本篇我们阐述对Github上给出的SDM程序,我们做的一些Bug修正。关于SDM for face alignment,请参考:
《 Supervised Descent Method and its Applications to Face Alignment》
我们的程序在开始阶段需要载入数据,由于数据层次不齐,所以需要做形状归一化。其中的一个必要操作就是裁剪图片,取出包含人脸的那部分区域。如下图:
,
实际上我们不要这么大,我们只需要人脸的那部分,于是我们根据shape的包围盒并且向左上和右下拓展,扩大截取区域,得到:
但是在截取过程中,我们发现对于一些人脸过于靠近边界的图片,我们的截取区域超过了图片的范围,如图:
在这种情况下,一种办法就是直接把超过图片范围的区域去掉,只取剩下的这部分。这种办法简单,很多时候也可以使用,但是在我们的程序中,这种方法可能会导致在后来的迭代过程中计算出的shape超过图片范围,造成无法继续迭代的后果。所以在这种状况下,我们希望初始截取的图片人脸最好可以居于中间。我们想到了直接去填充超过图片的那部分区域即可。如下:
这部分中可以使用Matlab的填充图像函数:
1 | B = padarray(A,padsize,padval,direction) |
这部分程序在common/cropImage/cropImage.m中,用法如下:
1 | [ img,shape,box,t ] = cropImage( img,shape ) |
最终,我们来看看效果: