概述
最近几年深度学习的快速发展对目标检测(Object Detection)领域也产生了巨大的影响,各种SOTA(State of Art)的模型也层出不穷,包括但不限于Faster-RCNN,YOLO,SSD,FCOS等等,很多时候我们看论文和模型容易陷入其复杂的细节之中,而得不到全局的视野,尤其是像Yolo系列各种堆版本也是看的眼花缭乱。事物的发展也许就是这样的吧,刚开始都是很复杂的,或者想的很复杂的,越到后面越能看到基本原理,也越能理解事物本身。这篇文章是多年目标检测经验后的总结,试图阐述目标检测模型复杂外表下的内核,如有错误请不吝赐教。
卷积网络的感受野(Receptive Field)
![](https://i-blog.csdnimg.cn/blog_migrate/8a7cdd16e64d2fbf49cbb4a4e4862f5d.png)
我们知道卷积神经网络(CNN,卷积网络)的感知是局部的或位置相关的,这个也是论文中经常提及的概念叫归纳偏置(Inductive Bias),卷积网络有这样位置相关的归纳偏执。如上图,网络第二层中的蓝绿色格点,只能感知到网络第一层红色线框中的图像信息,网络第三层则能感知到全图的信息。所以如果 CNN的特征图遵循金字塔结构,即下一层的特征图大小大于上一层的特征图,且无残差结构,那么在CNN中不同的层的不同特征格点(Feature Map’s Grid)感知到的信息是不同的及位置相关,且越上层的特征格点感受野越大。
我们假设去除网络第三层,而让网络第二层只输出目标分类的概率,那么很显然,网络第二层的所有格点及从其感受野到该格点的路径构成的子网络是一个分类网络,所以如果我们将卷积网络各个分类格点连通到感受野的有向无环图结构拆分为一个单独的网络,那么卷积网络其实是由许许多多的子分类网络构成的。
分类问题是机器学习中的基本问题,而网络拆分某种程度上说明了,卷积网络的任意子网络的作用都可能是一个简单的分类器,尤其是以 R e L U ReLU ReLU作为激活函数的网络,只是我们不太明白中间到底是在分类什么。另一个层面说,对于分类问题,感受野的本质是由该格点连通到其关联输入格点的单层或多层网络组成的一个子分类网络。
** 以
R
e
L
U
ReLU
ReLU为激活函数的单层网络我们可以表示为如下形式,学过线性分类器的都知道
W
T
X
+
b
=
0
W^TX+b=0
WTX+b=0构成了一个线性分割超平面,
R
e
L
U
ReLU
ReLU 的作用就是留下超平面的一侧的数据,去除超平面的另一侧。其本质就是一个线性二分类器,只是在深度学习中我们需要保留输出数据作为下一层的输入,所以保留了分类为
1
1
1 的经过线性变换后的数据。
R
e
L
U
(
W
T
X
+
b
)
=
{
1
∗
(
W
T
X
+
b
)
,
W
T
X
+
b
>
0
0
,
W
T
X
+
b
⩽
0
ReLU(W^TX + b) =\left\{\begin{matrix} 1*(W^TX+b)&,W^TX+b>0 \\ 0&,W^TX+b\leqslant 0 \end{matrix}\right.
ReLU(WTX+b)={1∗(WTX+b)0,WTX+b>0,WTX+b⩽0
目标检测的核心
目标检测是分类问题的一个推广,在基于卷积网络的目标检测上是显然的且很容易被证明。
比如在图1中我们先将最高层Layer_3N 去除,让每个格点输出物体的类别及其概率,简单的取格点对应的图像中心区域作为边界框(Bounding Boxes, bbox,本文使用[x,y,w,h]格式),通过简单的bbox IoU(Intersection Over Union,交并比) 分配策略就能训练出一个目标检测模型。理想情况下,蓝绿色格点预测的Dog概率最大,bbox为[0,2,3,3],红色格点预测的Bike概率最大,其bbox为[1,1,3,3]。且通过良好的模型结构设计及更密集的格点去预测,对bbox 的预测并不是必需的,可以通过特征格点的位置直接映射到图像位置。
![](https://i-blog.csdnimg.cn/blog_migrate/80f2c10f008a3a53b0ac06dba04e18e6.png)
如上图,YOLOv1就是类似以上描述的算法,最后的输出为 S × S S\times S S×S 的预测格点,算法增加了bbox的预测,换句话说即使没有bbox的预测也能根据感受野特征格点的输出概率分布找到物体位置,只是精度会差一些,其bbox的预测中(x,y)是关于当前格点感知图像范围的,而(w,h)是关于整张图像的,整体来说YOLOv1的算法比较简单,其设计基本遵循了CNN的感知原理。缺陷也很明显,小物体检测比较差,且对重叠比较大的物体容易漏检,对(w,h)的预测未遵循CNN的局部感知特性。
锚定框 Anchor
Anchor在目标检测中最早是Faster-RNN引入的概念,Anchor即是在每个滑动窗口上预设不同大小和比例的框,Faster-RNN的Anchor和YOLOv2后的系列不同,是通过区域提议网络(Region Proposal Network,RPN)来实现的,类比在YOLOv1上就是 S × S S\times S S×S的每一个格点,预设了不同大小(scales, s s s)和比例(aspect ratios, r r r)的框,其输出就变为了 S × S × N × ( 5 + C ) S\times S\times N\times(5+C) S×S×N×(5+C),这里 N N N为Anchor数量
Anchor宽高的计算( a a a为格点对应图像感受野面积):
h
=
s
×
a
×
r
h = s\times\sqrt{a\times r}
h=s×a×r
w
=
h
÷
r
w =h\div r
w=h÷r
举例,在图1中的蓝绿色格点我们设置2个Anchor,分别为:
s
=
1
,
r
=
1
s=1,r=1
s=1,r=1在 Layer_N 上就是
3
×
3
3\times3
3×3 的框,红框;
s
=
1
,
r
=
3
s=1,r=3
s=1,r=3在 Layer_N 上就是
1
×
3
1\times3
1×3 的框,绿框;
很显然,绿框比红框更能表示Dog的bbox,绿框和真实bbox的IoU更接近 1 1 1,当然也就能够更精确的检测目标,换句话说Anchor就是预设了模型必须预测在这个设定区域的目标概率与bbox,也即我们常说的注意力机制(Attention),Anchor还有一个作用就是在局部子网络的感受野中设置预测区,预测区外的区域即是上下文区域,而上下文能更好的增加模型性能。那么Anchor是必须的吗?和先前说的同理,可以通过良好的模型结构设计及更密集的格点来实现,Anchor其实也不是必需的。比如,我们可以设计使用 1 × 3 1\times3 1×3 的卷积核来得到预测格点,即 图1右侧 Layer_2NX 所示,绿色格点也能很好的表示目标区域。
无Anchor的模型
![](https://i-blog.csdnimg.cn/blog_migrate/87e1ad1e40ea263fd866df51d0bac431.png)
YOLOv1也是无Anchor模型,在FCOS及之后的模型基本有证明了无Anchor模型也能达到及超过有Anchor模型,当然FCOS会更多的利用特征金字塔,即如上所说的良好的模型结构设计及更密集的格点来实现,所以FCOS及其他无Anchor的模型的成功也说明了Anchor并非必须。
基于Attention的模型
我们知道Anchor其实就是预设的Attention,所以基于Attention的目标检测也是自然而然的事情,随着transformer技术的发展后面很多基于Attention的模型都使用了transformer,如:DETR等,这里后面再展开讲了。
小结
总结来说就是,bbox 和Anchor 都不是必须的,剔除这些漂亮且复杂的装饰,我们能看到目标检测的核心仍然是分类问题,或者说叫位置相关的分类问题。
图像金字塔 vs 特征金子塔
在早期的目标检测中,更多的使用图像金字塔(Image Pyramid)去搜索目标,这个很符合直觉,比如固定算法输入[36x36]的尺度,在模型输入尺度不变的前提下,图像中任意的大于该尺度的目标总能通过图像金子塔缩放到这个尺度,也即任意比该尺度大的目标都能被该模型分类,考虑到模型对输入尺度不一定有不变性,如果不放大图像,模型不一定能分类比[36x36]太小的目标,这时该算法有一个最小可检测目标。后来随着神经网络模型的发展,也自然而然的产生了基于图像金字塔与卷积网络的模型,如:DenseBox,Cascade CNN等。
![](https://i-blog.csdnimg.cn/blog_migrate/00c2b034d3b02a98f4c759ca7d214628.png)
在卷积网络中特征金字塔能更好的共享计算,特征金子塔和图像金子塔的原理是一致的,大的目标需要被缩小后才容易被检测到,对应到高层小尺度的特征金子塔层,而小物体的检测更加依赖于大尺度的偏底层特征金字塔层,但是在卷积网络中因为感受野的原因,小目标对应的特征金字塔层缺少全局的视野,也由于小目标广泛的模糊,纹理缺失等成为目标检测的难点。
总的来说基于特征金字塔这种原理,小目标和大目标在不同的层次上去检测,容易给人割裂感。Faster-RCNN 系列这种在同一层去检测不同大小的目标相对更符合人类直觉。但是两者都是有缺陷的,或者说可能是卷积网络带来的,即多个子网络构成的网络的位置相关性及独立性,对上下文感知或物体间、物体与场景间关系表示会比较弱。所以物体检测算法改进仍然还有很多空间。
卷积网络的分形特征
分形(Fractal)是大自然中广泛存在的特征,如树,树叶,花椰菜,雪花等等都具有这种特征,值得说的是,我们的大脑也具有这种特征,其主要表现为不同尺度下具有自相似的结构,换句话说,较小的分支通过放大适当的比例后可以得到与整体几乎完全一致的结构,也即沿着分支不断放大,得到的结构与主体是一致的,所以理论上具有分形特征的物体具有无限的细节。
![](https://i-blog.csdnimg.cn/blog_migrate/4ff13fa99389f138a9da3072d277d4d1.jpeg)
卷积网络有一个非常有意思的特征是分形特征,以前总希望找到一种和大脑相似结构的模型,现在看来好像不用找了。
如图1是一个主体结构,即 [5x5]>>[3x3]>>[1x1] 的结构,其实可以将任意一个格子用这个主体结构代替,但是因为这个结构替换由上往下会比较复杂,这里简单将最下层的[5x5]中每个格点用该结构替换,替换后变为了 [25x25]>>[15x15] >>[5x5]>>[3x3]>>[1x1] 的结构,但是这个结构 [25x25]>>[15x15] 没有考虑特征共享的问题,特征共享后我们可以得到这样的结构:[9x9]>>[7x7]>>[5x5]>>[3x3]>>[1x1],可能你也看出来了这个就是使用卷积核kernel=[3x3]和stride=1的结果,所以卷积网络是具有分形特征的,即该网络与主体网络自相似,且从任意特征格点开始都能提出一个从该特征点到其感受关联的下N层特征层的独立网络。这种分形结构的设计是很巧妙的,这个结构也很好的契合了我们大脑里面的结构。其实我们也看出来了,在其他网络里面,如:多层感知机也有这样的结构,但是没有卷积网络这么巧妙。
但是遗憾的是对这种神经网络的分形结构的研究比较少。更多的是提出像FractalNet和Fractal Neural Network这类模型,其实是没有理解到卷积网络本身就蕴含这样一个特性。
参考
- You Only Look Once: Unified, Real-Time Object Detection
- Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
- YOLO9000: Better, Faster, Stronger
- SSD: Single Shot MultiBox Detector
- FCOS: Fully Convolutional One-Stage Object Detection
- DenseBox: Unifying Landmark Localization with End to End Object Detection
- A Convolutional Neural Network Cascade for Face Detection
- End-to-End Object Detection with Transformers
- Is Your Brain Fractal?
- FractalNet: Ultra-Deep Neural Networks without Residuals
- Fractal Neural Network: A new ensemble of fractal geometry and convolutional neural networks for the classification of histology images
- maskrcnn-benchmark - anchor_generator
- Finding Tiny Faces