【基于 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 的尺寸。

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

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

相关文章

抖店怎么选品?抖店爆款选品思路技巧,新手直接用!

大家好,我是电商花花。 抖店选品永远是我们做抖店,做电商的核心,店铺想要出单,想要赚钱,我们就一定要学会怎么选品,怎么筛选商品。 而我们绝大多数新手并没有办法保证持续选爆款的能力,如果店…

【ARM+Codesys案例】T3/RK3568/树莓派+Codesys锂电池测试设备控制解决方案

锂电池诞生于上世纪60年代,90年代开始由日本索尼公司实现商业化。锂离子电池凭借快速充放电、长循环寿命、无记忆效应等众多优点,成为当今数码产品及电动汽车大规模应用的第一选择。与镍氢电池、铅酸电池相比,锂电池可以存储更多电能。现在&a…

Visual Studio 智能代码插件:CodeGeeX

前言 在软件开发领域,高效的编程助手一直是提升开发者效率和质量的关键。 随着人工智能技术的不断发展,智能编程助手逐渐成为开发者们不可或缺的工具。其中,CodeGeeX作为一款专为Visual Studio设计的免费智能编程助手,凭借其强大…

让大模型更聪明——复杂而艰巨的任务

一、引言 在人工智能领域,大模型因其强大的数据处理能力和复杂的结构,成为了推动技术进步的重要力量。然而,要让大模型真正展现出“聪明”的特质,即具备高度的人类智能水平,仍是一项极具挑战性的任务。本文将从数据质…

Java-Stream流-概述、创建、使用:遍历/匹配、筛选、聚合、映射、归约、排序、提取/组合

Java8-Stream: 一、Stream流概述1.Stream流的特点:2.使用步骤:3.常用方法示例: 二、Stream流创建1.常见的创建Stream的方法2. stream()或parallelStream()方法的使用和选择 三、Stream流使用Optional案例中使用的实体类1.遍历/匹配…

MYSQL之安装

一,下载仓库包 wget -i -c https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm二,安装仓库 yum -y install mysql80-community-release-el7-3.noarch.rpmsed -i s/gpgcheck1/gpgcheck0/g mysql-community.repo三,安装MY…

JS——对象

1.什么是对象 对象是什么? 对象是一种数据类型 无序的数据的集合( 数组是有序的数据集合 ) 对象有什么特点? 无序的数据的集合 可以详细地描述某个事物 静态特征 (姓名, 年龄, 身高, 性别, 爱好) > 可以使用数字, 字符串…

618有哪些值得买的好物?这几款好物通宵整理吐血推荐!

随着618购物节越来越近,很多买家终于等到了用好价钱买好东西的好机会。不管是你一直想要的家居电器,还是最新的数码产品,平时挺贵的东西在618期间会便宜不少。不过,这么多东西可选,促销活动也多得让人看花了眼&#xf…

antd-vue a-tree 当两个不同一级下二级key相同的时候就会导致两个同时选择, 拿到node.parent的数据也会出问题, 解决办法

一、问题如下图: 当两个不同一级下二级key相同的时候就会导致两个同时选择, 同时拿到node.parent的数据也会出问题, 出现一下问题的原因是因为数据treeData 的key出现相同的了 然后如下图、因为我的查询条件 第二层是给 cloud , 第二层是给 relatedPool…

内存泄漏面面谈

概述 主要介绍了内存泄漏的关注点是对象,对内存问题进行了分类并且确定本文关注点是内存泄漏,15种内存泄漏判断方式,hprof文件的用法和分析过程,以及memory profiler工具一些基本概念,最后提到了如何触发内存泄漏问题…

企业文件加密软件有哪些?企业文件加密软件排名榜一

企业文件加密软件有哪些?企业文件加密软件排名榜一 企业文件加密软件在市场上种类繁多,尤其是2024年的市场,很多新生加密软件也出现了,那么排在榜一的是哪款加密软件呢? 1、安企神软件: 这款软件支持7天试用…

YOLOv8猫狗检测:从SwanLab可视化训练到Gradio Demo网站

基于YOLO模型在自定义数据上做训练,实现对特定目标的识别和检测,是CV领域非常经典的任务,也是AI项目落地最热门的方向之一。 这篇文章我将带大家使用Ultralytics、SwanLab、Gradio这两个开源工具,完成从数据集准备、代码编写、可…

第十八节:带你梳理Vue2: Vue组件中的注意事项和特例

1. Vue组件名推荐使用驼峰命名 现在我们来看看为什么在Vue中推荐注册组件时使用驼峰写法, 在了解这个之前,相信大家应该都能明白为什么在Vue中, 局部组件的使用频率高于全局组件. 推荐使用驼峰写法也是和局部组件有关系 我们先看一个示例 <div id"app"><…

2、PHP 8.1.0-dev 后门远程命令执行漏洞复现

1、青少年ctf&#xff0c;题目PHP后门 2、页面 3、bp抓包发现PHP版本为8.1.0-dev 4、尝试使用以前爆出过的漏洞&#xff08;网上查相关案例&#xff09; User-Agentt: zerodiumvar_dump(5*5); User-Agentt: zerodiumsystem("cat /flag"); 5、查找flag User-Agentt: z…

双向带头链表实现

目录 一. 逻辑结构图解 1. 节点中存储的值 2.逻辑实现 二. 各种功能实现 1. 创建节点函数 2. 初始化哨兵位 3. 尾插 4. 头插 5. 尾删 6. 头删 7. 打印链表值 8. 查找数据&#xff0c;返回节点地址 9. 指定地址后插入节点 10. 删除指定地址节点 11. 销毁链表 三.…

JAVA云HIS医院系统源码 云HIS运维平台源码 融合B/S版电子病历系统,支持电子病历四级,saas模式

JAVA云HIS医院系统源码 云HIS运维平台源码 融合B/S版电子病历系统&#xff0c;支持电子病历四级&#xff0c;saas模式 HIS系统就是医院信息管理系统&#xff0c;HIS系统是整个医院信息化的核心&#xff0c;门诊、住院、药房、药库等都是由HIS系统来承载起来的&#xff0c;所以…

【Spring】深入学习AOP编程思想的实现原理和优势

【切面编程】深入学习AOP编程思想的实现原理和优势 前言AOP的由来及AOP与代理的关系AOP的实现方式详解静态代理动态代理 AOP的应用场景记录日志权限控制数据库事务控制缓存处理异常处理监控管理 AOP的底层实现全流程解析Spring AOP的简介动态代理的实现原理Spring AOP的实现原理…

rockeylinux 搭建k8s 1.28.10

1.关闭防火墙 systemctl stop firewalld systemctl disable firewalld 2.关闭selinux # 临时禁用selinux # 将 SELinux 设置为 permissive 模式&#xff08;相当于将其禁用&#xff09; setenforce 0 sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config 3.网…

tinyrenderer-渲染器着色

整理了代码&#xff0c;创建了一个相机类&#xff0c;控制镜头 class Camera { public:Camera(Vec3f cameraPos, Vec3f target, Vec3f up):cameraPos_(cameraPos), target_(target), up_(up) {}Matrix getView();Matrix getProjection(); private:Vec3f cameraPos_;Vec3f targ…

2024年区块链,物联网与信息技术国际会议(ICBITIT 2024)

2024年区块链&#xff0c;物联网与信息技术国际会议&#xff08;ICBITIT 2024&#xff09; 2024 International Conference on Blockchain, Internet of Things, and Information Technology 会议简介&#xff1a; 2024年区块链&#xff0c;物联网与信息技术国际会议&#xff…