Fast R-CNN网络结构、框架原理详解

一、Fast R-CNN简介

Fast R-CNN是一种基于区域卷积网络 ( Region-based Convolutional Network ) 的快速目标检测方法。是R-CNN作者Ross Girshick继R-CNN 之后的又一力作,原文链接。与R-CNN相同,Fast R-CNN同样使用VGG16作为网络的backbone,FastR-CNN训练非常深的VGG16网络比R-CNN快9倍,在测试时快213倍,并且在pascalVOC2012上实现了更高的mAP。与SPPnet相比,FastR-CNN训练VGG16 3×的速度更快,测试速度更快10×,而且更准确。

Fast R-CNN architecture

二、 Fast R-CNN 详解

1.Fast R-CNN处理过程

1) Fast R-CNN整张图片一组建议框(object proposals)作为输入,通过几个卷积层和最大池化层处理整张图像,得到卷积特征图(conv feature map)

2)对于每个建议框,通过RoI pooling layer 为每个object proposal来提取在feature map上对应的特征,并使得输出都具有相同size的特征图。

3)将每个特征图输入到一系列的全连接层(FCs)中, 把这些特征综合起来。

4)将综合起来的特征,通过概率分类器(FC layer+softmax)和边界框回归器(FC layer+bbox regressor)输出。

2、Fast R-CNN的重要知识

1)object proposals(建议框或候选区域)的生成

与R-CNN一样,利用Selective Search算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就包含着可能需要的物体。

但是,Fast R-CNN与R-CNN不同的是,这些生成出来的候选区域不需要每一个都丢到卷积神经网络里面提取特征,而且只需要在特征图上映射便可,见下一个步骤。

2)投影特征图获得相应的特征矩阵

Fast-RCNN没有像RCNN一样,其不限制输入的图像的尺寸,其将整张图像送入网络,得到了一个特征图。紧接着从特征图像上提取相应的候选区域。这些候选区域的特征不需要再重复计算,简洁了不少的时间。

 

但是这其中涉及训练数据正负样本采样的问题。不过Fast R-CNN与Faster R-CNN处理得不同,也可以不用太过的在意。

        在Fast R-CNN中,并不适用SS算法提供的所有的候选区域,SS算法会差不多得到2000个候选框,但是训练的过程中其实只需要使用其中的一部分就可以了,Fast R-CNN中好像只挑选了其中的64个。其中还是分为正样本与负样本,正样本指的是在候选框中确实存在所需检测目标的样本;而负样本指的是候选框中没有所需检测的目标,也就是只有背景。

        当数据不平衡时,数据会有所偏向。如果全部只有正样本,那么网络就会有很大的一个概率认为候选区域是我们需要的一个检测目标,这样就会有问题,所以存在正负样品。正样本的定义为候选框与真实的目标边界框的iou大于0.5;负样本的定义为候选框与所有真实的目标边界框的iou值最大的区间为0.1-0.5。重点是其实没有完全适应SS算法提供的所以的边界框。

3)RoI pooling layer

RoI max pooling 的原理:

将 h×w RoI 窗口划分为大小近似为 h/H × w/W 大小的子窗口的 H×W 网格 ;然后将每个子窗口的中的值最大化(max-pooliing) 作为对应对应网格的输出 ;RoI pooling layer 是 SPP-Net 的特例,它只有一个金字塔层 。

有了训练样本之后,将训练样本的候选框通过ROI Pooling层缩放到统一的尺寸。

ROI Pooling层的具体做法是,将候选框所框选的训练样本,这是一个比较抽象的特征信息。将其划分为77,也就是49等份。划分之后,对每一个区域做一个最大池化下采样操作,也就是MaxPooling操作。如此对49等分的候选区域操作,便得到了一个77的特征矩阵。

也就是说,无论候选区域的特征矩阵是怎么样的尺寸,都被缩放到一个77的大小,这样就可以不去限制输入图像的尺寸了。因为,作进一步的工作的是输入图像的候选区域,而候选区域总是能被缩放为77的尺寸的,所以也就和输入图像的尺寸无关。

在R-CNN当中,其使用的卷积神经网络要求输入是227*227大小,但是Fast R-CNN就不需要考虑这个因素。

4)展平特征图利用全连接层得到预测结果。

         概率分类器

输出N+1个类别的概率(N为检测目标的种类, 1为背景)共N+1个节点。

其中的第0个节点表示的背景的概率。剩下的20个是其他所需检测的类别概率。这个概率是经过softmax处理之后的,是满足一个概率分布的,其和为1.而既然现在是需要预测21个类别的概率,所以目标概率预测的全连接层为21个节点。

        边界框回归器

输出对应N+1个类别的候选边界框回归参数(d x , d y , d w , d h )。需要注意,这是每一个类别都有这4个参数。所以共(N+1)x4个节点。

也就是4个4个为一组,一组为一个边界框回归参数。那么如何根据回归参数得到最后的预测边界框?对应着每个类别的候选边界框回归参数(d x , d y , d w , d h)。

 

Px,Py,Pw,Ph 分别为候选框的中心x,y坐标,以及宽高
Gx,Gy,Gw,Gh 分别为最终预测的边界框中心x,y坐标,以及宽高

4)Fast R-CNN损失函数

由于最后是两个不同的输出,所以就有了多任务损失(multi-task loss) ,分别输出概率分布和回归偏移。其损失函数如下。

其中真实目标边界框回归参数的计算公式为:

其中对于分类损失:

其中对于边界框回归损失:

注意,这个损失是由4个部分组成的。分别对应着我们回归参数 x 的smoothL1的回归损失,回归参数 y 的smoothL1的回归损失,回归参数 w 的smoothL1的回归损失与最后的回归参数 h 的smoothL1的回归损失。

  • tu对应边界框回归器预测的对应类别u的回归参数(tux,tuy,tuw,tuh)
  • v对应真实目标的边界框回归参数(vx,vy,vw,vh)

而具体的smoothL1损失的计算公式为:

λ 是一个平衡系数,用于平衡分类损失与边界框回归损失。

[u ≥ 1] 是艾佛森括号,也可以理解为一个计算公式。当u满足条件是,公式的值为1;而当u不满足条件时,也就是u<1时,也就是u=0时,(u为类别的标签),此时类别标签为背景,公式的值为0.

u代表了目标的真是标签,u ≥ 1表示候选区域确实属于所需检测的某一个类别当中,也就是对应着正样本。当u=0时,此时候选区域对应着为背景,不属于所需检测的某一个类别当中。那既然是背景,就没有边界框回归损失这一项了。

也就是Fast R-CNN的总损失 = 分类损失 + 边界框回归损失然后对其进行反向传播就可以训练Fast R-CNN网络了。

三、Fast R-CNN总结(Conclusion)

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

参考资料:目标检测算法——Fast R-CNN_目标检测_Clichong-GitCode 开源社区 (csdn.net)

<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. **自动驾驶**:道路目标实时检测
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值