【原创】Fast R-CNN详解
Fast R-CNN详解
Fast R-CNN的改进
Fast R-CNN相较于R-CNN来说改进了以下三点:
1.基本实现了模型的end-to-end(除了还是需要用Selctive Search来生成2K个候选区域外)。
2.不在将每个候选区域放入CNN中计算特征,而是直接输入原图得到原图的全部特征(只进行一次CNN)。
3.将候选框的回归和分类问题同时进行输出,而不需要分别训练SVM和回归器。
Fast R-CNN的基本框架
Fast-RCNN依旧基于VGG16,首先输入的图片resize为224*224后放入CNN网络提取特征(5个卷积层和2个降采样层)
VGG16网络结构:
作者在第五个卷积层提取特征,并加上Selective Search产生的2K个ROI,通过ROI pooling层将这些ROI调整为固定维度,再通过两个output都是4096的全连接层后,将输出分为分类和回归两块,在分类模块中,输出通过一个output为21的全连接层(21表示20个类和一个背景)和一个softmax层,在回归模块中,输出通过一个output为48的全连接层(48表示各个类别region proposal的四个坐标)和SmoothL1Loss层。
问题
1.在RCNN中我们使用Selective Search在原图中获取ROI,并通过CNN提取特征,在Fast R-CNN中我们先将原图通过CNN提取特征,那么如何在feature map中获取ROI的对应区域?
2.如何将不同维度的ROI转换为相同维度?
解答1
,其中⌊⌋为向下取整符号,为feature map中ROI的横坐标,x为原图中ROI的横坐标,S是convs中所有的strides的乘积,通过如上转换可以在feature map中找到ROI的坐标位置。
图片来源
比如在上图中ZF-5中,S=222*2=16,对于Overfeat-5/7就是S=12,需要注意的是Strides包含了池化、卷积的stride。
因此我们输入原图从而得到了ROI后,可以得到每个ROI的四个点,再根据公式:
左、上点:
右、下点:
就可以得到在feature map中ROI的位置。
解答2
在我们得到feature map中ROI位置后,我们再经过ROI pooling层将特征转变为固定大小。
Fast R-CNN中的ROI pooling层将输入的feature map中大小为的ROI分割成个大小为的sub-windows,然后对每个sub-windows进行max-pooling操作,于是不论输入的ROI大小为多少,经过ROI pooling层后,其大小将变成(文中作者的H和W都设为7)。此时可以将ROI的特征输出全连接层。
全连接层
我们在得到固定大小的ROI的特征输出后将其放入全连接层进行计算,这里作者不再使用SVM和回归器作为分类和回归region proposal的方式,而是将regressor放进网络一起训练,每个类别对应一个regressor,同时用softmax代替原来的SVM分类器,从而进行end-to-end的训练(个人认为end-to-end的训练有助于卷积层能力和回归于分类层能力相互提高)。
损失函数分为分类的损失函数和bbox回归的损失函数,回归损失函数:
回归的输出是一个四元组,分别为,其中u表示类别,表示ground true。
最后将分类的loss和回归的loss整合在一起,作者将设为1。
训练
在fine-tuning中,每个min-batch都选取随机两张图像和128个region proposal,其中每个图像都有64个ROI,然后从这些ROI中挑选约25%的ROI,这些ROI和ground truth的IOU值都大于0.5,剩余的ROI都在区间[0.1,0.5)中采样,并将u标记为0(背景)。另外只采用随机水平翻转的方式增加数据集(50%概率水平翻转)。
测试
前面和训练差不多,测试中对每个类型采用NMS算法,得到最终结果。
SVD加速
详见下一篇博文(占个坑)
总结
Fast R-CNN在很大程度上实现了end-to-end(除了生成2K个候选区域的Selective Search算法),并通过只进行一次卷积运算、使用SVD加速全连接层等大大提高了运算效率,但同时Selective Search算法依旧使得Fast R-CNN的运行时间很长,这也是后续Faster RCNN的改进方向之一。