本文参考自
第八章_目标检测.md
Two stage目标检测算法:
先进行区域生成(region proposal,RP)(一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。
任务:特征提取—>生成RP—>分类/定位回归。
常见的two stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。
一、目标追踪
-
分类
-
分类+位置
-
多目标检测
-
图像分割
二、R-CNN
R-CNN简要步骤:
-
输入测试图像
-
利用选择性搜索Selective Search算法在图像中从下到上提取2000个左右的可能包含物体的候选区域(Region Proposal)
-
因为取出的区域大小各自不同,所以需要将每个 Region Proposal 缩放 (warp) 成统一的227×227的大小并输入到CNN,将CNN的fc7层的输出作为特征
-
将每个Region Proposal提取到的CNN特征输入到SVM进行分类
三、SPP-Net
参考文章:
【目标检测】SPPnet论文详解
1.SPP-Net特点
-
网络的输入图片可以是任意尺寸
-
深度卷积神经网络的基础结构分为:卷积层(conv layers)→池化层(pooling layers)→全连接层(fc layers)
-
我们在设计网络的时候,全连接层的输入维数必须提前固定。从全连接层往前推的话,就必须保持第一层卷积的输入尺寸是固定的,例如224×224(ImageNet)、32×32(LenNet)等。这也就要求我们在检测图片时,需要将图片经过crop(裁剪)、warp(拉伸)等操作把图片变换成固定尺寸,才能输入神经网络。这些操作在一定程度上会导致图片信息的丢失或者变形。
对此SPPnet提出的解决方案是在最后一层卷积层后用空间金字塔池化层(Spatial Pyramid Pooling)代替普通池化层。
2.空间金字塔池化(SPP)
-
论文中举例:把卷积操作之后的特征图(feature maps),以不同大小的块(池化框)来提取特征,分别是4×4,2×2,1×1,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的块(Spatial Bins),我们从这21个块中,每个块提取出一个特征(提取方式有平均池化、最大池化等),这样就得到了固定的21维特征向量。
-
以不同的大小格子的组合方式来池化的过程就是空间金字塔池化。
-
这么一来,我们只要设计m个n×n大小的网格就可以生成任意维数的特征向量,而不需要在意经过多层卷积操作后的特征图的大小是多少,这也意味着我们不需要在意网络输入的图片尺寸。
-
使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量)
3.SPP-Net过程
-
首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。
-
特征提取阶段:这一步就是和R-CNN最大的区别了,这一步骤的具体操作如下:
-
把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps
-
然后在feature maps中找到各个候选框的区域
-
再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。
而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。
-
-
最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别
四、Fast R-CNN
参考文章:
【目标检测】Fast R-CNN论文详解
相比R-CNN最大的区别,在于RoI池化层和全连接层中目标分类与检测框回归微调的统一。
1.Fast R-CNN解决R-CNN的三个问题
-
测试速度慢
R-CNN中用CNN对每一个候选区域反复提取特征,而一张图片的2000个候选区域之间有大量重叠部分,这一设定造成特征提取操作浪费大量计算。
Fast R-CNN将整个图像归一化后直接送入CNN网络,卷积层不进行候选区的特征提取,而是在最后一个池化层加入候选区域坐标信息,进行特征提取的计算。
-
训练速度慢
同测试速度慢理由
-
训练所需空间大
R-CNN中目标分类与候选框的回归是独立的两个操作,并且需要大量特征作为训练样本。
Fast R-CNN将目标分类与候选框回归统一到CNN网络中来,不需要额外存储特征。
2.Fast R-CNN的网络结构
-
RoI池化层
RoI池化层去掉了SPP的多尺度池化,直接用M×N的网格,将每个候选区域均匀分成M×N块,对每个块进行max pooling。从而将特征图上大小不一的候选区域转变为大小统一的特征向量,送入下一层。
什么是RoI呢?
RoI是Region of Interest的简写,一般是指图像上的区域框,但这里指的是由Selective Search提取的候选框。
往往经过RPN后输出的不止一个矩形框,所以这里我们是对多个RoI进行Pooling。
RoI Pooling的输入
输入有两部分组成:
1. 特征图(feature map):指的是上面所示的特征图,在Fast RCNN中,它位于RoI Pooling之前,在Faster RCNN中,它是与RPN共享那个特征图,通常我们常常称之为“share_conv”
2. RoIs,其表示所有RoI的N*5的矩阵。其中N表示RoI的数量,第一列表示图像index,其余四列表示其余的左上角和右下角坐标。
在Fast RCNN中,指的是Selective Search的输出;在Faster RCNN中指的是RPN的输出,一堆矩形候选框,形状为1×5×1×1(4个坐标+索引index),其中值得注意的是:坐标的参考系不是针对feature map这张图的,而是针对原图的(神经网络最开始的输入)。其实关于ROI的坐标理解一直很混乱,到底是根据谁的坐标来。其实很好理解,我们已知原图的大小和由Selective Search算法提取的候选框坐标,那么根据”映射关系”可以得出特征图(featurwe map)的大小和候选框在feature map上的映射坐标。至于如何计算,其实就是比值问题,下面会介绍。所以这里把ROI理解为原图上各个候选框(region proposals),也是可以的。
注:说句题外话,由Selective Search算法提取的一系列可能含有object的bounding box,这些通常称为region proposals或者region of interest(ROI)。
RoI的具体操作
1. 根据输入image,将ROI映射到feature map对应位置
注:映射规则比较简单,就是把各个坐标除以“输入图片与feature map的大小的比值”,得到了feature map上的box坐标
2. 将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同)
3. 对每个sections进行max pooling操作
这样我们就可以从不同大小的方框得到固定大小的相应 的feature maps。值得一提的是,输出的feature maps的大小不取决于ROI和卷积feature maps大小。RoI Pooling 最大的好处就在于极大地提高了处理速度。
RoI Pooling的输出
输出是batch个vector,其中batch的值等于RoI的个数,vector的大小为channel×w×h;RoI Pooling的过程就是将一个个大小不同的box矩形框,都映射成大小固定(w×h)的矩形框。
RoI Pooling示例
-
特征提取方式
Fast R-CNN在特征提取上可以说很大程度借鉴了SPPnet,首先将图片用选择搜索算法(selective search)得到2000个候选区域(region proposals)的坐标信息。
另一方面,直接将图片归一化到CNN需要的格式,整张图片送入CNN,将第五层的普通池化层替换为RoI池化层,图片然后经过5层卷积操作后,得到一张特征图(feature maps),开始得到的坐标信息通过一定的映射关系转换为对应特征图的坐标,截取对应的候选区域,经过RoI层后提取到固定长度的特征向量,送入全连接层。
-
联合候选框回归与目标分类的全连接
层
在R-CNN中的流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression进行候选框的微调;Fast R-CNN则是将候选框目标分类与bbox regression并列放入全连接层,形成一个multi-task模型。
cls_ score层用于分类,输出K+1维数组p,表示属于K类和背景的概率。 bbox_predict层用于调整候选区域位置,输出4×K维数组t,表示分别属于K类时,应该平移缩放的参数。
五、Faster R-CNN
参考文章:
一文读懂Faster RCNN
1.Faster R-CNN基本结构
Faster RCNN其实可以分为4个主要内容:
-
Conv layers:作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层
Conv layers包含了conv,pooling,relu三种层
Faster RCNN Conv layers中对所有的卷积都做了扩边处理( pad=1,即填充一圈0),导致原图变为 (M+2)×(N+2)大小,再做3×3卷积后输出M×N 。正是这种设置,导致Conv layers中的conv层不改变输入和输出矩阵大小,如上图
-
Region Proposal Networks:RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals
根据上图可以看出RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已!
RPN网络结构总结起来就是:
生成anchors → softmax分类器提取positvie anchors→ bbox reg回归positive anchors → Proposal Layer生成proposals
-
Roi Pooling:该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别
从图络结构图中可以看到Rol pooling层有2个输入:
-
原始的feature maps
-
RPN输出的proposal boxes(大小各不相同)
-
-
Classification:利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置
六、R-FCN
参考文章:
R-FCN论文详解
1.创新点
-
采用全卷积(Fully Convolutional),主干网络为Res-Net101
-
采用位置敏感得分图(position-sentive score maps)
2.R-FCN整体流程
R-FCN主要包括4个部分:Conv layers(ResNet)、Region Proposal Network(RPN)、Classification、Regression。而整个R-FCN的流程如下:
-
首先输入一张图片,图片要经过resize使得图片的短边的长度为600。
-
然后图片先经过ResNet-101来提取特征,ResNet-101主要包括5个卷积网络块。
-
其中conv4的输出作为RPN的输入,和Faster R-CNN相同,这个RPN是用来提取proposal的,即提取出RoIs。
-
同时,ResNet-101的conv5输出因为是2048-d的,所以又加了一个新的new conv来降低channel的维度,输出的维度为1024-d。
-
然后这个1024-d的feature map再输入两个平行的conv layer中,一个用来classification,另一个用来regression。
-
对于classification的conv layer会产生一个
k2
(
c
+
1
)
k^2(c+1)
k
2
(
c
+
1
)
维的position-sensitive score map,然后再结合RPN提取的RoIs进行pooling,之后再为每个RoI得到分类结果。
-
而对于regression的conv layer则会产生一个
4k
2
4k^2
4
k
2
维的position sensitive score map,然后也同样结合RPN提取的RoIs进行pooling,之后再为每个RoI得到回归结果。
3.selective pooling
我们将方块分成9个部分,由此创建了9个特征图,每个用来检测对应的目标区域。这些特征图叫做位置敏感得分图(position-sensitive score map),因为每个图检测目标的子区域(计算其得分)。
下图中红色虚线矩形是建议的ROI。我们将其分割成3×3个区域,并询问每个区域包含目标对应部分的概率是多少。例如,左上角ROI区域包含左眼的概率。我们将结果存储成3×3 vote数组,如下图(右)所示。例如,vote_array[0][0]包含左上角区域是否包含目标对应部分的得分。
将ROI应用到特征图上,输出一个3×3数组。将得分图和ROI映射到vote数组的过程叫做位置敏感ROI池化(position-sensitive ROI-pool)。该过程与前面讨论过的ROI池化非常接近。
将ROI的一部分叠加到对应的得分图上,计算V[i][j]。在计算出位置敏感ROI池化的所有值后,类别得分是其所有元素得分的平均值。
假如我们有C个类别要检测。我们将其扩展为C+1个类别,这样就为背景(非目标)增加了一个新的类别。每个类别有3×3个得分图,因此一共有(C+1)×3×3个得分图。使用每个类别的得分图可以预测出该类别的类别得分。然后我们对这些得分应用 softmax 函数,计算出每个类别的概率。以下是数据流图,在本案例中,k=3。
七、FPN(特征金字塔网络)
1.创新点
-
多层特征
-
特征融合
-
解决了目标检测中的多尺度问题,通过简单的网络连接改变,在基本不增加原有模型计算量的情况下,大幅度提升小物体(small object)检测的性能
2.网络结构图
这种网络结构,能够在增加较少计算量的前提下融合低分辨率语义信息较强的特征图和高分辨率语义信息较弱但空间信息丰富的特征图。
3.组成模块
(1)Bottom-up pathway(自底向上线路)
(2)Lareral connections(横向链接)
(3)Top-down path(自顶向下线路)
-
Bottom-up pathway
前馈Backbone的一部分,backbone是ResNet-101。
Bottom-up可以理解为自底向上,Top-down可以理解为自顶向下。这里的下是指low-level,上是指high-level,分别对应于提取的低级(浅层)特征和高级语义(高层)特征。
Bottom-up pathway 是卷积网络的前向传播过程。在前向传播过程中,feature map的大小可以在某些层发生改变。一些尺度(scale)因子为2,所以后一层feature map的大小是前一层feature map大小的二分之一,根据此关系进而构成了feature pyramid(hierarchy)。
然而还有很多层输出的feature map是一样的大小(即不进行缩放的卷积),作者将这些层归为同一 stage。对于feature pyramid,作者为每个stage定义一个pyramid level。
作者将每个stage的最后一层的输出作为feature map,然后不同stage进行同一操作,便构成了feature pyramid。
具体来说,对于ResNets-101,作者使用了每个stage的最后一个残差结构的特征激活输出。将这些残差模块输出表示为{C2, C3, C4, C5},对应于conv2,conv3,conv4和conv5的输出,并且注意它们相对于输入图像具有{4, 8, 16, 32}像素的步长。考虑到内存占用,没有将conv1包含在金字塔中。
-
Top-down pathway and lateral connections
Top-town pathway是上采样(upsampling)过程。而later connection(横向连接)是将上采样的结果和bottom-up pathway生成的相同大小的feature map进行融合(merge)。
注:上采样尺度因子为2,因为为了和之前下采样卷积的尺度因子等于2一样。上采样是放大,下采样是缩小。
上采样的方法是最近邻插值法:
具体操作如下图所示,上采样(2x up)feature map与相同大小的bottom-up feature map进行逐像素相加融合(element-wise addition),其中bottom-up feature先要经过1×1卷积层,目的是为了减少通道维度(reduce channel dimensions)。
注:减少通道维度是为了将bottom-up feature map的通道数量与top-down feature map的通道数量保持一致,又因为两者feature map大小一致,所以可以进行对应位置像素的叠加(element-wise addition)。
八、Mask R-CNN
Mask R-CNN是一个实例分割(Instance segmentation)算法,主要是在目标检测的基础上再进行分割。Mask R-CNN算法主要是Faster R-CNN+FCN,更具体一点就是ResNeXt+RPN+RoI Align+Fast R-CNN+FCN。
即在Faster R-CNN的基础上添加了一个预测分割mask的分支,如上图所示。其中黑色部分为原来的Faster-RCNN,红色部分为在Faster-RCNN网络上的修改。将RoI Pooling 层替换成了RoIAlign层;添加了并列的FCN层(mask层)。
1.创新点
-
Backbone:ResNeXt-101+FPN
-
RoI Align替换RoI Pooling
2.Mask R-CNN算法步骤
-
输入一幅你想处理的图片,然后进行对应的预处理操作,或者预处理后的图片;
-
将其输入到一个预训练好的神经网络中(ResNeXt等)获得对应的feature map;
-
对这个feature map中的每一点设定预定个的RoI,从而获得多个候选RoI;
-
将这些候选的RoI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的RoI;
-
对这些剩下的RoI进行RoI Align操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);
-
对这些RoI进行分类(N类别分类)、BB回归和MASK生成(在每一个RoI里面进行FCN操作)。
3.RoI Pooling和RoI Align的不同
ROI Align 是在Mask-RCNN中提出的一种区域特征聚集方式,很好地解决了RoI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。实验显示,在检测测任务中将 RoI Pooling 替换为 RoI Align 可以提升检测模型的准确性。
在常见的两级检测框架(比如Fast-RCNN,Faster-RCNN,RFCN)中,RoI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故RoI Pooling这一操作存在两次量化的过程。
-
将候选框边界量化为整数点坐标值。
-
将量化后的边界区域平均分割成
k×
k
k\times k
k
×
k
个单元(bin),对每一个单元的边界进行量化。
事实上,经过上述两次量化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为“不匹配问题(misalignment)”。
下面我们用直观的例子具体分析一下上述区域不匹配问题。如下图所示,这是一个Faster-RCNN检测框架。输入一张
800
×
800
800\times 800
8
0
0
×
8
0
0
的图片,图片上有一个
665
×
665
665\times 665
6
6
5
×
6
6
5
的包围框(框着一只狗)。图片经过主干网络提取特征后,特征图缩放步长(stride)为32。因此,图像和包围框的边长都是输入时的1/32。800正好可以被32整除变为25。但665除以32以后得到20.78,带有小数,于是RoI Pooling 直接将它量化成20。接下来需要把框内的特征池化
7
×
7
7\times 7
7
×
7
的大小,因此将上述包围框平均分割成
7
×
7
7\times 7
7
×
7
个矩形区域。显然,每个矩形区域的边长为2.86,又含有小数。于是ROI Pooling 再次把它量化到2。经过这两次量化,候选区域已经出现了较明显的偏差(如图中绿色部分所示)。更重要的是,该层特征图上0.1个像素的偏差,缩放到原图就是3.2个像素。那么0.8的偏差,在原图上就是接近30个像素点的差别,这一差别不容小觑。
为了解决RoI Pooling的上述缺点,作者提出了RoI Align这一改进的方法(如图2)。
RoI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。值得注意的是,在具体的算法操作上,RoI Align并不是简单地补充出候选区域边界上的坐标点,然后将这些坐标点进行池化,而是重新设计了一套比较优雅的流程,如下图所示:
1. 遍历每一个候选区域,保持浮点数边界不做量化。
2. 将候选区域分割成
k
×
k
k\times k
k
×
k
个单元,每个单元的边界也不做量化。
3. 在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。
这里对上述步骤的第三点作一些说明:这个固定位置是指在每一个矩形单元(bin)中按照固定规则确定的位置。比如,如果采样点数是1,那么就是这个单元的中心点。如果采样点数是4,那么就是把这个单元平均分割成四个小方块以后它们分别的中心点。显然这些采样点的坐标通常是浮点数,所以需要使用插值的方法得到它的像素值。在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,RoI Align 在遍历取样点的数量上没有RoI Pooling那么多,但却可以获得更好的性能,这主要归功于解决了mis alignment的问题。值得一提的是,我在实验时发现,RoI Align在VOC 2007数据集上的提升效果并不如在COCO上明显。经过分析,造成这种区别的原因是COCO上小目标的数量更多,而小目标受mis alignment问题的影响更大(比如,同样是0.5个像素点的偏差,对于较大的目标而言显得微不足道,但是对于小目标,误差的影响就要高很多)。