人脸对齐中的尺寸拉伸程度求解

人脸对齐中的尺寸拉伸程度求解,第1张

人脸对齐中的尺寸拉伸程度求解 前言

人脸对齐是人脸相关应用中非常重要的技术,通常采用人脸关键点来进行对齐。而在关键点对齐中最常用的便是相似变换(SimilarityTransform)。

相似变换可以看成是仿射变换中的简单的一种,不存在倾斜变化和翻转变化。关于仿射变换的介绍可以查阅参考资料[4]。相似变换相当于等距变换和均匀缩放的一个复合,而等距变换是平移变换和旋转变换的复合。所以相似变换包含了平移变换、旋转变换和均匀缩放三类变化。

尺寸拉伸程度求解

常用的求解相似变换的变换矩阵的函数有
scikit-image (skimage) 的transform.SimilarityTransform.estimate()方法。

其中transform.SimilarityTransform.estimate()方法采用基于最小均方估计的umeyama算法实现。


对于2D的相似变换:

意思就是在变换前的坐标(x, y)与变换后的坐标(X, Y)之间建立变换关系,通过多组坐标对建立方程组,使用最小均方估计求解出未知数,主要是三个未知数:旋转角,平移量,缩放系数。

常用的人脸对齐模板如下所示,使用trans.SimilarityTransform().estimate(landmark5, tem[i])估算,可以得到最匹配的状态(均方误差最小),进而得到变换矩阵M。

而此时的M的形式如下:

[[a0  b0  a1]
 [b0  a0  b1]
 [0   0    1]]

在调用.estimate方法时,默认传入了estimate_scale=True参数,得到的变换矩阵已经隐含scale信息。如果需要得到缩放系数,可以通过调用.scale属性获得。

注:scale方法被@property 装饰器变成属性以供调用。


如果在应用时拿到的变换矩阵只有M的前两行:

mat = 
[[a0  b0  a1]
 [b0  a0  b1]]

那么可以通过进行一定转换后求解得到scale:

params = np.concatenate([mat , np.array([[0.,0.,1.]])], axis=0)
scale = np.sqrt(np.linalg.det(params))
版权说明

本文为原创文章,独家发布在blog.csdn.net/TracelessLe。未经个人允许不得转载。如需帮助请email至[email protected]

参考资料

[1] Module: transform - skimage.transform.SimilarityTransform — skimage v0.20.0.dev0 docs
[2] scikit-image/_geometric.py at main · scikit-image/scikit-image
[3] face_alignment库获取人脸图片landmark示例_TracelessLe的专栏-CSDN博客
[4] 仿射变换(AffineTransform)与仿射矩阵_TracelessLe的专栏-CSDN博客
[5] SKimage-transform.SimilarityTransform 相似变换 及其 人脸对齐的应用 - 努力的孔子 - 博客园
[6] skimage库的transform.SimilarityTransform()用法_小C的博客-CSDN博客
[7] python - Difference between SimilarityTransform (scikit-image) and warpAffine (openCV)? - Stack Overflow
[8] Similarity Transformation – from Wolfram MathWorld
[9] Similarity (geometry) - Wikipedia
[10] 基础知识:仿射变换、相似变换、等距变换等常见变换 - Lilu1223 - 博客园

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5625028.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存