感觉自己陷入了代码细节误区,本着时间紧任务重的理念,加上本人能力有限,暂时无法完成细节代码图解,但是可以简单写一下自己两周以来的学习感悟,和整体架构!
首先总体架构参考如下博客:https://zhuanlan.zhihu.com/p/38520597
代码部分总的执行流程如下:
代码结构截图:
代码实现模型的初始化,首先是构建mtcnn的tensorflow计算图,然后载入训练好的模型参数,细节是分别调用pnet,rnet,onet组装成mtcnn。里面涉及python装饰器的内容,首先写了一个基本的层,然后用装饰器分别实现神经网络各种层,感觉有点类似caffe的工厂模式。
代码实现最终的检测道德人脸框的四个点坐标和5个点的包括双眼,鼻尖,两个嘴角的坐标。
这是官方训练好的模型文件。
这里会对检测到的人脸框和五点位置进一步处理,最终得到我们想要的结果。
这里是代码的核心了,首先得到图像金字塔,参考博文。https://blog.csdn.net/poem_qianmo/article/details/26157633
然后输入pnet,返回值输入框的初始化,然后nms,然后rect实现正方形框输出,然后因为预测的框会超过原图边界,所以会涉及像素填充调用pad函数,然后输入到rnet,图像缩放、像素值归一化,归一化就是等比例缩放数值,如下图所示:
后面的也会有nms,等函数的调用就不一一细说了,先理解整体框架,具体代码实现讲解后面补充。
下面列出pro:net的网络结构图。
pnet 人脸得分 conv4-1, 人脸框对应 conv4-2,
rnet 人脸得分 conv5-1, 人脸框对应 conv5-2,
onet 人脸得分 conv6-1, 人脸框对应 conv6-2, 和 五点conv6-3 对应
代码解释:detect_face.py
1、def imresample(img, sz):函数主要功能对图片进行缩小放大。
im_data = cv2.resize(img, (sz[1], sz[0]), interpolation=cv2.INTER_AREA)
img 输入图片
sz[1], sz[0] resiz的尺寸
利用python opencv中的 cv.Resize(源,目标,变换方法)就可以实现变换为想要的尺寸了
源文件:就不