Backbone、Neck 和 Head

目标检测网络的两个重要部分:Backbone和Detection head。

一、Backbone
Backbone在整个目标检测网络当中指的是特征提取网络,其作用是提取图片当中的特征信息。通常,为了实现从图像中检测目标的位置和类别,我们会先从图像中提取出些必要的特征信息,比如HOG特征,然后利用这些特征去实现定位和分类。

常用的Backbone主要有

提取能力强:VGG、ResNet(ResNet18,50,100)、ResNeXt、DenseNet、SqueezeNet、Darknet(Darknet19,53)、DetNet、DetNASSpineNet、EfficientNet(EfficientNet-B0/B7)、CSPResNeXt50、CSPDarknet53等。
轻量:MobileNet、GhostNet、VoVNet、ShuffleNet、ThunderNet等。
 

从某种意义上来说,如何设计好的backbone,更好地从图像中提取信息,是至关重要的,特征提取不好,自然会影响到后续的定位检测。在目标检测任务之前,深度学习技术在图像分类领域中发挥了重大的作用,起到了非常好的效果,尤其是在ResNet系列的工作问世后,图像分类任务几乎达到了一个顶峰。虽然后续这个领域还在陆陆续续地出现些新工作,但大多数都只是换汤不换药,涨涨点罢了。

深度学习技术之所以能够这么出色地完成图像分类任务,基本上体现出了其在图像特征提取这一块的出色表现。另外,考虑到目标检测任务中,也需要对图像中的物体进行类别的识别,因此,一个很直接的想法就是将图像分类的网络直接拿来做目标检测的任务。但目标检测除了需要分类,更重要的一点是在于定位,而这一点恰恰是做分类任务的网络所不具备的。

随着迁移学习概念的兴起和普及,通过在检测任务中的数据集上对分类网络进行微调似乎是一个很不错的想法,所谓的“ImageNet pretrained model”概念就诞生了。简单地来说,就是目标检测和图像分类这两个任务具有一定的相似性,因为可以将分类的网络,比如VGG、ResNet等,用来做特征提取器。这一部分,我们就称其为backbone。

所谓的backbone,直接翻译过来就是“骨干网络”,很明显,这个单词的含义就表明了它并不是整体的网络。既然两个任务具有相似性,再加之迁移学习思想的普及,为什么还会要用这么个单词来描述它呢?事实上,尽管目标检测和图像分类两个任务具有相似性,但不完全是等价的,目标检测的目标是实现对物体的定位和分类,而图像分类仅仅是对图像中的物体进行分类,而不会去定位。于是,就在“定位”这一点上,完全将分类网络搬过来使用显然是不恰当的。

从优化目标上来看,分类任务只做分类,而目标检测还需要做定位,因此,任务驱动不同,目标不同,因此,完全有理由相信二者的优化空间有很大的差异。所以,仅仅是微调网络是无法完成目标检测任务的,当然,这一点,我们会在后续的实践来验证的。

二、Neck
Neck,中文翻译为颈部、脖子。Neck是目标检测框架中承上启下的关键环节。Neck在目标检测网络主要是把Backbone提取的特征进行融合,使得网络学习到的特征更具备多样性,提高检测网络的性能。更好地融合/提取Backbone所给出的feature,然后再交由后续的Head去检测,从而提高网络的性能。

它对Backbone提取到的重要特征进行再加工及合理利用,有利于下一步Head的具体任务学习,如分类、回归、keypoint、instance mask等常见的任务。Neck放在backbone和head之间的,是为了更好的利用backbone提取的特征。 像是最著名的FPN——《Feature Pyramid NetworksforObject Detection》 提出的FPN结构,将不同尺度的特征进行融合,充分利用Backbone提取的特征信息。

常用的Neck主要有

Additional blocks:SPP、ASPP、RFB、SAM

Path-aggregation blocks:FPN、PAN、NAS-FPN、Fully-connected FPN、BiFPN、ASFF、SFAM、NAS-FPN
 

三、Detection head
Head,中文翻译为头部。在目标检测网络中一般叫做检测头。Head是获取网络输出内容的网络,利用之前提取的特征,Head利用这些特征,做出预测。Head可以理解为是根据Backbone提取出来的特征,从这些特征中预测目标的位置和类别。目标检测除了识别出物体的类别,更重要的是还要对物体进行定位,主要作用是定位和分类

常用的Head主要有

Dense Prediction (one-stage):RPN、SSD、YOLO、RetinaNet(anchor based)、CornerNet、CenterNet、MatrixNet、FCOS(anchor free)

Sparse Prediction (two-stage):Faster R-CNN、R-FCN、Mask RCNN (anchor based)、RepPoints(anchor free)
 

随着技术的发展,除了backbone和head这两部分,更多的新奇的技术和模块被提了出来,最著名的,莫过于FPN了——《Feature Pyramid NetworksforObject Detection》提出的FPN结构,在不同的尺度(实际上就是不同大小的feature map)上去提取不同尺度的信息,并进行融合,充分利用好backbone提取的所有的特征信息,从而让网络能够更好地检测物体。有了FPN,backbone提取出的信息可以被利用的更加充分,使得detector能够很好地应对多尺度情况——图像中,目标的大小不一,大的、中等的、小的,都有,尤其是小物体,几乎成为了目标检测这一块的单独研究点。

三、Neck
除了FPN这种新颖的结构,还有诸如ASFF、RFB、SPP等好用的模块,都可以接在backbone后面,而这一部分,我们称之为“neck”,有些文章中直接把它翻译成“瓶颈”或“脖子”,neck这部分的作用就是更好地融合/提取backbone所给出的feature,从而提高网络的性能。

四、detector=backbone+neck+head


neck:提出一个好的结构或模块,更好适应feature

head:分类+定位

backbone:提取基础特征网络

补充backbone:尽管现在学术界已经知道了不用那些在ImageNet上预训练的模型作为backbone,而是自己搭建backbone网络或者使用分类网络,但不会加载预训练模型,也能够达到同样的效果,但是这样的代价就是需要花更多的实践来训练,如何对数据进行预处理也是要注意的,换句话说,给调参带来了更多的压力。关于这一点,感兴趣的读者可以阅读Kaming He的《Rethinking ImageNet Pre-training》。即便如此,大家还是会优先使用预训练模型,这么做,仅仅是减少我们的调参压力和训练时间所耗费的成本。
 

你可能感兴趣的:(pytorch,深度学习,linux)