《Rich feature hierarchies for accurate object detection and semantic segmentation》阅读笔记
R-CNN:Regions with CNN features
CNN一般用于分类,而R-CNN则用于目标检测,这里摘取VOC(Visual Object Classes)数据集官网中的一段话,说明二者的区别:
Classification: For each of the twenty classes, predicting presence/absence of an example of that class in the test image.
Detection: Predicting the bounding box and label of each object from the twenty target classes in the test image.
文中作者也提到了二者的区别:“Unlike image classification, detection requires localizing (likely many) objects within an image. ”目标检测首先需要定位图片中的对象,然后给出对象的标签。分类只需要对每个类别依次判断该图片是否属于这个类别。
所以我个人认为目标检测比分类问题多了一个步骤,即给出对象可能出现的region proposal。过去解决定位问题有两种方法:
- 将定位过程看成回归问题,但是实际效果不是很好;
- .使用滑动窗口定位。但是Alexnet网络pool5层输出的特征图上的像素在输入图像上有很大的感受野(195 × 195 )和步长(32×32),会使得定位精度不高。
感受野(receptive fields)
感受野的定义
在卷积神经网络中,感受野的定义是 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。
感受野大小的计算
感受野计算时有下面的几个情况需要说明:
- 第一层卷积层的输出特征图像素的感受野的大小等于滤波器的大小;
- 深层卷积层的感受野大小和它之前所有层的滤波器大小和步长有关系;
- 计算感受野大小时,忽略了图像边缘的影响,即不考虑padding的大小。
关于感受野大小的计算采用top to down的方式, 即先计算最深层在前一层上的感受野,然后逐渐传递到第一层,使用的公式可以表示如下:
RF = 1 #待计算的feature map上的感受野大小
for layer in (top layer To down layer):
RF = ((RF -1)* stride) + fsize
stride 表示卷积的步长; fsize表示卷积层滤波器的大小。
步长的计算
这里的每一个卷积层还有一个strides的概念,这个strides是之前所有层stride的乘积。
strides(i) = stride(1) * stride(2) * ...* stride(i-1)
以上摘自:卷积神经网络物体检测之感受野大小计算
R-CNN以AlexNet为模型,计算感受野和步长时需要考虑conv层和pool层,即可验证“have very large receptive fields (195 × 195 pixels) and strides (32×32 pixels) in the input image”这句话。
模块设计
Extract Region proposals
使用selective search(选择性搜索)提取输入图片中对象可能出现的位置,即一组bounding box。关于选择性搜索可以参考 Selective Search for Object Recognition解读 。
Compute CNN features
对每个提取到的Region proposals使用CNN提取特征。由于每个Region的大小不一致,而CNN要求固定大小(227 × 227)的输入,因此需要warp region(利用插值进行图像变形)。在warping之前,将最紧密的包围盒扩大p个像素,使得变形后的图像块融入一些图像背景( Prior to warping, we dilate the tight bounding box so that at the warped size there are exactly p pixels of warped image context around the original box (we use p = 16))。
Classify regions
使用线性SVM进行分类。
Non-Maximum Suppression
该部分参考高效的非极大值抑制算法