一个常见的目标检测网络,其本身往往可以分为一下三大块:
Backbone network,即主干网络(目标检测网络的主体结构),是目标检测网络最为核心的部分,大多数时候,backbone选择的好坏,对检测性能影响是十分巨大的。
代表网络有:
- VGG网络:《Very Deep Convolutional Networks for Large-Scale Image Recognition》。其中最常用的就是VGG-16.
- ResNet网络:《Deep Residual Learning for Image Recognition》。其中最常用的就是ResNet50和ResNet101。当任务需求很小的时候,也可以用ResNet18.
- ResNeXT网络:《Aggregated residual transformations for deep neural networks》,这个我没有用过,但很多sota工作中都会使用,刷榜的小伙伴不妨考虑一下。
- ResNet+DCN网络:这一网络主要是将DCN工作应用在ResNet网络上,DCN来源于这篇文章:《Deformable Convolutional Networks》。DCN是常用的涨点神器,不过似乎在实际部署的时候要复杂一些,刷榜的时候还是很值得一用。
- DarkNet网络:常用的包括darknet19和darknet53,这两个网络分别来源于YOLOv2和YOLOv3两个工作中。其中darknet19对标的是vgg19,darknet53对标的是resnet101,但由于darknet本身是个很小众的深度学习框架,不受学术界关注,且这两个网络均是由darknet框架实现的,因此也就很少会在其他工作中看到这两个backbone。不过,笔者更偏爱darknet,也对其进行了复现,因为结构简洁,便于理解。
- CSPResNet网络:出自于《CSPNet: A New Backbone that can Enhance Learning Capability of CNN》。CSP是一种很好用的结构,在减少参数量的同时,还能够提升模型性能,是不可多得的性价比极高的模块之一。像前一段时间的Scaled-YOLOv4就借鉴了这一工作的思想大幅度提升了YOLOv4的性能。不过,目前似乎也不是主流,仍旧无法撼动ResNet101和ResNet+DCN的刷榜地位。
Neck network,即颈部网络(更好地利用网络所提取的特征信息),Neck部分的主要作用就是将由backbone输出的特征进行整合。其整合方式有很多,最为常见的就是FPN(Feature Pyramid Network),有关FPN的内容,我们会在展开介绍Neck的时候再次提到的。
代表网络有:
- FPN(Feature Pyramid Network),FPN的工作就是在检测前,先将多个尺度的特征图进行一次bottom-up的融合,这被证明是极其有效的特征融合方式,几乎成为了后来目标检测的标准模式之一。如下图所示:
- RFB:出自《Receptive Field Block Net for Accurate and Fast Object Detection》
- ASPP:出自《DeepLab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected CRFs》
- SAM:出自《CBAM: Convolutional block attention module》
- PAN:出自《Path aggregation network for instance segmentation》。PAN是一个非常好用的特
Detection head,即检测头(负责检测与定位),这一部分的作用就没什么特殊的含义了,就是若干卷积层进行预测,也有些工作里把head部分称为decoder(解码器)的,这种称呼不无道理,head部分就是在由前面网络输出的特征上去进行预测,约等于是从这些信息里解耦出来图像中物体的类别和位置信息。
我们可以为以上任意部分单独去设计一个模块,然后“插进去”即可。很多目标检测的优化工作就是这么来的,比如2018年的ECCV上的RFBNet,就是在SSD基础上,设计了RFB模块插进Neck部分,从而显著提升了模型性能。