R-CNN
今天进行了R-CNN论文第一遍的学习。因为R-CNN已经算比较老旧的算法,因此没有花时间通读全文,主要阅读了前3章的内容及Bounding-box regression的知识。算是稍微了解了下R-CNN的思想及结构,及相关细节。
原文链接: https://arxiv.org/abs/1311.2524
算法整体框架
- Region proposals。通过Selective Search的方法,在原图上生成一系列大小不一,比例不一的Region proposal(建议窗口),对于每张图片都大约生成2000个建议窗口。同时由于Region proposal的尺寸大小不一,需要将Region proposal中的内容warp(拉伸)到227*227的固定尺寸;
- CNN特征提取。通过一个5层conv层+2层fn层的CNN对图像进行特征提取;
- SVM分类。通过线性SVM分类器对每个建议窗口产生的特征向量进行分类打分;
- Bounding-box regression。对于窗口进行线性回归训练,得到回归权值,并利用该权值对建议的窗口进行偏移及缩放操作。从而得到最终的窗口;
- 采取非极大抑制(NMS)。根据打分和IoU进行筛选,得到NMS后的窗口。
算法存在缺陷
- 虽然算法中的CNN参数在所有类别中可以共享,但是由于先进行建议窗口生成,因此相当于每张图片都会产生大量的子图,这些子图都会输入CNN中进行训练,计算量大,效率低。
- 由于Region proposals的尺寸各不相同,需要形成fixed size的尺寸。在这个过程中会产生图片失真。
算法中需要注意的细节
- 如论文中提到的唯一的针对特定类的计算是features map和SVM weights之间的点乘和NMS。这说明SVM的weights是不共享的,每一个类都有一个独立的SVM,从算法的整体结构图中可与看出,一张图片产生的所有region共享一个CNN,但是每个的SVM和Box regression都是类别独立的。
- 算法中提到了一些可以提高算法mAP的方法。其中比较有用的是:
- Bounding-box regression。
- 采用pool5层或fc6或fc7的计算值。说明不同层的输出会对mAP产生影响,但CNN层的表征能力主要来自于卷积层,而不是占大量参数的全连接层
- 采用不同的CNN网络架构。
- 采用不同的IoU超参数。论文中采取的是0.3,取值区间是 { 0 , 0.1 , . . . , 0.5 } \{0, 0.1, ..., 0.5\} {0,0.1,...,0.5},0.3的效果能达到的mAP最好
- 采用fine-tuning。采用fine-tuning能让模型的mAP有比较明显的提高。
- 对于每个SGD的迭代,mini-batch包含了32个positive框(包含所有类别)和96个背景框,mini-batch size=128。
算法中涉及到的几个关键技术
Selective Search
使用Selective Search选择性搜索,来对一张图片产生2000个左右的候选区域。它的目标是减小滑动窗或者穷举法带来的冗余候选区域,从而减小计算量。这部分内容已经在之前略微提到过,实现的话没有自己手动实现,通过pip
安装可以实现对Selective Search的直接调用。
Bounding box regression
该部分的内容主要参考了原文,和王斌_ICT的回答。
这部分的目的是对于Selective Search中产生的region进行微调,使之边框更加接近真实的边框。相当于在提出区域和原区域之间做了一个回归。
主要的思想是:
- 对于每一个region,都会通过CNN计算出相应的activation map,这部分即代表了提出区域。
- activation map的张量通过reshape后得到关于原区域的表示 ϕ 5 ( P ) \phi_5(P) ϕ5(P),这个值再点乘权值矩阵W,可以得到一个关于原区域P的一个表示 d ⋆ ( P ) d_{\star}(P) d⋆(P)。这样的表示其实是一种对原来坐标的变换。
这里的5代表的是5th conv
- 通过这个
d
⋆
(
P
)
d_{\star}(P)
d⋆(P)去与真实区域G的坐标及提出区域坐标的变换进行回归计算,来学习得到权值矩阵W。
通过这个过程可以看到,回归的输入是P(包括P对应的特征及用来计算变换的坐标)和G(坐标),输出是W
Bounding box regression的具体思想就不再详细说了,论文和链接中都有详细的解释。
非极大值抑制(Non-Maximum Suppression,NMS)
该部分内容主要参考博客,原文: https://www.cnblogs.com/makefile/p/nms.html © 康行天下
该技术的目的是对于很多交叉的滑动窗口,选取最高分数的窗口并通过IoU抑制其他分数低且重叠度高的窗口。例如在目标检测过程中,在一个物体周围可能会产生很多窗口,那么需要选择得分最高的窗口,并将其他与之IoU高的窗口去掉;当去掉所有大于IoU阈值的窗口后,再选择得分次高的窗口进行IoU筛选。
算法的典型训练和预测过程
训练过程
- 输入一张图片,已知图片中的真实框位置以及框内的类别;
- 通过Selective Search产生提出区域;
- 根据这块提出区域与图像内真实区域的IoU可以确定这一块区域的真实类别,即先给框内图像打上自己的标签;
- 根据mini-batch size,提取mini-batch;
- 对每一个mini-batch,通过fine-tune的CNN或CNN产生fn7,进行flatten后与SVM的参数相乘得到打分,并根据真实类别确定损失函数;
- 同时,使用CNN产生的pool5 feature和真实框G坐标来求出该类别框回归的损失函数;
- 通过backprop调整4和5中的参数;
- 完成训练,得到共享的CNN参数,及不同类别对应的Bbox回归参数;
- 进行非极大抑制,减少框的数量,得到最后的框及框的类别。
预测过程
- 来一张图片,通过Selective Search产生提出区域;
- 对每一个提出区域,通过训练好的CNN和SVM进行训练,预测出提出区域的类别;
- 通过类别对应的Bbox回归参数调整区域框,这一步不像在训练过程中和SVM可以同步进行,因为训练过程中是知道类别的,而在预测过程中需要通过SVM判断类别,才能使用对应类别的 w ⋆ w_\star w⋆;
- 采用非极大抑制减少整个图像内框的数量。
由于没有手动实现,对于R-CNN的理解仅限于理论理解,估计细节方面还是有不少偏差的地方,如有错误,欢迎指正!