Fast RCNN

Fast RCNN
Abstract
本文提出了一种快速基于区域的卷积网络目标检测方法(Fast RCNN)。Fast RCNN基于之前使用深度卷积网络来更好的进行候选目标区域分类的工作基础之上。和之前的工作相比,Fast RCNN提供了几种创新来提高训练和测试的速度并提升了检测的准确性。Fast RCNN训练VGG16的速度要比RCNN快9倍,在测试时的快213倍,并在PASCAL VOC上实现了更高的mAP。和SPPnet相比,Fast RCNN训练VGG16的速度快上3倍,测试时快10倍并且更加准确。Fast RCNN由python 和C++实现,并且已经开源。
Introduction
近来,深度卷积网络已经显著提升了图像分类和目标检测的准确性。和图像分类相比,目标检测是一个更具有挑战性的工作,需要更复杂的方法解决。由于其复杂性,当前的模型训练方法一般是多阶段,并且十分缓慢且精度不高。
复杂性的上升是由于检测需要对物体的位置进行准确的定位,这就有两个首要的问题。其一,许多候选的物体位置需要被处理。其二,这些候选区域只提供粗略的位置并且必须被修正来提供更加精确的定位。解决这些问题的方法通常需要牺牲,速度,准确性和模型的简单性。
在本文中,我们依次展示了当前最先进的基于卷积网络的目标检测器的训练过程。我们提出了一个单阶段训练方法,联合学习候选区域分类以及修正空间定位的精度。
这种方法训练VGG16的速度比RCNN快9倍,比SPPnet快3倍。在运行时,每张图片仅需要耗费0.3s,在PASCAL VOC 2012 上实现最高的准确率为66%。
R-CNN and SPPnet
RCNN通过使用深度卷积神经网络来分类目标候选区域实现了极好的目标检测准确性。不过,它也有一些显著的缺陷。1.训练是一个多阶段的过程。R-CNN首先在目标候选框上使用log损失来微调神经网络。之后,用卷积网络学习到的特征来调整SVM。这些SVM分类器的作用是目标检测器,代替了通过微调学习到的softmax分类器。在第三个训练阶段,学习到了bounding-box回归器。2.训练十分的耗费空间和时间。对于SVM以及bounding box回归器的训练来说,会从每张图片的每一个候选区域中提取特征并写入到磁盘中。使用很深的网络,例如VGG16,这个过程大约5000个图像在单个GPU上要花费2.5天。这些特征需要数百G的存储空间。3.目标检测的速度很慢。在测试时。特征会从每张图片上的每个候选区域中提取。在一块GPU上检测一张图片需要花费47s。
RCNN很慢是因为它对每一个候选区域进行卷积网络前传,而不进行计算共享。空间金字塔池化网络(SPPnets)被提出出来通过计算共享来对RCNN进行加速。SPPnet网络对每一个完整的图像计算卷积特征图,之后使用从共享的特征图中提取出来的特征向量来对每一个候选区域进行分类。特征通过最大池化候选区域中特征图部分而被提取出来并转化为固定大小。多个输出被池化,之后连接成最大金字塔。SPPnet在测试时可以将RCNN加速到10到100倍。训练的时间也因为更快的特征提取而被减少了三倍。
不过,SPPnet也有一些显著的缺陷。就像RCNN一样,训练过程是一个多阶段的流水线,包含了特征提取,使用log损失来对网络进行微调,训练SVMs,以及最后的bounding box 回归器的拟合。特征也会被写入到磁盘当中。但是不像RCNN,微调算法不能更新空间金字塔之前的卷积层。不难预料,这种限制使得对于很深的网络来说,其准确性受到了限制。
Contribution
我们提出了一种新的算法,很好的解决了RCNN以及SPPnet中存在的问题,并且提高了准确性以及速度。Fast RCNN有以下几个优点。1、map值高于RCNN以及SPPnet。2、训练过程使用多任务loss,只有一个阶段。3、训练可以更新所有的网络层。4、不需要存储提取出来的特征。

Architecture and training
图1展示了Fast RCNN的结构。Fast RCNN网络将一整张图片以及一系列目标候选区域作为输入。网络首先用几个卷积层来对整张图片进行处理,之后使用一个最大池化层来产生卷积特征图。对于每一个候选框,ROI池化层从特征图中抽取固定大小的特征向量。每个向量被喂到一系列的池化层中,之后产生两个同级的向量层:其中一个输出K个类别加一个背景类别的概率估计,另一个为K个类别中每一个类别输出4个真实值。每一组值都是对某一个类别回归框位置的修正。
The RoI pooling layer
RoI池化层使用最大池化来将roi区域中有价值的特征转化为一个小的特征图,固定的大小为H*W。H和W是这一层的超参,独立于任何的RoI之外。在本文之中,RoI是卷积特征图中的一个矩形窗口。每一个RoI都是有四个值确定的。
RoI最大池化通过将窗口分成一系列的子窗口,并得出大约的面积。然后对每一个子窗口输出进行最大池化,将输出合并到相应的输出单元之中。同标准的最大池化一样,池化操作是对每一个特征图通道单独作用的。
Initiaizing from pre-trained networks
用了三个预训练的ImageNet网络进行预训练,每个网络有5个最大池化层以及5到13个卷积层。当预训练网络初始化一个Fast RCNN网络时,会进行三个变体。
首先,最后一个最大池化层会被ROI池化层所代替。
其次,网络的最后一个全连接层和softmax层会被之前描述过的两个同级层所代替。
第三,网络被修正成两个输入,一系列图片,以及这些图片上的一系列ROI。
Fine-tuning for detection
对于Fast RCNN来说,用反向传播算法计算所有的网络权重是十分重要的能力。首先,先阐述一下,为什么sPPnet无法更新位于空间金字塔下面的层的权重。
根本原因是,当训练样本来自于不同的图片时SPP的反向传播算法是十分低效率的。(why?如果都来自于一张图片是否就高效?)这也正是RCNN以及SPPnet的训练方式。这种低效率的原因是每个ROI的感受野太大了,有时候甚至包括了整个图片。由于正向传播算法必须处理整个感受野,训练的输入经常很大。
我们提出了一种效率更高的方式,即在训练过程中特征共享。Fast RCNN中的SGD的批量的采样是分层的,先采图片,再对每个图片采样ROI。ROI来自于同一个图片,可以减少正向以及反向的计算和存储。当我们使得图片的数量减少时,就可以使得mini-batch的计算减少。
这种想法,有可能会因为ROI之间的相关性使得训练收敛变慢,不过实际使用时这个问题并没有发生。
为了分层采样,Fast RCNN采用了流水线的训练过程,使用了一个微调联合优化了一个softmax分类器和bounding box回归器,而不是在三个阶段,分别训练一个softmax分类器。SVM以及回归器。

Multi-task loss
Fast RCNN有两个同级的输出层。第一个输出K+1上的类别概率,这是通过全连接层上的softmax实现的。第二个输出bounding box回归的偏移量。、
每一个训练的ROI的label 包含了类别和框。我们用一个多任务的loss来联合训练分类和bounding box回归。Loss如下:

对于背景ROI没有bounding box,因此它的第二个loss也就自动忽略了。对于bounding box回归的loss的具体展开如下。

其中L1是比较鲁棒的,对于异常点不是十分敏感,与之相比RCNN以及SPPnet中的L2就相对敏感。当回归的目标无界的时候,,带有L2损失的训练需要更仔细的微调学习率来防止梯度爆炸。
等式1中的超参控制着两个loss的平衡。
Mini-batch sampling
在微调阶段,每个SGD小批量是由2张图片构成的。Batch的size是128,每张图片上采样64个ROI。我们从候选框中选择25%的ROI,这些的IoU至少是0.5。这些ROI包含了被标记为前景物体的目标类别。剩余的ROI从其他的IOU在0.1-0.5之间的选,这些是背景样本。(The lower threshold of 0.1 appears to act as a heuristic for hard example mining ???)训练过程中,图片有50%的可能性会发生水平反转。不需要进行其他的数据增强。
Back-propagation through RoI pooling layers。
反向传播经过RoI池化层。为了清楚起见,我们假设每一个batch只有一张图片。结论是有扩展性的,因为传播对每一张图片都是独立的。

SGD hyper-parameters
用于Softmax分类和检测框回归的全连接层的权重分别使用具有方差0.01和0.001的零均值高斯分布初始化。偏置初始化为0。所有层的权重学习率为1倍的全局学习率,偏置为2倍的全局学习率,全局学习率为0.0

深度学习之卷积神经网络CNN做手写体识别的VS代码。支持linux版本和VS2012版本。 tiny-cnn: A C++11 implementation of convolutional neural networks ======== tiny-cnn is a C++11 implementation of convolutional neural networks. design principle ----- * fast, without GPU 98.8% accuracy on MNIST in 13 minutes training (@Core i7-3520M) * header only, policy-based design supported networks ----- ### layer-types * fully-connected layer * convolutional layer * average pooling layer ### activation functions * tanh * sigmoid * rectified linear * identity ### loss functions * cross-entropy * mean-squared-error ### optimization algorithm * stochastic gradient descent (with/without L2 normalization) * stochastic gradient levenberg marquardt dependencies ----- * boost C++ library * Intel TBB sample code ------ ```cpp #include "tiny_cnn.h" using namespace tiny_cnn; // specify loss-function and optimization-algorithm typedef network CNN; // tanh, 32x32 input, 5x5 window, 1-6 feature-maps convolution convolutional_layer C1(32, 32, 5, 1, 6); // tanh, 28x28 input, 6 feature-maps, 2x2 subsampling average_pooling_layer S2(28, 28, 6, 2); // fully-connected layers fully_connected_layer F3(14*14*6, 120); fully_connected_layer F4(120, 10); // connect all CNN mynet; mynet.add(&C1); mynet.add(&S2); mynet.add(&F3); mynet.add(&F4); assert(mynet.in_dim() == 32*32); assert(mynet.out_dim() == 10); ``` more sample, read main.cpp build sample program ------ ### gcc(4.6~) without tbb ./waf configure --BOOST_ROOT=your-boost-root ./waf build with tbb ./waf configure --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build with tbb and SSE/AVX ./waf configure --AVX --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build ./waf configure --SSE --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build or edit inlude/config.h to customize default behavior. ### vc(2012~) open vc/tiny_cnn.sln and build in release mode.
<think>好的,我现在需要回答用户关于Fast R-CNN的问题。首先,用户已经提到了R-CNN系列的其他算法,比如R-CNN、SPPNet、Faster R-CNN和Mask R-CNN,并引用了相关的资料[^1][^2]。用户可能已经对这些算法有了一定的了解,现在想重点了解Fast R-CNN的原理、实现和应用场景。 首先,我应该回顾Fast R-CNN的基本原理。根据之前的R-CNN发展,R-CNN的一个主要问题是速度慢,因为它对每个候选区域单独进行卷积运算,导致大量重复计算。SPPNet通过空间金字塔池化(SPP)层解决了这个问题,允许网络对任意大小的区域进行特征提取,但训练过程仍然是多阶段的。Fast R-CNN在此基础上做了改进,整合了特征提取、分类和边界框回归,实现了端到端的训练,同时提高了速度和精度。 接下来需要整理Fast R-CNN的关键改进点。首先是ROI Pooling,取代了SPP层,将不同大小的候选区域转换为固定大小的特征图。其次是多任务损失函数,将分类损失和回归损失结合在一起,简化了训练流程。此外,Fast R-CNN不需要将特征存储在磁盘上,减少了内存消耗。 然后需要说明算法流程。输入图像经过CNN得到特征图,然后提取候选区域(如通过Selective Search),通过ROI Pooling处理这些区域,最后通过全连接层进行分类和回归。这部分需要简明扼要,突出步骤间的逻辑。 关于实现方法,用户可能关心代码结构。需要提供一个简化的PyTorch示例,包括模型定义、ROI Pooling的使用以及多任务损失的计算。代码应展示关键部分,如特征提取、ROI处理和损失函数,但不需要完整实现,避免过于复杂。 应用场景方面,Fast R-CNN适用于需要较高检测精度和实时性要求的场合,比如自动驾驶、视频监控等。可以举例说明其在工业界和学术界的应用。 最后,生成相关问题时要围绕Fast R-CNN的改进点、与其他算法的对比、实现细节和应用展开,帮助用户深入理解。 需要确保所有数学公式和术语符合格式要求,使用中文回答,结构清晰。同时检查引用是否正确,引用标识是否自然添加。避免使用Markdown格式,保持回答流畅自然。</think>### Fast R-CNN 算法详解 #### 一、算法背景 Fast R-CNN 是 R-CNN 系列的第二代改进模型,解决了 R-CNN 和 SPPNet 的计算冗余和多阶段训练问题[^1]。其核心改进在于**端到端训练**和**特征共享**,将检测速度提升至 R-CNN 的 200 倍以上。 #### 二、核心原理 1. **特征共享** 输入整张图像至卷积神经网络CNN),生成共享特征图,避免重复计算候选区域的特征[^2]。 2. **ROI Pooling 层** 将不同尺寸的候选区域(Region of Interest, ROI)映射为固定大小(如 $7×7$)的特征图。公式描述: $$ \text{ROI Pooling}(x_i, h, w) = \max_{0≤m< \frac{h}{H}} \max_{0≤n< \frac{w}{W}} x_i(m,n) $$ 其中 $H×W$ 是输出尺寸,$h×w$ 是输入区域尺寸。 3. **多任务损失函数** - 分类损失:Softmax 交叉熵 - 边界框回归损失:Smooth L1 损失 总损失函数为二者加权和: $$ L = L_{\text{cls}} + \lambda L_{\text{reg}} $$ #### 三、算法流程 1. 输入图像通过 CNN 生成特征图 2. 使用 Selective Search 提取约 2000 个候选区域 3. ROI Pooling 将候选区域特征标准化 4. 全连接层输出分类结果和边界框回归参数 #### 四、PyTorch 简化实现 ```python import torch import torchvision from torch import nn class FastRCNN(nn.Module): def __init__(self, num_classes): super().__init__() # 特征提取层(使用预训练VGG16) self.backbone = torchvision.models.vgg16(pretrained=True).features # ROI Pooling层 self.roi_pool = torchvision.ops.RoIPool((7,7), spatial_scale=1/16) # 分类与回归头 self.fc = nn.Sequential( nn.Linear(512*7*7, 4096), nn.ReLU(), nn.Linear(4096, 4096), nn.ReLU() ) self.cls_head = nn.Linear(4096, num_classes) self.reg_head = nn.Linear(4096, 4*num_classes) def forward(self, images, rois): # 提取共享特征 features = self.backbone(images) # [batch, 512, H/16, W/16] # ROI Pooling pooled = self.roi_pool(features, rois) # [num_rois, 512,7,7] # 全连接处理 flattened = pooled.flatten(1) # [num_rois, 512*7*7] fc_out = self.fc(flattened) # 输出结果 cls_scores = self.cls_head(fc_out) # [num_rois, num_classes] reg_params = self.reg_head(fc_out) # [num_rois, 4*num_classes] return cls_scores, reg_params ``` #### 五、应用场景 1. **实时视频分析**:如监控系统中的人/车检测 2. **医学影像处理**:病灶区域定位 3. **自动驾驶**:道路目标实时检测
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值