前言
R-CNN(Reigions with CNN features)是老牌的目标检测算法,趁此机会一块总结下各个版本,R-CNN 2014 fast R-CNN 2015 faster R-CNN 2016,看看处理速度由慢变快都做了什么样的改进。
R-CNN
R-CNN的主要思路是:先提取出候选检测区域,再用CNN提取各个候选区域的特征,最后用分类器判别类别,用回归拟合边界。基本结构和步骤如下:
Region Proposal
生成目标检测的候选区域集合,方法见selective search(参考7),先将图片切分成小块,每两块中间计算相似度(有4种不同定义),再决定合并与否,逐层向上合并(分层分组算法)。候选域的抽取方法在R-CNN方法中占据着重要的位置,对目标的位置识别严重依赖这里,这种依赖持续到Fast R-CNN(只要将候选域抽取独立出来的,都有这种依赖,即便对目标边缘也做训练预测)。
Fine Tuning and Feature Extraction
Fine Tuning: CNN结构,5个Conv+2个FC+softmax,输入[227x227] RGB。预训练的分类模型,为适应当前的目标检测任务,需要在目标检测数据集上做微调。替换最后的softmax层为新的softmax(N+1)层,输出节点数量为:当前检测任务的所有物品类型N,再+1(背景也占一个节点)。
问题一:怎么标记目标检测时的物品类别?
对每个候选域,计算IOU,其中IOU>=0.5的则认为label是目标检测的标记类别。否则,则认为label=0。
问题二: CNN模型的输入尺寸是固定的,而候选域的尺寸是大小不一的。
将候选区域尺寸warp成固定尺寸。使用这些处理过的图像做输入,微调模型。
Feature Extraction: 借助CNN,对候选区域抽提取高维特征feature-map【第5层的pooling输出】。注意,这里使用的候选域仍然是上面的wrap之后的图像。这样就搞到了图像的高维表示,接下来可以拿来做分类判断和边缘预测了。
Linear Classifier and Bounding-box Regression
1) 上面处理得到的feature,每个类别都单独训练一个SVM分类器。
注意:这里的分类label,使用IOU>=0.3来做标记阈值。
2) 分类预测好了,边缘怎么预测呢?做回归训练。
并不是直接预测边缘值,而是经过一次转折,预测候选域与真实边缘的比例,这个比例的计算也是精心设计的。中心坐标值是线性的比例,长宽值是log的比例。
将目标的真实边缘与候选域的边缘比例确定出来,作为要拟合的值,关系如下:
将候选域的feature-map提取出来,通过线性加权后得到预测比例,以此比例值来拟合真实的比例值,对误差做平方和并做2阶正则约束,如下:
两个经验注意事项:;的选择很重要,选择候选域的IOU接近于1的来训练,而尽量避免那些小IOU的。
怎么预测
将图像抽取出候选域集合(M个域),wrap后,用CNN抽取feature-map,送到SVM分类器中判别,得到Mx(N+1)个判别结果,以及对应的Mx4个边缘(每个候选域自带的)。使用NMS,对每个类处理一遍留下最大可能的候选域,设定IOU阈值,选择图中最大可能的目标类别。候选域确定好了,边缘也就可以通过回归参数拟合出来了。
疑问:为什么不直接拿候选域在CNN中做分类呢?还要单独提取出feature-map,再单独训练SVM分类器。难道是CNN直接分类效果不好,必须要用多个二分类来解决多分类问题?还真是有可能,2014年的时候,GoogLeNet是该年ILSVRC冠军,top-5的误差是6.67%,付出了极为复杂的网络结构和高昂地计算代价。而本文作者借鉴的是2012年Alex Krizhevsky 的AlexNet,而2012年的Alex作为ILSVRC中的冠军,top-5的误差率是17%,top-1的误差率是37.5%。实际上是跟模型深度及联合训练方法都有关,后面的Fast R-CNN有介绍。
Fast R-CNN
Fast R-CNN的主要思路是,不管是图像还是图像中的目标区域,大家同时计算feature-map,然后经过尺寸折叠,统一来训练分类和拟合任务。通过多尺寸feature share compute(主要思路来自SPPNet)和混合loss的联合训练,来加快计算速度并缩减训练环节。
主要借鉴VGG16来初始化CNN,不同于第一代R-CNN借鉴AlexNet,两者什么区别呢?VGGNet更深,对特征的表达更充分,也为联合训练,将分类和回归合并到一起打下更坚实的基础。其实Fast R-CNN对AlexNet和另外版本的VGG也有试验,效果最好的还是VGG16。基本结构和步骤如下:
Share Compute
问题一:共享计算体现在哪里呢?
输入整张图 + 采样的目标区域,在提取feature-map时,是利用整张图的计算结果来提取。直接做分类和回归训练,来调整参数(不同于第一代是做微调,这里更强调是用来训练目标检测任务)。
问题二:目标区域在feature-map时,尺寸不一致怎么办呢?
加入了一个ROI pooling 层,将不同尺寸,压缩到固定尺寸。将输入[h,w]拆成[H, W]的grid(每个网格尺寸大小为[h/H, w/W]),然后做max-pooling,得到[H, W]的固定输出尺寸。
联合训练
不再单独将分类和区域位置独立训练,而是在CNN后面加两个平行的输出。一个是softmax(N+1)计算分类;一个是平方和的平滑误差计算位置(4XK)。单个目标区域的预测的结果包括:N+1个分类概率,N组边缘预测值,要拟合的目标值(与R-CNN中一样,但多了对真实比例值的标准化处理,很多时候将预测目标做(-1,1)或者(0,1)的范围压缩有益处)。是目标区域的类别标记,标记方法如步骤2所示。单训练样本的loss如下:
,注意是交叉熵;;
其中;刚好在背景时,不计算拟合loss。
拟合损失
其中
这个平滑函数是为了防止梯度爆炸的。
注意一:这里的是R-CNN里面的预测目标比例值,进一步作了标准化,零均值,1方差(降低学习难度,便于收敛)。
注意二: mini-batch的采样方法,克服了多张图片分别采样所带来的误差后传的在宽视野的检测训练时的低效性。缺点是收敛慢,但是不影响。
注意三:训练采样方法。
1. 每个batch,只有2张图片。
2. 每个图片随机采样64个目标区域。
3. 其中25%(16个)要采IOU>=0.5的目标区域,类别正常编号;其中75%(48个)要采IOU [0.1, 0.5)的目标区域,类别编号为0。
有意思的探索
作者在几个方面做了探索,值得了解下。
1. 用SVD分解来替换全连接层,加快计算速度约30%,并且无明显精度损失。
2. 多尺度训练与单一尺度训练,作者得出结论是多尺度并无卵用,但是仅在小网络结构上实验了,没在大网络结构上实验是因为内存受限。(值得注意的是YOLO就会收益于多尺度训练)
3. 哪些层更值得调整训练?作者对实验所用的网络都讨论了下对哪些层是有必要update的。对AlexNet是conv2及其更深层参数,都调整;对VGG_CNN_M_1024也是;对VGG16则是Conv3_1及其更深层参数。
4. 联合训练的实际提升比例,能提高mAP大约1%~3%,从论文的Tab 6里计算得到的。
5. 更多训练集是会提高模型性能的。
6. 用SVM做为当前模型的分类层,效果不如使用softmax做分类层。
7. 更多的候选域,不会对mAP指标有害,除了计算更多以外。
Faster R-CNN
看到这里,我们大体上也了解了R-CNN的进化之路,逐步将所有的单独的环节合并到一起,往end-to-end上更靠近。Fast R-CNN将分类和回归合并到CNN里面了,剩下的只有一个selective search环节了,那么有没有可能将候选域去掉呢?答案是Yes,Faster R-CNN就是将候选域的单独选择去掉了,将目标区域也作为了预测的一部分(RPN: Region Propoal Net),但是加以辅助手段”anchor box”。其训练基本步骤如下:
RPN
RPN(就是一个Fully Conv Net)用来学习生成目标候选区域,预测项包括是否含有物品,含有物品时的边界值。引入了anchor-boxes,来定义各种可能地形状。
注意一:
anchor-box只是一组共9个固定尺寸和比例的锚箱。【类】
一个anchor则是一个anchor-box在某滑动窗口内,具体锚箱【具体的类对象】。
实际计算时,对滑动窗口的一个范围,有9组待确定的预测锚箱。因为滑动窗口有M步滑动,所以有Mx9个待定的anchor。不能将Mx9个anchor全部拿来训练,容易偏向于负样本,因此也就有了正负label比例1:1的采样anchor步骤。正负label,则依赖于锚箱与ground-truth box的关系。
注意二: anchor打标记时,IOU的计算,是在输入像素上计算得到的,而并不是将目标区域投射到feature-map上,再与anchor-box计算IOU,虽然感觉anchor-box好像是在feature-map上生效似的,要弄明白anchor-box是对物品形状的预定义。
注意三:每个子loss项前面的系数并没那么敏感,可以省掉。
share between PRN and Fast R-CNN
互相交叉地作为初始化,固定共享的部分。
小结
1)R-CNN:将抽取目标区域独立出来,微调网络并抽取高阶特征,然后单独训练分类器。
2)Fast R-CNN:抽取目标区域仍然独立,联合训练分类和拟合任务。与第一代的最大区别是省略掉了单独的分类步骤,逐渐变成end-to-end,当然还不彻底。节约的计算在联合训练的share-feature compute这里。
3)Faster R-CNN:训练目标区域的抽取网络,与检测网络共享部分网络结构,将抽取也合并到整个检测网络里面,交叉训练整个网络。
第一代更像是个功能独立拼装工具,第二代则正针对目标检测做联合训练,第三代则把目标区域抽取也合并到整个目标检测网络里面。
补充知识
Yolo与R-CNN的mAP及FPS
ILSVRC 成绩补充表格
不同的图像转换方法示例
SPPNet
Spatial Pyramid Pooling Layer,如下图:
对feature-map的每一个channel都做固定格子的max-pooling,再concate起来。
比如第一层级格子数目为4x4=16,将大小为[W,H]的feature-map划分成16个格子(每个格子大小为[W/4, H/4]),每个做max-pooling。第二层级格子数目为2x2=4,第三层级格子数目为1x1=1。从而保证了channel(256)基数不变,并且乘数(16+4+1)都是固定的,也就将不固定的尺寸的feature-map输入变成了固定长度的向量。
SPP是早在卷积前就有的图像处理技术,现在在CNN上发挥了巨大的作用,对各种类型的CNN模型均有提升作用(主要是允许多尺度训练)。
详细了解,见参考8
Reference
- 2014-Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation [R-CNN]
- R-CNN github: https://github.com/rbgirshick/rcnn
- 2015-Fast R-CNN
- Fast R-CNN github: https://github.com/rbgirshick/fast-rcnn
- 2016-Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
- Faster R-CNN github: https://github.com/rbgirshick/faster_rcnn
- 2012-Selective Search for Object Recognition
- 2015-Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition