两阶段法目标检测发展脉络
模式识别期末展示大作业,做个记录,希望大家喜欢。
R-CNN
Fast R-CNN
R-FCN
整个过程可以分解为以下几个步骤:
- 输入图像 (image) 和初步特征提取 (conv, feature maps):
- 首先,输入一张原始图像,经过一系列卷积层(没有全连接层)输出一组特征图 (feature maps),这些特征图包含了图像中丰富的视觉信息。
- 生成位置敏感得分图 (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 等)。
- 位置敏感 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 个维度。
- 投票 (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池化层的核心思想是区分目标的不同位置信息,这与之前的方法有所不同。具体来说,该层将RoI(Region of Interest,感兴趣区域)划分为 k × k 个bin(子区域),每个bin负责对目标特定位置的响应进行聚合。
选择性池化是指,对于每个bin,它只从 k × k 个score map(得分图)中选择一个特定的score map进行池化操作,而不是像传统RoI池化那样对所有score map进行池化。这里的每个score map对应于目标的一个特定相对位置(例如,目标的左上角、中心、右下角等)。通过这种方式,网络可以学习到每个bin应该关注哪个位置的信息,从而实现对不同位置信息的区分。
例如,如果 k = 3,那么就有 3 × 3 = 9 个bin和9个score map。左上角的bin可能只聚合第一个score map的响应,该score map负责检测目标的左上角;而中心bin可能只聚合第五个score map的响应,该score map负责检测目标的中心。通过这种选择性池化,位置敏感RoI池化层能够更好地处理目标的位置变化和形变,从而提高目标检测的准确性。
在两张图片中,可视化了当k × k = 3 × 3时,R-FCN学习到的位置敏感得分图。这些专门的图预计会在对象的特定相对位置被强烈激活。例如,“顶-中心-敏感”得分图在大致靠近对象顶部中心的位置表现出高分。如果候选框与真实对象精确重叠,则RoI中的大多数k^2个bin会被强烈激活,并且它们的投票会导致高分。相反,如果候选框未与真实对象正确重叠,则RoI中的某些k^2个bin不会被激活,并且投票得分较低。
训练
c∗ 是 RoI 的真实标签 (c∗ = 0 表示背景)。
[c∗ > 0] 是一个指示器,如果参数为真则等于 1,否则为 0
设置平衡权重 λ = 1
因为我们的每RoI计算可以忽略不计,所以前向时间几乎不受N的影响,这与中的OHEM Fast R-CNN相反,后者可能会使训练时间加倍。
为了使R-FCN与RPN共享特征
结果
使用ResNet-101的Faster R-CNN和R-FCN之间的比较。时间评估在单个Nvidia K40 GPU上进行。使用OHEM时,在前向传播中计算每个图像N个RoI,并选择128个样本用于反向传播。按照[18],测试使用300个RoI。
使用 ResNet-101 在 PASCAL VOC 2007 测试集上的比较。“Faster R-CNN +++” [9] 使用迭代框回归、上下文和多尺度测试。
使用ResNet-101在PASCAL 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的主要动机是将候选区域生成网络(RPN,Region Proposal Network)集成到整个检测网络中,实现端到端的训练和检测。
在目标检测任务中,目标的尺度变化较大。传统的 CNN会产生不同层次的特征,但这些特征在尺度适应性上存在不足。例如,浅层特征对小目标检测有帮助,但语义信息较弱;深层特征语义信息丰富,但对于小目标检测可能会丢失细节。FPN通过自下而上的路径(原始 CNN的特征提取过程)生成不同尺度的特征图,然后通过自上而下的路径(上采样等操作)和横向连接(将自上而下路径和自下而上路径的特征进行融合)构建特征金字塔。这样可以将高语义信息的深层特征和高分辨率的浅层特征结合起来,使得网络在不同尺度目标的检测上都有较好的性能。
Faster R - CNN虽然在速度和精度上有了很大的提升,但它仍然依赖于 ROI pooling层后的全连接层,这在一定程度上限制了其在不同尺度输入下的灵活性,且全连接层的参数较多。R - FCN摒弃了全连接层,采用全卷积网络的结构。它在特征映射上为每个位置生成位置敏感的分数图(Position - Sensitive Score Maps),然后通过 ROI pooling等操作来获取候选区域的特征。
相关文章:

两阶段法目标检测发展脉络
模式识别期末展示大作业,做个记录,希望大家喜欢。 R-CNN Fast R-CNN R-FCN 整个过程可以分解为以下几个步骤: 输入图像 (image) 和初步特征提取 (conv, feature maps): 首先,输入一张原始图像,经过一系列…...
Flannel 支持的后端
Flannel 是一个为 Kubernetes 设计的容器网络解决方案,支持多种后端(backend)来处理节点间的数据包转发。根据官方文档和其他可靠来源,以下是 Flannel 支持的后端类型及其说明: VXLAN(推荐) 描述…...

小白的进阶之路系列之六----人工智能从初步到精通pytorch数据集与数据加载器
本文将介绍以下内容: 数据集与数据加载器 数据迁移 如何建立神经网络 数据集与数据加载器 处理数据样本的代码可能会变得混乱且难以维护;理想情况下,我们希望我们的数据集代码与模型训练代码解耦,以获得更好的可读性和模块化。PyTorch提供了两个数据原语:torch.utils…...
SQL进阶之旅 Day 5: 常用函数与表达式
【SQL进阶之旅 Day 5】常用函数与表达式 在SQL的进阶学习中,掌握常用函数和表达式是提升查询效率、解决复杂业务问题的关键。本篇文章将深入探讨聚合函数、日期函数、条件表达式等核心内容,并结合实际案例分析其应用价值。通过理论讲解、代码示例和性能…...

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环境 网络负载均衡技术将外部计算机发送的连接请求均匀的分配到服务器集群中的每台服务器上,接受到请求的服务器独立地响应客户的请求。 网络负载均衡技术还…...
arcgis字段计算器中计算矢量面的每个点坐标
python脚本 函数 def ExportCoordinates(feat):coors = []partnum = 0partcount = feat.partCountwhile partnum < partcount:part = feat.getPart(partnum)pnt = part.next()while pnt:coors.append("({}, {})".format(pnt.X,pnt.Y))pnt = part.next()if not p…...

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

AI Agent工具全景解析:从Coze到RAGflow,探索智能体自动化未来!
在人工智能技术持续深入行业应用的背景下,越来越多的企业和个人寻求通过自动化技术来提高效率和减少重复性劳动,AI Agent的崛起已经成为了不可忽视的趋势。AI Agent,即人工智能代理,是一种基于先进的人工智能技术,特别…...
GitLab CI流水线权限隔离
方案概述 本方案实现在GitLab CI/CD中根据不同人员的权限级别执行不同的流水线步骤,主要基于GitLab的以下特性: rules 条件判断variables 变量传递only/except 条件限制用户权限API查询 基础权限模型设计 1. 用户角色定义 角色描述对应GitLab权限De…...
xcode卡死问题,无论打开什么程序xcode总是在转菊花,重启电脑,卸载重装都不行
很可能是因为我们上次没有正常关闭Xcode,而Xcode保留了上次错误的一些记录,而这次打开Xcode依然去加载错误的记录,所以必须完全删除这些记录Xcode才能加载正常的项目。 那么也就是说,我们是不是只需要删除这部分错误记录文件就可以…...

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如何更改图片的拍摄路径
如何更改相机拍摄图片的路径 前言:基础夯实:效果展示:实现功能:遇到问题:未解决: 核心代码: 前言: 最近在项目开发中遇到需要让用户更改相机拍摄路径的问题,用户可自己选…...
WebSocket学习总结
WebSocket 是一种基于TCP的网络通信协议,允许浏览器和服务器之间进行全双工、实时、低延迟的双向数据传输。它突破了传统HTTP协议的限制(请求-响应模式),特别适合需要实时通信的场景(如聊天、实时数据推送、游戏等&…...

秋招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…...
PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums
PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums PostgreSQL 提供了两种重要的数据完整性检查机制:amcheck 扩展和 pg_checksums 工具。它们在功能定位、检查层次和使用场景上有显著区别。 核心对比概览 特性amcheckpg_checksums检查对象…...

Vert.x学习笔记-什么是Handler
Vert.x学习笔记 在Vert.x中,Handler是一个核心概念,用于处理异步事件和回调。它是Vert.x响应式编程模型的核心组件之一,通过函数式接口的方式简化了异步编程的复杂性。 1. Handler的定义 Handler是一个函数式接口,定义如下&#…...
浏览器游戏的次世代革命:WebAssembly 3.0 实战指南
破局开篇:开发者必须跨越的性能鸿沟 在2025年,WebAssembly(WASM)技术已经成为高性能Web应用的核心驱动力。特别是WASM3引擎的广泛应用,使得在浏览器中实现主机级游戏画质成为可能。本文将深入探讨WASM3的关键特性、性…...
Java设计模式之工厂模式与策略模式简单案例学习
目录 1.前言2.工厂模式2.1 简单工厂方法2.2 静态工厂方法2.3 抽象工厂方法 3.策略模式4.区别与联系4.1定义与核心意图4.2 UML 结构对比4.3 关键组成对比4.4 应用场景对比 1.前言 最近接手的项目真的是太无语了,经历了多数人的编写,什么牛马鬼神写法都有&…...

【Echarts】象形图
目录 效果代码 效果 代码 <!-- 业务类型 --> <template><div class"ywlx" :style"{ --height: height }"><div class"header_count count_linear_bg"><div>当月业务总量<span class"common_count text_s…...
git 本地合并怎么撤回
在Git中,如果你已经执行了合并(merge)操作,但发现合并的结果不符合预期,你可以通过以下几种方式来撤销这次合并: 1. 使用git merge --abort 如果你在合并过程中还没有完成合并的提交(即合并冲…...

集星云推短视频矩阵系统的定制化与私有化部署方案
在当今数字化营销时代,短视频矩阵系统成为众多企业和机构拓展影响力、实现精准营销的关键工具。集星云推短视频矩阵系统凭借其强大的功能和灵活的定制性,为企业提供了全方位的解决方案。 一、API接口定制:无缝对接自有系统 集星云推短视频矩…...
npm run build 报错:Some chunks are larger than 500 KB after minification
当我们的 Vue 项目太大,使用 npm run build 打包项目的时候,就有可能会遇到以下报错: (!) Some chunks are larger than 500 kB after minification. Consider: - Using dynamic import() to code-split the application - Use build.rollup…...

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

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

CPP中CAS std::chrono 信号量与Any类的手动实现
前言 CAS(Compare and Swap) 是一种用于多线程同步的原子指令。它通过比较和交换操作来确保数据的一致性和线程安全性。CAS操作涉及三个操作数:内存位置V、预期值E和新值U。当且仅当内存位置V的值与预期值E相等时,CAS才会将内存位…...

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