【YOLO系列】YOLO v5(网络结构图+代码)

news2024/12/23 0:48:44

文章目录

    • 推理
    • 转换onnx
    • 网络架构
      • SPP VS SPPF
      • AutoAnchor
      • Loss
    • 参考

【YOLO系列】YOLO v3(网络结构图+代码)
【YOLO 系列】YOLO v4-v5先验知识
【YOLO系列】YOLO v4(网络结构图+代码)

我是在自己笔记本上配置的YOLO v5环境。首先,conda创建YOLO v5虚拟环境,克隆
ultralytics/yolov5项目,pip install -r requirements.txt安装所需库文件。

YOLO v5提供了五个不同大小的预训练模型,分别是YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l和YOLOv5x。这五个模型的参数量、mAP和推理速度如下所示:
在这里插入图片描述
这五个模型的网络结构是一样的,不一样的就是通道数和宽度不一样,受depth_multiple和width_multiple两个因子影响。

模型depth multiplewidth multiple
YOLOv5n0.330.25
YOLOv5s0.330.50
YOLOv5m0.670.75
YOLOv5l1.01.0
YOLOv5x1.331.25

推理

我笔记本的CPU为Inter i7-7700HQ,使用detect.py进行推理。预训练权重选择yolov5x.pt,推理图像默认来自于"\data\images"文件夹下。推理命令行如下所示:

python detect.py --weights models/yolov5x.pt --device cpu --view-img

推理时,会输出每张图片前处理后的图片大小,检测结果和推理时间。官方给出的YOLOv5x在CPU上的推理时间为766ms,可能笔记本的CPU太弱了吧,这两张图片的推理时间在1.5s~2.0s之内。

image 1/2 F:\yolov5\data\images\bus.jpg: 640x480 4 persons, 1 bus, 1973.8ms
image 2/2 F:\yolov5\data\images\zidane.jpg: 384x640 3 persons, 2 ties, 1565.6ms
Speed: 0.5ms pre-process, 1769.7ms inference, 7.8ms NMS per image at shape (1, 3, 640, 640)

bus图片推理结果展示zidane图片推理结果展示
在这里插入图片描述在这里插入图片描述

转换onnx

YOLO v5的模型配置是yaml文件,为了能直观地查看YOLO v5的网络结构,需要将预训练pt模型转换成onnx的格式。onnx的算子版本默认为17,这里设置算子版本为11。

python export.py --weights models/yolov5x.pt --device cpu --opset=11 --include onnx

然后使用生成的onnx文件进行推理,测试一下生成的onnx文件是否正确。

F:\yolov5>python detect.py --weights models/yolov5x.onnx --device cpu --view-img

网络架构

YOLO v5的网络结构也清晰地分为backbone、Neck和Head三部分。YOLO v5第一版于2020年6月发布,距今已有三年,这三年YOLO v5也从第一版已更新到第七版。在前四版时,对PAN和CSP都进行了更新。在第四版时,使用SiLU激活函数代替LeakyReLU和Hardswish激活函数。在第六版时,使用一个Conv(k=6, s=2, p=2) 卷积层替代Focus结构;使用SPPF替代SPP结构。还有一些其他更改,目的都是为了使得YOLO v5模型更轻量、更快和更准确。

自YOLO v5模型第六版之后,backbone、neck和Head的结构就如下所示了。

  • Backbone: New CSP-Darknet 53
  • Neck: SPPF, New CSP-PAN
  • Head: YoLo v3 Head

下图是YOLOv5l的网络架构,YOLO v5在Head时,使用C3结构替代YOLOv3和YOLOv4 head和neck的五层卷积。

在这里插入图片描述

SPP VS SPPF

SPPSPPF
在这里插入图片描述在这里插入图片描述

SPPF比SPP的运行时间快2倍。SPP的三个最大池化层的size是不一样的,但是输入是一样的;SPPF的三个最大池化层的size是一样的,后续两个最大池化的输入是前一个最大池化层的输出。

AutoAnchor

在YOLO v5中,默认使用autoAnchor,不用手工选择anchor boxes,使用k-means聚类算法在训练集上自动寻找anchor boxes。训练时设置noautoanchor,才能使用自定义的anchor boxes。

parser.add_argument(‘–noautoanchor’, action=‘store_true’, help=‘disable AutoAnchor’)

autoAnchor在yaml配置文件中设置如下所示。其中3表示每个输出层分配3个anchor大小。

anchors: 3 # AutoAnchor evolves 3 anchors per P output layer

k-means是非常经典的聚类方法,通过计算样本之间的距离将相近的样本聚到同一类别。auto anchor的计算函数为utils/autoanchors.py文件的kmean_anchors。源代码有些长,我只截取了k-means计算auto anchor的核心部分和进化算法中的适应度计算。

def metric(k, wh):  # compute metrics
    """
    k: anchor框
    wh: 整个数据集的 wh [N, 2]
    x: [N, 9] N个 gt boxes 与所有 anchor boxes的宽比或高比(两者之中较小者)
    x.max(1)[0]: [N] N个 gt boxes 与所有 anchor boxes中的最大宽比或高比(两者之中较小者)
    """
    r = wh[:, None] / k[None]  # 两者的重合程度越高,越趋近1
    x = torch.min(r, 1 / r).min(2)[0]  # ratio metric
    return x, x.max(1)[0]  # x, best_x

def anchor_fitness(k):  # mutation fitness
    #适应度计算 用于遗传算法中衡量突变是否有效的标注 优胜劣汰
    _, best = metric(torch.tensor(k, dtype=torch.float32), wh)
    return (best * (best > thr).float()).mean()  # fitness

# 得到数据集中所有图像的wh
shapes = img_size * dataset.shapes / dataset.shapes.max(1, keepdims=True) # 将图片的长边缩放到img_size,相应地缩放短边
wh0 = np.concatenate([l[:, 3:5] * s for s, l in zip(shapes, dataset.labels)])  # 将图片中gt boxes的wh缩放到shapes尺度。 dataset.labels其中格式为[类别,x, y , w, h],xywh均已经归一化了

# Filter
i = (wh0 < 3.0).any(1).sum() # 统计gt boxes中w和h小于3像素的个数
if i:
    LOGGER.info(f'{PREFIX}WARNING ⚠️ Extremely small objects found: {i} of {len(wh0)} labels are <3 pixels in size')
# 筛选大于2像素的gt boxes用作聚类
wh = wh0[(wh0 >= 2.0).any(1)].astype(np.float32)  # filter > 2 pixels

# Kmeans init
try:
    LOGGER.info(f'{PREFIX}Running kmeans for {n} anchors on {len(wh)} points...')
    assert n <= len(wh)  # apply overdetermined constraint
    # 计算wh的标准差
    s = wh.std(0)  # sigmas for whitening
    # 聚类
    k = kmeans(wh / s, n, iter=30)[0] * s  # points
    assert n == len(k)  # kmeans may return fewer points than requested if wh is insufficient or too similar
except Exception:
    LOGGER.warning(f'{PREFIX}WARNING ⚠️ switching strategies from kmeans to random init')
    k = np.sort(npr.rand(n * 2)).reshape(n, 2) * img_size  # random init
wh, wh0 = (torch.tensor(x, dtype=torch.float32) for x in (wh, wh0))
k = print_results(k, verbose=False)

Loss

YOLO v5的loss也由三部分组成,Classes loss和Objectness loss都使用的是BCE loss,Location loss为CIoU loss。三个预测层的Objectness loss是有不同权重的,小中大分别是[4.0, 1.0, 0.4]。

YOLO v5更新了YOLO v3中已知偏移量 c x , c y , t w , t h c_{x},c_{y},t_{w},t_{h} cx,cy,tw,th计算预测bbox的公式,公式对比如下所示:

YOLO v3YOLO v5
在这里插入图片描述在这里插入图片描述

更新公式之后,中心点偏移量的取值范围由 ( 0 , 1 ) \left( 0, 1\right) (0,1)调整到 ( − 0.5 , 1.5 ) \left( -0.5, 1.5\right) (0.5,1.5),因此,偏移量更容易得到0或者1。在YOLO v3的box方程中,宽度和高度无上限,这是一个严重的缺陷,它可能会导致梯度失控、不稳定性、NaN loss等问题,并最终导致无效训练。

中心点对比宽度和高度对比
在这里插入图片描述在这里插入图片描述

参考

  1. ultralytics/yolov5
  2. Architecture Summary

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

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

相关文章

饼状图使用属性时,使用驼峰命名法

饼状图是使用D3.js等JavaScript库来绘制的&#xff0c;而JavaScript中的属性名通常采用驼峰式命名法&#xff0c;即第一个单词的首字母小写&#xff0c;后面单词的首字母大写&#xff0c;例如fontSize、fontWeight等。而CSS中的属性名采用连字符命名法&#xff0c;即单词之间用…

Top 5 Best Open Source Projects on GitHub 2023

这里介绍Github上 5 个增长最快的开源项目&#xff0c;它们为原有的解决方案提供了更加具有成本效益的替代方案&#xff0c;并为开发者、数据分析师和企业提供了高可用的工具产品。利用开源的优势&#xff0c;这5个项目拓展了强大而有效的解决方案&#xff0c;是值得收藏、分享…

比ureport好用的报表系统-VeryReport报表系统

随着数据时代的到来&#xff0c;数据成为企业管理和决策的重要依据。然而&#xff0c;在处理海量数据的同时&#xff0c;如何快速准确地生成各种形式的报表却成为了一个痛点。手工制作报表费时费力、容易出错&#xff1b;而传统的报表工具又复杂难用&#xff0c;无法满足不同用…

基于jsp+mysql+Spring+mybatis+Springboot的SpringBoot婚纱影楼摄影预约网站

运行环境: 最好是java jdk 1.8&#xff0c;我在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以&#xff0c;如果编译器的版本太低&#xff0c;需要升级下编译器&#xff0c;不要弄太低的版本 tomcat服务器环…

Linux下快速创建大文件的4种方法总结

1、使用 dd 命令创建大文件 dd 命令用于复制和转换文件&#xff0c;它最常见的用途是创建实时 Linux USB。dd 命令是实际写入硬盘&#xff0c;文件产生的速度取决于硬盘的读写速度&#xff0c;根据文件的大小&#xff0c;该命令将需要一些时间才能完成。 假设我们要创建一个名…

SAP从入门到放弃系列之CRP-part2

标准的生产处理流程如下&#xff1a; 在标准的流程里&#xff0c;MRP为无限产能方式&#xff0c;所以在MRP或者MPS之后&#xff0c;需要进行CRP计算&#xff0c;然后调整。 测试数据准备&#xff1a; 1、参考复制part1文章中的ZW01CRP工作中心复制到新的ZW01CRP2。 2、为物…

springboot 连接 kafka集群(kafka版本 2.13-3.4.0)

springboot 连接 kafka集群 一、环境搭建1.1 springboot 环境1.2 kafka 依赖 二、 kafka 配置类2.1 发布者2.1.1 配置2.1.2 构建发布者类2.1.3 发布消息 2.2 消费者2.2.1 配置2.2.2 构建消费者类2.2.3 进行消息消费 一、环境搭建 1.1 springboot 环境 JDK 11 Maven 3.8.x spr…

SpringCloud Alibaba Nacos--下

SpringCloud Alibaba Nacos-下 Nacos 配置中心实例 示意图 在Nacos Server 加入配置 进入到Nacos Server加入配置&#xff0c; 特别提醒: 文件后缀.yaml 别忘了. Data ID: e-commerce-nacos-config-client-dev.yaml 创建Nacos 配置客户端模块e-commerce-nacos-config-client…

kafka集群报错找不到broker

一、问题描述 某次用户反馈&#xff0c;kafka消费这边消息失败&#xff0c;报错消费者被踢出消费组或broker状态异常无法连接&#xff0c;后实际验证端口确实不通 现场测试验证&#xff0c;报错&#xff1a;报错&#xff1a;Failed to find brokers to send ListGroups……fi…

实战干货,pytest自动化测试-Git中的测试用例运行(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 我们每天写完自动…

httprunner 2.x的基本使用(二)

上一章&#xff1a; httprunner 2.x介绍与使用_做测试的喵酱的博客-CSDN博客 下一章&#xff1a; 一、 api 文件夹&#xff08;没有任何数据依赖的场景&#xff09; api 文件夹&#xff1a;执行接口case的最小单元。如果一个接口case&#xff0c;没有任何数据依赖&#xff0…

虚拟ECU实践:汽车发动机控制器仿真

虚拟化技术使得在Windows PC上对汽车ECU&#xff08;Electronic Control Unit&#xff0c;电子控制器单元&#xff09;进行闭环仿真成为可能&#xff0c;能有效改善ECU开发过程。一些开发任务得以从道路、测试平台和HIL&#xff08;Hardware in the Loop&#xff0c;硬件在环&a…

Python入门教程+项目实战-13.3节-集合的快速查找

目录 13.3.1 键的输出顺序 13.4.2 键的数据类型 13.4.3 集合的快速查找 13.4.4 知识要点 13.4.5 系统学习python 13.3.1 键的输出顺序 集合类型的底层实现基于哈希表&#xff0c;键的输出顺序取决于键在哈希表中的存储顺序。 对哈希表结构不是很熟悉的同学&#xff0c;可…

【DBA生存之四大守则---读书笔记】

&#x1f448;【上一篇】 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 【下一篇】&#x1f449; &#x1f53b;《Oracle 数据库性能优化》一书的序言中提到: 兴趣勤奋坚持方法成功 很遗憾我不能给以上公式画上“”&#xff0c;但是无…

Coggle 30 Days of ML 打卡任务一

Coggle 30 Days of ML 打卡任务一 任务一&#xff1a;两个赛题数据可视化 难度/分值&#xff1a;低/1 打卡内容&#xff1a; 参赛选手名称&#xff1a;AppleDoctor完成日期&#xff1a;2023.6.6任务完成情况&#xff1a; 使用的编程语言&#xff1a;Python实现的功能&#…

八大排序算法

八大排序算法 是指常用的八种排序算法&#xff0c;它们包括&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;通过不断交换相邻元素的位置&#xff0c;将最大&#xff08;或最小&#xff09;的元素逐渐"冒泡"到最后&#xff08;或最前&#xf…

【技术分享】华为防火墙双机热备

组网需求 如图所示&#xff0c;两台FW旁挂在数据中心的核心交换机侧&#xff0c;保证数据中心网络安全。通过核心交换机的流量都会被引流到旁挂的FW上进行安全检测&#xff0c;引流的方式为静态路由方式。企业希望两台FW以主备备份方式工作。正常情况下&#xff0c;流量通过FW_…

android 如何分析应用的内存(五)

android 如何分析应用的内存&#xff08;五&#xff09; 接上文 lldb的工具篇的GUI部分。分成两部分&#xff1a; vscode 的LLDBas的LLDB 接下来是as的LLDB as的LLDB 为了进行LLDB的调试&#xff0c;需要对as进行配置&#xff0c;事实上&#xff0c;每一个在AS中编辑的应…

充电桩检测仪表TK4860E交流充电桩检定装置

波形失真度测量&#xff1a;具备电压电流波形失真度测量功能。 时钟校验功能&#xff1a;实时时钟显示&#xff0c;可完成充电桩的时钟时刻误差测试。 温湿度测量&#xff08;选配件&#xff09;&#xff1a;可选配蓝牙温湿度计&#xff0c;通过蓝牙连接平板电脑&#xff0c;…

properties、yaml作为配置文件的特点

说明&#xff1a;在软件开发中&#xff0c;经常需要把一些配置写在文件中&#xff0c;如数据库配置、MyBatis配置等。这样&#xff0c;后续如果数据库参数有改动&#xff0c;就可以避免直接对代码做修改&#xff0c;只要修改配置文件中关于数据库的配置。关于配置文件的选择&am…