人脸对齐是人脸相关应用中非常重要的技术,通常采用人脸关键点来进行对齐。而在关键点对齐中最常用的便是相似变换(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至tracelessle@163.com。
[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 - 博客园
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)