MTCNN网络
这两周下班花了很多时间理解MTCNN网络,从综述到博客,再到代码和原论文,最终又回过去看代码和博客,总算把MTCNN的数据前处理,结构和内部的一些算法搞清楚了。总的来说,个人认为MTCNN难点主要在第一阶段,包括训练数据的前处理,测试数据的输入等。
文章主要参考了:http://www.sfinst.com/?p=1683
https://www.cnblogs.com/the-home-of-123/p/9857056.html
https://blog.csdn.net/autocyz/article/details/82799529
https://zhuanlan.zhihu.com/p/31761796
级联神经网络从一个小网络开始,逐层训练,最终形成一个多层的结构。MTCNN是多任务级联CNN的人脸检测深度学习模型,该模型不仅考虑了人脸检测概率,还综合训练了人脸边框回归和面部关键点检测,多任务同时建立loss function并训练,因此为MTCNN。
MTCNN的网络结构主要包括P-NET,R-NET和O-NET(Proposal Network, Refinement Network和 Output Network),运算量最大的是Pnet,耗时也最多。各层级网络结构如下:
Pnet输入是12123尺寸的图片,用来获取面部分类概率,面部窗口和相应的候选框的回归向量。然后采用非极大值抑制方法non-maximum suppression(NMs)对生成的面部候选框进行合并操作。
RNET对PNET输出的面部候选框进一步训练矫正人脸候选框的回归向量,并同样对候选框执行非极大值抑制
ONet是最后的输出网络,生成最终的人脸识别概率,人脸回归框以及面部关键点。
MTCNN训练和预测的关键点包括输入数据的前处理,Bounding Box的生成,交并比的计算,非极大值抑制,回归框偏移量等。
数据前处理
PNET输入的训练数据是12123的图片,对图片进行预处理是训练的第一步。MTCNN原文作者训练的数据主要来源WIDER FACE数据集以及对应的annotation,可从如下地址下载:http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/
数据集包括训练集,验证集合测试集,并且annotation中均被标记人脸框(Guarant True Box),annotation格式如下:
0–Parade/0_Parade_marchingband_1_849.jpg 448 329 570 478
*.jpg为图片命名,后四个数字为人脸框的左上角和右下角坐标,如果不止一个人脸框,则数字会继续在后面append。如下代码可以把上面这幅图以及人脸框画出来:
import cv2
from dface.core.detect import create_mtcnn_net, MtcnnDetector
import dface.core.vision as vision
import matplotlib.pyplot as plt
import pylab
img = cv2.imread("0_Parade_Parade_0_904.jpg")
annotation = [360, 97, 623, 436 ]
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
figure = pylab.figure()
# plt.subplot(121)
pylab.imshow(img_rgb)
figure.suptitle('DFace Detector', fontsize=20)
rect = pylab.Rectangle((annotation