【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

news2024/11/15 1:51:58

前言

文章性质:学习笔记 📖

学习资料:吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2

主要内容:根据学习资料撰写的学习笔记,该篇主要介绍了优化候选框的几种方法。

一、优化候选框的几种方法

在进行目标检测时,往往会产生很多候选框,其中大部分是我们需要的,也有部分是我们不需要的。

因此 有效过滤 这些不必要的框就非常重要。这节我们介绍几种常用的优化候选框的算法。

1、交并比

使用 选择性搜索(SS)区域候选网络(RPN)等方法,最后每类选出的候选框会比较多,在这些候选框中如何选出质量较好?

可使用 交并比 这个度量值进行过滤。交并比(Intersection Over Union, IOU)用于计算候选框和目标实际标注边界框的重合度。

假设我们要计算两个矩形框 A 和 B 的 IOU ,即它们的交集与并集之比,如图 9-15 所示。且 A 、B 的重合度 IOU 的计算公式:

IOU=\frac{A\cap B}{A\cup B}

2、非极大值抑制

通过 选择性搜索(SS)区域候选网络(RPN)等方法生成的大量的候选框中有很多指向同一目标,故存在大量冗余的候选框。

如何减少这些冗余框?可使用 非极大值抑制(Non-Maximum Suppression, NMS)算法。

非极大值抑制算法的思想:搜索局部极大值,抑制非极大值元素。

如图 9-16 所示,要定位一辆车,SS 或 RPN 会对每个目标生成一堆矩形框,而 NMS 会过滤掉多余的矩形框,找到最佳的矩形框。

非极大值抑制的基本思路分析如下:先假设有 6 个候选框,每个候选框选定的目标属于汽车的概率如图 9-17 所示。

将这些候选框选定的目标按其属于车辆的概率从小到大排列,标记为 A 、B 、C 、D 、E 、F 。

(1)从概率最大的矩形框(即面积最大的框)F 开始,分别判断 A ~ E 与 F 的重叠度是否大于某个设定的阈值。

(2)假设 B 、D 与 F 的重叠度超过阈值,就将 B 、D 丢弃,并标记 F 是我们保留下来的第一个矩形框。

(3)从剩余的 A 、C 、E 中,选择概率最大的 E ,然后判断 A 、C 与 E 的重叠度是否大于某个设定的阈值。

(4)假设 A 、C 与 E 的重叠度超过阈值,就将 A 、C 丢弃,并标记 E 是我们保留下来的第二个矩形框。

(5)重复这个过程,直到找到所有被保留下来的矩形框。

【说明】因为超过阈值,说明两个矩形框有很大部分是重叠的,那么保留面积大的矩形框即可,那些小面积的矩形框是多余的。

3、边框回归

通过 选择性搜索(SS)区域候选网络(RPN)等方法生成的大量候选框,虽然有一部分可以通过 非极大值抑制(NMS)等方法过滤一些多余框,但仍然会存在很多质量不高的框图,如图 9-18 所示。

如图 9-18 所示,其中内部框的质量不高,定位不准,IOU<0.5 ,说明它没有正确检测出飞机,需要通过 边框回归 进行修改。

除此之外,训练时,我们也需要通过 边框回归 使预测框不断迭代,不断向真实框(又称目标框)靠近。

(1)边框回归的主要原理

如图 9-19 所示,最下面的框 A 代表生成的候选框,最上面的框 G 代表目标框。

接下来我们需要基于 A 和 G 找到一种映射关系,得到一个预测框 G' ,并通过迭代使 G' 不断接近目标框 G 。

这个过程用数学符号可表示为如下形式:

锚框 A 的四维坐标为 A=(A_x,A_y,A_w,A_h) ,其中 4 个值分别表示锚框 A 的中心坐标及宽和高。

锚框 G 的四维坐标为 G=(G_x,G_y,G_w,G_h) ,其中 4 个值分别表示锚框 G 的中心坐标及宽和高。

基于 A 和 G ,找到一个对应关系 F 使 F(A) = G' ,其中 G'=(G'_x,G'_y,G'_w,G'_h) ,且 G' ≈ G 。

(2)如何找到对应关系 F

如果通过变换 F 实现从矩形框 A 变为矩形框 G' 呢?比较简单的思路就是 平移 + 放缩 ,具体实现步骤如下:

① 先平移:

G'_x=A_w \cdot d_x(A)+A_x

G'_y=A_h \cdot d_y(A)+A_y

② 后缩放:

G'_w=A_w \cdot exp(d_w(A))

G'_h=A_h \cdot exp(d_h(A))

这里要学习的变换是 F \: : \: (d_x(A),d_y(A),d_w(A),d_h(A)) ,当输入的锚框 A 与 G 相差较小时,可以认为这四个变换是一种线性变换,这样就可以用线性回归来建模对矩形框进行微调。线性回归是指给定输入的特征向量 X ,学习一组参数 W ,使得经过线性回归后的值与真实值 G 非常接近,即 G ≈ WX 。那么锚框中的输入以及输出分别是什么呢?

输入:A=(A_x,A_y,A_w,A_h)

这些坐标实际上对应 CNN 网络的特征图,训练阶段还包括目标框的坐标值,即 T=(t_x,t_y,t_w,t_h) 。

输出:4 个变换,d_x(A) ,d_y(A) ,d_w(A)d_h(A)

输入与输出之间的关系:

d_*(A)=W_*^T \Phi (A)

由此可知训练的目标就是使预测值 d_*(A) 与真实值 t_* 的差最小化,用 L1 来表示:

Loss=\sum_{i=1}^{N} \left | t_*^i - W_*^T \Phi (A^i) \right |

为了更好地收敛,我们实际使用 smooth-L1 作为其目标函数:

\hat{W}_*=argmax_{W_*}\sum_{i=1}^{N} \left | t_*^i - W_*^T \Phi (A^i) \right | + \lambda \left \| W_* \right \|

(3)边框回归为何只能微调?

要使用线性回归,就要求锚框 A 与 G 相乘较小,否则这些变换可能会变成复杂的非线性变换。

(4)边框回归的主要应用

在 RPN 生成候选框的过程中,最后输出时也使用边框回归使预测框不断向目标框逼近。

(5)改进空间

YOLO v2 提出了一种 直接预测位置坐标 的方法。之前的坐标回归实际上回归的不是坐标点,而是需要对预测结果做一个变换才能得到坐标点,这种方法使其在充分利用目标对象的位置信息方面的效率大打折扣。

为了更好地利用目标对象的位置信息,YOLO v2 采用 目标对象的中心坐标左上角 的方法,具体可参考图 9-20 。

其中,p_w 和 p_h 为锚框的宽和高,t_x 、t_y 、t_w 、t_h 为预测边界框的坐标值,\sigma 是 sigmoid 函数。C_x 、C_y 是当前网格左上角到图像左上角的距离,需要将网格 大小归一化 ,即令一个网格的 宽 = 1高 = 1

4、SPP-Net

候选区域通过处理最后由全连接层进行分类或回归,而全连接层一般是固定大小的输入。为此,我们需要把候选区域的输出结果设置为固定大小,有两种固定方法:

1. 第一种方法是直接对候选区域进行缩放,不过这种方法容易导致对象变形,进而影响识别效果;

3. 第二种方法是使用 空间金字塔池化网络(Spatial Pyramid Pooling Net, SPP-Net)方法或在此基础上延伸的 RoI 池化 方法。

空间金字塔池化网络 SPP-Net 对每个候选框使用了不同大小的金字塔映射,如 4×4 ,2×2 ,1×1 等。

空间金字塔池化网络 SPP-Net 由何恺明、孙健等人提出,其主要创新点就是 空间金字塔池化(Spatial Pyramid Pooling, SPP)

空间金字塔池化网络 SPP-Net 成功解决了 R-CNN 中每个候选区域都要过一次 CNN 的问题,提升了效率,并避免了为适应 CNN 的输入尺寸而缩放图像导致目标形状失真的问题。

SPP-Net 是自适应的池化方法,分别对 输入特征图 进行 多个尺度 的池化,得到特征,进行向量化后拼接起来,如图 9-21 所示。

  • 输入特征图:可以由不定尺寸的输入图像输入 CNN 得到,也可以由候选区域框定后输入 CNN 得到。
  • 多个尺度:实际上就是改变池化的大小和步幅。 

与普通池化的固定大小不同( 普通池化的大小和步幅相等,即每一步都不重叠 ),SPP-Net 固定的是池化后的尺寸 ,而大小则是根据尺寸计算得到的自适应数值来确定。这样可以保证不论输入是什么尺寸,输出的尺寸都是一致的,从而得到定长的特征向量。

图 9-22 是使用 SPP-Net 把一个 4×4 RoI 用 2×2 ,1×1 的大小池化到固定长度的示意图。 

SPP-Net 对特征图中的候选框进行了多尺寸( 如 5×5 ,2×2 ,1×1 等 )池化,然后展平、拼接成固定长度的向量。

RoI 对特征图中的候选框只需要下采样到一个尺寸,然后对各网格采用最大池化方法,得到固定长度的向量。

Fast R-CNN 及 Faster R-CNN 都采用了 RoI 池化方法。以 VGG-16 的主干网络为例,RoI 将候选框下采样到 7×7 的尺寸。

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

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

相关文章

Java 面向对象编程(OOP)

面向对象编程(Object-Oriented Programming,OOP)是Java编程语言的核心思想之一。通过OOP,Java提供了一种结构化的编程方式,使代码更易于维护和扩展。 一、类和对象 1. 类的定义 类是对象的蓝图或模板,定…

回收站删掉的照片还能找回来吗?掌握这5个方法,很简单!

“我一不小心在回收站中误删了一些照片,这些照片对我来说是比较重要的,不知道这些还有机会将它们找回来吗?” 当我们不小心将珍贵的照片从计算机的回收站中误删时,那种瞬间的心痛和焦虑难以言表。这些照片可能记录了我们生活中的重…

大数据开发面试题【Kafka篇】

83、介绍下Kafka,Kafka的作用?Kafka的组件?适用场景? kafka是一个高吞吐量、可扩展的分布式消息传递系统,在处理实时流式数据,并能够保证持久性和容错性 可用于数据管道、流分析和数据继承和关键任务应用(发布/订阅模式&#…

雷达基数据绘制成雷达图

x波段雷达基数据绘制成雷达图 1.雷达基数据格式Z_RADR_I_ZR001_20240521020002_O_DOR_YLD2-D_CAP_FMT.bin.bz2 2.基数据读取 python f StandardData(i) # 新版本标准数据radarTime f.scantime # 获取雷达时次date_str radarTime.strftime(%Y-%m-%d %H:%M:%S)date_str d…

盘点10大灵动惊艳小演员❗谁是你的心头好?

盘点国内影视那些惊艳观众的小演员们无疑为影视作品注入了新的活力。以下是10个备受赞誉的小演员: 1.韩昊霖:凭借在《我和我的祖国》和《庆余年》中的出色表现 韩昊霖的演技赢得了观众和业界的广泛认可 他能够准确地把握角色的情感和细节,展…

STM32_USART

1、USART简介 USART,即Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步/异步收发器。USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自…

claude3国内API接口对接

众所周知,由于地理位置原因,Claude3不对国内开放,而国内的镜像网站使用又贵的离谱! 因此,团队萌生了一个想法:为什么不创建一个一站式的平台,让用户能够通过单一的接口与多个模型交流呢&#x…

点云工具CloudCompare下载、安装与汉化

一、下载 软件免费开源,所以可以直接在官网下载,官网地址: CloudCompare - Open Source project 进入官网后,点击菜单栏【Download】 选择合适系统进行下载 二、安装 常规软件安装流程即可 三、汉化 打开软件后,…

社交媒体数据恢复:微信电话本

首先,请确保您的微信已登录,并且您具有管理员权限。接下来,按照以下步骤进行操作: 第一步:备份微信数据 在进行数据恢复之前,建议您先备份微信数据。这可以帮助您在数据丢失的情况下更好地保护您的微信数据…

成都百洲文化传媒有限公司引领电商服务新风尚

在当今数字化时代,电商行业正以前所未有的速度蓬勃发展,而在这个充满机遇与挑战的领域中,成都百洲文化传媒有限公司以其专业的电商服务,成为了行业的佼佼者。作为一家专注于电商服务的传媒公司,百洲文化不仅为商家提供…

NDK下载与配置以及遇到的问题

通过 Android Studio进行下载或者官网下载,下面是在 androidStudio中下载在项目中配置ndk 菜单栏点开 File-》Project Structure,可以看到配置好的ndk配置ndk的系统环境变量,系统变量 -> 新建一个变量名为 NDK_HOME -> 变量值为文件路…

新旅程:类与对象的魔法课堂

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C和数据结构怀有无限热忱的探索者。🙌 🌸🌸🌸这里是我分享C/C编程、数据结构应用的乐园✨ 🎈🎈&…

AI大模型在测试中的深度应用与实践案例

文章目录 1. 示例项目背景2. 环境准备3. 代码实现3.1. 自动生成测试用例3.2. 自动化测试脚本3.3. 性能测试3.4. 结果分析 4. 进一步深入4.1. 集成CI/CD管道4.1.1 Jenkins示例 4.2. 详细的负载测试和性能监控4.2.1 Locust示例 4.3. 测试结果分析与报告 5. 进一步集成和优化5.1. …

RK3588 camera驱动总结二之图像格式

camera驱动中很重要的一个设置就是格式,此文来看看这块。 在驱动中有个重要的参数mbus-code,即Media Bus Pixel Codes,它描述的是用于在物理总线上传输的格式,比如 sensor 通过mipi dphy 向 isp 传输的图像格式,或者在…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试5月28日预测第4弹

今天继续基于8883的大底进行测试,今天继续测试,好了,直接上结果吧~ 首先,888定位如下: 百位:3,4,2,5,0,7,8,9 十位:3,2,4,1,6,7,8,9 个位:0,1,2,3,4,5,6,7 …

如果你使用vscode的ssh插件远程连接不了服务器,解决办法如下

CtrlShiftP打开命令面板,在命令面板中输入setting,选择User Settings 在页面中配置"remote.SSH.useLocalServer": true,保存重启后再重新连接就好了 再次连接就可以输入密码连接了

YOLOv5改进 | 卷积模块 | 提高网络的灵活性和表征能力的动态卷积【附代码+小白可上手】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 轻量级卷积神经网络由于其低计算预算限制了CNNs的深度(卷积层数)和宽度(通道数),…

手机号码携号转网查询保障用户权益、信息透明、优化用户体验

携号转网服务是指在同一本地网范围内,蜂窝移动通信用户(不含物联网用户)变更签约的基础电信业务经营者而用户号码保持不变的一项服务。近年来,随着通信行业的不断发展,携号转网服务已成为满足用户个性化需求、提升服务…

使用nexus搭建的nodejs私库,定期清理无用的npm组件,彻底释放磁盘空间

一、背景 昨天我们整理了一篇关于docker私库,如何定期清理以释放磁盘空间的文章。 虽然也提及了npm前端应用的组件该如何定期清理的,本文是对它作一个补充说明。 前文也看到了,npm组件占用的blob空间为180多GB,急需清理。 二、…

给pdf加水印,python实现

from PyPDF2 import PdfReader, PdfWriterdef add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):"""把水印添加到pdf中"""pdf_output PdfWriter()input_stream open(pdf_file_in, rb)pdf_input PdfReader(input_stream, strictFalse…