第十八周:Faster R-CNN论文阅读

news2025/1/7 20:07:00

Faster R-CNN论文阅读

  • 摘要
  • Abstract
  • 文章简介
  • 1. 引言
  • 2. Faster R-CNN 框架
    • 2.1 RPN
    • 2.2 损失函数
    • 2.3 RPN的训练细节
  • 3. Faster R-CNN的训练
  • 4. 优缺点分析
  • 总结

摘要

本篇博客介绍了 Faster R-CNN,这是一种双阶段的目标检测网络,是对 Fast R-CNN 的改进。为了解决 Fast R-CNN 中,计算效率低和区域推荐算法耗时长的问题,Faster R-CNN 提出了区域推荐的方法:Region Proposal Network(RPN),这种方法代替了传统的区域推荐算法。RPN 与 Fast R-CNN 共享卷积特征,减少了计算量,大幅提高了目标检测的速度,准确率也达到了新的高度。但它也存在一些不足,例计算复杂度较高、对小目标和遮挡目标的检测效果有限、训练时间较长以及超参数调优复杂。

Abstract

This blog introduces Faster R-CNN, a two-stage object detection network that improves upon Fast R-CNN. To address the issues of low computational efficiency and time-consuming region proposal algorithms in Fast R-CNN, Faster R-CNN proposes a novel region proposal method: the Region Proposal Network (RPN), which replaces traditional region proposal algorithms. By sharing convolutional features with Fast R-CNN, RPN reduces computational overhead, significantly enhances the speed of object detection, and achieves new heights in accuracy. However, it also has some limitations, such as high computational complexity, limited effectiveness in detecting small and occluded objects, lengthy training times, and complex hyperparameter tuning.

文章简介


Title:Faster R-CNN
Author:Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun
URL:https://arxiv.org/abs/1506.01497


1. 引言

在 Faster R-CNN 算法的提出之前,最先进的目标检测算法依赖region proposal算法和 RCNN 网络。在 R-CNN 和 Fast R-CNN 中都是用selective search 的 region proposal 算法来生成候选区域的,Fast R-CNN通过引入 RoI Pooling 来避免大量的重复计算,从而显著提升了网络速度,而并没有解决 region proposal 算法耗时长的问题。Faster R-CNN 在 Fast R-CNN 的基础上提出了Region Propose Network(RPN)来生成候选区域,RPN 与检测网络共享图像卷积特征,只需非常少额外时间来生成候选区域。

2. Faster R-CNN 框架

Faster R-CNN 在 Fast R-CNN 的基础上,将 selective search 算法换成了 RPN 。Faster R-CNN的 backbone 还是 VGG16,卷积层生成的特征图分别送入 RPN和 RoI pooling层, 其中RPN用来产生候选区域并与特征图一起送入RoI Pooling层。后面的分类和边界款回归与Fast R-CNN的一样。
在这里插入图片描述

2.1 RPN

RPN 的输入是由 backbone (文中的backbone用了两种:ZF和VGG16)提取到的特征图,输出为一系列候选区域,每个候选区域包含一个边界框和一个得分(表示该区域包含目标的可能性)。
在这里插入图片描述
上图中的 256-d 是由 ZF 网络对原图进行特征提取后的特征图的通道数,对于不同的backbone特征提取网络,其通道数可能不一样,如VGG16的特征图通道数是256-d。
RPN 使用3*3的卷积核对特征图进行滑动窗口式的处理,之后分别通过两个 1 ∗ 1 1*1 11 的卷积层,其中一个用于生成2K个得分,另外一个用于生成4K个边界框偏移量。
在这里插入图片描述
3 ∗ 3 3*3 33卷积会遍历整个特征图,对于特征图中的每个点都会分配 K 个 anchor ,这些anchor就是初始检测框。原文中的 K 设置为9(有三种比例和是那种尺度)。每个anchor对应两个概率,前景和背景的概率,每个anchor有四个位置参数,左上角和右下角的坐标,对于每个anchor都要预测边界框的偏移量,所以边界框回归有4K个输出。
这里为何用两个并行的 1 ∗ 1 1*1 11的卷积而不用全连接操作。
卷积操作可以保持特征图的空间结构,为每个位置生成多个anchor的类别得分和边界框偏移量。
在这里插入图片描述
原文中设置的anchor的长宽比有三种:{1:1,1:2,2:1},尺度也有三种,所以K是9,因此分类层经过卷积后有 2 ∗ 9 = 18 2*9=18 29=18个通道,边界框回归层经过卷积层有 4 ∗ 9 = 36 4*9=36 49=36个通道。
proposal层是为了生成region proposal,先按照输入的positive softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的positive anchors;然后限定超出图像边界的positive anchors为图像边界,并剔除尺寸非常小的positive anchors;最后对剩余的positive anchors进行NMS。
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。
对于anchor,文中提到一个问题,有些anchor的尺寸比滑动窗口在原图中的感受野要大,为什么能够预测比感受野大的边界框呢?
通过一个小的感受野来预测比感受野大的目标的边界框是有可能的,当看到目标的一部分的时候也能粗略的预测出目标完整的位置区域。 这在实际使用中也使用中也是有效的。

2.2 损失函数

训练RPN时,每个anchor有一个二分类的类别标签(前景或背景)。与真实边界框具有最高交并比的anchor和与某真实边界框的IoU大于0.7的 anchor 作为正样本,类别标签为1,表示前景;与所有真实边界框的交并比都小于0.3的anchor作为负样本,类别标签为0,表示背景。注意:anchor是在原图上的,也是在原图上与真实边界框求的交并比。
在一张图像上的损失函数为:
在这里插入图片描述
其中, i i i是anchor的索引, p i p_i pi表示anchor i 区域是前景的预测概率, p i ∗ p_i^* pi表示anchor i 区域的类别标签(前景标签为1,背景标签为0), t i t_i ti表示预测边界框偏移信息的向量, t i ∗ t_i^* ti表示标签为1的anchor对应的真实偏移信息, N c l s N_{cls} Ncls表示一个mini-batch中样本的数量, N r e g N_{reg} Nreg表示anchor位置的个数(不是anchor的个数), λ \lambda λ为平衡参数,文中取10,使分类损失和边界框回归损失的系数大致相等。
分类损失在实际的实现中用的是二分类交叉熵损失: L c l s ( p i , p i ∗ ) = p i ∗ log ⁡ ( p i ) + ( 1 − p i ∗ ) log ⁡ ( 1 − p i ) L_cls(p_i,p_i^*)=p_i^*\log(p_i)+(1-p_i^*)\log(1-p_i) Lcls(pi,pi)=pilog(pi)+(1pi)log(1pi)这种损失只需要预测对每个 anchor 预测一个概率(为前景的概率)即可,所以对于特征图的每个点只需要预测 K 个而不是 2K 个分类概率。原论文中的 2K 个类别概率是想用多分类交叉熵损失: L c l s ( p i , p i ∗ ) = log ⁡ ( p i ) L_cls(p_i,p_i^*)=\log(p_i) Lcls(pi,pi)=log(pi),其中的 p i p_i pi是预测为真实标签的概率(前景或背景)。
回归损失与Fast R-CNN的回归损失一样使用smooth L1损失: L r e g ( t i , t i ∗ ) = ∑ s m o o t h L 1 ( t i − t i ∗ ) L_{reg}(t_i,t_i^*)=\sum smooth_{L1}(t_i-t_i^*) Lreg(ti,ti)=smoothL1(titi)其中的累和是对每个anchor的四个参数而言的, s m o o t h L 1 ( x ) = { 0.5 x 2 , if  ∣ x ∣ < 1 ∣ x ∣ − 0.5 , otherwise smooth_{L1}(x)=\begin{cases} 0.5x^2 , & \text{if } |x| <1 \\ |x|-0.5, & \text{otherwise} \end{cases} smoothL1(x)={0.5x2,x0.5,if x<1otherwise
回归损失前的系数 p i ∗ p_i^* pi是控制 p i ∗ = 1 p_i^*=1 pi=1时才计算(效果与Fast R-CNN中的 [ u ≥ 1 ] [u\geq 1] [u1]一样),也就是anchor中是前景而不是背景,背景计算边界框回归无意义。

2.3 RPN的训练细节

RPN可以通过反向传播和随机梯度下降(SGD)进行端对端训练。文中 mini- batch 设为256,对正负样本进行 1:1 采样,若正样本不够,则用负样本填充。backbone的网络参数使用预训练好的,对于RPN单独的层,在标准方差为0.01的零均值高斯分布中随机取值来初始化层参数。在训练中采用动量和权重衰减。

3. Faster R-CNN的训练

文中对 Faster R-CNN的训练采取的是四步交替训练,用于联合训练RPN(Region Proposal Network)和Fast R-CNN模块。这种方法通过交替训练两个模块,逐步优化它们的参数,同时共享卷积特征。四步交替训练方法如下:

  1. 训练 RPN:
    使用预训练的主干网络(如VGG16)初始化共享卷积层。对RPN的其他部分进行随机初始化。使用RPN的多损失函数进行优化,对RPN的特定层参数进行更新。目的是使RPN能够生成高质量的 region proposal。
  2. 训练 Fast RCNN:
    对Fast RCNN的特定层进行随机初始化,使用预训练的主干网络初始化共享卷积层,用第一步训练的RPN生成 region proposal。用主干网络提取的特征图和RPN生成的 region proposal来训练Fast RCNN的特定层(RoI Pooling、分类、回归层),用的损失是Fast RCNN的多任务损失。
  3. 微调 RPN:
    在第二步训练好的网络的基础上,固定Fast RCNN的特定层,重新训练网络,更新RPN和共享卷积层的参数。
  4. 微调 Fast RCNN:
    在第三步训练好的网络上,固定RPN和共享卷积层,训练网络,更新Fast RCNN特定层的参数。

下表直观解释了每一步对哪些层进行了更新

步骤更新参数固定参数
第一步:训练RPNRPN的特定层(3x3卷积层、分类层、回归层)共享卷积层(backbone)、Fast R-CNN特定层的所有参数
第二步:训练Fast R-CNNFast R-CNN的特定层(RoI Pooling层、分类层、回归层)共享卷积层(backbone)、RPN特定层的所有参数
第三步:微调RPNRPN的特定层(3x3卷积层、分类层、回归层)、共享卷积层(backbone)Fast R-CNN特定层的所有参数
第四步:微调Fast R-CNNFast R-CNN的特定层(RoI Pooling层、分类层、回归层)共享卷积层(backbone)、RPN特定层的所有参数

在具体实现中,可以不采用四步交替训练,而直接合并损失函数,在每次反向传播中,同时更新 RPN、Fast R-CNN 和共享卷积层的参数。这种简化的训练流程可以缩短训练的时间,并且通过联合优化,可以使 RPN 和 Fast R-CNN 更好地协同工作。

注意
对于 anchor 超过边界的处理办法,训练时选择直接丢弃。而测试时需要对其进行裁剪,使其不超过边界。

4. 优缺点分析

优点
Faster R-CNN 使用 RPN 替代了传统的区域建议方法(如 Selective Search),直接通过卷积神经网络生成区域建议。RPN 可以高效地生成高质量的区域建议,和 Fast R-CNN 共享卷积特征,避免了重复计算,减少了计算开销。在实际的实现中,可以利用多任务损失进行端到端的训练,同时优化分类任务和回归任务,提高了模型的泛化能力和检测精度。
在这里插入图片描述
缺点
对小目标的检测效果较差,因为Faster R-CNN 的主干网络通常会对输入图像进行多次下采样,导致小目标的特征信息丢失。超参数较多,且训练时间较长。

总结

Faster RCNN 将传统目标检测模型中的区域推荐算法替换成了 RPN 网络,直接通过卷积神经网络生成 region proposal,将整个目标检测模型融合到一个卷积神经网络之中,大幅提升了目标检测任务的速度。
RPN 对卷积神经网络提取到的特征图先后进行 3 ∗ 3 3*3 33的就滑动窗口操作和两个不同的 1 ∗ 1 1*1 11的卷积操作,滑动窗口对特征图中的每个位置对应的原图区域应用不同大小和比例的 anchor ,判断原图中对应的 anchor 区域是前景和背景的概率,并生成 anchor 的偏移参数,对 anchor 进行修正。根据分类得分对所有 anchor 进行排序,保留得分最高的前 N 个。使用 NMS 去除重叠度较高的 anchor ,得到较准确的 region proposal。骨干网络提取的特征图和RPN生成的region proposal作为Fast RCNN的输入,经过RoI池化层后,分别经过分类和回归的全连接层,对region proposal进行分类并再次生成偏移参数,得到更精准的边界框。Faster RCNN 不仅大幅提高了目标检测的速度,也在准确率上达到了新高度。
但其训练参数和超参数较多,所以训练时间较长且调优难度较大,且其对小目标的检测效果较差。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Day28下 - 大模型微调:酒店评论情感分析

一、前置准备 1. 下载 LLaMA Factory https://github.com/hiyouga/LLaMA-Factory.git 搭建过程详见&#xff1a;https://blog.csdn.net/CSBLOG/article/details/144584581 2. 选择 预训练模型 和 prompt指令模型 预训练阶段在实际工作中&#xff0c;一般是用不上的&#xff…

【网络安全 | 漏洞挖掘】JS Review + GraphQL滥用实现管理面板访问

未经许可,不得转载。 正文 在映射目标范围后,我发现了一个用于管理的控制台界面,但没有注册功能。 于是我开始尝试: 1、模糊测试注册端点 -> 失败 2、在请求中将登录替换为注册 -> 再次失败 尝试均未奏效后,我决定冷静下来,重新思考方法并利用技术手段。 我观察…

数据库管理-第278期 开年综艺,第七届中国PG数据库生态大会有感(20250105)

数据库管理278期 20245-01-05 数据库管理-第278期 开年综艺&#xff0c;第七届中国PG数据库生态大会有感&#xff08;20250105&#xff09;1 走后门的可观测性2 社区VS商业3 从O来到PG去4 现场集锦5 IF CLUB社区总结 数据库管理-第278期 开年综艺&#xff0c;第七届中国PG数据库…

Docker 安装Elasticsearch搜索引擎 搜索优化 词库挂载 拼音分词 插件安装

介绍 允许用户快速索引和搜索大量的文本数据。通过使用倒排索引&#xff0c;它能够在海量数据中高效检索相关信息。提供灵活的查询语言&#xff0c;可以做全文搜索、模糊搜索、数据统计等&#xff0c;用来代替MYSQL的模糊搜索&#xff0c;MYSQL的模糊搜索不支持使用索引从而导…

NVR小程序接入平台EasyNVR使用FFmpeg取流时提示错误是什么原因呢?

在视频监控系统中&#xff0c;FFmpeg常用于从各种源&#xff08;如摄像头、文件、网络流等&#xff09;获取流媒体数据&#xff0c;这个过程通常称为“取流”。 在EasyNVR平台中&#xff0c;使用FFmpeg取流是一种常见的操作。FFmpeg作为一款强大的开源多媒体处理工具&#xff…

【电源专题】为什么测试电源的SW波形上冲振荡之前的0V电位要先来个小的下降

在同步电源的开关节点SW波形测试中,你可能会发现周期性的SW波形在上升前的一小段时间时间内会有一个小小的下跌,这个下跌会低于0V。那么这个下跌是怎么来的呢? 如下所示为某降压转换器的SW开关节点波形: 其展开后可以看到在上升之前有20ns左右的时间,SW电压是下跌…

基于EB和S32DS3.5建立基础工程

本文参考&#xff1a; https://blog.csdn.net/weixin_41660366/article/details/141949690 https://blog.csdn.net/zhoujingCSDN/article/details/142284796 0、简介 本文基于S32K312 介绍新建工程并引入EB&#xff0c;环境如下&#xff1a; MCU&#xff1a;NXP S32k312 RT…

如何申请LabVIEW软件著作权?

申请 软件著作权 时&#xff0c;若你的单位开发的应用是基于 LabVIEW 的图形化编程语言&#xff0c;你需要将 LabVIEW 程序中的图形化设计转换为源代码形式&#xff0c;以符合软件著作权申请的要求。由于LabVIEW本身是图形化编程语言&#xff0c;而不是传统的文本编程语言&…

C/C++中new/delete与malloc/free的区别及对象管理

C/C++中new/delete与malloc/free的区别及对象管理 在C/C++编程中,动态内存管理是一个核心且复杂的话题,其中new、delete、malloc和free是四个经常用于此目的的工具。尽管它们都涉及到内存的分配和释放,但它们在处理对象时的方式和效果却大相径庭。本文将通过示例来说明这些工…

GitHub 图像修复开源项目推荐【持续更新】

GFPGAN 介绍&#xff1a;GFPGAN&#xff08;Generative Facial Prior-GAN&#xff09;是由腾讯ARC&#xff08;Applied Research Center&#xff09;开发的一种实用的真实世界人脸修复算法。它专门设计用于人脸图像的生成和优化&#xff0c;尤其在低质量人脸图像的超分辨率恢复…

JWT认证实战

JWT&#xff08;JSON Web Token&#xff09;是一种轻量级的、基于 JSON 的开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在各方之间安全地传递信息。JWT 的特点是结构简单、轻量化和跨平台支持&#xff0c;适用于用户身份验证、信息加密以及无状态的 API 访问控制…

【无标题】优秀回答统计

在Class-Aware Pseudo-Labeling (CAP) 方法中&#xff0c;类感知阈值&#xff08;Class-Aware Thresholds&#xff09;的动态调整是通过以下步骤实现的&#xff1a; 初始化阈值&#xff1a; 在训练开始时&#xff0c;为每个类别设置初始阈值。这些阈值可以基于先验知识、数据分…

arcgis模版空库怎么用(一)

这里以某个项目的数据为例&#xff1a; 可以看到&#xff0c;属性表中全部只有列标题&#xff0c;无数据内容 可能有些人会认为空库是用来往里面加入信息的&#xff0c;其实不是&#xff0c;正确的用法如下&#xff1a; 一、下图是我演示用的数据&#xff0c;我们可以看到其中…

基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划

• 关于前后端分离 当前流行的一种常见的前后端分离模式是vueflask&#xff0c;vueflask模式的前端和后端之间进行数据的传递通常是借助 API&#xff08;应用程序编程接口&#xff09;来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如&#xff0c;前端可能通过发送…

edeg插件/扩展推荐:助力生活工作

WeTab 此插件在我看来有2个作用 1.改变edeg的主页布局和样式,使其更加精简,无广告 2.提供付费webtab Ai(底层是chatGpt) 沉浸式翻译 此插件可翻译网页的内容 假设我们浏览github 翻译前 翻译后 Better Ruler 可以对网页的距离进行测量 适合写前端的小伙伴 用法示例:

k8s基础(4)—Kubernetes-Service

Service概述 抽象层 ‌k8s的Service是一种抽象层&#xff0c;用于为一组具有相同功能的Pod提供一个统一的入口地址&#xff0c;并通过负载均衡将网络流量分发到这些Pod上。‌ Service解决了Pod动态变化的问题&#xff0c;例如Pod的IP地址和端口可能会发生变化&#xff0c;通过…

客户案例:基于慧集通(DataLinkX)集成平台的金蝶云星空公有云与WMS系统对接集成方案

本文档详细介绍了基于慧集通&#xff08;DataLinkX&#xff09;集成平台的金蝶云星空公有云与WMS系统对接集成方案。该方案旨在实现金蝶云星空与WMS系统之间的数据同步和流程对接&#xff0c;以提高企业供应链管理的效率和准确性。通过物料、供应商资料同步&#xff0c;采购、销…

jenkins入门4 --window执行execute shell

1、启动关闭jenkins 在Windows环境下&#xff0c;如果你需要关闭Jenkins服务&#xff0c;可以通过以下几种方式&#xff1a; 1、使用Windows服务管理器&#xff1a; 打开“运行”对话框&#xff08;Win R&#xff09;&#xff0c;输入services.msc&#xff0c;然后回车。 在服…

ZYNQ初识7(zynq_7010)RAM_IP核

学习汇总正点原子bi站教学视频。但由于目前的学习板PL端缺乏时钟晶振&#xff0c;所以需要从PS端调用时钟供给PL端使用&#xff0c;也就造成顶层文件的设置出现一些问题&#xff0c;在IP核创建调用和例化过程中一些功能会受到限制&#xff0c;所以以下仅作汇总参考。 zynq_7000…

LeetCode:98.验证二叉搜索树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;98.验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 …