【目标检测】- Fast-RCNN

        博文是基于前两篇关于R-CNNPSP-Net文章来写的,不了解的可以回过去看看再来看这篇。总的来说Fast-RCNN相比前边目标检测的有几个亮点,这里也只说说这几个亮点。

参考博文:http://blog.csdn.net/WoPawn/article/details/52463853?locationNum=5

                 http://shartoo.github.io/RCNN-series/


Fast-RCNN流程:

1、输入测试图像

2、利用selective search 算法在图像中从上到下提取2000个左右的建议窗口(Region Proposal)

3、将整张图片输入CNN,进行特征提取

4、把建议窗口映射到CNN的最后一层卷积feature map上

5、通过RoI pooling层使每个建议窗口生成固定尺寸的feature map

6、利用Softmax Loss(探测分类概率) 和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练。


图中省略了通过Selective Search获得proposal的过程,第一张图中红框里的内容即为通过Selective Search提取到proposal,中间的一块是经过深度卷积之后得到的conv feature map,图中灰色的部分就是我们红框中的proposal对应于conv feature map中的位置,之后对这个特征经过ROI pooling layer处理,之后进行全连接。在这里得到的ROI feature vector最终被分享,一个进行全连接之后用来做softmax回归,用来进行分类,另一个经过全连接之后用来做bbox回归。

注意: 对中间的Conv feature map进行特征提取。每一个区域经过RoI pooling layer和FC layers得到一个 固定长度 的feature vector(这里需要注意的是,输入到后面RoI pooling layer的feature map是在Conv feature map上提取的,故整个特征提取过程,只计算了一次卷积。虽然在最开始也提取出了大量的RoI,但他们还是作为整体输入进卷积网络的,最开始提取出的RoI区域只是为了最后的Bounding box 回归时使用,用来输出原图中的位置)。

那么重点来了,比较前面的R-CNN和SPP-Net亮点就可以看出来了。

亮点一:

规避R-CNN中冗余的特征提取操作,只对整张图像全区域进行一次特征提取;

亮点二:(作者也是受到何凯明大神的启发得来)

Fast-RCNN提出了一个可以看做单层SPP-Net的网络层(SPP-Net可以回过头看前面留的笔记:http://blog.csdn.net/zhuzemin45/article/details/79589289),叫做ROI Pooling,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量,而我们知道,conv、pooling、relu等操作都不需要固定size的输入,因此,在原始图片上执行这些操作后,虽然输入图片size不同导致得到的feature map尺寸也不同,不能直接接到一个全连接层进行分类,但是可以加入这个神奇的ROI Pooling层,对每个region都提取一个固定维度的特征表示,再通过正常的softmax进行类型识别。

亮点三:

第二点RCNN的处理流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression,而在Fast-RCNN中,作者巧妙的把bbox regression放进了神经网络内部,与region分类和并成为了一个multi-task模型,实际实验也证明,这两个任务能够共享卷积特征,并相互促进。Fast-RCNN很重要的一个贡献是成功的让人们看到了Region Proposal+CNN这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度,也为后来的Faster-RCNN做下了铺垫。


ROI Pooling:

每一个RoI都由一个四元组(r,c,h,w)表示,其中(r,c)表示左上角,而(h,w)则代表高度和宽度。这一层使用最大池化(max pooling)将RoI区域转化成固定大小的 H*W 的特征图(H和W是取决于任何特定RoI层的超参数)。
RoI 最大池化通过将 h×w RoI窗口划分为 h / H × w / W个子窗口网格,子窗口大小固定为 H × W ,然后将每个子窗口中的值max pooling到相应的输出网格单元 。
roi_pool层将每个候选区域均匀分成 H × W 块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一的数据,送入下一层。

                                                                                            

Rol pooling layer的作用主要有两个:
1.是将image中的rol定位到feature map中对应patch
2.是用一个单层的SPP layer将这个feature map patch下采样为大小固定的feature再传入全连接层。即
RoI pooling layer来统一到相同的大小-> (fc)feature vector 即->提取一个固定维度的特征表示。


Multi-task loss:

        Fast R-CNN网络分类损失和回归损失如下图所示【仅针对一个RoI即一类物体说明】,黄色框表示训练数据,绿色框表示输入目标:

-cls_score层用于分类,输出K+1维数组p,表示属于K类物体和背景的概率; 
-bbox_predict层用于调整候选区域位置,输出4*K维数组,也就是说对于每个类别都会训练一个单独的回归器; 

Fast RCNN有两个输出层:
一个对每个RoI输出离散概率分布:
一个输出bounding box回归的位移:
k表示类别的索引,前两个参数是指相对于object proposal尺度不变的平移,后两个参数是指对数空间中相对于object proposal的高与宽。

每个训练的RoI都被标记了ground-truth类别 u 以及ground-truth边界框回归 v 。在每个标记好的RoI上用multi-task loss 函数来级联的训练分类和bbox边界框回归:


约定u=0为背景分类,那么[u≥1] 函数表示背景候选区域即负样本不参与回归损失,不需要对候选区域进行回归操作; 

第一项是对于 u 类的分类损失(log loss for true class u)。
对于分类loss,是一个N+1路的softmax输出,其中的N是类别个数,1是背景。

第二项是回归损失,是在 u 类的真正边界框回归目标的元组 v 上定义的,是一个 4xN 路输出的regressor,也就是说对于每个类别都会训练一个单独的regressor,评估回归损失代价就是比较真实分类 u 对应的预测平移缩放参数和真实平移缩放参数的差距:



其中,
是真实平移缩放参数
对于 u 重新预测bbox回归平移缩放参数:
这里的损失不是L2损失函数,而是smooth L1损失函数,对于离群点不敏感,因为有L2损失的训练可能需要仔细调整学习率,以防止爆炸梯度(控制梯度的量级使得训练时不容易跑飞)。
公式如下:

超参数 λ 是用来控制两个损失函数的平衡的。作者对回归目标进行归一化使其具有零均值及单位权方差(zero mean and unit variance)。所有的函数都设置超参数 λ = 1。
        
后边训练部分可以参看前面推荐的几篇博文。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值