目标检测算法YOLOv5简介

      没有关于YOLOv5的直接论文,YOLOv5由Ultralytics维护,源码见:https://github.com/ultralytics/yolov5 ,于2020年6月发布v1.0版本,最新发布版本为v7.0,License为AGPL-3.0.

      以下内容主要来自:

      1. Ultralytics官网:https://docs.ultralytics.com/yolov5/

      2. SF-YOLOv5: A Lightweight Small Object Detection Algorithm Based on Improved Feature Fusion Mode:https://www.mdpi.com/1424-8220/22/15/5817

      YOLOv5在算法设计上延续了YOLO系列的一贯思想:即通过输入层(Input)对待检测图像进行处理,发送到主干网络(Backbone)进行特征提取。主干网络获得不同尺寸的特征图,然后通过特征融合网络(Neck)融合这些特征,最终生成三个特征图P3、P4、P5(在YOLOv5中,维度用80*80, 40*40, 20*20的大小来表示)分别检测图片中的小、中、大目标。将三个特征图发送到预测头(Head)后,使用预设的先验锚点对特征图中的每个像素进行置信度计算和边界框回归,从而获得多维数组(BBoxes)包括目标类别、类别置信度、框坐标、宽度和高度信息。通过设置相应的阈值(confthreshold,objthreshold)过滤数组中的无用信息,并进行非极大值抑制(NMS)处理,即可输出最终的检测信息。将输入图片转换为BBox的过程称为推理过程,后续的阈值和NMS操作称为后处理(post-processing)。后处理不涉及网络结构。YOLOv5的默认推理过程可以用下图表示:

      YOLOv5旨在实时提供高速、高精度的检测结果。YOLOv5基于PyTorch构建YOLOv5模型有五个版本,分别是YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l和YOLOv5x,如下图所示:YOLOv5x和YOLOv5x6等较大的模型几乎在所有情况下都会产生更好的结果,但参数更多,需要更多CUDA内存来训练,并且运行速度更慢。对于移动部署,我们建议使用YOLOv5s/m,对于云部署,我们建议使用YOLOv5l/x。

      YOLOv5的配置文件不在采用.cfg格式,而是采用.yaml格式,如YOLOv5l:https://github.com/ultralytics/yolov5/blob/master/models/yolov5l.yaml

      一般来说,YOLOv5的网络结构是指Backbone和Neck:

      1.Backbone:YOLOv5的主干网络如下图所示,主要结构是多个CBS(Conv + BatchNorm + SiLU)模块和C3模块的堆叠,最后连接一个SPPF模块。CBS模块用于辅助C3模块进行特征提取,而SPFF模块增强了Backbone的特征表达能力。

      因此,在YOLOv5的主干网络中,最重要的一层是C3模块。C3的基本思想来自CSPNet(跨阶段部分网络)。C3实际上可以看作是CSPNet的具体实现。YOLOv5采用CSPNet的思想构建C3模块,既保证了Backbone具有优秀的特征提取能力,又遏制了Backbone中梯度信息重复(duplication)的问题。

      2.Neck:在Neck,YOLOv5使用了FPN和PAN的方法,如下图所示:FPN的基本思想是对特征提取网络经过多次卷积下采样操作生成的输出特征图(C3、C4和C5)进行上采样,生成多个新的特征图(P3、P4和P5)用于检测不同尺度的目标

      FPN的特征融合路径(feature fusion path)是自上而下的。在此基础上,PAN重新引入了一种新的自下而上的特征融合路径,进一步增强了对不同尺度目标的检测精度。

      YOLOv5 v6.0/6.1各个版本的差异可以通过对比.yaml文件来查看

      1.模型结构:YOLOv5的架构由三个主要部分组成:模型的结构如下图所示:高清图见:https://docs.ultralytics.com/yolov5/tutorials/architecture_description/#1-model-structure

      (1).Backbone:这是网络的主体。对于YOLOv5,主干网络是使用新的CSP-Darknet53结构设计的,该结构是对先前版本中使用的Darknet架构的修改。

      (2).Neck:该部分连接Backbone和Head。在YOLOv5中,使用了SPPF和新的CSP-PAN结构

      (3).Head:这部分负责生成最终的输出。YOLOv5使用YOLOv3 Head来实现此目的。

      与之前的版本相比,YOLOv5引入了一些细微的变化:

      (1).早期版本中的Focus结构已替换为6*6 Conv2d结构。这一变化提高了效率。

      (2).SPP结构被SPPF取代。这种改变使处理速度提高了一倍以上。

      2.数据增强技术:YOLOv5采用各种数据增强技术来提高模型的泛化能力并减少过拟合(overfitting)。这些技术包括:

      (1).Mosaic Augmentation:一种图像处理技术,将四张训练图像组合成一张,鼓励(encourage)目标检测模型更好地处理各种对象尺度和平移。

      (2).Copy-Paste Augmentation:一种创新的(innovative)数据增强方法,可以从图像中复制随机补丁(patches)并将其粘贴到另一个随机选择的图像上,从而有效地生成新的训练样本。

      (3).Random Affine Transformations:包括图像的随机旋转、缩放、平移和剪切。

      (4).MixUp Augmentation:一种通过对两个图像及其相关标签进行线性组合来创建合成图像的方法。

      (5).Albumentations:一个强大的图像增强库,支持多种增强技术。

      (6).HSV Augmentation:随机更改图像的色相、饱和度和明度。

      (7).Random Horizontal Flip:一种随机水平翻转图像的增强方法。

      3.训练策略:YOLOv5应用了多种复杂的训练策略来增强模型的性能。包括:

      (1).Multiscale Training: 在训练过程中,输入图像在原始尺寸的0.5至1.5倍范围内随机重新缩放。

      (2).AutoAnchor:此策略优化先前的锚框,以匹配自定义数据中真实框的统计特征。

      (3).Warmup and Cosine LR Scheduler:一种调整学习率以增强模型性能的方法。

      (4).Exponential Moving Average(EMA):一种使用过去步骤(past steps)的参数平均值来稳定训练过程并减少泛化误差的策略。

      (5).Mixed Precision Training:一种以半精度格式执行运算的方法,可减少内存使用并提高计算速度。

      (6).Hyperparameter Evolution:一种自动调整超参数以实现最佳性能的策略。

      4.额外特性

      (1).Compute Losses:YOLOv5中的损失计算为三个单独损失分量的组合:

      1).Classes Loss(BCE Loss):二元交叉熵损失(Binary Cross-Entropy loss),测量分类任务的误差。

      2).Objectness Loss(BCE Loss):另一种二元交叉熵损失,计算检测目标是否存在于特定网格单元中的误差。

      3).Location Loss(CIoU Loss):完整的IoU损失,测量网格单元内目标定位的误差。

      (2).Balance Losses:三个预测层(P3、P4、P5)的目标性损失的加权不同。平衡权重分别为[4.0, 1.0, 0.4]。这种方法确保不同尺度的预测对总损失有适当的贡献(contribute)。

      (3).Eliminate Grid Sensitivity(消除网格敏感性):与早期版本的YOLO相比,YOLOv5架构对框预测策略做了一些重要的改变。在YOLOv2和YOLOv3中,使用最后一层的激活直接预测框坐标。然而,在YOLOv5中,预测框坐标的公式已被更新,以降低网格敏感性并防止模型预测无界框尺寸。

      (4).Build Targets:YOLOv5中的构建目标过程对于训练效率和模型精度至关重要。它涉及将真实框分配给输出map中适当的网格单元,并将它们与适当的锚框进行匹配。此过程遵循以下步骤:

      1).计算真实框尺寸与每个锚模板尺寸的比率。

      2).如果计算出的比率在阈值内,则将真实框与相应的锚点进行匹配。

      3).将匹配的锚点分配给适当的单元格,请记住,由于修改后的中心点偏移,真实框可以分配给多个锚点。因为中心点偏移范围从(0, 1)调整为(-0.5, 1.5)。GT Box可以分配给更多的anchor。

      这样,构建目标过程可确保在训练过程中正确分配和匹配每个真实目标,从而使YOLOv5能够更有效地学习目标检测任务。

      总之,YOLOv5代表了实时目标检测模型发展的重要一步。通过整合各种新功能、增强功能和训练策略,它在性能和效率上超越了YOLO系列之前的版本。YOLOv5的主要增强功能包括使用动态架构(dynamic architecture)、广泛的数据增强技术、创新的训练策略,以及计算损失和构建目标过程的重要调整。所有这些创新都显着提高了目标检测的准确性和效率,同时保留了YOLO模型的标志----高速度。

      GitHub:https://github.com/fengbingchun/NN_Test

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

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

相关文章

2024.4.29 Pandas day01 基础语法

pandas是python的一个数据库,在使用数据库的时候需要输入 import pandas as pd 引入, df pd.read.csv(文件路径“):这是利用pandas数据库读取CSV文件的方法,如果读取EXCEL文件或者其他文件,csv文件换成其他…

库存管理系统开源啦

软件介绍 ModernWMS是一个针对小型物流仓储供应链流程的开源库存管理系统。该系统的开发初衷是为了满足中小型企业在有限IT预算下对仓储管理的需求。通过总结多年ERP系统研发经验,项目团队开发了这套适用于中小型企业的系统,以帮助那些有特定需求的用户。…

Python-Socket编程实现tcp-udp通信

本文章是记录我准备大创项目时学的socket编程的用法,纯属记录生活,没有教学意义,视频我是看b站up主王铭东学的,讲的很详细,我只粗略学了个大概,我想要通过tcp,udp传输yolo目标检测中的物体坐标信…

C语言中的goto语句

goto label; C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。 #include <stdio.h> int main(){goto first;printf("我是你好\n");first:printf("nihao\n");second:printf("This is 2\n");return 0; } 使用goto会…

== 和 equals()区别,equals()重写问题

对于引用类型&#xff1a;比较的是两个引用是否相同&#xff08;所指的是否为同一个对象&#xff09;&#xff0c;注&#xff1a;如果两个引用所指的对象内容一样&#xff0c;但是不是同一个对象&#xff08;hashcode不一样&#xff09;&#xff0c;依然返回false&#xff0c;随…

MYSQL数据目录结构上篇-表在文件系统中表示

前言感悟:我个人是比较不喜欢只会用,不太懂为什么的这么用,而且有的时候很多官方术 语让人难以读懂, 这里我会用比较大白话的方式,让我自己也能让网友们更加理解,如果书写哪里有误,欢迎大家指出((,,•ω•)ノ"(っω•&#xff40;。)) 从入门开始啦推荐一个学习mysql的视频…

在GPU上加速RWKV6模型的Linear Attention计算

精简版&#xff1a;经过一些profile发现flash-linear-attention中的rwkv6 linear attention算子的表现比RWKV-CUDA中的实现性能还要更好&#xff0c;然后也看到了继续优化triton版本kernel的线索。接着还分析了一下rwkv6 cuda kernel的几次开发迭代以此说明对于不懂cuda以及平时…

基于Springboot的房屋租赁管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的房屋租赁管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

【机器学习】Ctrl-Adapter:视频生成领域的革新者

Ctrl-Adapter&#xff1a;视频生成领域的革新者 一、ControlNets的挑战与Ctrl-Adapter的应运而生二、Ctrl-Adapter的技术原理与实现三、Ctrl-Adapter的应用实例与性能表现四、Ctrl-Adapter的意义与未来展望 随着人工智能技术的飞速发展&#xff0c;图像与视频生成领域正经历着前…

【busybox记录】【shell指令】cksum

目录 内容来源&#xff1a; 【GUN】【cksum】指令介绍 【busybox】【cksum】指令介绍 【linux】【cksum】指令介绍 使用示例&#xff1a; 计算校验和 - 传统输出格式 默认输出 - 基础POSIX标准32位CRC校验和 其他校验指令对参数有更好的支持&#xff0c;请看其他校验指…

一篇文章带你深入了解“指针”

一篇文章带你深入了解“指针” 内存和地址了解指针指针类型const修饰指针指针的运算指针与整数之间的运算指针与指针之间的运算指针的关系运算 void* 指针传值调用和传址调用数组和指针的关系野指针野指针的形成原因规避野指针 二级指针字符指针指针数组数组指针数组传参一维数…

灌溉机器人 状压dp

灌溉机器人 题目描述 农田灌溉是一项十分费体力的农活&#xff0c;特别是大型的农田。小明想为农民伯伯们减轻农作负担&#xff0c;最近在研究一款高科技——灌溉机器人。它可以在远程电脑控制下&#xff0c;给农田里的作物进行灌溉。 现在有一片 N 行 M 列的农田。农田的土…

Java Jackson-jr 库是干什么用的

Jackson-jr 是一个轻量级的Java JSON 处理库。这个库被设计用来替代 Jackson 的复杂性。对比 Jackson 的复杂 API&#xff0c;Jackson-jr 的启动速度更快&#xff0c;包大小更小。 虽然Jackson databind&#xff08;如ObjectMapper&#xff09;是通用数据绑定的良好选择&#…

三维重建(SFM)与实时定位建图(SLAM)的区分与联系

1、SLAM SLAM是Simultaneous Location and Mapping&#xff0c;同时定位与地图构建。是指搭载特定传感器的主体&#xff0c;在没有环境先验信息的情况下&#xff0c;于运动过程中建立环境的模型&#xff0c;同时估计自己的运动。目的是解决自主机器人“定位”和“建图”两个问题…

OpenCV多张图片堆叠显示

OpenCV实现多张图片堆叠显示 程序思路效果代码 程序思路 读取两张或多张图片&#xff1b;获取图片尺寸&#xff1b;选择多张图片中较大的宽度和高度建立画布&#xff1b;合并图片到画布&#xff1b; 效果 代码 import cv2 import numpy as np# 读取两张图片 img1 cv2.imrea…

C# Web控件与数据感应之 TreeView 类

目录 关于 TreeView 一些区别 准备数据源 范例运行环境 一些实用方法 获取数据进行呈现 ​根据ID设置节点 获取所有结点的索引 小结 关于 TreeView 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&#xff0c;本文将继续介绍与…

mysql设置允许其他IP访问

文章目录 更改mysql配置文件登录mysql 更改mysql配置文件 查找.ini或者.cnf文件 更改bind-address为0.0.0.0 [mysqld] character-set-serverutf8mb4 bind-address0.0.0.0 default-storage-engineINNODB [mysql] default-character-setutf8mb4 [client] default-character-s…

redis集群-主从机连接过程

首先从机需要发送自身携带的replid和offset向主机请求连接 replid&#xff1a;replid是所有主机在启动时会生成的一个固定标识&#xff0c;它表示当前复制流的id&#xff0c;当从机第一次请求连接时&#xff0c;主机会将自己的replid发送给从机&#xff0c;从机在接下来的请求…

LAME及 iOS 编译

文章目录 关于 LAME编译 for iOS 关于 LAME 官网&#xff1a;https://lame.sourceforge.io LAME是根据LGPL许可的高质量MPEG音频层III&#xff08;MP3&#xff09;编码器。 LAME的开发始于1998年年中左右。Mike Cheng 最开始将它作为针对8hz-MP3编码器源的补丁。在其他人提出…

Redis(九)渐进式遍历 | 数据库管理

文章目录 前言什么是渐进式遍历SCAN数据库管理 前言 前面我们学习了针对 redis 五种基本数据类型和五种特殊数据类型的常用命令&#xff0c;其中通用命令 keys pattern 我们都知道是用来查询当前 redis 服务器中有哪些 key 的&#xff0c;而如果此时 redis 服务器中存在很多的…