深度学习基础—目标检测算法

目录


1.滑动窗口算法

2.滑动窗口的卷积实现

(1)1*1卷积的作用

(2)全连接层转化为卷积层

(3)在卷积层上实现滑动窗口

3.Bounding Box预测(YOLO算法)


1.滑动窗口算法


        假如要构建一个汽车检测算法,首先创建一个标签训练集,也就是适当剪切的汽车图片样本,编号1是一个正样本,因为它是一辆汽车图片,编号2、3也有汽车,但编号4、5没有汽车。一开始我们可以使用适当剪切的图片,就是整张图片几乎都被汽车占据,有了这个标签训练集,就可以开始训练卷积网络了,输入这些适当剪切过的图片(编号6),卷积网络输出:0或1表示图片中有汽车或没有汽车。训练完这个卷积网络,就可以用它来实现滑动窗口目标检测,具体步骤如下:

        假设下图是一张测试图片,首先选定一个特定大小的窗口,将这个红色小方块输入卷积神经网络,卷积网络开始进行预测,即判断红色方框内有没有汽车。

        滑动窗口目标检测算法接下来会继续处理第二个图像,即红色方框稍向右滑动之后的区域(每次都固定步幅),并输入给卷积网络,因此输入给卷积网络的只有红色方框内的区域,再次运行卷积网络,然后处理第三个图像,依次重复操作,直到这个窗口滑过图像的每一个角落。

        然后选择比上次大的红色方框,进行滑动窗口算法,遍历整张图片。第三次可以选择更大的方框,这样做的目的是:不论汽车在图片的什么位置,总有一个窗口可以检测到它。

        但是这种算法也有明显的缺点:因为方框会将图片切割成多张小图片多次进行检测,所以引来巨大的计算成本。假如选择小步幅移动,就会增加计算成本;如果选择大步幅,就会减少切割的数量,从而影响检测性能(有汽车却因为切割部分的图片含有较少汽车部分,从而检测失败)。

2.滑动窗口的卷积实现


(1)1*1卷积的作用

        1*1卷积听起来好像是为图片的每一个位置乘以一个数字,似乎没啥作用,但是如果在有对通道数改变的需求的场景,就会产生非凡的意义。

        如上图所示,输入是6*6*32的维度,选择通道数相同的1*1卷积核,得到的结果是6*6*过滤器数量的输出。把1*1卷积核理解为权重,这就表示输入的图片依次与每个1*1卷积核做运算,这不就是全连接层吗。

        所以1×1卷积可以从根本上理解为对这32个不同的位置都应用一个全连接层,全连接层的作用是输入32个数字(过滤器数量标记为,在这36个单元上重复此过程),输出结果是6*6*过滤器数量,以便在输入层上实施一个非平凡(non-trivial)计算。

        那么,我们就可以应用1*1卷积核,来改造我们的网络,实现特殊的目的。

(2)全连接层转化为卷积层

        如何把这些全连接层转化为卷积层?假设在上图第一行这样的卷积网络中,我们希望网络的输出为:汽车、行人、摩托车和背景等四类,那么softmax层就有4个单元分别输出4类的概率。

        找到全连接层和前一层,用5*5的过滤器来实现卷积层的转化,数量是400个(编号1所示),输入图像大小为5*5*16,用5*5的过滤器对它进行卷积操作,过滤器实际上是5*5*16,因为在卷积过程中,过滤器会遍历这16个通道,所以这两处的通道数量必须保持一致,输出结果为1*1。假设应用400个这样的5*5*16过滤器,输出维度就是1*1*400,我们不再把它看作一个含有400个节点的集合,而是一个1*1*400的输出层。从数学角度看,它和全连接层的效果是一样的,因为这400个节点中每个节点都有一个5*5*16维度的过滤器,所以每个值都是上一层这些5*5*16激活值经过某个任意线性函数的输出结果(也就是全连接层中的线性组合)。

        再添加另外一个卷积层(编号2所示),这里用的是1*1卷积,假设也有400个1*1的过滤器,在这400个过滤器的作用下,下一层的维度是1*1*400,这其实就是上个网络中的这一全连接层(400个神经元)。最后经4个1*1过滤器的处理,得到一个softmax激活值,通过卷积网络,我们最终得到这个1*1*4的输出层,而不是这4个数字(编号3所示)。

        可以发现,我们在图片上实施一次预测,就会输出1*1*4的结果,这实际上是4个分类的概率,那么如果我们用一张更大的图片,运用滑动窗口算法(用一定大小的窗口分割图片),也实施一次预测,是否会得到多个预测结果?这样岂不是可以减少滑动窗口的运算量。答案是肯定的。

(3)在卷积层上实现滑动窗口

        上图所示的是简化的网络结构,并不是3D版本的。现在有一张16*16*3的图片需要预测,它比输入给卷积网络的14*14*3的图片大。在传统的卷积网络运用滑动窗口算法,需要将图片用14*14的框进行分割,选择步长为2,分割为4张图片,因此需要运行4次网络(即4次向前传播过程)才可以得到4个预测结果。结果发现这其中有很多重复计算可以共享(比如第一次卷积过程中相同参数的卷积核在同一个区域工作了4次),因此我们可以直接输入一张16*16的图片。这样网络的计算就变为了上图第二行的过程,经过5*5*16的卷积核后,选择步长为1,输出变为12*12*16;再经过最大池化,选择2*2的过滤器,结果变为了6*6*16;此时改造后的全连接层用5*5*16的400个卷积核,得到2*2*400的结果;再经过1*1*400的400个卷积核,输出也是2*2*400;最后经过由1*1*400的4个卷积核改造的softmax层,得到2*2*4的结果。

        这个结果可以解释为:左上角的部分(红色圈)是选择14*14方框进行滑动窗口的第一次分割的图片的预测结果,绿色箭头是第二次分割预测结果,黄色箭头是第三次分割预测结果,紫色箭头是第四次分割预测结果。

        所以该卷积操作的原理是我们不需要把输入图像分割成四个子集,分别执行前向传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公共区域可以共享很多计算。

        卷积层上的滑动窗口算法,提高了整个算法的效率。不过这种算法仍然存在缺点,比如边界框的位置可能不够准确,可能分割的时候无法完整的圈住对象。

3.Bounding Box预测(YOLO算法)

        如下图所示,我们选择蓝色方框进行滑动窗口算法,可以发现蓝色的框始终没有完整的圈住汽车,合理的方框位置应该是红色的方框,滑动窗口算法似乎很难圈到,不能完整的圈到汽车,我们就难以训练网络给出汽车的位置。这就引出了YOLO算法:You Only Look Once(你只看一次)。这是由Joseph Redmon,Santosh Divvala,Ross Girshick和Ali Farhadi提出的算法。

        从算法的名字可以看出,我们对于包含对象的方框只圈一次,当然肯定是要尽可能完整的圈住对象。算法的实施具体如下:

        简单起见,可以将图片分为3*3的方阵(实际可以分割的更多),为每个方阵编号1—9。假设有汽车、行人、摩托车和背景四类对象,我们需要识别出背景外的对象,也就是汽车、摩托车和行人,因此需要在3*3的方阵中为对象找到他们所属的图片(一个对象只属于一个分割区域),比如黑色轿车应该属于4号图片,面包车应该属于6号图片,而实际上两车在5号图片也存在少量区域,但是YOLO算法要求我们只找对象的中点,将对象分配给包含中点的方格。因此从算法角度来说,5号不包含任何对象。

深度学习基础—目标定位与特征点检测icon-default.png?t=O83Ahttps://blog.csdn.net/sniper_fandc/article/details/142707197?fromshare=blogdetail&sharetype=blogdetail&sharerId=142707197&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link        在《深度学习基础—目标定位与特征点检测》这篇博客中提到,对于目标定位问题,我们需要定义标签:

        于是9个区域都有属于自己的标签向量,规定c1为行人类别,c2为汽车类别,c3为摩托车类别,比如:1号区域不包含对象,因此pc=0,那么其他数值就无意义了:

        6号区域包含汽车对象,因此pc=1,c2=1,其余位置坐标根据对象的位置进行编码:

        方框的位置的编码方式应根据小方格的比例进行编码比较合理(还有其他的方式也比较ok),假设把6号区域的左上角定为(0,0),右下角定为(1,1),则面包车的中点(黄点)的坐标大致在(0.4,0.3)的位置,而能包围面包车对象的方框的宽和高大概是6号区域宽和高的0.9和0.5倍,于是就可以进行如下的标签定义。

        需要注意:在按照方格比例编码方式的对象的中点坐标范围是[0,1],因为如果不在这个区间,就说明对象不在这个方格内,那就不应该把对象分配给这个方格。而宽和高的范围应该是非负数,因为红色框的宽和高可以比区域大。

        如果存在多个对象中点在一个区域内,可以进行更细致的划分,确保一个区域尽量只包含一个对象的中点

        对于这种区域划分的方式,网络的输出应该是3*3*8,3*3表示9个区域的输出,8表示每个区域会输出一个长度为8的向量,根据这个输出向量实施优化算法,训练出网络进行预测。

        由于算法的卷积实现,不用跑9次算法,只需要在完整的图片运行一次算法,就可以得到输出,所以这个算法效率很高,同时卷积的效率可以保证实时识别。YOLO算法有很多改进,我们后续再来探讨。

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

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

相关文章

【AI知识点】泊松分布(Poisson Distribution)

泊松分布(Poisson Distribution) 是统计学和概率论中的一种离散概率分布,通常用于描述在固定时间或空间内,某个事件发生的次数。该分布适用于稀有事件的建模,特别是当事件发生是独立的、随机的,且发生的平均…

PCL 点云体素滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 体素滤波实现 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新&#xf…

【RISCV指令集手册】向量扩展v1.0

概述 从rvv 0.9说起 此前写过向量扩展0.9的阅读记录,三年已过,本以为不再参与RVV的相关开发,奈何造化弄人,旧业重操,真就世事难料呀。 总的来说1.0版本相比0.9版本的扩充了较多内容,但大部分为指令功能的…

YOLOv8改进线性注意力模块 ICCV2023 FLatten Transformer

1,原理部分 论文地址:2308.00442 (arxiv.org) 在将 Transformer 模型应用于视觉任务时,自我注意的二次计算复杂性一直是一个持续的挑战。另一方面,线性注意力通过精心设计的映射函数近似 Softmax 操作,通过其线性复杂性提供了一种更有效的替代方案。然而,当前的线性注意…

使用LlamaIndex构建RAG

使用LlamaIndex构建RAG 一、什么是LlamaIndex二、环境准备2.1虚拟环境创建及基础安装2.2安装llamaIndex相关2.3下载词向量模型2.4下载NLTK资源2.5准备LLM模型2.6不使用RAG情况下的问答效果2.7使用llama-index的效果2.7.1安装llama-index词嵌入依赖2.7.2获取知识库2.7.3准备代码…

信号检测理论(Signal Detection Theory, SDT)

信号检测理论(Signal Detection Theory, SDT)模拟是一种实验设计,用于研究和理解在存在噪声或不确定性的情况下如何做出决策。在心理学、认知科学、工程学和许多其他领域,信号检测理论都非常重要。 一、基础概念: 在信…

TIBCO Jaspersoft Studio 创建数据源并进行测试

1、连接数据源: 右键Data Adapters ,然后新建 根自己的情况,进行创建,这里测试用的是excel表格。 2、新建Jasper Report,然后我们选择刚刚创建的数据源 这样report就建好了,然后我们进行测试。 3、先把不…

【源码+文档】基于SpringBoot+Vue的酒店管理系统

🚩如何选题? 如何选题、让题目的难度在可控范围,以及如何在选题过程以及整个毕设过程中如何与老师沟通,这些问题是需要大家在选题前需要考虑的,具体的方法我会在文末详细为你解答。 🚭如何快速熟悉一个项目…

文心智能体——制作你的专属AI

随着社会的进步和互联网技术的发展,人工智能领域正蓬勃发展。最近几年关于人工智能的新闻日渐增多并且成为了当代最大的热点,所有的领域都在引进AI、训练AI、使用AI,AI正逐步融入人们的生活。从前几年chatGPT大语言模型的横空出世&#xff0c…

Finops成本优化企业实践-可视化篇

引言:上一章讨论了finops的一些方法论,笔者在拿到finops官方认证finops-engineer certificate之后,将方法论运用到所在项目组中,并于今年完成了40%的费用节省。在此将这些实践方法总结沉淀,与大家分享。实践包括三篇&a…

[Python学习日记-38] Python 中的函数的名称空间

[Python学习日记-38] Python 中的函数的名称空间 简介 名称空间 作用域查找顺序 简介 在前面学习函数的时候我们发现,函数内部也有一个内存空间是用于存储函数自己的一些变量的,及时这个变量名与外部的变量名一样是也没关系,Python 会优先…

SpringCloud Alibaba - Eureka注册中心,Nacos配置中心

Eureka 1、创建服务端 server:port: 8761 # eureka 默认端口spring:application:name: eureka-server # 应用名称(微服务中建议必须定义应用名称) SpringBootApplication EnableEurekaServer // 开启eureka注册中心功能 public class EurekaServerAppli…

数据驱动投资:AI在股票市场的应用

当ChatGPT首次亮相时,其卓越的语言处理能力立刻引起了许多行业的广泛关注,投资界也不例外。关于ChatGPT是否能应用于投资决策的问题,迅速成为热门讨论的焦点。 近期,加拿大多伦多大学和印度孟买理工学院的研究人员联合开展了一项…

《Linux从小白到高手》理论篇:Linux的进程管理详解

本篇将介绍Linux的进程管理相关知识,并将深入介绍Linux的进程间相互通信。 进程就是运行中的程序,一个运行着的程序,可能有多个进程。 比如Oracle DB,启动Oracle实例服务后,就会有多个进程。 Linux进程分类 在 Linux…

python实战四:输入一个年份,判断是否是闰年

问题: 从键盘获取一个四位的整数年份,判断其是否是闰年。闰年的判断条件为︰能被4整除但不能被100整除,或者能被400整除。 需求方法: 使用 input() 函数从键盘获取输入。输入的年份是一个字符串。检查输入是否为四位数&#xf…

优优嗨聚集团:债务纠纷下的个人财务困境揭秘

在当今社会,随着经济活动的日益频繁与复杂化,债务问题已成为许多人生活中难以回避的挑战之一。债务纠纷,作为这一问题的直接体现,不仅关乎金钱的得失,更深刻地影响着个人的生活方方面面,从心理健康、家庭关…

vscode 连接云服务器(ubantu 20.04)

更改服务器系统 如果云服务器上的系统不是ubantu20.04的,可以进行更改: 登录云服务官网(这里以阿里云为例)点击控制台 点击服务器实例 点击更多操作、重置系统 点击重置为其他镜像、系统镜像:选择你要使用的系统镜像…

c++ union内存布局

// // Created by 徐昌真 on 2024/10/5. // #include <iostream> using namespace std;//定义一个union union Data{int a;char s[7]; //char值的范围(-128~127) }; int main() {//创建一个unionData d;d.s[0] 255; //16进制 0xFF 16进制F对应二进制 1111d.s[1] 1; …

瓶颈ing

全排列的回溯算法怎么好理解记忆啊&#xff0c;对着解析理解顺着逻辑也能够推&#xff0c;但是自己写无从下手呜呜呜

探索基于基于人工智能进行的漏洞评估的前景

根据2023年的一份报告 网络安全企业据估计&#xff0c;到 10.5 年&#xff0c;网络犯罪每年将给世界造成 2025 万亿美元的损失。每年记录在案的网络犯罪数量都会创下新高。这要求对传统的安全测试流程进行重大改变。这就是漏洞评估发挥作用的地方。 漏洞评估对于识别系统中的弱…