cnn输入层_【目标检测】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)

47baba9605021a180d687ce7125e15de.png
图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)。

f4c17b02a9fc44f2a710112d65765b1b.png
图2 RoI pooling layer示例

由此可见,经过RoI pooling layer之后,不同size的object proposal的feature map变成同样的size了。至于为什么需要RoI pooling layer,这和为什么在SPP-net要用SPP layer同样的道理,我在SPP-net的文章中讲解过了,可以参考哦(Jacqueline:【目标检测】SPP-net)。

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)

分类器会为每个RoI输出一个possibility distribution

,同时每个RoI都有一个ground-truth class
(
不是一个概率分布,而是一个数字,为0是代表是背景,为1-20是代表所属的类别),所以分类器的损失函数可以表示为:

9c123b423ac70b999ad5d8bd00ba825a.png

其中,

代表这个RoI属于第
类的概率值。

4.3.2 回归器(Regressor)

回归器的作用是使得最后预测的bounding box和ground-truth的box更接近,所以回归器的输出是每个RoI需要进行的位置偏移(offset),如果有同学不是很理解bounding box regression的话,可以参考我的这篇文章:Jacqueline:【目标检测】基础知识:IoU、NMS、Bounding box regression。回归器的输出为

,那每个RoI也有一个regression target
,所以回归器的损失函数可以表示为:

1d04a3f819aacf36eaf7dcae28b91cb2.png

其中,

89dd348c94814798dd442a004723c0c4.png

所以, Fast R-CNN的损失函数可以表示为:

769fc21d1e887be31d9879920ad08c4b.png

其中,

是一个指示器,当
时,为1,否则为0。这是因为当
时,代表是背景,所以我们就不需要考虑这个RoI的位置。

其中关于每个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(如右图所示)。

2e727a1ac4c7d91237b286ca83813ec1.png
图3 max pooling

4.4.2 Average pooling

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

a231e228c60d390a33588c87f61dfea4.png
图4 average pooling

5. 测试(Testing)

在测试时,就是输入一张图片和object proposals(RoI)到网络中,网络便会输出每个RoI的分类结果和位置偏移,然后就对RoI进行位置调整,最后同样也是使用非极大值抑制(NMS)来去除掉重复的框,便得到最终的结果。如果有同学不是很理解非极大值抑制,可以参考我这篇文章哦:Jacqueline:【目标检测】基础知识:IoU、NMS、Bounding box regression

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

总结(Conclusion)

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

本文都是根据个人理解编写的,希望可以帮到大家。此外,如有误,烦请指正。如果喜欢,请点赞哦,谢谢~

我将持续更新目标检测领域的经典paper,欢迎大家订阅哦!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值