这篇由百度提出的pyramidbox前前后后看了快一个星期,中途好多东西都看不懂,然后就转去看了S3FD和SSH。Pyramidbox结合了很多前人的技术和思想,比如FPN、Max-out等。当然本文作者也提出了一些新的思想,如pyramidanchor、data-anchor-sampling等。
本文最大的特色是加入了上下文信息在检测过程中(其实在SSH中就有用到上下文信息,但那时没有重点用),头部信息和身体信息的加入更加有利于检测人脸,所以在训练的时候还要加入头部和身体标签,这个工作量有点大。接下去由我来稍稍梳理一下这篇文章的思路。
正如上图一 所示,Pyramidbox的主架构采用的是S3FD的架构,骨干网络是VGG16,取Pooling5及以前的层,将FC6,FC7下采样为conv_fc6和
conv_fc7,然后再加了几层卷积层来增加深度,从而使模型获得更好的非线性拟合。因为平衡每一种尺度的人脸对检测小脸很重要,所以这整一部分中卷积的步长是anchor尺寸的四分之一,这样可以使各种尺度的人脸匹配到差不多数量的anchor,更加详细的内容可以查阅S3FD这篇文章。https://arxiv.org/abs/1708.05237
第二部分是LFPN,如下图二,这是对何凯明的FPN(图三)的改进,本文给出了改进的理由:并不是所有的高维特征都有助于小脸的检测,同时在小脸中抽取高维特征容易引入噪声并且较小的、模糊的、被遮挡的人脸与较大的、清晰的、完整的的人脸有不同的纹理特征等所以本文作者并不是像原生FPN那样直接从top层向下融合,而是从中间conv_fc7开始,这一层的感受野是原图尺寸的一半,不容易引入噪声。如果细看LFPN和FPN除了开始层数不一样外,用1x1卷积来升维的地方也不一样。可惜作者并没有说明原因。
第三部分是CPM,这部分的思想是受到了Inception-Resnet的又宽又深的启发,因此结合了SSH和DSSD中优秀的思想改进,具体就是将SSH的检测模块包括上下文模块里面的3x3卷积全部换成了DSSD中的残差预测快,这样既有了宽度又有了深度。它的输出通道统一是20个:4个脸部类别,2个头部类别,2个身体类别,以及脸部、头部、身体的回归框位置分别4个。如下图四所示
第四部分是Pyramidanchor,这部分我读了好几遍,但是依然有很多不清楚的,接下去就说我的理解吧,如有不对的请大家指正哈。Pyramidanchor和下面的Max-in-out都在CPM里面的,这一部分的主角是脸部、头部和身体,但是在融合的过程中,这三部分的信息均来自不同层,这个我比较不明白,为什么不是来自同一层呢,还有从图中可以看出最后几个层都没有凑齐3个信息。(这一部分我是看的一脸懵逼)。具体可以看一下图五这个例子。
最后我再讲讲data-anchor-sampling和Max-in-out。前者是一种数据增强的方式,单看里面的公式不太好懂,但是本文作者给大家举了一个例子,基本明了。Max-in-out是对Max-out的一种改进,后者只是针对negative样本做处理,而前者对positive样本也做了处理,本文作者在conv3_3这一层用正:负=1:3,因为这一层小anchor较多,正负样本比不平衡,后面的层则全部是正:负=3:1。如下图七所示。