目标检测的问题,就是在给定的图片中找到物体的位置,并标明物体的类别。
通过卷积神经网络CNN,我们可以完成图像识别,即分类任务,然后我们需要通过一些额外的功能完成定位任务,即找到上图中方框在图像中的位置
(
x
,
y
,
w
,
h
)
(x,y,w,h)
(x,y,w,h)。
目前目标检测的研究路线如下,相关论文在这里可以找到,在这里我们选取部分论文来解释一下。
步骤1:训练一个分类模型(比如AlexNet);
步骤2:对该模型进行fine-tuning;
步骤3:用selective search提取图像的候选框,修正区域大小输入到CNN,将输出结果存入硬盘;
步骤4:训练一个SVM分类器判别物体类别;
步骤5:使用回归器修正候选框位置。
SPP:Spatial Pyramid Pooling(空间金字塔池化)
步骤1:首先通过selective search,对待检测的图片进行搜索出2000个候选窗口;
步骤2:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用SPP池化,提取出固定长度的特征向量;
步骤3:最后采用SVM算法进行特征向量分类识别。
主要特点:
1.实现了CNN的多尺度输入
如下图所示,在卷积层和全连接层之间加入SPP层,对于任意输入,SPP层中的每一个池化的卷积核会根据输入调整大小,因此SPP层的输出尺度始终是固定的。
2.只对原图进行一次卷积
在R-CNN中,每个候选框都要resize到统一大小再输入到CNN中,要耗费很多时间,而SPP Net对原图只进行一次卷积得到feature map,然后找到每个候选框在feature map上的映射,将其作为卷积特征输入到SPP层。这样可以节省大量的计算时间,比R-CNN有一百倍左右的提速。
R-CNN使用selective search提取bounding box作为输入,但是在对所有区域进行特征提取时会有重复计算,导致R-CNN有严重的速度瓶颈。
Fast R-CNN提出一种可以看作单层SPP Net的网络层,叫ROI Pooling,它可以把不同大小的输入映射到一个固定尺度的特征向量。
ROI Pooling采用的是SPP的思路,但是实现方式不同,只使用了一层金字塔。下面是ROI Pooling的网络参数:
layer {
name: “roi_pool5”
type: “ROIPooling”
bottom: “conv5_3”
bottom: “rois”
top: “pool5”
roi_pooling_param {
pooled_w: 7
pooled_h: 7
spatial_scale: 0.0625 # 1/16
}
仅使用了(pooled_w,pooled_h)这个尺度,来将得到的每一个特征图分成(pooled_w,pooled_h),然后对每一块进行max_pooling取值,最后得到一个n*7*7固定大小的特征图。
另外,Fast R-CNN将bounding box regression放入了神经网络内部,与分类一起组成一个multi-task模型。实际实验也证明,这两个任务能够共享卷积特征,并相互促进。
可见,Fast R-CNN相对于R-CNN的提速原因就在于,不像R-CNN把每个候选区域给CNN提特征,而是整张图提一次特征,再把候选框映射到conv5上,剩下的只需要在conv5层上操作就可以了。
Fast R-CNN使用selective search找出候选框,也非常耗时。Faster R-CNN提出一种全卷积神经网络叫做Region Proposal Network(RPN),用来提取region proposals。
步骤1:将整张图片输入CNN,进行特征提取;
步骤2:用RPN生成anchors,并对其进行筛选和标记,然后通过NMS剔除重叠的anchors,得到最终的region proposals,每张图片生成300个region proposals;
步骤3:把region proposals映射到CNN最后一层卷积的feature map上;
步骤4:通过ROI pooling使每个region proposal生成固定尺寸的feature map;
步骤5:使用softmax loss和smooth L1 loss对分类概率和边框回归进行联合训练。
RPN网络的结构如下图:
下图为Caffe版本的RPN网络图:
RPN的输入为原图片卷积之后得到的feature map,输出就是region proposals。
如何找到region proposals,就涉及到一个anchor的概念。在feature map上添加一个滑窗,即上图中的sliding window,在每个滑窗中假定可以最多找到 k k k个region proposals,这 k k k个region proposals可以被参数化为 k k k个相关的box,这就是anchors。anchors是由不同的尺度(scale)和长宽比(aspect ratio)得到。
通过anchors,RPN就可以得到region proposals的信息。这种方式产生的region proposal个数远少于selective search产生的个数,而且质量也有很大的提升。
Faster R-CNN包含四个损失函数:
• RPN calssification(anchor good.bad)
• RPN regression(anchor->proposal)
• Fast R-CNN classification(over classes)
• Fast R-CNN regression(proposal ->box)
训练时采用4步交替训练(4-step alternating training):
1. 单独训练RPN,得到RPN1,CNN1
2. 单独训练Fast R-CNN,结合第一步的region proposal,得到Fast R-CNN1,CNN2
3. fine-tune RPN1 on CNN2,得到RPN2(共享卷积层)
4. fine-tune Fast R-CNN1 on CNN2,结合第三步的region proposal,得到Fast R-CNN2(共享卷积层)