Fast R-CNN 论文学习笔记

24 篇文章 2 订阅
19 篇文章 1 订阅

原论文:《Fast R-CNN
代码:https://github.com/rbgirshick/fast-rcnn
关键操作:RoI映射RoI池化

基本说明:

  • 输入图片及一些目标候选区域
  • 流程
    1. 获取候选框
    2. 对整张图片特征提取,获取特征图;
    3. 候选框映射到特征图上,得到RoI(Region of Interest);
    4. 在RoI上进行RoI池化,再经过全连接层后得到固定长度的特征向量;
    5. 将特征向量分别送入两个全连接层;
    6. 两个全连接层分别用作分类任务和边界框回归任务。
      Fast R-CNN architecture

主要内容介绍

一、获取候选框

R-CNN使用的方式相同,即使用 Selective Search 算法获取候选框。

二、整张图片特征提取

使用AlexNet、VGG16等卷积网络均可。

三、候选框在特征图上的映射(RoI映射)

可以参考图片在特征提取网络中传递的过程(比如pooling),对候选框的大小进行调整。《目标检测之 Fast R-CNN》对这点介绍的比较详尽,我将这部分摘录如下:

比如采用的是pre-trained 网络模型为VGG16的话,RoIPooling替换掉最后一个max pooling层的话,则原图像要经过4个max pooling层,输出的feature maps是原图像的1/16,因此,将原图像对应的四元数组转换到feature maps上就是每个值都除以16,并量化到最接近的整数。

四、RoI池化(这是稀疏金字塔池化的一种特例)

RoI(Region of Interest)指的是候选框在特征图上的映射。注意,它是特征图上的一部分。
这种池化方法的目的是将大小不一的RoI转换成具有统一行列数的特征图
具体方法如下(可参考原论文或者《目标检测模型二:Fast-R-CNN,ROI池化》):

输入:尺寸为 h × w h\times w h×w 的RoI(对于不同的 RoI, h h h w w w的大小都是不相同的)
输出 H × W H\times W H×W 的特征图( H H H W W W 是人为控制的超参数)
操作:将RoI均等的分为 h H × w W \frac{h}{H} \times \frac{w}{W} Hh×Ww子窗口(将RoI分出 h H \frac{h}{H} Hh行与 w W \frac{w}{W} Ww列),然后在每一子窗口上使用max-pooling得到一个值,这些值构成了我们最终想要的大小固定的特征图。
举例:
[ 85 9 90 85 77 41 47 17 91 75 0 26 45 15 38 68 53 2 95 28 92 1 26 28 41 96 13 53 33 45 9 57 12 21 75 91 5 31 68 64 92 41 57 79 86 63 53 33 31 67 47 27 43 15 71 27 85 10 61 42 65 98 100 54 ] = = = = = = = = = > R O I : 左 下 h = 5 , w = 7 [ 41 96 13 53 33 45 9 12 21 75 91 5 31 68 92 41 57 79 86 63 53 31 67 47 27 43 15 71 85 10 61 42 65 98 100 ] = = = = = = = = > 分 割 : H = 2 , W = 2 [ 41 96 13 ∣ 53 33 45 9 12 21 75 ∣ 91 5 31 68 92 41 57 ∣ 79 86 63 53 31 67 47 ∣ 27 43 15 71 85 10 61 ∣ 42 65 98 100 ] = = = = = = = > m a x − p o o l i n g [ 96 91 92 100 ] \begin{bmatrix} 85 & 9 & 90 & 85 & 77 & 41 & 47 & 17 \\ 91 & 75 & 0 & 26 & 45 & 15 & 38 & 68 \\ 53 & 2 & 95 & 28 & 92 & 1 & 26 & 28 \\ 41 & 96 & 13 & 53 & 33 & 45 & 9 & 57 \\ 12 & 21 & 75 & 91 & 5 & 31 & 68 & 64 \\ 92 & 41 & 57 & 79 & 86 & 63 & 53 & 33 \\ 31 & 67 & 47 & 27 & 43 & 15 & 71 & 27 \\ 85 & 10 & 61 & 42 & 65 & 98 & 100 & 54 \\ \end{bmatrix} \overset{ROI:左下h=5,w=7}{=========>} \begin{bmatrix} 41 & 96 & 13 & 53 & 33 & 45 & 9 \\ 12 & 21 & 75 & 91 & 5 & 31 & 68 \\ 92 & 41 & 57 & 79 & 86 & 63 & 53 \\ 31 & 67 & 47 & 27 & 43 & 15 & 71 \\ 85 & 10 & 61 & 42 & 65 & 98 & 100 \end{bmatrix} \\ \overset{分割:H=2, W=2}{========>} \begin{bmatrix} 41 & 96 & 13 & | & 53 & 33 & 45 & 9 \\ 12 & 21 & 75 & | & 91 & 5 & 31 & 68 \\ \hdashline 92 & 41 & 57 & | & 79 & 86 & 63 & 53 \\ 31 & 67 & 47 & | & 27 & 43 & 15 & 71 \\ 85 & 10 & 61 & | & 42 & 65 & 98 & 100 \end{bmatrix} \overset{max-pooling}{=======>} \begin{bmatrix} 96 & 91 \\ 92 & 100 \end{bmatrix} \\ 859153411292318597529621416710900951375574761852628539179274277459233586436541151453163159847382696853711001768285764332754=========>ROIh=5,w=7411292318596214167101375574761539179274233586436545316315989685371100========>H=2,W=2411292318596214167101375574761539179274233586436545316315989685371100=======>maxpooling[969291100]

五、损失函数

使用多任务损失函数,即同时进行分类与回归的操作:
L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , v ) L(p,u,t^u,\pmb{v})=L_{cls}(p,u)+\lambda[u\geq 1]L_{loc}(t^u,\pmb{v}) L(p,u,tu,vvv)=Lcls(p,u)+λ[u1]Lloc(tu,vvv)
其中, L c l s L_{cls} Lcls 是分类任务的损失函数, L l o c L_{loc} Lloc 是边界框回归的损失函数。u是实际的类别, v = ( v x , v y , v w , v h ) \pmb{v}=(v_x,v_y,v_w,v_h) vvv=(vx,vy,vw,vh) 是实际的边界框。对于每一个类别u,网络所输出的边界框是 t u = ( t x u , t y u , t w u , t h u ) \pmb{t}^u=(t^u_x,t^u_y,t^u_w,t^u_h) tttu=(txu,tyu,twu,thu),这个框应该与 v \pmb{v} vvv 越近越好。
此外, λ = 1 \lambda=1 λ=1 [ u ≥ 1 ] = { 1 if  u ≥ 1 0 otherwise  [u\geq 1]=\begin{dcases} 1 &\text{if } u\geq 1 \\ 0 &\text{otherwise } \end{dcases} [u1]={10if u1otherwise 
分类的损失函数:
L c l s ( p , u ) = − l o g ( p u ) L_{cls}(p,u)=-log(p_u) Lcls(p,u)=log(pu)
回归的损失函数:
L l o c ( t u , v ) = ∑ i ∈ { x , y , w , h } s m o o t h L 1 ( t i u − v i ) L_{loc}(t^u,\pmb{v})=\sum_{i\in \{x,y,w,h\}}smooth_{L_{1}}(t^u_i-v_i) Lloc(tu,vvv)=i{x,y,w,h}smoothL1(tiuvi)
其中 s m o o t h L 1 ( x ) = { 0.5 x 2 if  ∣ x ∣ < 1 ∣ x ∣ − 0.5 otherwise smooth_{L_{1}}(x)=\begin{cases} 0.5x^2 &\text{if } |x|<1 \\ |x|-0.5 &\text{otherwise} \end{cases} smoothL1(x)={0.5x2x0.5if x<1otherwise

六、其他
1. 截断式奇异值分解(Singular Value Decomposition,SVD)

用于加快大型全连接网络的训练速度:
W ≈ U Σ t V T W \approx U\Sigma_{t}V^T WUΣtVT
这里, W W W u × v u\times v u×v 的矩阵, U U U u × t u\times t u×t 的矩阵, Σ t \Sigma_{t} Σt t × t t\times t t×t 的对角阵, V V V v × t v\times t v×t 的矩阵。

可以根据上面的近似公式将一层的全连接网络(输入神经元 u u u 个,输出神经元 v v v 个)用两层的全连接网络(输入神经元 u u u 个,中间层神经元 t t t 个,输出神经元 v v v 个,没有非线性计算单元)替代。在这两层神经元中,第一个是权重矩阵 Σ t V T \Sigma_{t}V^T ΣtVT(没有biases),第二个是 U U U(它的biases与 W W W 的biases相同)。

说明: 对于 W W W,有 u v uv uv 个参数;对于 U Σ t V T U\Sigma_{t}V^T UΣtVT t u + t v tu + tv tu+tv 个参数。如果 t ≪ m i n ( u , v ) t\ll min(u,v) tmin(u,v),则两层的全连接网络在训练起来就会比单层的快(参数更少,所以更快)。

奇异值分解的内容,需要学习《矩阵论》。

2. 小批量采样

参考《Fast-RCNN论文总结整理

3. 参数初始化

参考《Fast-RCNN论文总结整理

4. RoI池化中的BP算法

∂ L ∂ x i = ∑ r ∑ j [ i = i ∗ ( r , j ) ] ∂ L ∂ y r j \frac{\partial L}{\partial x_i}=\sum_{r}\sum_{j}[i=i^{*}(r,j)]\frac{\partial L}{\partial y_{rj}} xiL=rj[i=i(r,j)]yrjL
其中,
x i x_i xi 是输入到RoI池化层的第 i i i 个activation;
y r j y_{rj} yrj 是从第 r r r 个RoI得到的第 j j j 个池化后的输出: y r j = x i ∗ ( r , j ) y_{rj}=x_{i^{*}(r,j)} yrj=xi(r,j)
i ∗ ( r , j ) = a r g m a x i ′ ∈ R ( r , j ) ( x i ′ ) i^{*}(r,j)=\underset{i'\in R(r,j)}{argmax}(x_{i'}) i(r,j)=iR(r,j)argmax(xi)
R ( r , j ) R(r,j) R(r,j) 是池化后的输出 y r j y_{rj} yrj 在每个子窗口中的索引集合。


参考材料


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值