zoukankan      html  css  js  c++  java
  • MTCNN人脸检测识别笔记

    论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
    论文链接:https://arxiv.org/abs/1604.02878
    官方代码链接:https://github.com/kpzhang93/MTCNN_face_detection_alignment
    其他代码实现(MXNet):https://github.com/pangyupo/mxnet_mtcnn_face_detection

    一 模型及流程概览

           使用mtcnn神经网络进行人脸检测是目前比较主流的方式,相较于传统的人脸检测方法,mtcnn更能够适用各种自然条件下复杂的人脸场景。mtcnn是两年前发表的成果,在原作者实现的时候先后有两个版本:V1和V2。V1就是用matlab实现的论文《Joint Face Detection and Alignment using Multi-task Cascaded  Convolutional Neural Networks》,V2在V1的stage3后又添加了一个stage4,以实现更精确的回归。

           训练前,对图像做了multi scale的resize,构成了图像金字塔,然后这些不同scale的图像作为3个stage的输入进行训练,目的是为了可以检测不同scale的人脸。

      将图像进行多级scale操作(除了第一次resize,每次resize操作使得待检测图片的面积变为之前的一半),如果最小边长小于12,则停止scale操作;对于720p的图片来说,一共会进行11次scale: [0.6, 0.4242640687119285, 0.3, 0.21213203435596426, 0.15, 0.10606601717798213, 0.075, 0.053033008588991064, 0.0375, 0.026516504294495532, 0.01875];然后将11个不同尺度的图片送入P-Net;

    MTCNN由三个子模型组成,由粗到细(coarse-to-fine)生成结果:

    P(Proposal)-Net:浅层的全卷积神经网络CNN快速产生候选窗体和边界回归向量,利用NMS方法去除重叠窗体。在训练阶段,顶部有3条支路用来分别做人脸分类、人脸框的回归和人脸关键点定位;在推理阶段,输出只有N个bounding box的4个坐标信息和score,当然这4个坐标信息已经用回归支路的输出进行修正了,score可以看做是人脸的概率,具体可以看代码。

    R(Refine)-Net:通过更复杂的全连接CNN精炼候选窗体,利用边界框向量微调候选窗体,再利用NMS去除重叠窗体,丢弃大量的重叠窗体。输入是P-Net中得到的大量bounding box并都被resize成24*24尺寸。同样在推理阶段,这一步的输出只有M个bounding box的4个坐标信息和score,4个坐标信息也用回归支路的输出进行修正了。

    O(Output)-Net:网络结构比R-Net多一层卷积,功能与R-Net作用一样,只是在去除重叠候选窗口的同时,显示五个人脸关键点定位。输入大小调整为48*48,输出包含P个bounding box的4个坐标信息、score和关键点信息。

    二、损失函数

    1. face classification

    判定是否包含face的二分类问题,采用交叉熵损失函数

    2.bounding box regression

    回归检测人脸包围盒,使用L2 loss

    3.facial landmark localization

    4. 权值平衡

    不同的阶段对应的损失函数组合不一样,权重也不一样,因此定义了公式4用来控制对不同的输入计算不同的损失。可以在出,在P-Net和R-Net中,关键点的损失权重(α)要小于O-Net部分,这是因为前面2个stage重点在于过滤掉非人脸的bbox。β存在的意义是比如非人脸输入,就只需要计算分类损失,而不需要计算回归和关键点的损失。

    三 模型细节

    • PNet

    图片尺寸:12*12*3

    卷积层一 : [in_channel(3), shape(3), shape(3), out_channel(10)]      激活PReLU  MaxPool

    卷积层二 : [in_channel(10), shape(3), shape(3), out_channel(16)]    激活PReLU  MaxPool

    卷积层三 : [in_channel(16), shape(3), shape(3), out_channel(32)]    激活PReLU 

    卷积层四_一 : [in_channel(32), shape(1), shape(1), out_channel(2)]    conv4-1  激活Softmax 到 prob1层 对应人脸概率的得分

    卷积层四_二 : [in_channel(32), shape(1), shape(1), out_channel(4)]    conv4-2

    卷积层三为1x1卷积核得到PNet输出。PNet层输出分为3部分:
    1). face classification:图像中包含人脸的概率
    2). bounding box:输出矩形框位置信息
    3). facial landmark localization:5个关键点位置。


    rnet: 24x24x3, onet:48x48x3

    三、人脸对齐的一些笔记

  • 相关阅读:
    很好的Socket教程
    TcpClient 错误"不能做任何连接,因为目标机器积极地拒绝它" 的解决
    Tcp通信 暑期学习笔记(二)
    svn1.5+TortoiseSVN1.5+VisualSVN1.5
    进程、线程、应用程序域 暑期学习笔记(一)
    线程状态(转)
    Udp通信 暑期学习笔记(三)
    杜婧/于洋(为奥运冠军名字作诗)
    王峰(为奥运冠军名字作诗)
    刘子歌(为奥运冠军名字作诗)
  • 原文地址:https://www.cnblogs.com/punkcure/p/10415500.html
Copyright © 2011-2022 走看看