TensorFlow版本MTCNN解析

TensorFlow版本MTCNN解析

  • 整体架构
    • 样本生成部分
    • 三个模型的训练部分
    • 推理部分
    • 在训练时候为什么用小图片,而不用全图?
    • 会不会遗漏掉某些人脸?

整体架构

针对这篇文章的读者,默认为是已经对MTCNN有了基本了解的,若对MTCNN还未了解的,可自行了解。
分为几个部分:

  1. 样本生成部分
  2. 三个模型的训练部分
  3. 推理测试部分

样本生成部分

  1. PNet的样本生成
    根据GT数据,生成正样本,已经中间样本;随机生成负样本;
  2. RNet的样本生成
    img通过PNet之后,会在卷积结果层的每个点有一个预测分数,一个偏移值和一个landmark;其中卷积层的每个位置可对应到原图的相应位置,这个位置根据偏移值进行微调,获取PNet的预测位置;这个预测位置仍是不可靠的,我们需要使用GT数据对其进行处理,进而计算出和标准GT的偏移量;有了img,有了GT,有了偏移量,那样本就成了;
  3. ONet的样本生成
    ONet的样本生成过程,和RNet的生成过程一样

三个模型的训练部分

这个部分很简单,拿刚才生成的数据进行单个模型的训练即可

推理部分

一个img过来之后,首先使用PNet进行处理,生成一系列的bbox,和一系列的置信度;将img和经置信度阈值过滤后的bbox送入RNet(这个时候,img仅仅提供该图片的长宽,防止bbox超出界外,RNet真正吃的是bbox图片),RNet对每个bbox进行预测,又生成针对每个bbox的置信度和偏移量,再做重复的工作;

在训练时候为什么用小图片,而不用全图?

在PNet训练过程中,我们使用的12*12的小图片,没有使用全图;原因:

  1. 12*12的小图片和偏移值已经可以完成人脸的定位;也就是说,给模型一个半个脸的图片,模型可以通过偏移值的预测进而微调出这个全部脸的位置;
  2. 在卷积的时候,我们对全幅图进行卷积,其实有点像fastRNN,然后将卷积的结果反馈到原图上即可;

会不会遗漏掉某些人脸?

可以想象,MTCNN使用的是金字塔模型,对原图不停的缩放,直到达到我们定义的最小人脸尺寸为止;另一方面,我们还在每个缩放的图进行卷积,这个卷积有点像滑窗,对整幅图滑窗并预测每个滑窗的概率;通过这两个手段,基本上可以排除遗漏人脸的可能,并且不想yolo算法那样,对检出物体有上限的限制;

你可能感兴趣的:(MTCNN)