重温RCNN系列
在接触目标检测之初,大体上很粗略的看过一遍RCNN系列,但是很多细节都清楚。
昨天又重温了一下RCNN,把网络的框架又认真的学习了一边。
RCNN
R-CNN的简要步骤如下
(1) 输入测试图像
(2) 利用选择性搜索Selective Search算法在图像中从下到上提取2000个左右的可能包含物体的候选区域Region Proposal
(3) 因为取出的区域大小各自不同,所以需要将每个Region Proposal缩放(warp)成统一的224x224的大小并输入到CNN,将CNN的fc7层的输出作为特征。
这一步其实很像HOG+SVM,HOG+SVM是将图像用HOG算法提取特征然后用SVM分类,RCNN是用CNN模型提取一个特征来进行分类。
(4) 在得到特征后,需要把这些特征保存到本地磁盘,然后收集所有的特征,进行SVM分类。这里的特征的label应该是这个RP属于哪一类(根据IOU判断)
(5)用IOU判断出所有RP中是前景的RP, 然后进行回归。Loss是二范数。
SPP NET
解决问题:
1.需要对每一个SS提取的RP都进行特征提取。
2.因为CNN模型的有全连接层。SVM输入的向量维度也必须相同,所以输入的特征需要缩放到同一个大小,这会使RP的形变导致特征不准确。
方法:
1.特征映射:
可以对整张图片进行CNN,因为有特征映射的关系,所以SS提取原图的RP可以映射到CNN输出的featuremap,这样等于一次CNN就得到了所有RP的特征,
2.SPP
对于不同大小RP,可以用SPP池化出相同大小的特征向量。
Fast RCNN
解决问题:
1.SPP net 的训练不能训练到SPP层一下面的部分,好像是因为SPP层不支持反向传播?(不知道为什么)
2.SVM分类器需要将特征存到本地磁盘
ROI pooling
SPP是一个RP用三个maxpooling拼接到一起,ROIpooing是一个RP划分为固定的几块做maxpooling。
2.把SVM换成了softmax
Faster RCNN
RPN
对于RPN输入为大小16 * 16* n的featuremap来说:
CL路:一个16 * 16*(2 * 9),也就说16 *1 6就是特征图的每个点对应到原图的ancho box,2 * 9就是这16 * 16个点的9种形态的anchor box是前景还是背景。
BBOX路:一个16 * 16 *(2 * 9),16 * 16还是一样,4 * 9就是每个预测的(x,y,w,h) ,含义见下面loss
RPN的loss:
cl
bbox
这个东西就是RPN的BBOX输出,(x、,y,w,h)越接近真实,LOSS越小。
RPN正负样本选择:
在精确训练阶段,rpn网络会生产大约2000个候选区域,这些候选区域不会都拿去训练的,比如有一些实现中,iou值大于0.5的,大概排序后选取32个,而对于负样本是选取iou小于0.5的,且是倒序选取最小的一些,大约96个,基本正负比例在1:3。
LOSS
训练流程:
第一步:用 Imagenet 初始化共享cov 部分初始化RPN网络,然后训练RPN,在训练后,共享cov以及RPN的特有部分参数会被更新。(相当于训练一个RPN代替SS提取RP)
第二步:用Imagenet 初始化共享cov 部分初始化Fast-rcnn网络,这里是重新初始化。然后使用训练过的RPN来计算proposal,再将proposal给予Fast-rcnn网络。接着训练Fast-rcnn。训练完以后,共享cov 以及Fast-rcnn的特有部分都会被更新。
第三步:使用第二步训练完成的 共享cov 来初始化RPN网络,第二次训练RPN网络。但是这次要把 共享cov 锁定,训练过程中,model始终保持不变,而RPN的unique会被改变。
说明:因为这一次的训练过程中, 共享cov始终保持和上一步Fast-rcnn中共享cov一致,所以就称之为着共享。
第四步:仍然保持第三步的 共享cov不变,初始化Fast-rcnn,第二次训练Fast-rcnn网络。其实就是对其特有部分进行finetune,训练完毕,得到一个文中所说的unified network。
参考:
1.RPN:https://www.cnblogs.com/Terrypython/p/10584384.html
2.训练:https://www.cnblogs.com/WSX1994/p/11131148.html