博客专栏

EEPW首页 > 博客 > Anchor-free目标检测 | 工业应用更友好的新网络(1)

Anchor-free目标检测 | 工业应用更友好的新网络(1)

发布人:CV研究院时间:2021-09-16来源:工程师

1.jpg

随着 CVPR 2020和ICCV 2020的结束,一大批目标检测的论文在arXiv上争先恐后地露面,更多的论文都可以直接下载。

下面几篇paper有异曲同工之妙,开启了anchor-based和anchor-free的轮回。

1. Feature Selective Anchor-Free Module for Single-Shot Object Detection

2. FCOS: Fully Convolutional One-Stage Object Detection

3. FoveaBox: Beyond Anchor-based Object Detector

4. High-level Semantic Feature Detection: A New Perspective for Pedestrian Detection

这几篇论文不约而同地将矛头对准了Anchor这个检测里面的基础模块,采用anchor-free的方法在单阶段检测器上达到了和anchor-based方法类似或者更好的效果。

anchor-free和anchor-based区别

这个问题首先需要回答为什么要有anchor。在深度学习时代,物体检测问题通常都被建模成对一些候选区域进行分类和回归的问题。在单阶段检测器中,这些候选区域就是通过滑窗方式产生的anchor;在两阶段检测器中,候选区域是RPN生成的proposal,但是RPN本身仍然是对滑窗方式产生的anchor进行分类和回归。

而在上面几篇论文的anchor-free方法中,是通过另外一种手段来解决检测问题的。同样分为两个子问题,即确定物体中心和对四条边框的预测。预测物体中心时,具体实现既可以像1、3那样定义一个hard的中心区域,将中心预测融入到类别预测的target里面,也可以像2、4那样预测一个soft的centerness score。对于四条边框的预测,则比较一致,都是预测该像素点到ground truth框的四条边距离,不过会使用一些trick来限制 regress 的范围。

为什么anchor-free能卷土重来

anchor-free 的方法能够在精度上媲美 anchor-based 的方法,最大的功劳我觉得应该归于 FPN,其次归于 Focal Loss。(内心OS:RetinaNet 赛高)。在每个位置只预测一个框的情况下,FPN 的结构对尺度起到了很好的弥补,FocalLoss 则是对中心区域的预测有很大帮助。当然把方法调 work 并不是这么容易的事情,相信有些细节会有很大影响,例如对重叠区域的处理,对回归范围的限制,如何将 target assign 给不同的 FPN level,head 是否 share 参数等等。

anchor-free 和 single anchor

上面提到的 anchor-free 和每个位置有一个正方形 anchor 在形式上可以是等价的,也就是利用 FCN 的结构对 feature map 的每个位置预测一个框(包括位置和类别)。但 anchor-free 仍然是有意义的,我们也可以称之为 anchor-prior-free。另外这两者虽然形式上等价,但是实际操作中还是有区别的。在 anchor-based 的方法中,虽然每个位置可能只有一个 anchor,但预测的对象是基于这个 anchor 来匹配的,而在 anchor-free 的方法中,通常是基于这个点来匹配的。

anchor-free的局限性

虽然上面几种方法的精度都能够与 RetinaNet 相媲美,但也没有明显优势(或许速度上有),离两阶段和级联方法相差仍然较远。和 anchor-based 的单阶段检测器一样,instance-level 的 feature representation 是不如两阶段检测器的,在 head 上面的花样也会比较少一些。顺便吐槽一下,上面的少数 paper 为了达到更好看的结果,在实验上隐藏了一些细节或者有一些不公平的比较。

anchor-free的其他套路

anchor-free 除了上面说的分别确定中心点和边框之外,还有另一种 bottom-up 的套路,以 CornerNet 为代表。如果说上面的 anchor-free 的方法还残存着区域分类回归的思想的话,这种套路已经跳出了这个思路,转而解决关键点定位组合的问题。

这里就不详细讨论每一篇论文的方法(回复提供下载链接),下面开始主要分享一下个人的想法。

早期探索:

DenseBox: https://arxiv.org/abs/1509.04874

YOLO: https://arxiv.org/abs/1506.02640

基于关键点:

CornerNet: https://arxiv.org/abs/1808.01244

ExtremeNet: https://arxiv.org/abs/1901.08043

密集预测:

FSAF: https://arxiv.org/abs/1903.00621

FCOS: https://arxiv.org/abs/1904.01355

FoveaBox: https://arxiv.org/abs/1904.03797v1

DenseBox:

2.jpg

如上图所示,单个FCN同时产生多个预测bbox和置信分数的输出。测试时,整个系统将图片作为输入,输出5个通道的feature map。每个pixel的输出feature map得到5维的向量,包括一个置信分数和bbox边界到该pixel距离的4个值。最后输出feature map的每个pixel转化为带分数的bbox,然后经过NMS后处理。除了NMS之外,检测系统的所有组成部分都构建在FCN之中。

网络结构如下图所示,基于VGG19进行的改进,整个网络包含16层卷积,前12层由VGG19初始化,输出conv4_4后接4个1x1的卷积,前两个卷积产生1-channel map用于类别分数,后两个产生4-channel map用于预测相对位置。最后一个1x1的卷积担当这全连接层的作用。

3.png

Refine with Landmark Localization

在DenseBox中由于是全卷积网络,因此,基于landmark定位可以通过简单添加一些层来进行实现。通过融合landmark heatmaps及目标score maps来对检测结果进行增强。如下图所示,增加了一个分支用于landmark定位,假设存在N个landmarks,landmark 定位分支将会输出N个响应maps,其中,每个像素值代表该位置为landmark的置信分数。该任务的ground truth maps与检测的十分相似,对于一个landmark 实例4.png,landmark k的第i个实例,其对应的ground truth 是位于输出坐标空间中第k个响应 map上的positive 标记的区域。半径rl应当较小从而避免准确率的损失。与分类任务相似,landmark 定位损失也是定义为预测值与真实值的L2损失。同样使用negative mining及ignore region。

5.png

YOLOv1:

YOLO意思是You Only Look Once,创造性的将候选区和对象识别这两个阶段合二为一,看一眼图片(不用看两眼哦)就能知道有哪些对象以及它们的位置。

实际上,YOLO并没有真正去掉候选区,而是采用了预定义的候选区(准确点说应该是预测区,因为并不是Faster RCNN所采用的Anchor)。也就是将图片划分为 7*7=49 个网格(grid),每个网格允许预测出2个边框(bounding box,包含某个对象的矩形框),总共 49*2=98 个bounding box。可以理解为98个候选区,它们很粗略的覆盖了图片的整个区域。

RCNN:我们先来研究一下图片,嗯,这些位置很可能存在一些对象,你们对这些位置再检测一下看到底是哪些对象在里面。

YOLO:我们把图片大致分成98个区域,每个区域看下有没有对象存在,以及具体位置在哪里。

RCNN:你这么简单粗暴真的没问题吗?

YOLO:当然没有......咳,其实是有一点点问题的,准确率要低一点,但是我非常快!快!快!

RCNN:为什么你用那么粗略的候选区,最后也能得到还不错的bounding box呢?

YOLO:你不是用过边框回归吗?我拿来用用怎么不行了。

1)结构

去掉候选区这个步骤以后,YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。单看网络结构的话,和普通的CNN对象分类网络几乎没有本质的区别,最大的差异是最后输出层用线性函数做激活函数,因为需要预测bounding box的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO的整个结构就是输入图片经过神经网络的变换得到一个输出的张量,如下图所示。

6.jpg

因为只是一些常规的神经网络结构,所以,理解YOLO的设计的时候,重要的是理解输入和输出的映射关系.

2)输入和输出的映射关系

7.jpg

3)输入

参考图5,输入就是原始图像,唯一的要求是缩放到448*448的大小。主要是因为YOLO的网络中,卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入,所以倒推回去也就要求原始图像有固定的尺寸。那么YOLO设计的尺寸就是448*448。

4)输出

输出是一个 7*7*30 的张量(tensor)。

4.1)7*7网格

根据YOLO的设计,输入图像被划分为 7*7 的网格(grid),输出张量中的 7*7 就对应着输入图像的 7*7 网格。或者我们把 7*7*30 的张量看作 7*7=49个30维的向量,也就是输入图像中的每个网格对应输出一个30维的向量。参考上面图5,比如输入图像左上角的网格对应到输出张量中左上角的向量。

要注意的是,并不是说仅仅网格内的信息被映射到一个30维向量。经过神经网络对输入图像信息的提取和变换,网格周边的信息也会被识别和整理,最后编码到那个30维向量中。

4.2)30维向量

具体来看每个网格对应的30维向量中包含了哪些信息。

8.jpg

① 20个对象分类的概率

9.png

10.png


综合来说,一个bounding box的置信度Confidence意味着它 是否包含对象且位置准确的程度。置信度高表示这里存在一个对象且位置比较准确,置信度低表示可能没有对象 或者 即便有对象也存在较大的位置偏差。

简单解释一下IOU。下图来自Andrew Ng的深度学习课程,IOU=交集部分面积/并集部分面积,2个box完全重合时IOU=1,不相交时IOU=0。

11.jpg

总的来说,30维向量 = 20个对象的概率 + 2个bounding box * 4个坐标 + 2个bounding box的置信度

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

LCD显示屏相关文章:lcd显示屏原理


lcd相关文章:lcd原理


关键词: AI

相关推荐

技术专区

关闭