目标检测之Fast R-CNN

1 动机(Motivation)

Fast R-CNN是继R-CNN和SPPnet之后的又一篇目标检测的经典之作。首先文中分析了R-CNN和SPPnet的一些不足之处,包括多阶段训练、空间和时间消耗大等。所以本文就是对R-CNN和SPPnet做改进,然后提出了Fast R-CNN。

2. 贡献(Contribution)

新提出的Fast R-CNN模型解决了之前模型存在的问题,并使得模型具有以下的优点:

  • 目标检测的性能(mAP)要高于R-CNN和SPPnet
  • 整个训练过程是single-stage的,并且使用了multi-task的损失函数
  • 训练的过程能够更新所有层(这点主要针对于SPPnet,因为SPPnet不能更新SPP layer 之前的层)
  • 不需要消耗额外的空间来存储feature

3. 模型(Architecture)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jpZbLkGy-1597475720938)(en-resource://database/976:1)]

图1 Fast R-CNN网络结构

  • 1.输入:输入包括一张图片(224* 244)和object proposal的集合(2000个),文中的object proposal还是采用selective search来提取的。
  • 2.卷积层:图片经过多个conv layer和max pooling layer得到整张图的feature map。
  • 3.RoI pooling layer:这层是借鉴SPPnet的SPP layer层,输入feature map和object proposal,然后为每个object proposal来提取在feature map上对应的特征,并使得输出都具有相同的size。
  • 4.全连接层:将提取的特征输入两个全连接层(4096),把前边提取的特征综合起来
  • 5.输出:Fast R-CNN的输出包括两部分:(1)一个是经过FC layer(21个node)+softmax输出的,主要是对object proposal进行分类的,一共包括21类,即20类物体加上1个背景类。这个就取代了之前的SVM分类器。(2)另一个是经过FC layer(84个node)+bbox regressor输出的,这个就是为21个类各输出4个值(21* 4=84),而这4个值代表着精修的bounding box position。

对于conv layer和FC layer,大家应该都很熟悉,所有我给大家重点讲解一下这个RoI pooling layer,如下图所示,对于不同size的RoI(object proposal),我们都把它划分成(7* 7)的网格,然后对每个网格(bin)内的全部像素点求一个max pooling,即选取一个最大值作为输出,所有最后对不同size的RoI,我们都得到7* 7的feature map。这点其实是借鉴SPPnet的,它相当于是SPP layer的一个特例,就是只使用了一个尺度(7* 7)。

在这里插入图片描述
图2 RoI pooling layer示例
由此可见,经过RoI pooling layer之后,不同size的object proposal的feature map变成同样的size了。至于为什么需要RoI pooling layer,这和为什么在SPP-net要用SPP layer同样的道理。

4. 训练(Training)

4.1 预训练(Pre-trained)

本文使用了三个预训练的网络来初始化网络,分别是AlexNet(S),VGG_CNN_M_1024(M),VGG16(L)。此外,还对网络结构做了以下改变:

  • 把网络中的最后一个max pooling层替换为RoI pooling layer
  • 把网络中的最后一个FC layer + softmax替换成两个并行的网络,一个是FC + softmax来进行分类,另一个是FC + bbox regressor来进行位置回归
  • 网络的输入也变成了两个:图片和每个图片对应的RoIs

4.2 微调(Fine-tuning)

文中指出了SPPnet在fine-tune时不会更新SPP layer之前的层,因为SPP layer的反向传播是非常低效的。此外,R-CNN和SPPnet共同存在的一个问题就是,在训练时,假设一个mini-batch有128个RoI,那么这128个RoI全部是来自于不同的图片的,这样就导致不能共享feature,使得整个反向传播的效率非常低。
那么在Fast R-CNN中,作者提出了一个新的方法使得训练过程中能够共享feature。首先一个mini-batch是从N张图片中采样的,每张图片采取R/N个RoI,假设N=2,R=128,那么有64个RoI是来自同一张图片的,所以这些RoI可以在forward 和 backward passes时共享计算和内存(可以理解为共享feature),这样就会比来自不同图片的128个RoI快64倍。
此外呢,整个训练过程是one fine-tune stage的,这是因为Fast R-CNN网络直接包括softmax分类器和bounding-box regressor,所以不用额外训练SVM分类器和回归器。

4.3 损失函数(Multi-task loss)

Fast R-CNN有两个输出,一个是softmax输出的分类结果,另一个是regressor输出的位置offset,所以我们的loss包含两个部分,用这个共同的loss去同时训练这两部分。

4.3.1 分类器(Classifier)

分类器会为每个Rol输出一个possibility distribution p = ( p 0 , … , p k ) , p=\left(p_{0}, \ldots, p_{k}\right) \quad, p=(p0,,pk), 同时每个Rol都有一 个ground-truth class u u u u u u 不是一个概率分布, 而是一个数字, 为0是代表是背景, 为1-20是 代表所属的类别),所以分类器的损失函数可以表示为:
L c l s ( p , u ) = − log ⁡ p u L_{c l s}(p, u)=-\log p_{u} Lcls(p,u)=logpu
其中, p u \quad p_{u} pu 代表这个Rol属于第 u u u 类的概率值。

4.3.2 回归器(Regressor)

回归器的作用是使得最后预测的bounding box和ground-truth的box更接近, 所以回归器的输出 是每个Rol需要进行的位置偏移(offset),回归器的输出为 t u = ( t x u , t y u , t w u , t h u ) , t^{u}=\left(t_{x}^{u}, t_{y}^{u}, t_{w}^{u}, t_{h}^{u}\right), tu=(txu,tyu,twu,thu), 那每个Rol也有一个regression target v , v, v, 所以回归器的损失函数可以表示为:
L l o c ( t u , v ) = ∑ i ∈ [ x , y , w , h ] smooth ⁡ L 1 ( t i u − v i ) L_{l o c}\left(t^{u}, v\right)=\sum_{i \in[x, y, w, h]} \operatorname{smooth}_{L_{1}}\left(t_{i}^{u}-v_{i}\right) Lloc(tu,v)=i[x,y,w,h]smoothL1(tiuvi)
其中,
smooth ⁡ L 1 ( x ) = { 0.5 x 2  if  ∣ x ∣ < 1 ∣ x ∣ − 0.5  otherwise  \operatorname{smooth}_{L_{1}}(x)=\left\{\begin{array}{cc} 0.5 x^{2} & \text { if }|x|<1 \\ |x|-0.5 & \text { otherwise } \end{array}\right. smoothL1(x)={0.5x2x0.5 if x<1 otherwise 
所以, Fast R-CNN的损失函数可以表示为:
L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , v ) L\left(p, u, t^{u}, v\right)=L_{c l s}(p, u)+\lambda[u \geq 1] L_{l o c}\left(t^{u}, v\right) L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)
其中, [ u ≥ 1 ] [u \geq 1] [u1] 是一个指示器, 当 u ≥ 1 u \geq 1 u1 时, 为1, 否则为0。这是因为当 u = 0 u=0 u=0 时, 代表 是背景,所以我们就不需要考虑这个Rol的位置。

其中关于每个RoI的ground truth的定义:如果这个RoI和某个ground truth box有最大的IoU值,那么这个ground truth box的类别就是这个RoI对应的ground truth class,然后这个RoI变到该ground truth box的位置变换,即为该RoI的regression ground truth。

4.4 反向传播(Back-propagation)

这个主要是讲RoI pooling layer的反向传播,这个其实就和pooling层的反向传播类似,毕竟它本质上也就是个pooling层嘛。所以我们先来看一下pooling层如何进行反向传播的。

4.4.1 Max pooling

下图显示的是max pooling的前向传播和反向传播,前向传播主要是处理feature,比如(2, 2)的pool size,就是在(2, 2)的区域内取一个最大值。那反向传播呢主要是处理gradient,过程和前向刚好相反,这里是把值赋予给原来最大值所在的那个位置,然后 其他位置就设置为0(如右图所示)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FQf5WC3t-1597475720989)(en-resource://database/979:1)]

图3 max pooling

4.4.2 Average pooling

下图显示的是average pooling的前向传播和反向传播,前向传播主要是处理feature,比如(2, 2)的pool size,就是在(2, 2)的区域内求一个平均值。那反向传播呢主要是处理gradient,过程和前向刚好相反,是把值均分为4份赋予给原来(2, 2)区域内的所有位置(如右图所示)。
在这里插入图片描述

图4 average pooling

5. 测试(Testing)

在测试时,就是输入一张图片和object proposals(RoI)到网络中,网络便会输出每个RoI的分类结果和位置偏移,然后就对RoI进行位置调整,最后同样也是使用非极大值抑制(NMS)来去除掉重复的框,便得到最终的结果。

同时,文章也提出了可以使用SVD分解进一步加快速度。因为在整个过程中,全连接层耗费的时间相对较长,所以可以把全连接层的权重矩阵W经过奇异值分解(SVD)分解成两个参数较少的全连接层,这样可以使得速度更快。

总结(Conclusion)

Fast R-CNN还是很优雅的,把整个过程集成为一个single-stage pipeline,但是还是有一个小问题的,它的region proposal还是单独做计算的,还是没有实现真正的一体化呀。

参考:https://zhuanlan.zhihu.com/p/60968116

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值