背景:MTCNN作为人脸定位算法被广泛应用,无论是准确率和实时性方面都很有价值。
目的:解析MTCNN的论文。
论文地址:https://arxiv.org/abs/1604.02878
目录
一、摘要
1.1 贡献点
二、方法
2.1 框架
2.2 CNN架构
2.3 训练过程
人脸/非人脸判别
生成的备选框回归
人脸关键点标注定位
多任务训练
难样本挖掘
三、实验
数据集
3.1 训练数据
3.2 难样本训练的有效性
3.3 Joint detection与alignment
3.4 与其他方法对比
3.5 运行效率
四、结论及个人总结
三个级联的网络,Pnet,Rnet,Onet
Pnet: 生成备选框,并且根据回归得到相应的备选框的向量。然后运用NMS(非极大值抑制,解析https://blog.csdn.net/weixin_36474809/article/details/86234403)算法来抑制掉高度重叠的备选框。
Rnet: 重新筛选备选框,删除掉伪正的样本(即Pnet生成的正样本备选框,Rnet判断为不是正样本)
Onet:继续筛选备选框并且生成相应的人脸landmark
之前的人脸检测问题有下面这两点缺点:
为了满足这点,作者将所有5x5的filter全部换为3x3,来减少相应的运算但是增大网络的深度。网络与其它网络性能的对比和采用的网络结构如下:
设置三个量用于训练网络。
对于样本,设置交叉熵作为loss:
pi为网络预测判断是人脸的概率,
表示Ground truth
输出的位置与最近的ground truth之间的备选框的left top,height与width,所以学习的过程是一个回归问题。运用Euclidean loss作为每个样本xi的loss:
其中,
一共5个关键点,左眼,右眼,鼻子,左嘴角,右嘴角,坐标数字10个,依然运用欧氏距离作为loss
ground truth
旧的其他人的人脸识别会将三个任务在不同数据集上分开训练,这样作者将三个任务合在一起作为多任务训练。
其中,N为训练样本的个数,阿尔法表示任务的重要性,贝塔表示样本的类型。Pnet,Rnet与Onet训练分别采用不同的系数。如下:
作者运用前像传递之中所有样本每个mini batch之中的top 70%作为难样本(这点难样本的产生还是不明确,也没有具体的描述,需要看相关论文或者代码才能明确,但是思想已经明确,就是多生成难样本来训练网络以取得更好的训练效果)。
实验中证明了这种方法的效果比手动提取的效果更好。
在下面这三个数据集上进行相应的训练:
其中,FDDB包含5,171张人脸,2,845张图像
WIDER FACE 包含了393,703张标注的人脸 32,203张图像,其中50%被当作三个子数据集,40%被当作训练与保留作为validate
AFLW包含了人脸关键点标注,24.386张人脸
样本作用:
每个网络的训练:
在Onet上测评相应的结果,一个加了难样本训练,一个不加难样本训练
上图绿线为加了难样本训练的,黑线不加难样本训练。明显看出绿线的validate loss更小。
detection与alignment任务共同训练,然后运用不同的Onet的数据集来实现,FDDB数据集。运用Pnet与Rnet来实验。
将landmark的任务与classification与regression的任务共同训练明显取得了更好的效果。
MTCNN在人脸检测时候的PR曲线明显好于其他方法。
且关键点检测时候的Mean Error也明显优于其他的方法。
基于毫无优化的matlab代码,在2.60GHz的CPU取得了16fps的帧率,在GPU(Nvidia Titan Black)上取得了99fps的帧率
MTCNN可能是目前为止结合了帧率和准确率都是最好的算法,非常具有参考价值。
它通过三个级联的网络降低运算量并且取得了非常好的效果,值得我们参考和借鉴。