第十七周:Fast R-CNN论文阅读
Fast R-CNN论文阅读
- 摘要
- Abstract
- 文章简介
- 1. 引言
- 2. Fast R-CNN框架
- 2.1 RoI位置信息映射
- 2.2 RoI pooling
- 2.3 分类器与边界框回归器
- 2.4 以VGG16为backbone的Fast RCNN的网络结构
- 3. 训练细节
- 3.1 采样
- 3.2 多任务损失
- 4. 优缺点分析
- 总结
摘要
这篇博客介绍了Fast R-CNN,这是一种双阶段的目标检测模型,是对RCNN的改进。RCNN由于对每个候选区域单独进行特征提取,导致了大量的重复计算。为了解决这一问题,Fast R-CNN引入了更为高效的策略。它首先对整张图片进行卷积操作,得到特征图,然后根据候选区域在原图中的空间位置信息,在特征图上进行RoI Pooling,从而避免了重复计算。RoI Pooling层根据预定义的网格尺寸对候选区域特征图进行划分,然后在每个网格内执行最大池化操作,最终生成固定尺寸的RoI特征向量。这种方法还确保了无论候选区域的大小如何变化,都能生成一致的特征表示。此外,Fast R-CNN采用多任务损失函数,对分类器和边界框回归器进行联合训练。这种设计不仅加快了训练和推理的速度,还通过学习两种任务之间的相互影响,提高了目标检测的准确度。与RCNN相比,Fast R-CNN实现了端到端的训练,减少了训练阶段的复杂性,从而提升了检测精度。但Fast R-CNN并未解决候选区域生成过程中的耗时问题。
Abstract
This blog introduces Fast R-CNN, a two-stage object detection model that improves upon RCNN. RCNN extracts features for each candidate region separately, leading to a significant amount of redundant computations. To address this, Fast R-CNN introduces a more efficient strategy. It first performs convolution on the entire image to obtain feature maps, then conducts RoI Pooling on these feature maps based on the spatial location information of the candidate regions, thus avoiding redundant computations. The RoI Pooling layer divides the feature maps of candidate regions according to predefined grid sizes and performs max pooling in each grid, ultimately generating fixed-size RoI feature vectors. This method also ensures that consistent feature representations are generated regardless of variations in the size of candidate regions. Additionally, Fast R-CNN employs a multi-task loss function to jointly train the classifier and bounding box regressor. This design not only accelerates training and inference speeds but also enhances detection accuracy by learning the interactions between the two tasks. Compared to RCNN, Fast R-CNN achieves end-to-end training, reducing the complexity of the training phase and thus improving detection accuracy. However, Fast R-CNN does not address the time-consuming issue of candidate region generation.
文章简介
Title:Fast R-CNN
Author:Ross Girshick ;Microsoft Research
WOS:https://arxiv.org/abs/1504.08083v2
1. 引言
在FastRCNN提出之前,目标检测算法都是采用的多阶段训练流程,如RCNN。
目标检测任务的复杂性是因为需要目标的精确定位,这就带来了两个主要的难点:需要处理大量的候选区域、需要对这些候选框进行调整以实现精确定位。
尽管RCNN在目标检测任务上达到了很高的准确率,但也具有明显的缺点:
- 训练过程是多阶段的流程:首先,需要对与训练好的CNN进行微调;然后将CNN提取到的特征用来训练SVM分类器;最后用CNN提取到的特征来训练边界框回归器。三个步骤依次执行。
- 训练在时间和空间上的开销很大:训练SVM分类器和边界框回归器的数据是由CNN提取出的候选框的特征,这些特征需要先存到磁盘,在训练SVM分类器和边界框回归器时再从磁盘取出使用。
- 目标检测的速度很慢:在测试时,从每个测试图像中的每个候选区域提取一次特征,非常耗时。
2. Fast R-CNN框架
Fast R-CNN框架如下图所示。与RCNN一样,Fast R-CNN采用 selective search 算法产生图像的2K个左右的候选框。与RCNN不同,Fast R-CNN的网络输入图像不是候选区域,而是整张图像,而且候选框的位置信息也作为网络输入。整张图像经过CNN(文中用的网络是VGG的最后一个卷积层之前的网络)提取特征后,得到图像的特征图。各种不同大小的候选区域对应的特征图经过 RoI pooling 层得到特定尺寸的特征图,这些特征图展平后经过两层全连接层得到RoI特征向量。每个 RoI 特征向量分别经过两个不同的全连接层,其中,一个最终经过softmax得到每个类别的概率,另一个最终经过边框回归器得到除背景外其他所有类别的边框调整信息。
2.1 RoI位置信息映射
Fast R-CNN的网络输入是整张图像和其中的候选区域的信息,候选区域的特征图是根据整张图像的特征图和候选区域在原图中的相对位置得到的,具体方式如下:
位置信息先不考虑通道
经过卷积后,RoI在原图和特征图中的相对位置不变。
2.2 RoI pooling
RoI pooling 的输入是原图像的特征图和 RoI 在特征图中的位置信息,输出是特定尺寸的 RoI 特征图。
RoI pooling 对特征图中的 RoI 的每个通道都进行最大池化,但 RoI pooling 需要根据 RoI 的尺寸来决定池化的尺寸,具体如下:
假设RoI层的输出为
k
∗
k
k*k
k∗k ,RoI 特征图区域尺寸为
H
∗
W
H*W
H∗W,则划分后的网格中每个格子的尺寸为
H
k
∗
W
k
\frac{H}{k}*\frac{W}{k}
kH∗kW。若网格的分界线落到非整数像素上,则可对像素采用四舍五入的方法确定其所属的网格,例如如果一个网格从(1.2, 3.3)到(2.8, 4.7),则此网格在实际中包括行1, 2, 3和列3, 4, 5的像素,另一种处理方法为填充,使得每个网格尺寸为整数。
2.3 分类器与边界框回归器
分类器的输出为 N + 1 N+1 N+1个类别的概率,其概率是经过softmax的,所以满足概率分布,即概率的和为1;边界框回归器的输出是目标类别的位置和大小调整信息,输出的节点数为 N ∗ 4 N*4 N∗4.其中N为目标类别的个数,不包括背景。
2.4 以VGG16为backbone的Fast RCNN的网络结构
Layer Name | Type | Parameters | Activation Function |
---|---|---|---|
conv1_1 | Convolution | 3x3 filters, 64 channels | ReLU |
conv1_2 | Convolution | 3x3 filters, 64 channels | ReLU |
pool1 | Max Pooling | 2x2 pool, stride 2 | - |
conv2_1 | Convolution | 3x3 filters, 128 channels | ReLU |
conv2_2 | Convolution | 3x3 filters, 128 channels | ReLU |
pool2 | Max Pooling | 2x2 pool, stride 2 | - |
conv3_1 | Convolution | 3x3 filters, 256 channels | ReLU |
conv3_2 | Convolution | 3x3 filters, 256 channels | ReLU |
conv3_3 | Convolution | 3x3 filters, 256 channels | ReLU |
pool3 | Max Pooling | 2x2 pool, stride 2 | - |
conv4_1 | Convolution | 3x3 filters, 512 channels | ReLU |
conv4_2 | Convolution | 3x3 filters, 512 channels | ReLU |
conv4_3 | Convolution | 3x3 filters, 512 channels | ReLU |
pool4 | Max Pooling | 2x2 pool, stride 2 | - |
conv5_1 | Convolution | 3x3 filters, 512 channels | ReLU |
conv5_2 | Convolution | 3x3 filters, 512 channels | ReLU |
conv5_3 | Convolution | 3x3 filters, 512 channels | ReLU |
pool5 | Max Pooling | 2x2 pool, stride 2 | - |
RoI Pooling | RoI Pooling | Fixed-size pooling (e.g., 7x7) | - |
fc6 | Fully Connected | Weights 25088x4096, bias 4096 | ReLU |
fc7 | Fully Connected | Weights 4096x4096, bias 4096 | ReLU |
cls_score | Fully Connected | Weights 4096xnum_classes, bias num_classes | - |
bbox_pred | Fully Connected | Weights 4096x4num_classes, bias 4num_classes | - |
其中,VGG16的pool5及其前面的层没有变动,后面依次加入了RoI pooling层、两个全连接层、分类器和边界框回归器。
由于在全连接层之前使用了RoI pooling层来得到固定尺寸的RoI 特征图,所以网络的图像输入可以是任意尺寸的,而不像RCNN那样在网络输入前对图像进行warp处理以得到相同尺寸的图像输入。这也是对RCNN的一大改进。
3. 训练细节
网络的预训练与CRNN类似,也是在图像分类数据集上来训练卷积网络(文中是VGG),预训练使得卷积网络能够有很好的图像特征提取能力。本小节主要说明微调训练时的关键细节。
3.1 采样
在微调时,使用mini-batch采样。采样方式为分层采样,先采集N个图像,再从N个图像中采集R/N个RoI,共R个样本。
训练时,不直接使用SS算法得到的所有候选区域,只需要使用其中的一小部分。从候选区域中采集25%的RoI,要求这些候选区域与GT(Ground Truth)的IoU至少为0.5,采集的到的RoI作为正样本,类别标记为正数;对于与所有GT的最大IoU在[0.1,0.5)上的候选框,从中采样得到负样本,就是背景类别,其类别标签为0;另外,对于与所有GT的最大IoU小于0.1上的候选区域,可以用于难例挖掘。在训练期间,图像以概率0.5水平翻转作为数据增强,不使用其他数据增强。
3.2 多任务损失
Fast RCNN 有两个平行的输出子层。其中一个输出子层输出当前RoI的类别概率分布 :
p
=
(
p
0
,
p
1
,
p
2
.
.
.
.
.
.
,
p
k
)
p=(p_0,p_1,p_2......,p_k)
p=(p0,p1,p2......,pk)
p
0
p_0
p0为背景的概率;另一个输出子层输出边界框回归偏移信息,
t
k
=
(
t
x
k
,
t
y
k
,
t
w
k
,
t
h
k
)
t^k=(t_x^k,t_y^k,t_w^k,t_h^k)
tk=(txk,tyk,twk,thk)其中K是目标类别,输出的是所有目标类别的偏移信息。
对每个RoI都用多任务损失来联合训练分类器和边界框回归器,多任务损失函数为:
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,v)=L_{cls}(p,u)+\lambda[u\geq1]L_{loc}(t^u,v)
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)其中,
u
u
u是 RoI 的真实类别,
v
v
v是真实的边界框偏移信息。
L
c
l
s
(
p
,
u
)
L_{cls}(p,u)
Lcls(p,u)是分类损失,真实类别的表示类似于独热编码,在对应的位置上的概率为1,其他位置都为0。所以在交叉熵损失实际为:
L
c
l
s
(
p
,
u
)
=
−
log
p
u
L_{cls}(p,u)=-\log p_u
Lcls(p,u)=−logpu.
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,v)=\sum_{i\in{\{x,y,w,h\}}}smooth_{L_1}(t_i^u-v_i)
Lloc(tu,v)=∑i∈{x,y,w,h}smoothL1(tiu−vi)是定位损失,
其中,
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, & \quad \text{if } |x| <1, \\ |x|-0.5, & \quad \text{otherwise} . \end{cases}
smoothL1(x)={0.5x2,∣x∣−0.5,if ∣x∣<1,otherwise.,使用
L
1
L_1
L1损失是因为其相对于
L
2
L_2
L2损失具有更强的鲁棒性,对越界的边框不敏感。
其中的位置偏移信息与RCNN是一样的:
多任务损失中
[
u
≥
1
]
=
{
1
,
if
u
≥
1
,
0
,
otherwise
.
[u\geq1] = \begin{cases} 1, & \quad \text{if } u \geq 1, \\ 0, & \quad \text{otherwise } . \end{cases}
[u≥1]={1,0,if u≥1,otherwise .,这是因为当
u
=
0
u=0
u=0时,表示当前RoI的类别为背景,没有边界框的真值概念,因此没有位置损失。超参
λ
\lambda
λ是用来控制多任务损失中分类损失和边界框损失的权重的,文中将其设为1。
4. 优缺点分析
Fast RCNN和RCNN都是利用了卷积网络来实现目标检测任务,但前者是相较于后者,将特征提取、分类、边界框回归进行了融合。下面两个图中,上方为Fast RCNN的模块,下面为CNN的。
前者的优点主要体现在:
- 共享特征提取:Fast R-CNN通过对整个图像进行一次卷积神经网络处理,提取出特征图,然后在特征图上处理所有的候选区域。这种共享特征提取的方式避免了重复计算,进一步加快了检测速度。
- 引入RoI Pooling层:Fast R-CNN引入了Region of Interest (RoI) Pooling层,该层能够将不同大小的候选区域转换为固定大小的特征图。网络能够接收不同尺寸的图像输入。
- 联合分类和回归:Fast R-CNN将分类和边界框回归任务整合到同一个网络中,使用了多任务损失函数来训练网络,实现了同时优化分类和回归任务。这种多任务学习的方式比R-CNN的分开处理更为高效。
- 端到端训练:Fast R-CNN 支持端到端训练,网络可以整体优化,从而实现更好的性能和更简便的训练流程。
总之,Fast R-CNN提高了效率和准确率,降低了时间和空间上的开销。
缺点:
Fast R-CNN降低了网络的耗时,但其还是使用了selective search算法来生成大量的候选框,这需要花费较多时间。且依赖这种外部区域提议算法可能导致漏检一些目标,尤其是在目标大小多样或背景复杂的情况下。
总结
Fast RCNN是一种双阶段目标检测算法,其网络的训练时一个单阶段的流程。Fast RCNN实现目标检测的流程如下:首先,和RCNN一样,使用selective search算法生成候选框;整张图像和生成的候选框位置、大小信息一起送入网络,得到特征图和候选框的位置映射;图片的特征图和候选框映射的位置一起经过RoI池化层,得到固定尺寸的RoI特征图;RoI特征图经过两层全连接层后得到RoI特征向量;RoI特征向量分别经过两个平行的全连接子层,其中一个子层为分类子层,得到K+1个类别概率,另一个子层为边界框回归子层,得到K个前景类别边界框修正信息。Fast RCNN相比其之前的目标检测模型,大幅提升了训练和推理速度,同时提升了准确度,但仍存在候选框生成耗时长的问题。