Yolo v5实现细节(2)

Yolo v5代码实现细节

IOU系列损失

在之前的yolo v3中我们使用的定位损失主要使用的是差值平方的形式,通过预测边界框的参数和真实边界框的参数来进行计算求解的。

  • 定位损失

L loc  ( t , g ) = ∑ i ∈ pos  ( σ ( t x i ) − g ^ x i ) 2 + ( σ ( t y i ) − g ^ y i ) 2 + ( t w i − g ^ w i ) 2 + ( t h i − g ^ h i ) 2 N pos  L_{\text {loc }}(t, g)=\frac{\sum_{i \in \text { pos }}\left(\sigma\left(t_{x}^{i}\right)-\hat{g}_{x}^{i}\right)^{2}+\left(\sigma\left(t_{y}^{i}\right)-\hat{g}_{y}^{i}\right)^{2}+\left(t_{w}^{i}-\hat{g}_{w}^{i}\right)^{2}+\left(t_{h}^{i}-\hat{g}_{h}^{i}\right)^{2}}{N_{\text {pos }}} Lloc (t,g)=Npos i pos (σ(txi)g^xi)2+(σ(tyi)g^yi)2+(twig^wi)2+(thig^hi)2

g ^ x i = g x i − c x i g ^ y i = g y i − c y i g ^ w i = ln ⁡ ( g w i / p w i ) g ^ h i = ln ⁡ ( g h i / p h i ) \begin{array}{l} \hat{g}_{x}^{i}=g_{x}^{i}-c_{x}^{i} \\ \hat{g}_{y}^{i}=g_{y}^{i}-c_{y}^{i} \\ \hat{g}_{w}^{i}=\ln \left(g_{w}^{i} / p_{w}^{i}\right) \\ \hat{g}_{h}^{i}=\ln \left(g_{h}^{i} / p_{h}^{i}\right) \end{array} g^xi=gxicxig^yi=gyicyig^wi=ln(gwi/pwi)g^hi=ln(ghi/phi)

IOU损失

首先需要解释的是:L2损失是坐标的欧氏距离—L2损失就是差值平方和损失。

G r o u n d t r u t h : x ~ = ( x ~ t , x ~ b , x ~ l , x ~ r ) Ground truth: \tilde{x}=\left(\tilde{x}_{t}, \tilde{x}_{b}, \tilde{x}_{l}, \tilde{x}_{r}\right) Groundtruth:x~=(x~t,x~b,x~l,x~r)

P r e d i c t i o n : x = ( x t , x b , x l , x r ) Prediction: \quad x=\left(x_{t}, x_{b}, x_{l}, x_{r}\right) Prediction:x=(xt,xb,xl,xr)

ℓ 2 loss  = ∥ p r e d e t i o n − G r o u n d T r u t h ∥ 2 2 \ell_{2} \text { loss }=\|predetion-GroundTruth\|_{2}^{2} 2 loss =predetionGroundTruth22

首先我们给出IOU损失的计算形式:

IoU loss  = − ln ⁡ Intersection  ( p r e d e t i o n , G r o u n d t r u t h ) Union ⁡ ( p r e d e t i o n , G r o u n d t r u t h ) \text { IoU loss }=-\ln \frac{\text { Intersection }(predetion, Ground truth)}{\operatorname{Union}(predetion, Ground truth)}  IoU loss =lnUnion(predetion,Groundtruth) Intersection (predetion,Groundtruth)

在这里插入图片描述
其中更为常见的IOU损失的计算公式为: 1-IOU

使用iou损失的优点为:

  1. 能够更好的反应重合程度。
  2. 具有尺度不变性。

使用iou损失的缺点为:当两个边界框不相交是loss为0

在这里插入图片描述

GIOU损失

首先先要说明GIOU的概念:

G I o U = I o U − A c − u A c − 1 ≤ G I o U ≤ 1 \begin{aligned} G I o U & =I o U-\frac{A^{c}-u}{A^{c}} \\ -1 & \leq G I o U \leq 1 \end{aligned} GIoU1=IoUAcAcuGIoU1

引入下面的一张图片来说明ac的概率:在图片中蓝色的面积即为ac的值绿色代表的是真实的边界框的面接,红色代表的是预测的边界框。

在这里插入图片描述
而u代表的是绿色框和红色框并集的面积。

与IOU类似当我们的GIOU大于某个阈值的时候说明我们的边界框匹配成功了,小于某个阈值的时候说明没有匹配成功。

在特殊的情况下GIOU会退化为IOU的

在这里插入图片描述

DIOU损失

在DIOU提出的原论文中作者说明了IOU损失和DIOU损失存在的两个具体的问题。

  • Slow Convergence(收敛速度慢)
  • Inaccurate Regression(预测的精度不足)

在这里插入图片描述

图中的上面部分黑色的框代表的是锚框,绿色代表的是真实的边界框,蓝色是给出的预测边界框。

经过400迭代之后才可以近似的回归正确。

下面的图即为使用Diou的情况对比,经过120次的迭代就可以完成边界框的收敛。

Distance-loU可以更好的表示边界框之间的回归关系。

首先引入DIOU的计算公式:如下所示

在这里插入图片描述

D I o U = I o U − ρ 2 ( b , b g t ) c 2 = I o U − d 2 c 2 − 1 ≤ D I o U ≤ 1 \begin{array}{c} D I o U=I o U-\frac{\rho^{2}\left(b, b^{g t}\right)}{c^{2}}=I o U-\frac{d^{2}}{c^{2}} \\ -1 \leq D I o U \leq 1 \end{array} DIoU=IoUc2ρ2(b,bgt)=IoUc2d21DIoU1

DloU损失能够直接最小化两个boxes之间的距离,因此收敛速度更快。

其中b是预测边界框中心点的位置坐标,而bgt是真实边界框中心点的位置坐标。求的是两个中心点距离的平方。

而c指的是外接矩阵的最小对角线的长度。

在这里插入图片描述

分析:当两个中心点的位置坐标完整的重合在一起的时候d为0,

L D I o U = 1 − D I o U L_{D I o U}=1-D I o U LDIoU=1DIoU

0 ≤ L D I o U ≤ 2 0 \leq L_{D I o U} \leq 2 0LDIoU2

CIOU损失

一个优秀的回归定位损失应该考虑到3种几何参数:重叠面积、中心点距离、长宽比

首先在DIOU的基础上给出CIOU的计算公式:

C I o U = I o U − ( ρ 2 ( b , b g t ) c 2 + α v ) C I o U=I o U-\left(\frac{\rho^{2}\left(b, b^{g t}\right)}{c^{2}}+\alpha v\right) CIoU=IoU(c2ρ2(b,bgt)+αv)

v = 4 π 2 ( arctan ⁡ w g t h g t − arctan ⁡ w h ) 2 v=\frac{4}{\pi^{2}}\left(\arctan \frac{w^{g t}}{h^{g t}}-\arctan \frac{w}{h}\right)^{2} v=π24(arctanhgtwgtarctanhw)2

α = v ( 1 − I o U ) + v \alpha=\frac{v}{(1-I o U)+v} α=(1IoU)+vv

在这里插入图片描述

目标检测数据增强策略

Mosaic data augmentation

图像增强的常见方式就包括了图像的裁剪,图像的随机水平翻转,图像的对比度改变的一些常见的策略。

在v3-spp v4 和 v5中都使用到了Mosaic图像增强的策略。

本质上是将多张图片拼接在一起进行训练的图像增强方式。

在这里插入图片描述

  • 增加数据的多样性
  • 增加目标个数
  • BN能一次性统计多张图片的参数(输入的batchsize变大的过程)

Random affine

优化策略:进行随机的仿射变换。(Rotation, Scale, Translation and Shear)旋转、缩放、平移、侧切。

在这里插入图片描述
但根据配置文件里的超参数发现只使用了ScaleTranslation即缩放和平移。

MixUp

MixUp,就是将两张图片按照一定的透明度融合在一起

之前在学习opencv的过程中使用到了猫狗图片的融合操作,mixup这种数据增强的策略与融合操作类似。

在这里插入图片描述

Albumentations,

主要是做些滤波、直方图均衡化以及改变图片质量等等,代码里写的只有安装了albumentations包才会启用,但在项目的requirements.txt文件中albumentations包是被注释掉了的,所以默认不启用。

Augment HSV

Augment HSV(Hue, Saturation, Value),随机调整色度,饱和度以及明度。

在这里插入图片描述

损失计算部分

YOLOv5的损失主要由三个部分组成:

  1. Classes loss,分类损失,采用的是BCE loss,注意只计算正样本的分类损失。

  2. Objectness loss,obj损失,采用的依然是BCEloss,注意这里的obj指的是网络预测的目标边界框与GTBox的CIoU。这里计算的是所有样本的obj损失。

  3. Location loss,定位损失,采用的是CIoU loss,注意只计算正样本的定位损失。

L o s s = λ 1 L c l s + λ 2 L o b j + λ 3 L l o c L o s s=\lambda_{1} L_{c l s}+\lambda_{2} L_{o b j}+\lambda_{3} L_{l o c} Loss=λ1Lcls+λ2Lobj+λ3Lloc

针对三个预测特征层(P3,P4,P5)上的obj损失采用不同的权重。小型目标更难预测因此可以将权重设置的大一些。

L o b j = 4.0 ⋅ L o b j small  + 1.0 ⋅ L o b j medium  + 0.4 ⋅ L o b j large  L_{o b j}={4.0} \cdot L_{o b j}^{\text {small }}+{1.0} \cdot L_{o b j}^{\text {medium }}+0.4 \cdot L_{o b j}^{\text {large }} Lobj=4.0Lobjsmall +1.0Lobjmedium +0.4Lobjlarge 

消除Grid敏感度

在yolo v3中目标边界框的预测方式采用下面的公式来进行计算:

b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t h \begin{array}{l} b_{x}=\sigma\left(t_{x}\right)+c_{x} \\ b_{y}=\sigma\left(t_{y}\right)+c_{y} \\ b_{w}=p_{w} e^{t_{w}} \\ b_{h}=p_{h} e^{t_{h}} \end{array} bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth

在这里插入图片描述

将预测的边界框中心限制在当前cell中,原因是所有生成的先验框的回归参数并不是相对于锚框的而是相对于,当前cell的左上角位置生成的

对于这个图而言,ph和pw代表的是生成锚框的高度和宽度信息。蓝色代表的是网络预测的最终的位置和大小

σ ( x ) = Sigmoid ⁡ ( x ) \sigma(x)=\operatorname{Sigmoid}(x) σ(x)=Sigmoid(x)

改进当中心点的位置在左上角的这种情况引入了缩放因子的概念

b x = ( σ ( t x ) ⋅ scale  x y − scale  x y − 1 2 ) + c x b y = ( σ ( t y ) ⋅ scale  x y − scale  x y − 1 2 ) + c y \begin{array}{l} b_{x}=\left(\sigma\left(t_{x}\right) \cdot \text { scale }_{x y}-\frac{\text { scale }_{x y}-1}{2}\right)+c_{x} \\ b_{y}=\left(\sigma\left(t_{y}\right) \cdot \text { scale }_{x y}-\frac{\text { scale }_{x y}-1}{2}\right)+c_{y} \end{array} bx=(σ(tx) scale xy2 scale xy1)+cxby=(σ(ty) scale xy2 scale xy1)+cy

在yolo v5网络中缩放因子一般设置为2带入得到预测边界框位置的回归参数。

b x = ( 2 ⋅ σ ( t x ) − 0.5 ) + c x b y = ( 2 ⋅ σ ( t y ) − 0.5 ) + c y \begin{array}{l} b_{x}=\left(2 \cdot \sigma\left(t_{x}\right)-0.5\right)+c_{x} \\ b_{y}=\left(2 \cdot \sigma\left(t_{y}\right)-0.5\right)+c_{y} \end{array} bx=(2σ(tx)0.5)+cxby=(2σ(ty)0.5)+cy

在这里插入图片描述

在yolo v5中bw和bh也同时进行改进操作。

b w = p w ⋅ ( 2 ⋅ σ ( t w ) ) 2 b h = p h ⋅ ( 2 ⋅ σ ( t h ) ) 2 \begin{array}{c} b_{w}=p_{w} \cdot\left(2 \cdot \sigma\left(t_{w}\right)\right)^{2} \\ b_{h}=p_{h} \cdot\left(2 \cdot \sigma\left(t_{h}\right)\right)^{2} \end{array} bw=pw(2σ(tw))2bh=ph(2σ(th))2

匹配正样本

之前在YOLOv4介绍中有讲过该部分内容,其实YOLOv5也差不多。主要的区别在于GT Box与Anchor Templates模板的匹配方式。在YOLOv4中是直接将每个GT Box与对应的Anchor Templates模板计算IoU,只要IoU大于设定的阈值就算匹配成功。但在YOLOv5中,作者先去计算每个GT Box与对应的Anchor Templates模板的高宽比例,即:

r w = w g t / w a t r h = h g t / h a t \begin{array}{l} r_{w}=w_{g t} / w_{a t} \\ r_{h}=h_{g t} / h_{a t} \\ \end{array} rw=wgt/watrh=hgt/hat

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

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

相关文章

云服务器部署LNMP Web环境教程合集(多版linux系统安装方法)

LNMP环境包括Linux、Nginx、MySQL和PHP,Nginx是一款小巧而高效的Web服务器软件,使用阿里云服务器搭建LNMP Web网站环境很简单,支持多种LNMP环境部署教程,可使用ROS模板部署、LNMP镜像以及基于不同Linux操作系统手动部署LNMP全流程…

MySQL进阶——触发器

目录 1介绍 2语法 3案例 3.1 insert插入数据类型 3.2 update修改数据类型 3.3 delete删除数据类型 4视图/存储过程/触发器—小结 1介绍 触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义…

字节发布Depth Anything V2深度模型,比 Depth Anything V1 更精细的细节。

欢迎点击关注下方公众号并加入官方读者交流群,一个有趣有AI的AIGC公众号:关注AI、深度学习、计算机视觉、AIGC、Stable Diffusion、Sora等相关技术,欢迎一起交流学习💗~ 字节发布Depth Anything V2深度模型。比 Depth Anything V1…

idea使用maven打包报错GBK不可映射字符

方法一:设置环境变量 打开“控制面板” > “系统和安全” > “系统”。点击“高级系统设置”。在“系统属性”窗口中,点击“环境变量”。在“系统变量”部分,点击“新建”,创建一个新的变量: 变量名:…

4.任务调度

1.基本知识 2.任务的状态 FreeRTOS中任务共存在4种状态:Running 运行态 当任务处于实际运行状态称之为运行态,即CPU的使用权被这个任务占用(同一时间仅一个任务处于运行态)。Ready 就绪态 处于就绪态的任务是指那些能够运行&…

单片机学习记录

一,单片机及开发板介绍 1,基本介绍 单片机,英文Micro Controller Unit,简称MCU内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(…

1.x86游戏实战-认识CE

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提取码:6tw3 复…

Day5:有效的字母异位词 242 两个数组的交集 349 快乐数 202 两数之和1

题目242. 有效的字母异位词 - 力扣(LeetCode) class Solution { public:bool isAnagram(string s, string t) {//把数组当成哈希表,用两个数组来存储取模后的字母对应的数量//26个字母, 模25 0~25int arrs[26];int arrt[26];for(…

Python数据分析第一课:Anaconda的安装使用

Python数据分析第一课:Anaconda的安装使用 1.Anaconda是什么? Anaconda是一个便捷的获取包,并且对包和环境进行管理的虚拟环境工具,Anaconda包括了conda、Python在内的超过180多个包和依赖项 简单来说,Anaconda是包管理器和环境…

前端实战:实现块级元素的拖拽与缩放功能

在现代网页开发中,用户交互是一个非常重要的部分。在这篇文章中,我们将详细介绍如何使用原生 JavaScript 实现块级元素的拖拽与缩放功能。具体来说,我们将实现以下功能: 点击并拖动 outer 元素,可以移动整个块。点击并…

C语言学习记录20240626

飞船无论朝哪边行驶,都能通过结构体记录获取它的初始坐标、转向角度和在该方向行进的距离,需要根据这些信息计算飞船移动后的坐标。 向量(vector)指具有大小(magnitude)和方向(direction)的量,可以理解为有方向的线段。 标量或纯量(scalar)指…

【嵌入式 RT-Thread】一种优雅的使用 [互斥锁] 和 [信号量] 解决数据多路并发思路

rt-thread 中的信号量和互斥锁在工业开发项目中的应用,本博文主要介绍了一种优雅的使用 [互斥锁] 和 [信号量] 解决数据多路并发思路 2024-06 by 积跬步、至千里 目录 0. 个人简介 && 授权须知1. 工业场景描述1.1 工业数据采集需求1.2 总线协议与数据采集 2…

汇聚荣做拼多多运营,是新手怎么做?

作为电商领域的一颗新星,拼多多以其独特的商业模式迅速崛起,吸引了众多商家和消费者的目光。对于新手来说,如何在拼多多平台上开展运营活动,成为了许多初入电商领域的人们关心的问题。本文将围绕如何做好拼多多运营这一核心内容&a…

DataGrip 2024 po for Mac 数据库管理工具解

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件(适合自己的M芯片版或Intel芯片版),将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功3、打开访达,点击【文…

基于Springboot+Vue的校友社交系统(带1w+文档)

基于SpringbootVue的校友社交系统(带1w文档) 校友社交系统作为一种典型的管理系统也迅速的发展并深入人们的日常生活中,它使用户足不出户就可以管理自己的校友社交信息等,最大化减缩了用户的管理时间,提高了管理效率。 项目简介 基于SSMVUE的…

基于百度地图实现矩形绘制/电子围栏/自定义覆盖物选择、点击、区域选中、轨迹绘制

目录 开发前的准备账号注册页面创建地图初始化矩形绘制开启绘制模式监听绘制完成事件矩形取消事件自定义覆盖物渲染数据准备覆盖物渲染自定义点击事件优化用户刷新提供的覆盖物添加右键菜单轨迹绘制开发前的准备 账号注册 百度地图开发者平台点此访问 登录注册后点击右上角的控…

任务5.1 初识Spark Streaming

实战概述:使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架,用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统,能够处理流式数据并统计文本中的单词出现频…

allWebPlugin助力iWebOffice2015插件在高版本浏览器使用

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…

11-Django项目--Ajax请求二

目录 模版: demo_list.html perform_list.html 数据库操作: 路由: 视图函数: Ajax_data.py perform.py 模版: demo_list.html {% extends "index/index.html" %} {% load static %} # 未实现修改,删除操作{% block content %}<div class"container…

vue2 + dataV 组件问题

在使用 dataV 过程中&#xff0c;遇见 svg 动画不加载问题。 一、理想状态下&#xff1a; 二、开发中遇到的 加载不出来问题。 解决方案 在查找官方资料中&#xff0c;提到使用 key 可以解决方案。 1 绑定 key 2 改变 key 值 注意&#xff1a;一定要在 $nextTick 里面执…