自学内容网 自学内容网

深入探究 YOLOv5:从优势到模型导出全方位解析

一、引言

在计算机视觉领域,目标检测是一项至关重要的任务,它在自动驾驶、安防监控、工业检测等众多领域都有着广泛的应用。而 YOLO(You Only Look Once)系列作为目标检测算法中的佼佼者,一直备受关注。其中,YOLOv5 更是凭借其出色的性能和易用性,成为了许多开发者和研究者的首选。本文将深入探讨 YOLOv5,包括其优势、PyTorch 版本特点、模型导出格式支持以及模型类别与导出等方面,带领读者全面了解这一强大的目标检测模型。

二、Why  Choose  YOLOv5

YOLOv5 在目标检测领域具有显著的优势,以下通过与其他模型的对比来详细阐述。

(一)性能对比

在目标检测任务中,模型的性能通常通过平均精度(Average Precision,AP)和速度来衡量。如图所示,展示了 YOLOv5 不同版本(YOLOv5n6、YOLOv5s6、YOLOv5m6、YOLOv5l6、YOLOv5x6)与 EfficientDet 在 COCO 数据集上的 AP 值和 GPU 速度的对比。

从图中可以看出,在 GPU 速度方面,YOLOv5 系列模型表现出色,尤其是在速度较快的情况下,依然能够保持较高的 AP 值。例如,YOLOv5n6 在速度上具有明显优势,而 YOLOv5x6 则在 AP 值上达到了较高水平,超过了 EfficientDet。这意味着 YOLOv5 能够在保证检测精度的同时,实现快速的目标检测,满足实时性要求较高的应用场景。

二、模型结构与训练优势

YOLOv5 的模型结构设计精巧,采用了一系列先进的技术和策略,使其在训练过程中具有以下优势:

  1. 数据增强:YOLOv5 内置了丰富的数据增强方法,如随机缩放、裁剪、翻转、颜色变换等。这些数据增强操作可以有效地增加训练数据的多样性,提高模型的泛化能力,使其能够更好地应对各种复杂场景下的目标检测任务。
  2. 多尺度训练:支持多尺度训练,模型可以在不同分辨率的图像上进行训练,从而使模型能够适应不同大小的目标检测。这种训练方式有助于提高模型对不同尺度目标的检测精度,避免因目标大小变化而导致的漏检或误检问题。
  3. 高效的网络架构:YOLOv5 的网络架构经过精心设计,采用了深度可分离卷积等高效的卷积操作,减少了模型的参数量和计算量,同时保持了较高的检测性能。这使得模型可以在资源受限的设备上(如移动设备、嵌入式设备)高效运行,拓展了其应用范围。

YOLOv5-PyTorch 版本具有重要的地位和特点,以下是详细介绍。

(一)历史上第一个 PyTorch 版本

YOLOv5 是第一个基于 PyTorch 实现的版本,这具有重要意义。PyTorch 作为一款流行的深度学习框架,以其简洁易用、动态计算图、良好的调试体验等优点受到广大开发者的喜爱。YOLOv5-PyTorch 版本的出现,使得开发者能够利用 PyTorch 的强大功能和丰富生态,更加方便地进行模型的训练、调试和部署。

(二)不同规模模型介绍

YOLOv5 提供了多种规模的模型,包括 Small(YOLOv5s)、Medium(YOLOv5m)、Large(YOLOv5l)和 XLarge(YOLOv5x)。这些模型在模型大小、推理速度和检测精度上各有特点,以满足不同应用场景的需求。

  1. YOLOv5s

    • 模型大小:FP16 精度下仅为 14 MB,非常适合在资源有限的设备上部署,如移动设备或边缘设备。
    • 推理速度:在 V100 GPU 上,推理速度可达 2.2 ms,能够实现快速的目标检测,满足实时性要求较高的应用。
    • 检测精度:在 COCO 数据集上的 mAP(mean Average Precision)为 36.8,虽然相对其他大型模型精度较低,但在一些对精度要求不是特别苛刻的场景下,其快速的检测速度和较小的模型大小使其具有很大的优势。
  2. YOLOv5m

    • 模型大小:FP16 精度下为 41 MB,比 YOLOv5s 稍大,但仍然可以在一些中低端设备上运行。
    • 推理速度:在 V100 GPU 上,推理速度为 2.9 ms,速度依然较快。
    • 检测精度:mAP 达到 44.5,相比 YOLOv5s 有了显著提高,能够在保证一定速度的前提下,提供更高的检测精度,适用于对精度和速度都有一定要求的场景。
  3. YOLOv5l

    • 模型大小:FP16 精度下为 90 MB,模型规模进一步增大。
    • 推理速度:在 V100 GPU 上,推理速度为 3.8 ms,虽然速度有所下降,但仍然在可接受范围内。
    • 检测精度:mAP 达到 48.1,检测精度进一步提升,适用于对精度要求较高的场景,如工业检测等。
  4. YOLOv5x

    • 模型大小:FP16 精度下为 168 MB,是 YOLOv5 系列中最大的模型。
    • 推理速度:在 V100 GPU 上,推理速度为 6.0 ms,相对较慢,但在强大的计算设备上仍然可以实现实时检测。
    • 检测精度:mAP 达到 50.1,是 YOLOv5 系列中精度最高的模型,适用于对检测精度要求极高的场景,如医学图像分析等。

一般来说YOLOv5l模型的性价比更高,YOLOv5x比YOLOv5l模型大的很多,但是mAP来看,性能却没有多少提升。

以下是使用 PyTorch 加载 YOLOv5s 模型进行目标检测的示例代码:

import torch

# 加载预训练的YOLOv5s模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

# 对图像进行目标检测
image_path = 'your_image_path.jpg'
results = model(image_path)

# 显示检测结果
results.show()

在上述代码中,首先使用torch.hub.load函数加载预训练的 YOLOv5s 模型,然后将待检测的图像路径传入模型进行目标检测,最后使用results.show()函数显示检测结果。

三、模型导出格式支持

YOLOv5 最新版支持多种模型导出格式,这为其在不同平台和环境中的部署提供了极大的便利。

(一)支持的格式

  1. PyTorch:这是 YOLOv5 的原生格式,以.pt.pth文件形式存在。在 PyTorch 环境中,可以直接使用这些模型文件进行训练、测试和推理。例如,yolov5s.pt就是 YOLOv5s 模型的 PyTorch 格式文件。
  2. TorchScript:通过torchscript选项可以将模型导出为 TorchScript 格式,文件扩展名为.torchscript。TorchScript 是一种可以在 Python 环境之外运行的模型表示形式,它可以将 PyTorch 模型转换为一种中间表示,以便在 C++ 等其他语言中使用,提高了模型的可移植性和部署灵活性。
  3. ONNX:ONNX(Open Neural Network Exchange)是一种开放的神经网络模型交换格式,支持多种深度学习框架之间的模型互操作。通过onnx选项可以将 YOLOv5 模型导出为.onnx文件。例如,yolov5s.onnx就是导出的 ONNX 格式模型。导出 ONNX 格式的模型后,可以使用 ONNX Runtime 等推理引擎在不同的硬件和软件平台上进行高效的推理。以下是将 YOLOv5s 模型导出为 ONNX 格式的代码示例:
import torch

# 加载预训练的YOLOv5s模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

# 导出为ONNX格式
torch.onnx.export(model, torch.randn(1, 3, 640, 640), 'yolov5s.onnx', verbose=True)

在上述代码中,首先加载预训练的 YOLOv5s 模型,然后使用torch.onnx.export函数将模型导出为 ONNX 格式,其中torch.randn(1, 3, 640, 640)是一个随机生成的输入张量,用于指定模型的输入形状,yolov5s.onnx是导出的 ONNX 模型文件名,verbose=True表示在导出过程中输出详细信息。

  1. OpenVINO:OpenVINO 是英特尔推出的用于优化和部署深度学习模型的工具套件。通过openvino选项可以将 YOLOv5 模型导出为 OpenVINO 支持的格式,导出后的模型可以在英特尔的硬件平台上实现高效的推理加速,充分利用英特尔硬件的性能优势,适用于对性能和功耗有较高要求的边缘计算场景。
  2. TensorRT:TensorRT 是 NVIDIA 推出的用于高性能深度学习推理的 SDK。通过engine选项可以将 YOLOv5 模型导出为 TensorRT 引擎文件(.engine)。TensorRT 可以对模型进行优化和加速,利用 NVIDIA GPU 的并行计算能力,实现实时的目标检测,特别适用于需要高性能计算的场景,如自动驾驶、视频监控等。
  3. CoreML:CoreML 是苹果公司推出的用于在 iOS 设备上部署机器学习模型的框架。通过coreml选项可以将 YOLOv5 模型导出为 CoreML 格式(.mlmodel),方便在 iOS 应用中集成目标检测功能,为移动应用开发者提供了便捷的模型部署方式。
  4. TensorFlow SavedModel:TensorFlow SavedModel 是 TensorFlow 的一种模型保存格式。通过saved_model选项可以将 YOLOv5 模型导出为 TensorFlow SavedModel 格式,文件保存在指定的目录中(如yolov5s_saved_model/)。这种格式可以方便地在 TensorFlow 生态中使用和部署模型,与其他 TensorFlow 工具和库进行集成。
  5. TensorFlow GraphDef:GraphDef 是 TensorFlow 模型的一种底层表示形式,通过pb选项可以将 YOLOv5 模型导出为.pb文件。这种格式可以用于在 TensorFlow 中进行更底层的操作和优化,例如在一些需要对模型图进行精细调整的场景中使用。
  6. TensorFlow Lite:TensorFlow Lite 是 TensorFlow 针对移动和嵌入式设备推出的轻量级深度学习框架。通过tflite选项可以将 YOLOv5 模型导出为 TensorFlow Lite 格式(.tflite),适用于在资源受限的移动设备和嵌入式设备上运行目标检测模型,提供高效的推理性能和低功耗。
  7. TensorFlow Edge TPU:TensorFlow Edge TPU 是谷歌推出的用于在边缘设备上加速 TensorFlow 模型推理的硬件和软件解决方案。通过edgetpu选项可以将 YOLOv5 模型导出为 TensorFlow Edge TPU 支持的格式(.tflite),利用 Edge TPU 的硬件加速能力,实现快速的目标检测,适用于物联网等边缘计算场景。
  8. TensorFlow.js:TensorFlow.js 是 TensorFlow 的 JavaScript 版本,通过tfjs选项可以将 YOLOv5 模型导出为 TensorFlow.js 格式(yolov5s_web_model/),方便在 Web 浏览器中直接运行目标检测模型,为 Web 开发者提供了在网页上实现目标检测功能的可能性,无需安装额外的软件或插件。

四、模型可视化

对于导出的 ONNX 格式模型,可以使用https://netron.app进行可视化。Netron 是一款强大的神经网络模型可视化工具,它可以直观地展示模型的结构、层信息、输入输出形状等,帮助开发者更好地理解模型的内部工作原理,便于进行模型的分析和调试。

五、YOLOv5 模型类别与导出

(一)YOLOv5 模型导出与支持

YOLOv5 模型的导出过程相对简单,但需要注意一些细节。除了上述提到的通过export.py脚本结合不同的选项进行导出外,还需要确保模型在导出前已经完成了训练并且处于正确的状态。例如,在导出前需要将模型设置为评估模式(model.eval()),以确保模型的行为与训练时一致,并且不会受到训练过程中一些操作(如 Dropout)的影响。

此外,在导出不同格式的模型时,可能需要根据目标平台和推理引擎的要求进行一些额外的配置和优化。例如,在导出 TensorRT 模型时,需要根据硬件平台的特性和模型的性能要求,选择合适的优化参数和精度设置,以达到最佳的推理性能。

(二)不同精度的模型支持

YOLOv5 不仅支持不同规模的模型,还支持不同精度的模型导出。除了常见的 FP32(单精度浮点数)和 FP16(半精度浮点数)精度外,一些推理引擎还支持 INT8(8 位整数)等低精度量化模型。

低精度量化可以进一步减小模型的大小,降低内存占用和计算量,提高模型在一些硬件平台上的推理速度。例如,在一些边缘计算设备上,INT8 量化后的模型可以实现更快的推理,同时功耗也更低。然而,量化过程可能会导致一定的精度损失,因此需要在模型大小、速度和精度之间进行权衡。

以下是一个简单的示例,展示如何在 PyTorch 中对 YOLOv5 模型进行量化:

import torch
import torch.nn as nn
from torch.quantization import quantize_dynamic

# 加载预训练的YOLOv5s模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

# 对模型进行动态量化
quantized_model = quantize_dynamic(model, {nn.Conv2d, nn.Linear})

# 保存量化后的模型
torch.save(quantized_model.state_dict(), 'quantized_yolov5s.pth')

在上述代码中,首先加载预训练的 YOLOv5s 模型,然后使用quantize_dynamic函数对模型进行动态量化,量化的模块包括卷积层(nn.Conv2d)和全连接层(nn.Linear)。最后,将量化后的模型参数保存为.pth文件。

(三)模型量化的目的

  1. 减小模型大小
    • 原始的深度学习模型,尤其是像 YOLOv5 这样具有一定复杂度的模型,其参数通常以较高精度(如 FP32)存储,这会导致模型文件较大。例如,一个未量化的 YOLOv5 模型可能占用几十兆甚至上百兆的存储空间。通过量化,将模型参数的数据类型转换为低精度(如 INT8),可以显著减小模型的大小。这对于在资源受限的设备上部署模型非常重要,如移动设备、嵌入式设备等,这些设备的存储容量有限,较小的模型大小可以更容易地安装和运行。
    • 以 INT8 量化为例,相比于 FP32,数据存储所需的字节数大大减少(FP32 通常占用 4 个字节,而 INT8 仅占用 1 个字节),从而可以将模型文件压缩到原来的几分之一甚至更小。
  2. 降低内存占用
    • 在模型推理过程中,模型参数需要加载到内存中。未量化的模型由于参数精度高,占用的内存空间较大。当同时运行多个模型实例或者在内存资源紧张的环境中,高内存占用可能会导致内存不足的问题,影响系统的稳定性和其他程序的运行。
    • 量化后的模型由于参数占用内存减少,在相同的硬件环境下,可以同时处理更多的输入数据或者运行更多的模型副本,提高系统的并发处理能力和资源利用率。
  3. 提高推理速度
    • 许多硬件平台,特别是一些专门针对低精度计算进行优化的处理器(如一些移动处理器、GPU 等),在处理低精度数据时具有更高的计算效率。量化后的模型在这些硬件上运行时,可以利用硬件的特性,实现更快的推理速度。

六、小结

YOLOv5 作为一款强大的目标检测模型,具有出色的性能、丰富的模型规模选择、广泛的模型导出格式支持以及对不同精度模型的支持等优点。无论是在学术研究还是工业应用中,YOLOv5 都展现出了巨大的潜力和价值。YOLOv5 具有其优势、PyTorch 版本特点、模型导出格式以及模型类别与导出等方面具有不同选择。在实际应用中,开发者可以根据具体的需求和场景,选择合适的 YOLOv5 模型和导出格式,充分发挥其强大的目标检测能力,为各种计算机视觉任务提供高效、准确的解决方案。


原文地址:https://blog.csdn.net/weixin_52603404/article/details/145246306

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!