两阶段法目标检测发展脉络

news2025/6/1 6:17:52

模式识别期末展示大作业,做个记录,希望大家喜欢。

R-CNN

Fast R-CNN

R-FCN

整个过程可以分解为以下几个步骤:

  1. 输入图像 (image) 和初步特征提取 (conv, feature maps)
    • 首先,输入一张原始图像,经过一系列卷积层(没有全连接层)输出一组特征图 (feature maps),这些特征图包含了图像中丰富的视觉信息。
  2. 生成位置敏感得分图 (k^2(C+1)-d conv, position-sensitive score maps)
    • 在标准的全卷积网络之后,R-FCN 引入了一个特殊的卷积层。这个卷积层的输出通道数是 k^2×(C+1)。
    • 这里的 k 是一个预设的参数,表示我们将把一个感兴趣区域 (RoI) 划分为一个 k×k 的网格。在图示中,k=3,所以网格大小是 3×3=9 个单元格 (bins)。
    • C 是需要检测的对象类别数量,+1 表示包括背景类别。
    • 这个特殊的卷积层输出的特征图被称为“位置敏感得分图” (position-sensitive score maps)。这组得分图总共有 k^2×(C+1) 个通道。
    • 这些通道可以被理解为 k^2 个组,每组有 C+1 个通道。每个组对应于 RoI 网格中的一个特定空间位置(例如,左上角、中心、右下角等),而组内的每个通道则对应于一个类别(包括背景)。
    • 例如,对于 k=3 和 C+1 个类别,总共有 9×(C+1) 个得分图。图示中展示了其中的一部分,并用不同颜色表示对应 RoI 中不同位置(如 top-left, top-center, bottom-right 等)。
  3. 位置敏感 RoI 池化 (RoI, pool)
    • 接下来,对于从区域提议网络获得的每一个感兴趣区域 (RoI),我们对其进行位置敏感的 RoI 池化操作。
    • 首先,将 RoI 划分为 k×k 个大小相同的空间单元格(bins)。
    • 然后,对于 RoI 中的每一个单元格 (i,j)(其中 i,j∈{0,1,…,k−1}),我们只从位置敏感得分图中提取与该单元格对应的特定通道组进行池化。具体来说,对于 RoI 中的单元格 (i,j) 和类别 c,我们仅从那些对应于 RoI 中 (i,j) 位置的得分图通道中提取特征。例如,图示中 RoI 被划分为 3×3 网格,左上角的单元格只从对应“top-left”位置的得分图中池化。
    • 最终,位置敏感 RoI 池化输出一个 k×k×(C+1) 维的特征张量。图示中将其表示为 k×k 个空间位置,每个位置有 C+1 个维度。
  4. 投票 (vote) 和分类 (softmax)
    • 对于每一个类别 c,我们将 RoI 中所有 k×k 个单元格对应类别 c 的池化结果相加或求平均,得到一个最终的类别得分。
    • 这个投票过程将 k×k×(C+1) 维的特征聚合成一个 C+1 维的向量 (C+1),其中每个元素代表该 RoI 属于对应类别的总得分。
    • 最后,将这个 C+1 维的得分向量通过 Softmax 函数,得到 RoI 属于每一个类别的概率。 Softmax 函数将得分转换为介于 0 到 1 之间的概率分布,所有类别的概率之和为 1。

R-FCN 的核心优势在于,它将需要对 RoI 进行计算的全连接层替换为全卷积层和位置敏感的池化操作,这使得网络的大部分计算(生成位置敏感得分图)可以在整张图像上共享,显著提高了检测速度,同时通过位置敏感性保留了对目标空间结构的感知能力。

位置敏感RoI池化层的核心思想是区分目标的不同位置信息,这与之前的方法有所不同。具体来说,该层将RoIRegion of Interest,感兴趣区域)划分为 k × kbin(子区域),每个bin负责对目标特定位置的响应进行聚合。

选择性池化是指,对于每个bin,它只从 k × k score map(得分图)中选择一个特定的score map进行池化操作,而不是像传统RoI池化那样对所有score map进行池化。这里的每个score map对应于目标的一个特定相对位置(例如,目标的左上角、中心、右下角等)。通过这种方式,网络可以学习到每个bin应该关注哪个位置的信息,从而实现对不同位置信息的区分。

例如,如果 k = 3,那么就有 3 × 3 = 9 bin9score map。左上角的bin可能只聚合第一个score map的响应,该score map负责检测目标的左上角;而中心bin可能只聚合第五个score map的响应,该score map负责检测目标的中心。通过这种选择性池化位置敏感RoI池化层能够更好地处理目标的位置变化和形变,从而提高目标检测的准确性。

在两张图片中,可视化了当k × k = 3 × 3时,R-FCN学习到的位置敏感得分图。这些专门的图预计会在对象的特定相对位置被强烈激活。例如,“顶-中心-敏感”得分图在大致靠近对象顶部中心的位置表现出高分。如果候选框与真实对象精确重叠,则RoI中的大多数k^2bin会被强烈激活,并且它们的投票会导致高分。相反,如果候选框未与真实对象正确重叠,则RoI中的某些k^2bin不会被激活,并且投票得分较低。

训练

c 是 RoI 的真实标签 (c = 0 表示背景)
[c > 0] 是一个指示器,如果参数为真则等于 1,否则为 0

设置平衡权重 λ = 1

因为我们的每RoI计算可以忽略不计,所以前向时间几乎不受N的影响,这与中的OHEM Fast R-CNN相反,后者可能会使训练时间加倍。

为了使R-FCNRPN共享特征

结果

使用ResNet-101Faster R-CNNR-FCN之间的比较。时间评估在单个Nvidia K40 GPU上进行。使用OHEM时,在前向传播中计算每个图像NRoI,并选择128个样本用于反向传播。按照[18],测试使用300RoI

使用 ResNet-101 PASCAL VOC 2007 测试集上的比较。“Faster R-CNN +++” [9] 使用迭代框回归、上下文和多尺度测试。

使用ResNet-101PASCAL VOC 2012测试集上的比较。

“07++12” [6] denotes the union set of 07 trainval+test and 12 trainval. 

总结

R - CNN出现之前,目标检测主要依赖传统计算机视觉方法,如滑动窗口等,效果不理想。R - CNN的出现是目标检测领域的一个重要突破。它的基本思想是先通过选择性搜索(Selective Search)算法生成大约2000个候选区域(Region Proposal),然后对每个候选区域进行特征提取,再通过 SVM(支持向量机)进行分类,同时使用回归模型来精修候选框的位置。

每个区域独立地进行特征提取和分类等操作,但这也导致了其计算效率较低,因为每个候选区域都要单独通过 CNN

R - CNN的一个主要缺点是速度慢,因为它对每个候选区域都单独进行 CNN前向传播计算特征。Fast R - CNN为了解决这个问题,提出了一种更高效的方式。

先将整个图像输入 CNN提取特征,得到一个特征映射(Feature Map)。然后,将候选区域映射到这个特征映射上,通过 ROIPool层(Region of Interest Pooling)来获取每个候选区域的固定大小的特征。接着,这些特征被送入全连接层进行分类和回归。这样就避免了对每个候选区域都单独进行 CNN计算,大大提高了速度。

虽然 Fast R - CNN提高了速度,但其仍依赖于外部的候选区域生成方法(如选择性搜索),这在一定程度上限制了速度和精度。Faster R - CNN的主要动机是将候选区域生成网络(RPNRegion Proposal Network)集成到整个检测网络中,实现端到端的训练和检测

在目标检测任务中,目标的尺度变化较大。传统的 CNN会产生不同层次的特征,但这些特征在尺度适应性上存在不足。例如,浅层特征对小目标检测有帮助,但语义信息较弱;深层特征语义信息丰富,但对于小目标检测可能会丢失细节。FPN通过自下而上的路径(原始 CNN的特征提取过程)生成不同尺度的特征图,然后通过自上而下的路径(上采样等操作)和横向连接(将自上而下路径和自下而上路径的特征进行融合)构建特征金字塔。这样可以将高语义信息的深层特征和高分辨率的浅层特征结合起来,使得网络在不同尺度目标的检测上都有较好的性能。

Faster R - CNN虽然在速度和精度上有了很大的提升,但它仍然依赖于 ROI pooling层后的全连接层,这在一定程度上限制了其在不同尺度输入下的灵活性,且全连接层的参数较多。R - FCN摒弃了全连接层,采用全卷积网络的结构。它在特征映射上为每个位置生成位置敏感的分数图Position - Sensitive Score Maps),然后通过 ROI pooling等操作来获取候选区域的特征。

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

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

相关文章

小白的进阶之路系列之六----人工智能从初步到精通pytorch数据集与数据加载器

本文将介绍以下内容: 数据集与数据加载器 数据迁移 如何建立神经网络 数据集与数据加载器 处理数据样本的代码可能会变得混乱且难以维护;理想情况下,我们希望我们的数据集代码与模型训练代码解耦,以获得更好的可读性和模块化。PyTorch提供了两个数据原语:torch.utils…

NestJS——重构日志、数据库、配置

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

c++数据结构8——二叉树的性质

一、二叉树的基本性质 示图1: 性质1:层节点数上限 在一棵二叉树中,第i层至多有2^{i-1}个节点(首层是第1层) 这个性质可以通过数学归纳法证明: 第1层:2^{1-1}2^01个节点(根节点&am…

Window Server 2019--08 网络负载均衡与Web Farm

本章要点 1、了解网络负载均衡技术 2、掌握Web Farm核心原理 3、掌握如何使用Windows NLB搭建Web Farm环境 网络负载均衡技术将外部计算机发送的连接请求均匀的分配到服务器集群中的每台服务器上,接受到请求的服务器独立地响应客户的请求。 网络负载均衡技术还…

SpringBoot:统一功能处理、拦截器、适配器模式

文章目录 拦截器什么是拦截器?为什么要使用拦截器?拦截器的使用拦截路径执行流程典型应用场景DispatcherServlet源码分析 适配器模式适配器模式定义适配器模式角色适配器模式的实现适配器模式应用场景 统⼀数据返回格式优点 统一处理异常总结 拦截器 什…

AI Agent工具全景解析:从Coze到RAGflow,探索智能体自动化未来!

在人工智能技术持续深入行业应用的背景下,越来越多的企业和个人寻求通过自动化技术来提高效率和减少重复性劳动,AI Agent的崛起已经成为了不可忽视的趋势。AI Agent,即人工智能代理,是一种基于先进的人工智能技术,特别…

Onvif协议:IPC客户端开发-IPC相机控制(c语言版)

前言: 本博文主要是借鉴OceanStar大神的博文,在他的博文的基础之上做了一部分修改与简化。 博文链接: Onvif协议:IPC客户端开发之鉴权_onvif鉴权方式-CSDN博客 Onvif协议:IPC客户端开发之PTZ控制_onvif ptz-CSDN博客…

如何最简单、通俗地理解Pytorch?神经网络中的“梯度”是怎么自动求出来的?PyTorch的动态计算图是如何实现即时执行的?

PyTorch是一门科学——现代深度学习工程中的一把锋利利器。它的简洁、优雅、强大,正在让越来越多的AI研究者、开发者深度应用。 1. PyTorch到底是什么?为什么它重要? PyTorch是一个开源的深度学习框架,由Facebook AI Research(FAIR)于2016年发布,它的名字由两个部分组成…

QT+opecv如何更改图片的拍摄路径

如何更改相机拍摄图片的路径 前言:基础夯实:效果展示:实现功能:遇到问题:未解决: 核心代码: 前言: 最近在项目开发中遇到需要让用户更改相机拍摄路径的问题,用户可自己选…

秋招Day11 - JVM - 类加载机制

了解类的加载机制吗? JVM是运行Java字节码,也就是运行.class文件的虚拟机,JVM把.class文件中描述类的数据结构加载到内存中,并对数据进行校验,解析和初始化,最终转化为JVM可以使用的类型(Klass…

Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)

目录 一、源码分析 1.分析闭合 2.分析输出 (1)查询成功 (2)查询失败 (3)SQL语句执行报错 二、第03关 延时注入 1.打开靶场 2.SQL手注 (1)盲注分析 (2&#xf…

Vert.x学习笔记-什么是Handler

Vert.x学习笔记 在Vert.x中,Handler是一个核心概念,用于处理异步事件和回调。它是Vert.x响应式编程模型的核心组件之一,通过函数式接口的方式简化了异步编程的复杂性。 1. Handler的定义 Handler是一个函数式接口,定义如下&#…

【Echarts】象形图

目录 效果代码 效果 代码 <!-- 业务类型 --> <template><div class"ywlx" :style"{ --height: height }"><div class"header_count count_linear_bg"><div>当月业务总量<span class"common_count text_s…

集星云推短视频矩阵系统的定制化与私有化部署方案

在当今数字化营销时代&#xff0c;短视频矩阵系统成为众多企业和机构拓展影响力、实现精准营销的关键工具。集星云推短视频矩阵系统凭借其强大的功能和灵活的定制性&#xff0c;为企业提供了全方位的解决方案。 一、API接口定制&#xff1a;无缝对接自有系统 集星云推短视频矩…

XCTF-web-file_include

解析 <?php highlight_file(__FILE__); // 高亮显示当前PHP文件源代码 include("./check.php"); // 包含检查文件&#xff08;可能包含安全过滤逻辑&#xff09;if(isset($_GET[filename])) { // 检查是否传入filename参数$filename $_GET[f…

5.28 后端面经

为什么golang在并发环境下更有优势 Go语言&#xff08;Golang&#xff09;在并发环境下的优势主要源自其设计哲学和内置的并发机制&#xff0c;这些机制在语言层面提供了高效、简洁且安全的并发编程工具。以下是其核心优势的详细分析&#xff1a; 1. Goroutine&#xff1a;轻量…

CPP中CAS std::chrono 信号量与Any类的手动实现

前言 CAS&#xff08;Compare and Swap&#xff09; 是一种用于多线程同步的原子指令。它通过比较和交换操作来确保数据的一致性和线程安全性。CAS操作涉及三个操作数&#xff1a;内存位置V、预期值E和新值U。当且仅当内存位置V的值与预期值E相等时&#xff0c;CAS才会将内存位…

PHP生成pdf方法

1&#xff1a;第一种方法&#xff1a; 主要使用PHP的扩展 【 “spatie/browsershot”: “3.57”】 使用这个扩展生成PDF需要环境安装以下依赖 1.1&#xff1a;NPM【版本&#xff1a;9.2.0】 1.2&#xff1a;NODE【版本&#xff1a;v18.19.1】 1.3&#xff1a;puppeteer【npm in…

【Android笔记】记一次 CMake 构建 Filament Android 库的完整排错过程(安卓交叉编译、CMake、Ninja)

写在前面的话&#xff0c;为了保持Sceneform-EQR始终是采用最新的filament&#xff0c;每隔一段时间我都会编译filament&#xff0c;并根据新增内容完善Sceneform-EQR。 现由于更换电脑&#xff0c;环境需重新配置。简单记录下编译出错和解决方式。 Sceneform-EQR 是EQ对谷歌“…

C#中的BeginInvoke和EndInvoke:异步编程的双剑客

文章目录 引言1. BeginInvoke和EndInvoke的基本概念1.1 什么是BeginInvoke和EndInvoke1.2 重要概念解释 2. 委托中的BeginInvoke和EndInvoke2.1 BeginInvoke方法2.2 EndInvoke方法2.3 两者的关系 3. 使用方式与模式3.1 等待模式3.2 轮询模式3.3 等待句柄模式3.4 回调模式 4. 底…