R-CNN系列已发展到Mask R-CNN,目前各种目标检测、语义分割大赛选手大多基于该系列变种。虽然网上有很多介绍了,但最好的学习方式还是读论文,从中可以了解到作者的思路和心路历程。
个人笔记,未经润色,转载请注明出处。
1 introduction:
问题一:如何解决目标检测
目标检测几种方法:
regression:同时期工作,文献38,比作者的方法准确率差好多
sliding window:由于所使用CNN层数较多,输入图像感受野(receptive field,论文3.1节提到第5层卷积,神经元的感受野为195*195)、步长很大使得在sliding window中精确定位目标很困难
region proposal:算法产生约2000个种类无关的region proposal,输入cnn提取固定长度特征,再使用SVM对每个region划分类别。
region proposal尺寸不一怎么办?---使用affine image warping(图像卷曲:warping,affine仿射变换的一种)
问题二:标注数据少
传统解决方法:无监督预训练,然后有监督fine tuning
论文方法:在某个大型数据集上有监督预训练模型(imagenet),然后在领域数据集上fine tuning(pascalvoc)
系统效率高:运算为小矩阵、向量乘积,非极大值抑制(greedy non-maximum suppression),因为提取的cnn特征是所有类型共享的
2.R-CNN 目标检测
2.1 三个模块:
region proposal:使用已有算法,selective search
CNN feature extraction:对每个region proposal提取4096维度特征。227*227,减去图像均值,5层卷积2层全连接。图像转为固定大小尺寸方法:warp all pixels in a tight bounding box around it to the required size
SVM分类
2.2 预测流程
a. selective search fast mode生成约2000个proposal。
b. warp proposal,输入cnn提取特征
c.对每一个检测类别,使用该类别对应的svm分类器,给每个region proposal的cnn特征向量打分
d.给定输入图像的所有打分region,采用非极大值抑制处理--如果一个region与更高得分的region有IoU重叠,则废弃该region。得分必须大于某个阈值
2.3 训练流程
a. imagenet预训练模型下载
b.fine tuning:预训练模型最后的1000路分类层替换为随机初始化的目标检测N+1分类层(类别N+背景)
SGD学习率:0.001
minibatch:128(从所有类别中挑选32个 positive windows,涵盖所有前景类别,96 background windows。 即32个为N类别标签,96个为背景标签)
window/proposal的类别标签确定方法:对于某类别,所有与该类别的groud truth box大于0.5 IoU overlap的region proposal作为该类的正例标签,其他作为该类反例--背景
c. SVM训练:每一个类别训练一个二分类器。正例:ground truth box,负例:IoU overlap threshold法(详见附录B,一个类的负例定义为与该类所有instance IoU overlap小于0.3的proposal。对比finetuing的负例,svm的负例定义更为严格)
由于训练数据很大放不进内存,采用hard negative mining方法
section 3
P6 Table 2:
1-3行:直接使用预训练模型的效果
4-6行:使用fine tuning CNN模型
第7行:增加bbox回归阶段(以减少定位error)
table 3:
CNN结构 alexnet vs VGG
结论:
1)不使用bbox和fine tuning也可以。使用fintuning可提高准确率8%,增加bbox再次提高。
2)使用cnn哪层输出作为feature?
仅使用预训练模型时,fc6,fc7和pool5差不多。但是若用pool5参数量则大大减少(全连接层参数量很大),所以cnn的特征能力主要来自卷积层
这个表明可通过CCN卷积层获取任意图像大小的feature map。---后续可基于pool5的feature map使用sliding window方法(为后续论文埋下伏笔。实际上,问题就是这么一个接一个逐步解决的,量变到质变)
使用finetuning模型时,fc6,fc7比pool5好。表明pool5特征更一般化,领域finetuning后的提升在于这两层。
3)VGG效果比alexnet提高7点(那么resnet必然比vgg更高)
4. ISLVRC2013数据集
数据集特点:val test数据集充分标注,train数据集未充分标注
策略:主要使用val作为训练,train数据集只作为补充(详见4.3)
将val划分为val1和val2,由于val中类别特别不均衡,需寻找相对均衡的划分。
划分方法:使用类别数作为特征聚类。(代码已开源)
附录
A.region proposal转为CNN固定大小输入:
tighest square with context:proposal再加上图像上下文信息。
tighest square without context:proposal无上下文信息。
试验表名warp with context padding效果最好
B.训练正负样本选择,以及为何使用SVM分类
---为何fine tuning和SVM训练的样本不一样?
最开始训练时直接使用pretrain imagenet模型,未使用finetuning。那时SVM训练样本就已经定下来了。
使用fine tuning后,最一开始是使用的svm相同样本,但效果很差。
作者分析原因是finetuning样本太少,因此按上述规则制作了新的fine tuning样本(正样本扩充了30倍),作者认为在finetuning整个网络时是需要这么大数据量的,以避免过拟合。
但是,使用这些样本(目标的位置不精确)对finetune的网络也并非最优。这引出第二个问题:为何finetuing后训练svm,而不是直接使用cnn自带的softmax分类作为目标检测?作者说这个其实也试过了,但是准确率下降了4个点。分析可能的原因:
finetuning的训练样本并未强调精确位置信息,
softmax分类训练样本是随机采样的负样本(即背景类),而svm分类中采用的负样本为hard negative的子集(定义更为严格,详见上)。
C. bounding box回归
bbox回归:在svm给每个proposal打分之后,使用bbox regressor预测一个新的bbox。(和作者的DPM算法中bbox回归类似。只不过这里使用的是CNN特征,而DPM里是从inferred DPM part location计算的几何特征)
不用bbox回归也是可以的,因为候选region proposal都是带坐标的,svm预测出得分最高的proposal即可。不用bbox只是准确率低几个点
训练数据:(Pi,Gi)集合 i=1..N
考虑特定一组数据,其中G = (Gx, Gy, Gw, Gh)为groud truth bbox的坐标(注意:作者提到x,y是center of proposal的坐标,w,h分别是宽和高),P为proposed box,格式同G
训练目标:P到G的映射
将映射分为4个函数:dx(P),dy(P), dw(P), dh(P)
dx,dy:specify scale-invariant translation of the center of P's bbox
dw,dh:specify log-space tanslations of the width and height of P's bbox
预测的G'的公式为:(参考:http://blog.csdn.net/bixiwen_liu/article/details/53840913)
G'x = Pw * dx(P) + Px
G'y = Ph * dy(P) + Py
G'w = Pw * exp(dw(P))
G'h = Ph * exp(dh(P))
每一个d*函数(*=x,y,w,h)是proposal P的cnn pool5层特征的线性函数。损失函数为带L2正则(倾向于小权重,又叫ridge regression岭回归)的均方误差(最小二乘法 least square),回归的目标输出(即文中t*)定义为
tx = (Gx - Px)/Pw
ty = (Gy - Py)/Ph
tw = log(Gw/Pw)
th = log(Gh/Ph)
因此,该回归输入是pool5的特征向量,而不是proposal bbox坐标数值
P的样本选择很重要:
若P距离ground truth G很远,回归没有意义。使用和P类似的样本也没有价值。因此P定义为至少离一个groud truth很近:将proposal P assign到ground truth G,如果P与G有maximum IoU overlap(in case 与好几个ground truth有overlap),当且仅当overlap大于阈值0.6
没有被assign的P被丢弃。每一个object class都需要训练一个regressor。
小结:
训练时:每个类别都需要训练SVM和bbox regressor。
测试时,每个proposal打分一次,预测其new detection window也是一次
从R-CNN论文描述看,R-CNN的idea很明确,但是有大量的细节问题需要实验并确定,相当不易。而新的方法的提出,正是基于实验中遇到的问题和相应的分析