R-CNN学习笔记

参考文章:https://zhuanlan.zhihu.com/p/23006190

1.基础知识

1.1 NMS

有许多候选框预测是车,根据这些候选框是目标车的类别概率,找到最大概率的候选框,再利用其他的不是最大概率的候选框和最大概率的候选框做IOU丢弃IOU大于 设定阈值的候选框,最大的概率的候选框就是保留的候选框。再剩下候选框中再 选取最大概率的候选框再进行上述操作,找到所有被保留下来的矩形框。

1.2 Selective Search:

使用一种过分割手段,将图像分割成小区域 (1k~2k 个) 查看现有小区域,按照合并规则合并可能性最高的相邻两个区域。重复直到整张图像合并成一个区域位置 输出所有曾经存在过的区域,所谓候选区域。
其中合并规则如下: 优先合并以下四种区域:

  • 颜色(颜色直方图)相近的
  • 纹理(梯度直方图)相近的

合并后总面积小的: 保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域 (例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh)合并后,总面积在其BBOX中所占比例大的: 保证合并后形状规则。 (这句话什么意思?)

1.3 fine-tuning:

预训练和微调机制,就是在没有足够的标签数据的情况下,需要对模型在现有的大数据集下进行训练。在武侠小说中,张无忌之所以”乾坤大挪移“,”九阳神功“打的很溜,是因为张无忌的内功深厚,我们可以把与训练理解为”内功“ 。

2. R-CNN过程

2.1 .RCNN生成很多候选区域(合并Selective Search)

2.2 特征提取

利用CNN网络对每一个候选区域进行特征提取(输出4096维度向量)。但是这里面有问题:CNN网络输入图片的大小都都是固定的,但是选出来的候选框的大小不一,这个时候就需要进行缩放:

  • 各向异性缩放
    这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227
  • 各向同性缩放
    各向同因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。有两种办法
    • 先扩充后裁剪: 直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充(问题:候选框扩大以后就会将其他目标扩充进来怎么办?)
    • 先裁剪后扩充:先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),(解决了上述问题)

2.3 CNN网络训练

  • 参数初始化
    物体检测的一个难点在于,物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的是采用某些方法,把参数初始化了,然后在进行有监督的参数微调,这里文献采用的是有监督的预训练。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。网络优化求解时采用随机梯度下降法,学习率大小为0.001;(Alexnet网络经过预训练再进行微调)
    我们接着采用 selective search 搜索出来的候选框 (PASCAL VOC 数据库中的图片) 继续对上面预训练的CNN模型进行fine-tuning训练。假设要检测的物体类别有N类,那么我们就需要把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景) (20 + 1bg = 21),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续SGD训练了。开始的时候,SGD学习率选择0.001,在每次训练的时候,我们batch size大小选择128,其中32个事正样本、96个事负样本。(这里应该是将最后一层输出类别换成当前数据集的类别个数)
    每张图片生成2000个框,每个框都有自己的类别(类别匹配下面说明),利用这些框对CNN网络进行训练。

  • 正负样本匹配问题
    一张照片我们得到了2000个候选框。然而人工标注的数据一张图片中就只标注了正确的bounding box,我们搜索出来的2000个矩形框也不可能会出现一个与人工标注完全匹配的候选框。因此在CNN阶段我们需要用IOU为2000个bounding box打标签。如果用selective search挑选出来的候选框与物体的人工标注矩形框(PASCAL VOC的图片都有人工标注)的重叠区域IoU大于0.5,那么我们就把这个候选框标注成物体类别(正样本),否则我们就把它当做背景类别(负样本)。

      疑惑点: CNN训练的时候,本来就是对bounding box的物体进行识别分类训
      练,在训练的时候最后一层softmax就是分类层。那么为什么作者闲着没事干要
      先用CNN做特征提取(提取fc7层数据),然后再把提取的特征用于训练svm分类
      器?
      答:这个是因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致
      最后采用CNN softmax输出比采用svm精度还低。事情是这样的,cnn在训练的
      时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体
      的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原
      因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我
      们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为
      正样本了);然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样
      本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去
      了,我们才把它标注为物体类别,然后训练svm,具体请看下文
    

2.4 SVM训练、测试阶段

这是一个二分类问题,我么假设我们要检测车辆。我们知道只有当bounding box把整量车都包含在内,那才叫正样本;如果bounding box 没有包含到车辆,那么我们就可以把它当做负样本。但问题是当我们的检测窗口只有部分包含物体,那该怎么定义正负样本呢?作者测试了IOU阈值各种方案数值0,0.1,0.2,0.3,0.4,0.5。最后通过训练发现,如果选择IOU阈值为0.3效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点),即当重叠度小于0.3的时候,我们就把它标注为负样本。一旦CNN f7层特征被提取出来,那么我们将为每个物体类训练一个svm分类器。当我们用CNN提取2000个候选框,可以得到20004096这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096N点乘(N为分类类别数目,因为我们训练的N个svm,每个svm包含了4096个权值w),就可以得到结果了。
得到的特征输入到SVM进行分类看看这个feature vector所对应的region proposal是需要的物体还是无关的实物(background) 。 排序,canny边界检测之后就得到了我们需要的bounding-box。

2.4 预测框回归预测

https://blog.csdn.net/zijin0802034/article/details/77685438
在这里插入图片描述

  • 回归框的目的
    R-CNN网络提出来的候选框和真实的目标框还有一定差距,所以边界框回归的目的就是要学习一个变换来将候选框进行映射,尽可能贴近真实框。

  • 映射
    那问题来了,我们如何另候选框更贴近真实框?答:通过平移和缩放。
    下面看公式:
    位置平移
    ( Δ x , Δ y ) , Δ x = P w d x ( P ) , Δ y = P h d y ( P ) (\Delta x,\Delta y),\Delta x = P_wd_x(P),\Delta y = P_hd_y(P) (Δx,Δy),Δx=Pwdx(P),Δy=Phdy(P)
    通过位置平移的,的预测框的特征
    G ^ x = P w d x ( P ) + P x \hat G_x = P_wd_x(P)+ P_x G^x=Pwdx(P)+Px
    G ^ y = P h d y ( P ) + P y \hat G_y = P_hd_y(P)+P_y G^y=Phdy(P)+Py
    尺度缩放:
    ( S w , S h ) , S w = e d w ( P ) , S h = e d h ( P ) (S_w,S_h),S_w = e^{d_w(P)},S_h = e^{d_h(P)} (Sw,Sh),Sw=edw(P),Sh=edh(P)
    通过尺度缩放后:
    G ^ w = P w e d w ( P ) \hat G_w = P_we^{d_w(P)} G^w=Pwedw(P)
    G ^ h = P h e d h ( P ) \hat G_h = P_he^{d_h(P)} G^h=Phedh(P)

  • 学习过程
    学习就有输入数据、输出数据、标签、损失函数。
    **输入数据:**输入数据就是最后的候选框(Region Proposal )的最高特征层 Φ ( P i ) \Phi(P^i) Φ(Pi)
    输出数据: 输出数据就是能使候选框(Region Proposal )更接近真是框的变换
    标签标签就是,候选框(Region Proposal )和真实框之间的位置偏移和尺度缩放的变换即 ( t x , t y , t W , t h ) (t_x,t_y,t_W,t_h) (tx,ty,tW,th)
    t x = ( G x − P x ) / P w t_x = (G_x-P_x)/P_w tx=(GxPx)/Pw
    t y = ( G y − P y ) / P h t_y = (G_y-P_y)/P_h ty=(GyPy)/Ph
    t w = log ⁡ ( G w / P w ) t_w=\log{(G_w/P_w)} tw=log(Gw/Pw)
    t h = log ⁡ ( G h / P h ) t_h=\log{(G_h/P_h)} th=log(Gh/Ph)
    损失函数:将对位置和尺度的变换定义为一个向量 w ∗ w_* w,那么根据数输入得到的变换就是: d ∗ ( P ) = w ∗ T Φ ( P ) d_*(P)=w_*^T\Phi(P) d(P)=wTΦ(P)
    所以有如下公式:
    L o s s = ∑ i N ( t ∗ i − w ^ ∗ T Φ ( P i ) ) 2 Loss = \sum_i^N(t_*^i-\hat w_*^T\Phi(P^i))^2 Loss=iN(tiw^TΦ(Pi))2
    优化模型:(加入了正则项):
    W ∗ = arg ⁡ m i n w ∗ = ∑ i N ( t ∗ i − w ^ ∗ T Φ ( P i ) ) 2 + λ ∣ ∣ w ^ ∗ ∣ ∣ 2 W_* =\arg min_{w_*}=\sum_i^N(t_*^i-\hat w_*^T\Phi(P^i))^2 +\lambda||\hat w_*||^2 W=argminw=iN(tiw^TΦ(Pi))2+λw^2

  • 问题
    预测框回归原理原理就是想学一个偏差,但是为什么还要除以一个 P w P_w Pw P h P_h Ph ?
    因为除以 P w P_w Pw P h P_h Ph以后就有尺度不变性,我们预测位置偏移的时候,大目标便宜20个像素时,相对目标整体来说时并不算大,但是如果小目标的话,20个像素就是很大了,所以为了方便训练进行缩放。
    t ∗ i t_*^i ti是一个数还是一个向量?
    是一个数,*代表xyhw其中的一个。之前误会了,以为是一个向量呢。。。。
    建议区最高特征作为输入,对于每一个变换 d ∗ ( P ) = w ∗ T Φ ( P ) d_*(P)=w_*^T\Phi(P) d(P)=wTΦ(P)都会学习一个 w ∗ w_* w。最后利用学习出来的权重进行推理偏移。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值