关于R-CNN论文的学习总结。这是我人生中第一次写博客,以记录学习过程为主,才疏浅陋,还请各位看官多多包涵,如有错误,请您指正,感激不尽。
一、 三大步骤
- 生成独立候选区域。
- 将候选区域送进卷积神经网络提取特征,得到特征图谱。
- 训练多个支持向量机对特征图谱进行分类。
二、 非极大值抑制NMS
- 算法目标:消除由于滑动候选框导致一个目标有多个结果显示的问题。
- 算法原理:利用IOU来衡量两个目标的重合度,确定一个阈值。大于这个阈值表示两个候选框所选的目标为同一个。剔除所有大于该阈值的候选框。处理次大值,迭代直到任意两个候选框的IOU都小于该阈值。
- 算法步骤:
1.按照得分从大到小排序所有候选框,这里已经剔除得分较低的候选框。
2.将得分最高的候选框依次与后面的候选框两两计算IOU,剔除所有大于阈值的候选框。
3.处理次大值,迭代直到任意两个候选框的IOU都小于该阈值。
三、 图像缩放
-
问题提出:CNN的输入端必须是固定尺寸的。
-
原因:CNN的卷积层可以任意尺寸,但全连接层在设计的时候尺寸是固定的。因此在将候选框送入CNN时,必须做相应的尺寸变换。
-
具体方法:
- 各项异性变换:不管时候扭曲,直接resize为CNN的输入尺寸大小。
- 各项同性变换:
a)将bounding box延展为正方形,resize为CNN的输入尺寸。如果超出边界补bounding box内的颜色均值。
b)用bounding box内的颜色均值填充为正方形,resize为CNN的 输入尺寸。
四、 训练该网络
- 训练CNN。
CNN采用Alexnet架构搭建网络。采用迁移训练的方法,在已经训练好的Alexnet模型上微调得到现有的网络模型。在迁移训练时,将模型的最后一层f8替换成N+1个神经元,N为带分类数,加上背景这一维。当bounding box与ground truth的IOU大于0.5时,包括ground truth,我们认为所选区域为positive,否则为negative。 - 训练SVM。
SVM是一个二分类问题,对于每一类物体,需要训练一个SVM分类器。将ground truth作为正样本,ground truth与bounding box的IOU<0.3的作为负样本训练。 - hard negative mining(难例挖掘)
在训练SVM的过程中,负样本远远大于正样本,为了避免SVM向多数样本靠拢,应该使用负样本的子集来训练。这类子集应当代表负样本集中容易错判的负样本。具体的,我们将初始训练的SVM来对负样本进行预测。将错判的负样本加入困难样本集,可以看作是错题集。重新训练网络直至准确率不再提升。 - bounding box regression(边框回归)
考虑预测框与真实框的偏差,我们求得一个函数变换,使f(P)= G。其中P=(px,py,pw,ph)。G=(gx,gy,gw,gh)。这个变换可以表示为如下形式:
G x = P w ∗ d x ( P ) + P x Gx = Pw*dx(P)+Px Gx=Pw∗dx(P)+