一个常见的目标检测网络,其本身往往可以分为一下三大块:
Backbone network,即主干网络,是目标检测网络最为核心的部分,backbone选择的好坏,对检测性能影响是十分巨大的。
Neck network,即颈部网络,Neck部分的主要作用就是将由backbone输出的特征进行整合。其整合方式有很多,最为常见的就是FPN(Feature Pyramid Network),SPPF等。
Detection head,即检测头,这一部分的作用就没什么特殊的含义了,就是若干卷积层进行预测,head部分就是在由前面网络输出的特征上去进行预测,约等于是从这些信息里解耦出来图像中物体的类别和位置信息。
通常,为了实现从图像中检测目标的位置和类别,我们会先从图像中提取出些必要的特征信息,比如HOG特征,然后利用这些特征去实现定位和分类。而在深度学习这一块,这一任务就交由backbone网络来完成。深度学习的强大之处就在于其特征提取的能力,在很多任务上都超越了人工特征。
从某种意义上来说,如何设计好的backbone,更好地从图像中提取信息,是至关重要的,因为特征提取不好,自然会影响到后续的定位检测
。
Backbone这一部分通常就是将诸如VGG、ResNet等模型搬过来(去掉最后的global avgpooling和softmax层),这一部分的参数初始化就直接使用在ImageNet上训练好的参数。这一模式也就是后来所说的ImageNet pretrained
概念。
常用的backbone模型如下:
backbone部分,其作用归根结底就是一句话:提取图像中有用的信息。
由于backbone网络毕竟是从图像分类(image classification)任务迁移过来的,其提取特征的模式可能不太适合目标检测detection。因此,在我们最终从这些特征中得到图像中若干目标的类别信息(classification)和位置(location)信息之前,有必要对它们做一些处理。
这一部分,因为是在backbone之后,detection head之前,因此,被称为“Neck”。
Neck部分最有名的,莫过于 FPN(Feature Pyramid Network):
在SSD之前,不论是Faster R-CNN还是YOLO,他们都只是在backbone输出的最后一层很粗糙的特征图(feature map)上去做检测的。
在CNN中,有一个很关键的概念叫做“感受野”(receptive field),意思就是这一张特征图的pixel能包含原始图像中的少个像素。直观上来看,backbone最后输出的很粗糙的特征图。通常stride=32,即经过了32倍降采样,具有很大的感受野,这对于大物体来说是很友好的,但对于小物体而言,经过多次降采样,小物体的信息很容易就被丢失掉了。
为了解决这么个问题,SSD在三个不同大小的特征图上进行预测,即上图中的(c),但CNN随着网络深度的增加,每一层的特征图所携带的信息量和信息性质也不一样。
浅层包含的细节信息、轮廓信息、位置信息等更多,深层包含的语义信息更多。
因此,FPN的工作就是在检测前,先将多个尺度的特征图进行一次bottom-up的融合,也就是上图中的(d),这被证明是极其有效的特征融合方式,几乎成为了后来目标检测的标准模式之一。
当然除了FPN,还有SPP模块及其改进版本SPPF,也是很常用的Neck结构,下图便是SPP的结构示意图。
YOLOv3通过添加这一模块有效提升了模型的性能,而模型的计算量的增加几乎可以忽略不记。SPP的思想很简单,通过不同大小的maxpooling核来丰富特征图的感受野。
在YOLOV5中,使用了改进版本的SPPF,如下所示,后面我们自己实现YOLOV1版本中,会使用到SPPF。
RFB:出自《Receptive Field Block Net for Accurate and Fast Object Detection》
ASPP:ASPP是通过并联不同空洞率 3 * 3的卷积核组成的,通过多支路后进行concate,再进行1x1卷积(降维)。
PAN:PAN是一个非常好用的特征融合方式,在FPN的bottom-up基础上又引入了top-down二次融合(如下图),有效地提升了模型性能。
当然,还有很多出色的Neck模块,这里就不展开细说了。
一张图像,在经过了backbone和neck两部分的处理后,就得到了最终的特征图。
随后,在这样的特征图上,通过添加几层卷积即可进行识别和定位。
Detection head并不像前两部分那样,有那么多的说道和自由发挥的空间,这一部分通常就是普通的卷积。如下图的RetinaNet,最后的detection head部分就是三条并行的分支,每个分支右4层普通卷积堆叠而成。
结语:
我们可以为以上任意部分【主干网络、Neck以及检测头】单独去设计一个模块,然后“插进去”即可。
很多目标检测的优化工作就是这么来的,比如2018年的ECCV上的RFBNet,就是在SSD基础上,设计了RFB模块插进Neck部分,从而显著提升了模型性能。
本文参考自《YOLO目标检测》ISBN编号:9787115627094