【从基础到模型网络】深度学习-语义分割-ROI

news2025/5/19 23:51:13

在语义分割中,ROI(Region of Interest,感兴趣区域)是图像中需要重点关注的部分。其作用包括:提高效率,减少高分辨率图像的计算量;增强分割精度,聚焦关键语义信息;减少背景干扰,提升模型性能;适应特定场景需求,如医学图像中的肿瘤检测或自动驾驶中的行人检测。ROI 提取可通过手动标注、目标检测算法或注意力机制实现,是优化语义分割任务的重要手段。

目录

ROI Align

RoIWrap Pooling

RoIAlign Pooling


ROI Align

这种 Pooling 方法是在 Faster RCNN 中看到的,该种 Pooling 方法采用的运算方法比较直接。

注意

网络结构与用途

Faster R - CNN :是一种目标检测算法,主要用于在图像中找出目标物体位置并分类 。它基于 R - CNN 系列发展而来,结构上包含区域提议网络(RPN)、特征提取网络(如 VGG、ResNet 等)、ROI(Region of Interest)池化层以及分类和回归分支。先由 RPN 生成可能包含目标的候选区域,再对候选区域进行特征提取和分类回归。

FCN(Fully Convolutional Networks) :是语义分割算法 。它将传统 CNN 中的全连接层替换为卷积层,可接受任意尺寸图像输入,输出与输入图像尺寸相关的分割结果,对图像每个像素进行分类,确定像素所属类别。

工作原理

Faster R - CNN :通过 RPN 在特征图上滑动窗口生成大量候选区域,根据与真实目标框的 IoU(交并比)等指标筛选正负样本训练 RPN;特征提取网络提取图像特征后,ROI 池化层将不同大小候选区域特征映射到固定大小,最后分类分支判断类别,回归分支微调候选区域坐标。

FCN :对输入图像直接进行卷积操作提取特征,经多次卷积和下采样得到低分辨率高语义信息特征图;之后通过上采样(如反卷积等)操作将特征图恢复到接近输入图像尺寸,每个像素对应一个类别概率,实现像素级分类。

应用场景

Faster R - CNN :常用于目标检测场景,像安防监控中检测行人、车辆;自动驾驶中识别道路标志、车辆、行人等目标。

FCN :主要用于语义分割领域,如医学图像分割,区分器官、病变组织等;卫星图像土地利用分类,区分建筑、农田、森林等。

下面是其计算的流程图

在该网络中假设使用的骨架网络中的 feat stride=16,且测试图像中的一个边界框的大

小为 400∗ 300。

1 ) 首 先 计 算 对 应 feature map 上 图 的 大 小 , 那 么 在 特 征 图 上 的 大 小 就 是 400/16 ∗ 300/16=25∗ 18.75,注意这个时候出现小数了。那么就需要对其进行第一次量化操作,得到的特征图上大小为 25∗ 18。

2)得到 Pooling 结果。最后的 RoI Pooling 的输出是固定的为 7∗ 7,那么就要对这个特征图进行划分,那么划分出来的每一块的大小就是 25/7∗ 18/7=3.57∗ 2.57。又有小数,需要继续取整,这是第二次量化操作,块的区域就变成了 3∗ 2,然后再在这个区域上做 max pooling 得到最后的结果。

所以很大的误差是来自于量化过程,量化误差不断积累就变得很大了。

用一个生活中的例子来理解 RoI Pooling 的过程,就像把一张地图缩小后再划分格子找宝藏一样:

假设你有一张高清地图(原图),但计算机为了方便处理,会先把地图缩小成一张 “缩略图”(特征图)。这里有个缩小比例叫 feat stride=16,意思是缩略图上的 1 个像素,对应原图的 16×16 像素区域。

现在,你在原图上画了一个框(边界框),比如框住了一个 400×300 像素的区域(比如一片森林),你想知道这个区域在缩略图上的位置和大小。

第一步:找缩略图上的框(第一次量化)

计算缩略图上的框大小:

原图框是 400×300 像素,缩小 16 倍后,缩略图上的框应该是:

400÷16=25 像素宽,300÷16=18.75 像素高。

问题:但像素必须是整数,没法有 0.75 个像素,所以只能 “四舍五入” 或直接取整,这里直接取整为 25×18 像素(相当于把森林的缩略图强行压缩成 25 列、18 行的格子)。

类比:就像把一张纸从 A4 缩到 A5,纸上的画也会变小,但边缘可能被裁掉一点(取整导致误差)。

第二步:划分格子做 Pooling(第二次量化)

现在,你需要从这个 25×18 像素的缩略图框里,提取一个固定大小的特征(比如 7×7 的格子),就像把这片森林分成 7 行 7 列的小区域,每个区域找最明显的特征(比如最高的树、最大的石头)。

计算每个小格子的大小:

把 25 列分成 7 份:25÷7≈3.57列 / 格,

把 18 行分成 7 份:18÷7≈2.57行 / 格。

问题:又出现小数了!格子不能有 0.57 列,所以再次取整,变成 3 列 / 格 和 2 行 / 格。

类比:就像把一块蛋糕切成 7 份,但蛋糕尺寸不是 7 的倍数,只能尽量均分,每份大小可能不一样(左边 3 列,右边可能 4 列;上边 2 行,下边可能 3 行)。

每个格子里找最大值(Max Pooling):

现在,每个小格子是 3×2 像素的区域,在这个区域里找像素值最大的点(比如最亮的像素,代表可能有宝藏的位置),作为这个格子的特征值。

最终得到 7×7 的特征矩阵,这样无论原图框多大,输出都是固定尺寸的特征。

为什么会有误差?

第一次取整误差:原图框缩小到缩略图时,小数部分被直接舍弃(比如 0.75 像素没了),相当于把森林的边缘裁掉了一点。

第二次取整误差:划分小格子时,小数部分再次被舍弃,导致每个格子的实际大小和理想值不一致(比如本应 3.57 列的格子,只取了 3 列)。

误差积累:两次取整让框的位置和大小都偏离了真实值,就像两次 “近似裁剪” 后,地图上的森林位置可能和实际差了一块。

RoIWrap Pooling

该 Pooling 方法比前面提到的 Pooling 方法稍微好一些。对于一个选出来的预测框,

它的对应的 RoI 区域可以通过 feat stride 算出来(crop 操作)。

那么该方法与上一个方法的区别是什么呢?主要的区别在于第二步。还是用上面提到的

例子:在该网络中假设使用的骨架网络中的 feat stride=16,且测试图像中的一个边界框的

大小为 400∗ 300。

1)corp 操作。边界框在对应 feature map 上的大小为 400/16∗ 300/16=25∗ 18.75,

注意这个时候出现小数了。那么就需要像之前的方法一样对其进行第一次量化操作,得到的特征图上大小为 25∗ 18。

2)warp 操作。这里使用的是双线性差值算法,使 corp 操作的特征图变化到固定的尺

度上去,比如 14∗ 14,这样再去做 Pooling 得到固定的输出。这里的坐标就是连续的了,不会存在量化误差。

可以看出这里去掉了第二次的量化操作,进而减小了误差,也提升了检测的精度。

可以用 “修图” 的例子来理解 RoIWrap Pooling 的核心改进,它就像用更精细的 “拉伸” 替代 “硬裁剪”,减少了变形误差。

背景:问题从何而来?

在目标检测中,我们需要从原图的一个边界框(比如 400×300 像素的 “汽车” 区域)中提取特征,但计算机处理时,会先把原图缩小成一张 “缩略特征图”(缩小比例 feat stride=16)。此时,原图的边界框在特征图上会被缩小为 25×18.75 像素的区域(类似把一张大照片缩小后,汽车的位置可能变成 25 列、18.75 行的格子)。

RoI Pooling 的问题:两次 “硬裁剪”

之前的 RoI Pooling 会做两件事:

第一次裁剪(量化):把 18.75 行强行取整为 18 行(因为像素不能是小数),相当于把汽车的 “尾巴” 裁掉一点。

第二次裁剪(量化):把 25 列 ×18 行的区域分成 7×7 个小格子,但 25÷7≈3.57 列 / 格、18÷7≈2.57 行 / 格,又出现小数,只能再次取整为 3 列 / 格、2 行 / 格,导致每个小格子的大小被 “硬调整”(比如左边 3 列,右边可能 4 列)。

这两次 “硬裁剪” 会让特征区域变形,就像用剪刀强行把照片剪成格子,边缘和比例都会走样。

RoIWrap Pooling 的改进:用 “拉伸” 替代第二次裁剪

RoIWrap Pooling 的核心是第二步用 “双线性插值” 替代 “硬取整”,具体分两步:

1. 第一步:Crop(裁剪,仍有第一次量化)

和 RoI Pooling 一样,原图的边界框(400×300)在特征图上缩小为 25×18.75 像素的区域。由于像素必须是整数,仍需取整为 25×18 像素(裁掉 0.75 行的尾巴)。

2. 第二步:Warp(变形,无第二次量化)

关键区别在这里!RoIWrap 不会强行把 25×18 的区域分成 7×7 个 “硬格子”,而是直接用双线性插值把整个 25×18 的区域 “拉伸” 或 “压缩” 成固定尺寸(比如 14×14)。

双线性插值的作用:允许坐标是连续的小数(比如第 3.5 列、第 2.7 行),通过周围像素的加权平均计算新位置的像素值。这样,25 列 ×18 行的区域可以平滑地变成 14 列 ×14 行,不需要把小数部分 “裁掉” 或 “凑整”。

类比:就像用修图软件的 “自由变换” 功能,把一张 25×18 的小照片均匀拉伸成 14×14 的尺寸,虽然整体缩小了,但比例和细节保留得更完整(不会出现左边 3 列、右边 4 列的 “硬分割”)。

3. 最后:Pooling(取最大值)

拉伸后的 14×14 区域再做 Pooling(比如取最大值),得到固定尺寸的输出(比如 7×7)。

为什么误差更小?

RoIWrap Pooling 只在第一步做了一次 “裁剪”(量化),第二步通过双线性插值 “柔和调整” 尺寸,避免了 RoI Pooling 的第二次 “硬取整”。就像用 “拉伸” 替代 “剪刀剪”,减少了区域变形和细节丢失,特征更接近真实值,检测精度自然更高。

总结:核心区别

RoIAlign Pooling

这种 Pooling 方法是在 Mask RCNN 中被采用的,这相比之前的方法其内部完全去掉

了量化操作,取而代之的线性操作,使得网络特征图中的点都是连续的。从而提升了检测的精确度。

在该网络中假设使用的骨架网络中的 feat stride=16,且测试图像中的一个边界框的大小为 400∗ 300。

1)得到对应 feature map 中对应的区域。这里可以算出对应的区域大小为 400/16∗

300/16=25∗ 18.75,这个通过双线性差值计算的得到。这就是这一部分的结果了,不会对其进行量化操作。

2)得到 Pooling 结果。假设 Pooling 的固定输出为 7∗ 7,那么每个块得到的大小是 25/7∗ 18.75/7=3.57∗ 2.65。对于这样的一个块,假设在其中选择 2∗ 2 个采样点,那么每个采样点的值也是可以通过双线性差值得到,这样也是连续的。

因而相比前面的两个算法,其内部实现并没有存在量化的操作,也就没有因为量化而带

来的误差。这就使得其检测精确度进一步提升。具体的差别有多大?可以看一下 Mask RCNN 中给出的实验数据。

用 “绘制地图” 的比喻来理解 RoIAlign Pooling,像用 “无级缩放” 替代 “像素化裁剪”,让每个点都能精准定位,避免误差积累。

核心突破:彻底告别 “取整裁剪”

RoIAlign 的最大特点是全程不进行任何量化取整,所有坐标都允许是小数,通过双线性插值计算连续坐标的像素值。就像在地图上标记位置时,允许用经度纬度的小数(如 123.456°,45.678°)精准定位,而不是强制四舍五入到整数度数。

回到例子:边界框 400×300,feat stride=16

每个采样点的值怎么算?

用双线性插值,根据采样点周围 4 个整数像素的坐标加权平均。例如,采样点(0.893, 0.670)周围的 4 个像素是:

左上:(0, 0),右上:(1, 0),

左下:(0, 1),右下:(1, 1)。通过这 4 个点的值加权计算出采样点的值(权重由采样点到这 4 个点的距离决定)。

3. 第三步:Pooling(取最大值或平均值)

计算每个块内所有采样点的值后,取最大值(Max Pooling)或平均值,作为该块的输出。最终得到 7×7 的特征图。

为什么这样更精确?

无量化误差:

RoI Pooling 两次取整(如 18.75→18,3.57→3),导致区域位置和大小偏离真实值,

RoIAlign 全程用小数坐标,就像用 “游标卡尺” 精准测量,而非 “普通尺子” 粗略取整。

连续特征映射:

双线性插值让每个采样点都能 “感知” 周围像素的信息,避免因取整导致的 “特征断裂”。比如,原图中汽车轮胎的边缘可能落在小数坐标上,RoIAlign 能准确捕捉,而 RoI Pooling 可能直接裁掉或错放到相邻像素。类比:像素画 vs. 矢量图

RoI Pooling:像像素画,放大后边缘锯齿明显(量化误差导致特征模糊)。

RoIAlign:像矢量图,无论怎么缩放,边缘都平滑(连续坐标 + 插值保留细节)。

在 Mask RCNN 中,这种精度提升对实例分割至关重要 —— 比如分割汽车时,轮胎边缘的精确性直接影响掩码(Mask)的质量。

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

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

相关文章

掌握Docker:从运行到挂载的全面指南

目录 1. Docker的运行2. 查看Docker的启动日志3. 停止容器4. 容器的启动5. 删除容器6. 查看容器的详细信息7.一条命令关闭所有容器拓展容器的复制(修改数据不会同步)容器的挂载(修改数据可以同步)挂载到现有容器 1. Docker的运行 …

Pandas pyecharts数据可视化基础③

pyecharts基础绘图案例解析 引言思维导图代码案例分析 提前安装依赖同样操作安装完重新启动Jupyter Notebook三维散点图(代码5 - 40) 代码结果代码解析 漏斗图(代码5 - 41)结果代码解析 词云图(代码5 - 42)…

数据库中关于查询选课问题的解法

前言 今天上午起来复习了老师上课讲的选课问题。我总结了三个解法以及一点注意事项。 选课问题介绍 简单来说就是查询某某同学没有选或者选了什么课。然后查询出该同学的姓名,学号,课程号,课程名之类的。 sql文件我上传了。大家可以尝试练…

基于Bootstrap 的网页html css 登录页制作成品

目录 前言 一、网页制作概述 二、登录页面 2.1 HTML内容 2.2 CSS样式 三、技术说明书 四、页面效果图 前言 ‌Bootstrap‌是一个用于快速开发Web应用程序和网站的前端框架,由Twitter的设计师Mark Otto和Jacob Thornton合作开发。 它基于HTML、CSS和JavaScri…

组件导航 (Navigation)+flutter项目搭建-混合开发+分栏

组件导航 (Navigation)flutter项目搭建 接上一章flutter项目的环境变量配置并运行flutter 上一章面熟了搭建flutter并用编辑器运行了ohos项目,这章主要是对项目的工程化改造 先创建flutter项目,再配置Navigation 1.在开发视图的resources/base/profi…

ProfibusDP主站转modbusTCP网关与ABB电机保护器数据交互

ProfibusDP主站转modbusTCP网关与ABB电机保护器数据交互 在工业自动化领域,Profibus DP(Process Field Bus)和Modbus TCP是两种常见的通讯协议,它们各自在不同的场合发挥着重要作用。然而,随着技术的发展和应用需求的…

ubuntu24.04上安装NVIDIA driver+CUDA+cuDNN+Anaconda+Pytorch

一、NVIDIA driver 使用Ubuntu系统的:软件和更新——>附加驱动,安装NVIDIA驱动。 二、CUDA 安装命令:sudo apt install nvidia-cuda-toolkit 三、cuDNN cuDNN 9.10.0 Downloads | NVIDIA Developer 四、Anaconda Download Anaconda Di…

3、函数和约束

# 提供的数据sql CREATE TABLE IF NOT EXISTS student(no BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 学号,name VARCHAR(20) NOT NULL COMMENT 姓名,sex VARCHAR(2) DEFAULT 男 COMMENT 性别, age INT(3) DEFAULT 0 COMMENT 年龄,score DOUBLE(5,2) COMMENT 成绩…

PhpStudy | PhpStudy 工具安装 —— Windows 系统安装 PhpStudy

🌟想了解这个工具的其它相关笔记?看看这个:[网安工具] 服务器环境配置工具 —— PhpStudy 使用手册 笔者备注:Windows 中安装 PhpStudy 属于傻瓜式安装,本文只是为了体系完善而发。 在前面的章节中,笔者简…

基于vue框架的订单管理系统r3771(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:商家,用户,商品信息,订单信息,订单配送,评价记录 开题报告内容 基于Vue框架的订单管理系统开题报告 一、研究背景与意义 随着电子商务的快速发展和消费者购物习惯的改变,传统订单管理方式面临效率低、易出错、难以适应高并…

语音识别——语音转文字

SenseVoiceSmall阿里开源大模型,SenseVoice 是具有音频理解能力的音频基础模型,包括语音识别(ASR)、语种识别(LID)、语音情感识别(SER)和声学事件分类(AEC)或…

兰亭妙微:用系统化思维重构智能座舱 UI 体验

兰亭妙微设计专注于以产品逻辑驱动的界面体验优化,服务领域覆盖AI交互、智能穿戴、IoT设备、智慧出行等多个技术密集型产业。我们倡导以“系统性设计”为方法论,在用户需求与技术边界之间找到最优解。 此次智能驾驶项目,我们为某车载平台提供…

计算机视觉----基础概念、卷积

一、概述 1.计算机视觉的定义 计算机视觉(Computer Vision)是一个跨学科的研究领域,主要涉及如何使计算机能够通过处理和理解数字图像或视频来自动进行有意义的分析和决策。其目标是使计算机能够从视觉数据中获取高层次的理解,类似于人类的视觉处理能力。 具体来说,计算机…

第三十七节:视频处理-视频读取与处理

引言:解码视觉世界的动态密码 在数字化浪潮席卷全球的今天,视频已成为信息传递的主要载体。从短视频平台的爆火到自动驾驶的视觉感知,视频处理技术正在重塑人类与数字世界的交互方式。本指南将深入探讨视频处理的核心技术,通过Python与OpenCV的实战演示,为您揭开动态影像…

NSSCTF [GFCTF 2021]where_is_shell

889.[GFCTF 2021]where_is_shell(system($0)64位) [GFCTF 2021]where_is_shell (1) 1.准备 motalymotaly-VMware-Virtual-Platform:~$ file shell shell: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.s…

电子数据取证(数字取证)技术全面指南:从基础到实践

为了后续查阅方便,推荐工具先放到前面 推荐工具 数字取证基础工具 综合取证平台 工具名称类型主要功能适用场景EnCase Forensic商业全面的证据获取和分析、强大的搜索能力法律诉讼、企业调查FTK (Forensic Toolkit)商业高性能处理和索引、集成内存分析大规模数据处…

Ubuntu使用Docker搭建SonarQube企业版(含破解方法)

目录 Ubuntu使用Docker搭建SonarQube企业版(含破解方法)SonarQube介绍安装Docker安装PostgreSQL容器Docker安装SonarQube容器SonarQube汉化插件安装 破解生成license配置agent 使用 Ubuntu使用Docker搭建SonarQube企业版(含破解方法&#xff…

Django 项目的 models 目录中,__init__.py 文件的作用

在 Django 项目的models/init.py文件中,这些导入语句的主要作用是将各个模型类从不同的模块中导入到models包的命名空间中。这样做有以下几个目的: 简化导入路径 当你需要在项目的其他地方使用这些模型时,可以直接从models包导入&#xff0c…

网络的知识的一些概念

1.什么是局域网,什么是广域网 局域网(Local area network)也可以称为本地网,内网,局域网有这几个发展经历: 最开始电脑与电之间是直接用网线连接的 再后来有了集线器() 再后来出…

芋道项目,商城模块数据表结构

一、需求 最近公司有新的业务需求,调研了一下,决定使用芋道(yudao-cloud)框架,于是从github(https://github.com/YunaiV/yudao-cloud)上克隆项目,选用的是jdk17版本的。根据项目启动手册&#…