人脸检测、人脸对齐(MTCNN方法) - 花泽 - CSDN博客

标签: | 发表时间:2019-03-05 21:47 | 作者:
出处:https://blog.csdn.net

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

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

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

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

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

这里,我们主要是推荐步骤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的步骤。

                                                                 

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

这个接口一次性能检测一张图片,以及给出每个人脸的五个特征点,而我们除了要得到人脸外,还要进行人脸对齐,只要将对齐后的人脸送进网络才能得到更高的精度,所以,为了满足这个要求,我对源文件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


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



相关 [人脸检测 对齐 mtcnn] 推荐:

人脸检测、人脸对齐(MTCNN方法) - 花泽 - CSDN博客

- -
众所众知,严格定义上的人脸识别分为四个步骤:. ①人脸检测:从图片中准确定位到人脸. ②人脸矫正(对齐): 检测到的人脸,可能角度不是很正,需要使其对齐. ④对两张人脸图像的特征向量进行对比,计算相似度. 这里,我们主要是推荐步骤1和步骤2用到的一个方法,论文是. 《2016 Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》.  这篇论文具体的思想大家可以自己阅读.

基于mtcnn和facenet的实时人脸检测与识别系统开发 - 知乎

- -
简介:本文主要介绍了实时人脸检测与识别系统的详细方法. 该系统基于python/opencv2/tensorflow环境,实现了从摄像头读取视频,检测人脸,识别人脸的功能. 本系统代码地址: real time face detection and recognition. 人脸识别是计算机视觉研究领域的一个热点.

Android和iOS自带的人脸检测API

- friedvan - 增强视觉 | 计算机视觉 增强现实
说说Android和iOS里面自带的人脸检测API. Android提供了一个人脸检测类 android.media.FaceDetector,调用findFaces函数,它可以返回图片中的找到的人脸. 人脸的属性封装在Face类,包括x, y, z三轴的人脸pose,还有两眼距离eyesDistance().

利用OpenCV的人脸检测给头像带上圣诞帽

- - CSDN博客综合推荐文章
采用一张圣诞帽的png图像作为素材,.     利用png图像背景是透明的,贴在背景图片上就是戴帽子的效果了. 人脸检测的目的主要是为了确定贴帽子的位置,类似ps中自由变换的功能,检测到人脸中间的位置,resize圣诞帽子和人脸大小匹配,确定位置,贴上去,ok. 代码:非常简洁,根据参考博客给出的代码,由OpenCV自带的人脸检测代码经过简单修改即可.

人脸检测与识别的趋势与再分析

- - IT瘾-dev
最近因为种种原因,这方面的知识有得到大家的认可和对其有很大的兴趣,所以今天想再一次分享这知识,让已明白的人更加深入理解,让初学者有一个好的开端与认知,谢谢大家的支持. 现在打开谷*公司的搜索器,输入 “face detect”,估计大家都能够想到,都是五花八门的大牛文章,我是羡慕啊. (因为里面没有我的一篇,我们实验室的原因,至今没有让我发一篇有点权威的文章,我接下来会写4张4A纸的检讨,去自我检讨下为什么.

[译] OpenCV vs Dlib 人脸检测比较分析

- - IT瘾-dev
点击我爱计算机视觉标星,更快获取CVML新技术. 人脸检测是计算机视觉最典型的应用之一,早期OpenCV的logo就是Haar人脸检测的示意图. 很多人的第一个OpenCV学习目标就是跑通Haar级联人脸检测,Dlib库在业内开始流行很大程度上是因为其HOG-SVM人脸检测比OpenCV Haar的好,而近年来OpenCV和Dlib均已包含基于深度学习的人脸检测算法实现.

人脸检测江湖的那些事儿——从旷视说起 - 知乎

- -
这是 Face++ Detection Team(R4D)第 3 篇知乎专栏. 如果说该专栏的定位是双向交流,一个比较贴切的词可能是「窗口」:一方面,我们希望从论文的生产、研究员的成长乃至公司的文化氛围等多方面被了解,被认识,被熟悉,希望携手共同见证最优检测算法的研究、创新与落地,突破认知边界,实现降本增效,为客户和社会创造最大价值;另一方面,我们也希望了解读者的想法,增加与读者的互动,形成双向反馈的正向沟通机制.

MTCNN人脸及特征点检测--基于树莓派3B+及ncnn架构 - yuanlulu的博客 - CSDN博客

- -
本文尝试在树莓派3B+上用ncnn框架测试MTCNN. ncnn的基本编译和使用请参考《. 在树莓派3B+上编译ncnn并用benchmark和mobilenet_yolo测试》. mtcn-ncnn项目中下载mtcnn子目录,把这个目录放在最新的ncnn源码目录下. 修改ncnn最顶层的CMakeList.txt,增加对mtcnn的支持.

LLVM的调用协议与内存对齐

- chacoo - C++博客-首页原创精华区
在设计一门语言与其他语言交互的API与ABI(Application Binary Interface,二进制接口)时,调用协议和内存对齐是两个无从回避的问题. 本文将讨论如何在LLVM上生成正确的内存对齐和调用协议的代码. 在这里为了方便和标准起见,假定应用LLVM的语言的Extending和Embedding的对象都是C.

人脸对齐(一)--定义及作用 - 工作笔记 - CSDN博客

- -
人脸对齐任务即根据输入的人脸图像,自动定位出面部关键特征点,如眼睛、鼻尖、嘴角点、眉毛以及人脸各部件轮廓点等,如下图所示.      这项技术的应用很广泛,比如自动人脸识别,表情识别以及人脸动画自动合成等. 由于不同的姿态、表情、光照以及遮挡等因素的影响,准确地定位出各个关键特征点看似很困难. 我们简单地分析一下这个问题,不难发现这个任务其实可以拆分出三个子问题:.