R-CNN最大的贡献为将CNN引入目标检测领域,进行目标提取。
RCNN算法分为4个步骤。
候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search 方法)
特征提取: 对每个候选区域,使用CNN提取特征
类别判断: CNN最后一层FC特征送入每一类的SVM 分类器,进行二分类判断是否属于该类
位置精修: 使用回归器精细修正候选框位置
image.png
1 候选区域生成
R-CNN使用Selective Search对每张图像生成1k-2k推荐区域。
image.png
Selective Search主体思想为基于过分割方法,产生图像初始区域,使用贪心算法对区域进行迭代分组:
- 1 计算所有邻近区域之间的相似性;
- 2 两个最相似的区域被组合在一起;
- 3 计算合并区域和相邻区域的相似度;
*4 重复2、3过程,直到整个图像变为一个地区。
每次迭代,将合并区域的Bounding box坐标添加到推荐区域中。
为了保证分割多样性,提升由分割得到的Bounding box的多样性,区域合并规则考虑了颜色、纹理、尺度、形状四种相似性比较方法。
经过迭代最终对每张图片生成1k-2k推荐框。
2 特征提取
2.1 reseize
以Alexnet作为特征提取网络。该部分作用为对区域推荐方法推荐的2k区域提取特征。用于后续的svm分类。
Alexnet结果如下图,输入为227*227, f6、f7的神经元个数都是4096,对于每张输入区域裁剪图片,网络最后提取特征得到一个4096维的特征向量。
image.png
由于CNN输入需要固定尺寸,需要将2k推荐区域缩放成固定尺寸,有两种缩放方法:各向异性缩放(相当于直接resize,不考虑长宽比,会造成目标变形扭曲)(上图),各项同性缩放(可以先扩充后裁剪也可以先裁剪后扩充)(下图)。
image.png
最终采用各向异性缩放+padding=16的缩放形式将原始推荐区域裁剪成固定尺寸。
2.2 CNN的训练过程
image.pngCNN训练的作用就是提取特征输出为fc7的4096维特征向量用于分类。由于目标任务数据量可能较小,直接训练易造成收敛困难的问题,故采用预训练+fine-tuning方法。CNN先在Imagenet训练,然后在目标数据集上以每张图像生成的2k个区域作为输入,进行fine-tuning。fine-tuning时,前面网络参数均固定,只改变最后softmax层的维度,将原始imagenet的1000修改为目标任务类别+1(如VOC任务20+1=21).
- 有一个点未弄清楚,这里具体固定哪些层,对哪些层进行finetuning不确定,有的文章说说conv+所有fc均固定,仅训练softmax,那样训练完提取fc7的体征与就是原始在imagenet训练的CNN的参数,训练就没有意义了。应该是要对fc6及fc7的参数进行调参。
CNN训练需要需要label,CNN输入为每张图像的2k个推荐区域图像,其label定义为正负样本,规定,iou>0.5是该类别的正样本(20类正样本),iou<0.5是该类别的负样本(1类背景负样本)。
3.SVM分类训练
将CNN f7层特征被提取出来,为每个物体类别训练一个svm分类器。CNN提取2K个候选框,可以得到20004096这样的特征向量矩阵,把这样的一个矩阵与svm权值矩阵4096N点乘(N为分类类别数目,因为我们训练的N个svm,每个svm包含了4096个权值w),就可以得到结果了。
SVM训练过程正负样本定义推荐区域与bounding box IOU>0.7为正样本,否则为负样本。
- 解惑。CNN中使用softmax进行分类可起到同样效果,为什么需要单独训练一个SVM.
因为CNN中正负样本的定义比较宽泛,需要在特征提取与分类性能间做权衡。SVM只用于样本分类,正负样本定义较严格,直接使用CNN的softmax性能不如SVM。
4 位置精修
回归器:对每一类目标,使用一个线性脊回归器进行精修。正则项λ=10000。 输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。 训练样本:判定为本类的候选框中和真值重叠面积大于0.6的候选框。
5 测试阶段
使用selectivesearch 对输入图像生成2k推荐区域---每个区域resize成227*227---CNN提取特征---对于每个类别,使用这类的SVM对特征向量打分,得到所有区域对于这一类别的分数,使用NMS去除冗余框,得到bounding-box,再进行位置精修。