人脸检测、人脸对齐(MTCNN方法)

众所众知,严格定义上的人脸识别分为四个步骤:

①人脸检测:从图片中准确定位到人脸

②人脸矫正(对齐): 检测到的人脸,可能角度不是很正,需要使其对齐

③对矫正后的人脸进行特征提取

④对两张人脸图像的特征向量进行对比,计算相似度

这里,我们主要是推荐步骤1和步骤2用到的一个方法,论文是

《2016 Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》.  这篇论文具体的思想大家可以自己阅读。

称之为MTCNN人脸检测算法,同时有大神已经GitHub上开源了其基于caffe的C++ API 的源代码,https://github.com/DaFuCoding/MTCNN_Caffe  再次感谢大神以及开源~

这个GitHub上是原始的caffe,再加上了MTCNN的部分(一个源文件+8个训练好的caffemodel以及deploy文件),大家可以clone到本地从头编译。编译完后,生成一个可执行文件,路径为 build/examples/MTSrc/MTMain.bin ,这个可执行文件需要额外的两个参数,第一个是上面的8个文件所在目录(caffe/examples/MTmodel/),第二参数就是测试图片了。这里我们先运行下demo,将一张图片放到caffe目录下(放哪都行),然后转到caffe根目录下,运行 ./build/examples/MTSrc/MTMain.bin /examples/MTmodel/ 1.jpg 然后很快就出结果了,检测到人脸,以及五个特征点(两只眼睛,鼻子,左嘴角和右嘴角),具体demo展示可看GitHub的步骤。

                                                                 

同时打印出图片尺寸信息,以及检测耗时。

扫描二维码关注公众号,回复: 2641770 查看本文章

这个接口一次性能检测一张图片,以及给出每个人脸的五个特征点,而我们除了要得到人脸外,还要进行人脸对齐,只要将对齐后的人脸送进网络才能得到更高的精度,所以,为了满足这个要求,我对源文件MTMain.cpp进行了修改,分为了头文件以及源文件,并且添加了一些代码,得到人脸框以及五个特征点后,通道OpenCV里的仿射变换,使之对齐,效果如下                      

                                                    

左边的是输入图片,中间是经过人脸检测的图像,右边的是对齐后的图像,效果还是很好的。

我把MTMain.cpp文件进行修改后,分为了两个文件 MTCNN.h和MTCNN.cpp , 修改后的代码中,只开放了一个接口函数,调用十分简单,如下:

//核心代码在这
class MTCNN{
public:
       MTCNN(const string& proto_model_dir);   //构造函数,参数是8个caffemode、deploy文件所在目录路径
       
       //给定一张图片,faceRects用于保存检测到的人脸框,函数返回所有对齐后的人脸图片
       vector<Mat> getFaceRects(const Mat& img,vector<Rect>* faceRects=NULL);
       略.........
对一张图片,只要不断的调用该函数,就可以返回对齐后的人脸了,注意这里返回值是个图片数组,因为可能一张图中有多个人脸,所以返回的也是多个人脸。

有了这个方便的接口后,大家根据自己的需求,写个main.cpp 文件,把程序跑起来吧~~

这两个文件的百度云链接:链接:http://pan.baidu.com/s/1pLBGwuZ密码:fcyc

对了,也许有些小伙伴,不知道怎么单独编译这两个文件生成可执行文件,这里提供个样例Makefile文件,实际路径换上自己的,make一下就好了~

# Makefile

main.bin: main.cpp MTCNN.cpp
      g++ -o main.bin main.cpp MTCNN.cpp -I /home/yourname/caffe/include -I /home/yourname/caffe/build/src/ -I /usr/local/cuda/include -L /home/yourname/caffe/build/lib -lcaffe -lglog /-boost_system -lprotobuf `pkg-config --libs --cflags opencv` 

当然,如果只有CPU,可以把cuda的那个删去,同时记得在最后加一句 -D CPU_ONLY

最后,分享下用opencv进行仿射变换的博客

http://blog.csdn.net/u013713010/article/details/46047367


好了,接下来,自己跑起来吧~



猜你喜欢

转载自blog.csdn.net/zxj942405301/article/details/71799279