Fast RCNN 目标检测网络学习记录 (附代码)

论文地址:https://arxiv.org/abs/1504.08083

代码地址:https://github.com/rbgirshick/fast-rcnn

1.是什么?

Fast RCNN是目标检测领域的一个算法框架,是RCNN的改进版。Fast RCNN的主要目的是解决RCNN算法中的瓶颈问题,即选择性搜索算法的速度较慢。Fast RCNN通过引入ROI池化层,将整张图片的卷积特征图和候选框的位置信息输入到全连接层中,从而避免了对每个候选框都进行卷积操作的问题,大大提高了检测速度。Fast RCNN的作用是在目标检测任务中,对于输入的图像进行目标检测,输出图像中所有目标的类别和位置信息。

2.为什么?

  1. RCNN对每个proposal单独通过CNN进行特征提取,速度非常慢,并且有很多的区域是重叠的,导致冗余计算。Fast RCNN只对全图进行一次特征提取,然后对于每个proposal,从提取的全图特征中截取对应的特征。
  2. 提出了RoI Pooling,由于后面有分类和回归任务,需要固定长度的特征。而Region Proposal的大小是不固定的,RCNN中的处理是对proposal进行裁剪缩放到固定大小,无法完整保存原始图像的信息。Fast RCNN提出了RoI Pooling将特征调整为同样大小。
  3. Fast RCNN使用全连接层+softmax代替了RCNN中的SVM分类器,特征提取、分类、回归这个三部分合在了一起。

3.怎么样?

3.1网络结构

如图,将一张图像输入到 Deep ConvNet 中得到图像的特征图,根据ROI区域与整体图像的坐标映射关系 (RoI Projection)进行特征映射(Conv feature map),能够得到每一个候选区域(ROI区域)的特征矩阵。
将每一个特征矩阵通过RoI pooling layer,池化到固定尺寸(7*7),然后展平为向量(vector)。再经过两个全连接层(fully connected layers,FC),得到ROI特征向量(ROI feature vector)。
之后 ROI feature vector 并联两个FC,其中一个用于目标概率预测(softmax),另一个用于边界框参数的回归(bbox regressor,bbox 表示 bounding box)。
 

3.2 算法流程 

(1)输入图像;
(2)通过深度网络中的卷积层(VGG、Alexnet、Resnet等中的卷积层)对图像进行特征提取,得到图片的特征图;
(3)通过选择性搜索算法得到图像的感兴趣区域(通常取2000个);
(4)对得到的感兴趣区域进行ROI pooling(感兴趣区域池化):即通过坐标投影的方法,在特征图上得到输入图像中的感兴趣区域对应的特征区域,并对该区域进行最大值池化,这样就得到了感兴趣区域的特征,并且统一了特征大小,如图2所示;
(5)对ROI pooling层的输出(及感兴趣区域对应的特征图最大值池化后的特征)作为每个感兴趣区域的特征向量;
(6)将感兴趣区域的特征向量与全连接层相连,并定义了多任务损失函数,分别与softmax分类器和boxbounding回归器相连,分别得到当前感兴趣区域的类别及坐标包围框;
(7)对所有得到的包围框进行非极大值抑制(NMS),得到最终的检测结果。

 3.3 框架

Fast RCNN将CNN特征提取,SVM边界框分类,bbox regression边界框回归三部分结合到了一起,都融合到同一个CNN中。那么Fast RCNN就只有两部分了:先通过SS算法获取候选框,再通过CNN完成特征提取、分类和边界框回归。

3.3.1 ROI Pooling(Region of Interest)

它的输入是特征图,输出则是大小固定的channel x H x W的vector。ROI Pooling是将一个个大小不同的region proposals,映射成大小固定的(W x H)的矩形框。它的作用是根据region proposals的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和输出回归框操作。它可以加速处理速度。

ROI Pooling有两个输入,一个是图片进入CNN后的特征图,另一个是区域的边框。ROI 的输出是一个region_nums x channels x W x H的向量。

  RoI可以看成是SPP的简化版本,原版SPP是多尺度池化后进行concat组成新特征,而RoI只使用一个尺度,可以将任意维度的特征矩阵缩放成固定维度。论文中的具体做法是,把高和宽都平均分为7*7的小块,然后在每一个小块做max pooling操作,channel维度不变,这样做能使输出维度固定,同时RoI Pooling不是多尺度的池化,梯度回传非常方便,为fine-tune卷积层提供了条件。(SPP Net不能fine-tune卷积层)

3.3.2  softmax 分类器

softmax 分类器输出N+1个类别的概率,如下图所示。PASCAL VOC2012数据集中有20个分类,因此会输出21个类别的概率,其中第一个为背景概率,其余20个为每个分类的概率。所以softmax的FC中有N+1个节点。

3.3.3 边界框回归器(bbox regressor )

一幅图片中会画出N+1个分类的候选框,每个候选框都有x、y、w、d四个参数,所以 bbox regressor 的FC中有 4(N+1) 个节点。

 边界框参数回归的计算方法:

3.3.4 Fast RCNN 中 loss 的计算

因为在Fast RCNN 中需要预测N+1个类别的概率以及边界框的回归参数,所以定义了两个损失函数:分类损失和边界框回归损失。 

3.4 代码实现 

import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
class FastRCNN(nn.Module):
    def __init__(self, num_classes):
        super(FastRCNN, self).__init__()
 
        self.features = torchvision.models.vgg16(pretrained=True).features
        self.roi_pool = nn.AdaptiveMaxPool2d((7, 7))
        self.classifier = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, num_classes + 1)
        )
        self.bbox = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, (num_classes + 1) * 4)
        )
 
    def forward(self, x, rois):
        x = self.features(x)
        rois = torch.cat([rois[:, :1], rois[:, 1:] - rois[:, :1] + 1], dim=1)
        rois = self.roi_pool(F.roi_align(x, [rois], output_size=(7, 7)))
        rois = rois.view(rois.size(0), -1)
        cls_scores = self.classifier(rois)
        bbox_preds = self.bbox(rois)
 
        return cls_scores, bbox_preds

4.然后捏!

Fast R-CNN 问题和缺点

1.训练和推断时间较长:Fast R-CNN 的训练过程相对较慢,需要先训练候选区域生成网络(RPN),然后再训练目标分类网络。此外,在推断阶段,需要对整个图像进行前向传播,计算较为耗时。

2.ROI Pooling 的固定大小:ROI Pooling 操作将不同大小的候选区域映射到固定大小的特征图上。这种固定大小的映射可能导致信息的损失或扭曲,特别是对于较小或较大的目标区域。

3.候选区域生成器的质量:Fast R-CNN 使用候选区域生成网络(RPN)生成候选区域,而候选区域生成器的质量直接影响到目标检测的准确性。如果候选区域生成器无法准确地提供包含目标的候选区域,那么最终的检测结果可能会受到影响。

4.依赖预训练模型:Fast R-CNN 通常需要在预训练的卷积神经网络(CNN)模型上进行微调。这意味着它对于预训练模型的选择和质量有一定的依赖性,如果预训练模型不够准确或不适用于特定的任务,可能会影响 Fast R-CNN 的性能。

5.基于滑动窗口的候选区域生成:Fast R-CNN 仍然采用了基于滑动窗口的候选区域生成方法,这可能导致在大规模图像上的计算量较大。尽管 RPN 可以减少滑动窗口的数量,但仍需要对整个图像进行扫描。
 

参考:

[深度学习基础]Faster RCNN系列

深度学习目标检测Fast-RCNN模型算法流程详解说明(超详细理论篇)


http://www.niftyadmin.cn/n/5124228.html

相关文章

零基础也能玩转Java缓存开发,新手也能轻松上手,优化代码,提升性能,让你的应用畅享速度飞跃

1.前言 Spring从3.1开始定义了一系列抽象接口来统一不同的缓存技术;并支持使用JCache(JSR-107)注解简化我们进行缓存开发。Spring Cache 只负责维护抽象层,具体的实现由你的技术选型来决定。将缓存处理和缓存技术解除耦合。 2.主…

2023高频前端面试题-TCP

1. TCP 协议是什么? TCP(Transmission Control Protocol 传输控制协议) 是一种面向连接(连接导向) 的、可靠的、 基于 IP 的传输层协议。 TCP 使⽤校验、确认和重传机制来保证可靠传输 而 HTTP 协议 就是建立在 TCP / IP 协议 之上的一种应用。 TCP: 三次握手, 四次挥手~ …

springboot配置redis、Spring cache

1.Jedis库 依赖库 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0.2</version> </dependency>使用案例&#xff1a; Testpublic void jedis(){Jedis jedis new Jedis("127…

buuctf_练[CSAWQual 2019]Web_Unagi

[CSAWQual 2019]Web_Unagi 文章目录 [CSAWQual 2019]Web_Unagi掌握知识解题思路关键payload 掌握知识 ​ XXE漏洞利用&#xff0c;xml文件转换编码绕过WAF(UTF-8 --> UTF-16)&#xff0c;xml文件格式的书写 ​ 再遇到上传xml文件被拦截&#xff0c;就尝试修改编码再上传&a…

二叉搜索树的实现(递归方式)

目录 实现思路 插入操作 删除操作 完整代码 测试案例 总结 二叉搜索树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;是一种常用的数据结构&#xff0c;它具有以下特点&#xff1a; 左子树上所有节点的值均小于它的根节点的值右子树上所有节点的值均大于它的…

Python学习笔记合集(Matplotlib总结)

Python学习笔记合集 Python学习笔记合集(Matplotlib总结)Python学习笔记第五十九天&#xff08;Matplotlib 安装&#xff09;Python学习笔记第六十天&#xff08;Matplotlib Pyplot&#xff09;Python学习笔记第六十一天&#xff08;Matplotlib 绘图标记&#xff09;Python学习…

跨境电商外贸出口电动自行车、脚踏车、单车美国站需要什么认证?UL2849和GCC认证解析

自行车又称脚踏车或单车&#xff0c;是一种以人力作机械传动的代步和运载工具。自行车、脚踏车、单车出口美国站需办理UL2849认证和GCC认证。 美国自行车类产品安全要求&#xff1a; 2011年5月13日&#xff0c;美国消费品安全委员会&#xff08;CPSC)在对来自行车业及消费者的…

Go 语言操作 MongoDb

文章目录 连接数据库插入数据库插入一条数据批量插入数据 查询数据用 BSON 进行复合查询聚合查询 更新数据删除数据 连接数据库 package mainimport ("context""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"…