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

前言

文章性质:学习笔记 📖

学习资料:吴茂贵《 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 的尺寸。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能超万卡集群的核心设计原则和架构

超万卡集群的核心设计原则和架构 超万卡集群建设方兴未艾,当前主要依托英伟达GPU及其设备。英伟达GPU在大模型训练中表现卓越,但国产AI芯片虽进步显著,性能与生态构建仍存差距。面对诸多挑战,构建技术领先、基于国产生态的超万卡集群,仍需不断突破与创新。 大模型升级至万…

腾讯前端4轮面经分享,期望薪资28K

笔者原来在北京360企业安全工作,当时因为大学四年的学业是在北京完成的,所以就顺势通过校招在北京工作了。但家里是南方的,对南方的饮食和生活习惯更加喜欢一些,所以对深圳广州的公司特别是腾讯觊觎已久,所以就在今年2…

期货学习笔记-斐波那契学习1

斐波那契数列介绍 斐波那契数列是1、1、2、3、5、8、13、21、34、55、89…据说这是数学家莱昂纳多 斐波那契研究兔子繁殖时发现的一个神奇数列,似乎大自然在按照这个数列进行演化,一个斐波那契数字是由该数列相邻的前两个数字相加得到的 在斐波那契交易…

Spark Sql写代码方式(yarn)以及 spark sql整合hive详解

引入部分:通常我们在IDEA中写spark代码中如果设置了loacl参数,基本都是在IDEA本地运行,不会提交到 standalone或yarn上运行,在前几篇文章中写的大多数都是该种形式的spark代码,但也写到了如何将spark代码提交到standal…

大模型微调:Lora

原理图 原理:不改变原始大模型参数,只加入一个类似残差分支,先降纬再升纬,因为模型是过参数化的,它们有更小的内在维度,模型主要依赖于这个低的内在维度(low intrinsic dimension)去…

基于LLM的优化器评测

基于LLM的优化器评测 求解的目标函数测试结果测试代码测试日志 背景: ​ 很多时候我们需要为系统寻找最优的超参.比如模型训练,推理的量化等.本文尝试将LLM当成优化器,帮忙我们寻找最优的超参. 验证方法: 1.设计一个已知最优解的多项式,该多项式有3个变量(因为3个变量可以通过…

飞睿智能高精度、低功耗测距,无线室内定位UWB芯片如何改变智能家居

在数字化和智能化快速发展的今天,定位技术已经成为我们日常生活中不可或缺的一部分。然而,传统的GPS定位技术在室内环境中往往束手无策,给我们的生活带来了诸多不便。幸运的是,随着科技的不断进步,一种名为UWB&#xf…

符合车规级漏电流检测的磁通门传感器KTD1100

电动车充电桩 在政策出台后,充电桩类产品按要求需装配B端漏电流检测装置。它可以有效防止充电桩等设备中的漏电流对用户造成危害,保障用户的用电安全。其次,它可以促进充电桩等产品的质量提升,提高市场的公平竞争,让消…

汽车合面合壳密封UV胶固化后一般可以耐多少度的高温和低温? 汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车合面合壳密封UV胶固化后一般可以耐多少度的高温和低温? UV胶固化后的耐高温和低温能力取决于具体的UV胶水品牌和型号,以及固化过程中的条件。一般来说,高品质的UV胶水在固化后可以提供较好的耐温性能,但确切的耐温范围需要参考各个厂家提…

24年gdcpc省赛C题

1279:DFS 序 先不考虑多节点,先看着颗二叉树,假设他们的父亲节点是第k个被访问的点,如果先访问左子树,那么得到的结果是a1*ka2*(k1)b1*(2k)b2*(2k1),可以发现,先访问左子树,那么右子树每次的乘以的p值实际上是左子树乘以的p值加上左子树的节点个数,比如a1*k和b1*(2k),如果不看2…

Bookie存储架构源码剖析|得物技术

一、Pulsar存储架构简析 Pulsar作为新一代MQ中间件,在底层架构设计上充分贯彻了存算分离的思想,broker与Bookeeper两个组件独立部署,前者负责流量的调度、聚合、计算,后者负责数据的存储,这也契合了云原生下k8s大行其…

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

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

聚会活跃气氛神器小程序源码系统 各种小游戏 让聚会不再冷场 带源代码包以及安装搭建教程

系统概述 在社交聚会中,如何让气氛活跃起来一直是一个让人关注的问题。小编给大家分享一款聚会活跃气氛神器小程序源码系统。它不仅提供了丰富多样的小游戏,还带有源代码包和详细的安装搭建教程,让你轻松打造属于自己的聚会互动平台。 代码…

根据经纬度点计算经纬度点之间的距离

根据经纬度点计算经纬度点之间的距离 根据两点经纬度坐标计算直线距离 根据经纬度点计算经纬度点之间的距离 根据经纬度计算两地之间的距离 根据两点经纬度坐标计算距离 其实看第一个就够了 根据 半正矢公式(Haversine formula)即可计算 本计算式选取地…

【Django】开发个人博客系统【1】

使用Django开发个人博客系统,博客系统包括用户(博主)注册和登录、博主资料信息、图片墙功能、留言板功能、文章列表、文章正文内容和Admin后台系统。 1. 项目架构设计 下一步将上述设置写入Django的配置文件settings.py,当Django…

【C语言编程】Codeblocks安装步骤

操作系统 Windows 11 操作系统 安装步骤 1、 访问Codeblocks官网:Codeblocks官网,点击Download下载: 下载好的安装包: 2、 右键——以管理员身份运行: 3、 点击Next下一步: 4、 点击I Agree同意用…

解锁数据关联之道:SQL 表连接详解

文章目录 概述表关系横向连接内连接 inner join左连接 left join右连接 right join全连接 full join交叉连接 cross join 纵向合并UNION ALLUNION 概述 在数据处理、数据分析中常会用到表连接。表连接的作用是将多个表中的数据关联起来,以便在查询过程中获取更全面…

【LabVIEW FPGA入门】使用事件发生函数同步FPGA循环

1.使用事件发生函数 使用 Occurrences 函数来控制单独的同步活动。特别是,当您希望程序框图的一部分等待程序框图的另一部分完成任务而不强制 LabVIEW 进行轮询时,请使用这些函数。 您可以使用全局变量执行类似于occurrences函数的功能,通过一…

通过Windows事件日志介绍APT-Hunter

APT-Hunter是用于Windows事件日志的威胁搜寻工具,该工具能够检测隐藏在Windows事件日志中的APT运动,如果您是弄威胁情报的人,那么我保证您会喜欢使用此工具的,为什么?我将在本文中讨论原因,请注意&#xff…

音视频开发9 FFmpeg 解复用框架说明,重要API说明

一,播放器框架 二 常用音视频术语 容器/文件(Conainer/File): 即特定格式的多媒体文件, 比如mp4、flv、mkv等。 媒体流(Stream): 表示时间轴上的一段连续数据&#xff0…