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

网页端 目标检测 目标检测的网络_网页端 目标检测

一、Backbone和Detection head

通常,为了实现从图像中检测目标的位置和类别,我们会先从图像中提取出些必要的特征信息,比如HOG特征,然后利用这些特征去实现定位和分类。而在在深度学习这一块,backbone部分的网络就是负责从图像中提取特征,当然,这里提出的是什么样的特征,我们是无从得知的,毕竟深度学习的“黑盒子”特性至今还无法真正将其面纱揭开。

那么,如何去设计一个backbone去提取图像中的特征呢?

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

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

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

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

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

解决的办法相当简单,既然仅仅靠分类网络是不行的,那么我们就在后面加一些网络层,让这些额外加进来的网络层去弥补分类网络无法定位的先天缺陷。于是,这条脉络就非常清晰了:分类网络迁移过来,用作特征提取器(通过在OD数据集上进行微调,并且与后续的网络的共同训练,使得它提取出来的特征更适合OD任务),后续的网络负责从这些特征中,检测目标的位置和类别。那么,我们就将分类网络所在的环节称之为“Backbone”,后续连接的网络层称之为“Detection head”

在backbone这一部分,花些心思和功夫,倒也能够在顶会上做出些工作,只是,目前来看,手里没有太多卡的话,还是不推荐了(事实上,自己在做OD时,两个TITAN RTX我都觉得不够用,YOLO-v3在MSCOCO上迭代5w次要花费将近一周的时间,所以时间开销是非常大的~没有几块牛逼的卡,建议还是不要碰OD这个坑~)

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

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

因此,现在一个完整的目标检测网络主要由三部分构成:detector=backbone+neck+head

目前的话,neck这一部分的研究点还是相对来说比较多的,只需要提出一个好的结构或模块,加到现有的SOTA的网络中,涨点了,那就可以发文章了~,而head这一部分,就是分类+定位的,结构没什么新颖的,研究的似乎也比较少。

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

backbone这部分可以说很大程度上决定了detector的性能,所以,这部分的研究意义也很大,很吃GPU这点还是很现实的,毕竟要先在imagenet上去pretrain一下,这就花不少时间,然后再替换现有的detector的backbone网络,去COCO上训练看涨点否。总之,关于Backbone和Detection head两部分(中间加了些neck的部分),

 

 

参考文献

https://zhuanlan.zhihu.com/p/93451942