YOLO好像也没那么难?

news2024/9/20 12:32:46

“学YOLO的念头是想整个游戏外挂!”


目录

基本原理

模型推理

IOU交并比

NMS非极大值抑制

模型训练

损失函数LOSS

代码实现

YOLO学习渠道


基本原理

模型推理

         学习一个新的神经网络结构,作者认为整明白输入和输出是怎么回事就OK了,至于中间的推理过程设计,不是搞学术的,没必要那么明白。


        就拿YOLOv3的网络输入和输出来讲,它的输入shape是[N,3,416,416],这个shape的含义很好理解,就是N张416*416的三通道图片(彩色图片),而我们需要重点关注它的输出,它的输出有三部分:[N,255,13,13]、[N,255,26,26]、[N,255,52,52]。其中里面的N自然是指的N张图片,再看里面的255,255=3*(4+1+80),这里的80指的是分类数,意思是该模型可识别80种物体,采用的是one-hot编码,其中4指代的是预测框的中心点坐标(x, y)和预测框的高h和宽w,而1指代的是置信度,范围在0到1之间,3指代的是预测框的数量,有三个,有一个锚框就会有一个预测框。

        预测框信息应包含预测框的中心点坐标(x,y)和预测框的高h和宽w,和框里面框的是啥东西的one-hot编码代表物品类别,还有置信度,所以是(4+80+1)。

        YOLO进行目标检测的时候,会在逻辑上把图片划分为S*S的网格,在YOLOv3中,它把一个图片从三种不同的尺度进行划分,这也解释了该模型的输出,为什么有三组。因为它从不同尺度去检测物体,从大的感受野看,从小的感受野看,然后给出三组的预测框,可以让预测框更加准确与完整。 

        其次,在同一个尺度下,每个网格都拥有3个以该网格为中心点的锚框,3个锚框的大小是不一样的。在目标检测中,每个锚框都会预测一个预测框出来,所以一个网格就有三个预测框,这也更好地解释了模型输出shape的实际含义,拿一个尺度的输出shape而言就是[图片数量, 预测框数量*预测框信息量, W, H],其中W*H可以理解为网格数量。

        

        那现在YOLOv3输出了不同尺度下的全部预测框,我们可以看到不同尺度下的预测框密密麻麻的怎么变成右边清爽的模样呢?就需要引入两个概念了IOU与NMS。

IOU交并比

        IOU,全称Intersection over Union,即交并比,是衡量目标检测中边界框重叠程度的关键指标。它通过计算两个边界框的交集面积与并集面积之比来得到。简而言之,交集面积除以并集面积。

NMS非极大值抑制

        NMS,全称Non-Maximum Suppression,即非极大值抑制,是一种常用的目标检测算法中的后处理步骤。以下是NMS的操作步骤:

  1. 将所有预测框,按照置信度进行降序排序
  2. 依次选择置信度最高的框作为基准,并计算它与其他预测框的IOU值
  3. 如果某个预测框与基准框的IOU值大于预设的阈值,则认为该预测框与基准框重叠度较高,则将其移除
  4. 选择下一个置信度最高的框作为基准
  5. 重复以上过程,直到所有预测框都被处理完成

        利用NMS我们就可以实现以上清爽的效果了,在目标检测任务中,NMS是处理重叠预测框、提高检测精度的关键步骤。

模型训练

        了解了模型推理的过程,我们就要想一个问题,预测框怎么来的?换而言之,锚框怎么变成预测框?锚框的大小不是一开始就被设定的死死的嘛?

        锚框的大小和中心点(网格的左上角)确实是被设置的死死的,但我们可以让其中心点偏移,宽高拉伸,至于偏移量和拉伸量,这不就是神经网络需要训练的参数嘛?而原来的锚框经过中心点偏移和宽高拉伸就变成了预测框。

        我们也可以观察到这个偏移量和拉伸量还有点特别,偏移量用了sigmoid函数,拉伸量用了exp函数。偏移量用sigmoid函数,是因为我们规定一个网格的宽和高都为1,而该函数y值取值范围在0到1之间,这样可以保证一个网格的预测框中心点只会在该网格里面,不会跑到别的网格里面去。拉伸量用exp是保证了预测框的宽高是正数。

损失函数LOSS

        我们看预测框携带的信息有:预测框的中心点坐标,预测框的宽高,预测框内物体的种类,预测框的置信度。想要预测框与真实框的信息一致,是不是很显然这既是一个回归问题,也是一个分类问题,分类问题一般用Cross Entropy损失,回归问题一般用MSE损失,但飞桨这里用的是MAE(L1损失)

         但YOLO的损失还有一个特殊之处,就并不是所有的预测框与真实框的差距都要算损失,为什么?因为预测框有很多,密密麻麻的,而真实框只有一个,肯定有大部分的预测框与真实框是极其不匹配的,只有少部分的预测框与真实框算是贴切的,这样的正负样本比例不协调。所以YOLOv3中,设定一个IOU的阈值,如果预测框与真实框的IOU超过了这个阈值,那么这个预测框与真实框的损失就可以不用算,也就是0,相当于预测框就是真实框。

代码实现

        目前,yolo体系是十分成熟的,很多深度学习框架(pytorch,ts)都有yolo库,不需要咱们再手搓yolo了,作者用的是paddleDetection,用paddle主要是因为他们有免费的平台给你训练,主流的还是pytorch感觉,以下是paddle-Detection的快速入门。

docs/tutorials/QUICK_STARTED_cn.md · PaddlePaddle/PaddleDetection - Gitee.comicon-default.png?t=N7T8https://gitee.com/paddlepaddle/PaddleDetection/blob/release/2.7/docs/tutorials/QUICK_STARTED_cn.md#%E4%BA%8C%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE         paddleDetection进行数据训练时,可能会报下面的错误。大概就是0维张量不能被Tensor.numpy()[0]这么使用,以后只能写成float(Tensor)了。解决办法,目前是降paddle-paddle到2.4版本。

        Warning:: 0D Tensor cannot be used as 'Tensor.numpy()[0]' . In order to 
avoid this problem, 0D Tensor will be changed to 1D numpy currently, but it's not
 correct and will be removed in release 2.6. For Tensor contain only one element, 
Please modify  'Tensor.numpy()[0]' to 'float(Tensor)' as soon as possible, 
otherwise 'Tensor.numpy()[0]' will raise error in release 2.6。

“再学学Python怎么控制鼠标键盘,自瞄外挂不就成了嘛?” 

YOLO学习渠道

以下是作者学习YOLO基本原理与代码实现的推荐学习渠道。

飞桨AI Studio星河社区 - 人工智能学习与实训社区 (baidu.com)icon-default.png?t=N7T8https://aistudio.baidu.com/education/group/info/1617

B站YOLO算法原理讲解通俗易懂版本icon-default.png?t=N7T8https://www.bilibili.com/video/BV1sR4y1h7s4/?spm_id_from=333.337.search-card.all.click&vd_source=54c58eba17d5a4e408714286013d3d13 

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

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

相关文章

平安城市/雪亮工程现状及需求分析:EasyCVR视频汇聚平台助力雪亮工程项目建设

一、背景现状 经过近几年的努力,平安城市雪亮工程建设取得了显著的成绩,完成了前端高清视频点位和高清卡口系统建设,建成了(视频监控类)、(卡口类)和(应用类)的平台。这…

Linux笔记 --- 目录检索

基本概念 Linux中的目录与windows的文件夹相似但是概念大相径庭,windows中子文件一定不会比母文件夹大,但在Linux目录中是可以实现的,目录是一种文件索引表,下图是分区和目录的关系 Linux中目录是一组由文件名和索引号组成的索引表…

JavaScript基础(33)_鼠标滚轮滚动事件、键盘事件

鼠标滚轮滚动事件:onwheel 获取鼠标滚轮滚动的方向:wheelDelta 比如:向上滚动:109 (所有正值都是向上) 向下滚动:-109(所有负值都是向下) 注意:当…

技术分享:从崩溃边缘到问题解决 —— SSL证书兼容性问题的实战经历

引言 作为一名开发者,我们经常会遇到一些令人头疼的技术难题。有时候,这些问题看似简单却异常棘手,让人几乎要放弃。今天,我想分享一次特别的经历,它始于一系列的调试失败,最终却在不经意间找到了解决方案…

单片机几种通信协议(2)

SPI通信 相比于IIC协议,SPI通信速度更快,设计更为简单,功能并没有IIC那么多,学习起来比IIC简单许多 两条通信线,MISO,MOSI,全双工通信 理解SPI通信的核心

ISP代理与双ISP代理的区别

在网络营销、数据采集及隐私保护等领域,代理服务器扮演着至关重要的角色。而在代理服务器的选择中,ISP代理与双ISP代理是两种常见的选择。本文将对这两种代理服务进行详细分析,探讨它们之间的区别以及各自的优势和适用场景。 一、ISP代理概述…

经典算法题总结:二叉树篇

二叉树解题的思维模式分两类: 是否可以通过遍历一遍二叉树得到答案?如果可以,用一个 traverse 函数配合外部变量来实现,这叫「遍历」的思维模式。是否可以定义一个递归函数,通过子问题(子树)的…

排序篇--插入排序及希尔排序

前言 此次的排序均按照升序为例 排序大家都不陌生,生活中处处有排序。什么排名,评分,分数等。这其中最简单的应该就是冒泡排序了,在这里就不多说了。 提示:以下是本篇文章正文内容,下面案例可供参考 一、排…

构造方法,JavaBean,对象内存图,基础数据类型和引用数据类型

构造器,构造函数 在创建对象的时候给成员变量进行赋值 修饰符 类名(参数){ 方法体; } 如果我们没有写任何的构造方法,虚拟机会帮我们加一个空参构造方法 可以手动建一个空参,看是否调用成功。 如果我们…

负载均衡详细概念介绍之(四层和七层实现)

目录 一、负载均衡介绍 1.1什么是负载均衡 ​编辑 1.2 为什么要用负载均衡 二、负载均衡的类型 2.1 通过一些硬件实现 2.2 四层负载均衡 2.3 七层负载均衡 三、四层和七层的区别 及特点 一、负载均衡介绍 1.1什么是负载均衡 负载均衡:Load Balance,简称LB&a…

slowfast

核心网络网络架构: 1、分别获取高频和低频图像数据 2、分别进行特征提取 3、特征融合 4、预测 网络结构细节:

网站如何被Google收录?

想让你的网站快速被Google收录?试试GSI快速收录服务吧,这是通过谷歌爬虫池系统来实现的。这套系统吸引并圈养Google爬虫,提高你网站的抓取频率。每天有大量Google爬虫抓取你的网站页面,大大提高了页面的收录概率,从而增…

SpringBoot的使用的注解以及监控监控和lombok使用

目录 修改SpringBoot项目中依赖的版本号 为什么默认是8.0.23版本 修改方法 第一种 :直接在pom.xml中引入相关依赖时直接指定版本号 第二种:在pom.xml中的属性中进行修改 SpringBoot自动化配置web项目 Configuration注解 Import注解 1.导入Bean 2…

C++_进阶:C++11新增语法(2)

文章目录 1.新的类功能1.1 新的默认成员函数2. 类成员变量初始化3. 强制生成默认函数的关键字default4. 禁止生成默认函数的关键字delete:5. final与override关键字 2. 可变参数模板3. lambda表达式3.1 一个使用场景3.2 lambda表达式语法**3.3 lambda捕捉列表详细说明**3.4 **底…

一款好用的研发项目管理软件能为公司带来什么?

一款高效的研发项目管理软件可以为公司带来竞争优势,将项目交付时间缩短45%,提高项目成功率至72%,提高研发效率,缩短上市周期。该软件含有丰富的数据分析功能,可以更好地掌握项目进度,发现和解决问题&#…

Unity教程(十)Tile Palette搭建平台关卡

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

仕考网:考外省公务员可以调回本地吗?

一般情况下,公务员岗位是固定不可随意更换的,因为每个职位都对应特定的职责和要求。一旦考到外地的岗位,想要调回本地几乎是不可能的。因为这样的操作可能导致职位空缺,进而需要通过公共招聘流程来填补,而不是简单地从…

场外期权交易:找到适合你的那一款

各位期权爱好者们!今天咱们来聊聊在进行场外期权交易时,怎么去评估和选择适合自己风险承受能力的期权产品。 第一,你得对自己有个清楚的认识。想想看,你是那种激进型的冒险家,还是保守型的稳健派呢?了解自己…

PostgreSQL数据库内核(三):缓冲区管理器

文章目录 共享缓冲区基础知识逻辑读和物理读LRU算法和CLOCK时钟算法 共享缓冲区管理器结构共享缓冲表层共享缓冲区描述符层共享缓冲页层 共享缓冲区管理器工作流程初始化缓冲区读缓冲区淘汰策略共享缓冲区锁 共享缓冲区基础知识 通常数据库系统都会在内存中预留buffer缓冲空间…

elasticsearch集成springboot详细使用

1.es下载&配置 配置JVM 配置跨域 配置https和密码 2.es启动 .\elasticsearch.bat 或 后台启动: nohup ./bin/elasticsearch& 浏览器访问:https://localhost:9200 输入账户:elastic / 123456 3.重置es密码 .\elasticsearch-r…