news 2026/8/15 6:15:24

YOLOv5目标检测入门实战:从数据准备到模型部署全流程详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv5目标检测入门实战:从数据准备到模型部署全流程详解

1. 从零到一:为什么选择YOLOv5作为你的第一个目标检测项目?

如果你刚刚接触计算机视觉,或者对“目标检测”这个词还停留在概念阶段,想找一个能快速上手、看到实际效果的项目,那么YOLOv5绝对是你绕不开的起点。我见过太多新手,一开始就被复杂的理论、庞大的代码库和繁琐的环境配置劝退,最后项目还没开始就放弃了。YOLOv5的出现,很大程度上改变了这个局面。它不像一些学术界的模型那样,把代码写得像天书,而是真正考虑到了开发者和研究者的实际使用体验。

简单来说,YOLOv5是一个用于“目标检测”的深度学习模型。所谓目标检测,就是让计算机不仅能认出图片里有什么(分类),还能用一个框(Bounding Box)精准地标出这个东西在图片的哪个位置。比如,让摄像头识别路口的行人和车辆,或者让工厂的质检系统找出产品表面的瑕疵。YOLOv5的核心优势在于它的“快”和“易用”。它的名字“YOLO”(You Only Look Once)就揭示了其单阶段检测的哲学:只看一次图片,就能同时预测出所有目标的位置和类别,这使得它的推理速度非常快,能满足很多实时应用的需求。

那么,为什么特别推荐新手从YOLOv5开始呢?首先,它的代码库(GitHub上的ultralytics/yolov5)组织得非常清晰,文档也相对完善。从数据准备、模型训练到模型导出,整个流程都被封装成了易于调用的脚本和函数。你不需要从零开始写数据加载器,也不需要手动实现复杂的损失函数,这些“脏活累活”框架都帮你做好了。其次,它的社区生态极其活跃。你在训练过程中遇到的几乎任何问题,比如环境报错、显存不足、指标异常,几乎都能在GitHub的Issues里找到相似的讨论和解决方案。这种强大的社区支持,对新手来说是无比宝贵的。

更重要的是,YOLOv5对“自己的数据集”非常友好。你不需要你的数据格式必须和COCO或VOC这些大型公开数据集一模一样。它提供了一套简单的工具,让你能轻松地将自己标注的图片(比如用LabelImg标注的)转换成它需要的格式。这意味着你可以很快地将模型应用到你自己关心的领域,比如识别特定的商品、检测生产线上的零件,或者统计花园里某种昆虫的数量。这种“学以致用”的即时反馈,是保持学习动力的关键。

很多人会问,现在YOLOv8、YOLOv9甚至更快的模型都出来了,为什么还要学YOLOv5?我的看法是,对于入门而言,模型的“新”远不如“稳”和“资料多”重要。YOLOv5经过多年的迭代,是一个非常稳定、成熟的版本,相关的教程、博客、视频可以说是汗牛充栋。你踩的每一个坑,前面都有无数人踩过并填平了。先掌握YOLOv5,理解了数据准备、训练流程、参数调优这一整套方法论之后,你再迁移到v8、v9或者其他模型,会感觉非常顺畅,因为底层逻辑是相通的。直接上手最新版,你可能会被其新增的特性和变动搞得晕头转向。

所以,如果你是一个新手小白,想亲手训练一个能识别特定目标的AI模型,体验从数据标注到模型部署的完整流程,那么跟着我一步步操作,用YOLOv5训练你自己的数据集,就是最直接、最有效的入门方式。这个过程看似复杂,但一旦打通,你会发现它就像一套固定的“流水线”,掌握之后便可反复复用。

2. 训练前的基石:如何准备一份合格的“教材”数据集?

在开始训练模型之前,我们必须准备好“教材”,也就是数据集。模型所有的“知识”都来源于此,数据集的质量直接决定了模型性能的天花板。很多新手训练效果不好,八成问题都出在数据集上。这一章,我们就来彻底搞清楚,一份能让YOLOv5“学得好”的数据集,到底该怎么准备。

2.1 数据收集:不是越多越好,而是要“对”

首先,你需要收集图片。这些图片应该尽可能贴近你模型未来要应用的真实场景。如果你想做一个检测车间安全帽的模型,那么你的图片就应该是在车间环境下拍摄的,光照、角度、背景都要有代表性。直接从网上下载一些摆拍的安全帽图片,训练出的模型在真实车间里很可能“失灵”。

数量要求:对于YOLOv5这样的模型,每个类别(比如“安全帽”、“行人”、“狗”)至少需要准备几百张图片。如果目标本身变化不大(比如总是同一种样式的安全帽),几百张可能就够了。如果目标形态、大小、颜色变化多端(比如不同品种、不同姿态的狗),那么就需要上千张甚至更多。一个实用的起步建议是,每个类别准备500-1000张图片。不必一开始就追求数万张,可以先用小数据集跑通流程,看到初步效果后再迭代补充。

多样性是关键:你的图片要覆盖各种情况。包括:不同的光照条件(白天、夜晚、逆光)、不同的拍摄角度(俯视、平视、侧视)、目标的不同尺度(远距离小目标、近距离大目标)、目标的不同姿态(完整、部分遮挡、严重遮挡),以及不同的背景。多样性不足的数据集,会导致模型“过拟合”,即只在你的训练图片上表现好,换一个新场景就抓瞎。

2.2 数据标注:给模型划重点

收集好图片后,就要进行标注,也就是告诉模型,图片里哪里是我们感兴趣的目标。YOLOv5需要的是YOLO格式的标注文件。推荐使用LabelImg这个开源工具,它简单直观,非常适合新手。

  1. 安装LabelImg:可以通过pip安装:pip install labelimg,然后在命令行输入labelimg即可打开。
  2. 标注过程:用LabelImg打开图片,用矩形框(快捷键w)框住目标物体,然后输入类别名称(如“helmet”)。框的位置要尽可能紧密地贴合目标物体。
  3. 保存格式:在LabelImg中,将保存格式设置为“YOLO”。这样,每标注一张图片,除了原始的.jpg文件,还会生成一个同名的.txt标注文件。

这个.txt文件的内容就是YOLO格式的核心。我们来看一个例子:假设图片尺寸是640x480,你在图片上框出了一个目标,这个框的左上角坐标是(100, 200),右下角坐标是(300, 400),类别是“dog”(假设你在classes.txt里定义的类别索引是0)。

  • 首先,计算框的中心点坐标和宽高(归一化到0-1之间):
    • 中心点x坐标 = (100 + 300) / 2 / 640 = 400 / 2 / 640 = 200 / 640 = 0.3125
    • 中心点y坐标 = (200 + 400) / 2 / 480 = 600 / 2 / 480 = 300 / 480 = 0.625
    • 宽度 = (300 - 100) / 640 = 200 / 640 = 0.3125
    • 高度 = (400 - 200) / 480 = 200 / 480 = 0.4167
  • 那么,这个.txt文件里就会有一行:0 0.3125 0.625 0.3125 0.4167

每一行代表一个目标物体,格式为:<class_id> <x_center> <y_center> <width> <height>。这就是模型要学习的“标准答案”。

注意:标注质量至关重要。框要准,不能太大或太小;类别要对,不能标错。混乱的标注等于教给模型错误的知识,练得越久,错得越离谱。

2.3 数据集组织:让YOLOv5找得到“课本”

YOLOv5对数据集的目录结构有明确要求。一个规范的结构能避免很多路径错误。假设你的项目根目录叫yolov5_project,推荐按如下方式组织:

yolov5_project/ ├── yolov5/ # 从GitHub克隆的YOLOv5官方代码仓库 └── datasets/ └── my_custom_dataset/ # 你的自定义数据集文件夹 ├── images/ │ ├── train/ # 训练集图片 │ │ ├── image1.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── image100.jpg │ └── ... └── labels/ ├── train/ # 训练集标注文件 (与图片同名,.txt格式) │ ├── image1.txt │ └── ... └── val/ # 验证集标注文件 ├── image100.txt └── ...

为什么需要训练集和验证集?训练集(train)是用来教模型学习的“课本”。验证集(val)是用来定期考试,检查模型学得怎么样的“模拟卷”。我们不能用“课本”来考试,那样无法检验模型是否真的学会了泛化能力。通常,我们可以按8:2或7:3的比例,随机将总数据集划分为训练集和验证集。

2.4 创建数据集配置文件

最后,我们需要创建一个数据集配置文件(.yaml文件),告诉YOLOv5我们的数据集在哪、有哪些类别。在yolov5/data/目录下(或者在你自己的项目目录里),创建一个文件,例如my_dataset.yaml,内容如下:

# 数据集配置文件:my_dataset.yaml # 训练和验证图像的路径(相对于YOLOv5代码的根目录) train: ../datasets/my_custom_dataset/images/train/ val: ../datasets/my_custom_dataset/images/val/ # 类别数量 nc: 3 # 例如,你有3个类别:人、车、狗 # 类别名称列表 names: ['person', 'car', 'dog']

这个文件是连接你的数据和训练脚本的桥梁。路径一定要写对,否则训练时会报“找不到图片”的错误。到这一步,一份合格的“教材”就准备好了。这个过程可能有些枯燥,但请务必耐心、仔细。在数据上多花一小时,可能在调参上能省下一天。

3. 搭建训练环境:避开Win10/Mac/Linux上的那些“坑”

环境搭建是新手遇到的第一个实战关卡,网络上教程很多,但往往因为系统、显卡、Python版本等差异,导致“一看就会,一装就废”。这里,我将以最常用的Windows 10系统为例,带你走一遍最稳妥的流程,并指出关键陷阱。

3.1 基础环境准备:Python与Conda

首先,我们需要一个独立的Python环境。强烈建议使用AnacondaMiniconda来管理环境,它可以避免不同项目间的包版本冲突。

  1. 安装Conda:去Anaconda官网下载并安装适合你系统的版本。安装时记得勾选“Add Anaconda to my PATH environment variable”(将Anaconda添加到环境变量),这能避免后续很多命令找不到的问题。
  2. 创建虚拟环境:打开Anaconda Prompt(Windows)或终端(Mac/Linux),执行以下命令创建一个名为yolov5的Python 3.8环境(Python 3.8是经过大量验证与YOLOv5兼容性较好的版本):
    conda create -n yolov5 python=3.8
    激活这个环境:
    conda activate yolov5
    你会看到命令行提示符前面从(base)变成了(yolov5),表示你已经在这个独立环境中了。

3.2 核心依赖:PyTorch与CUDA

这是最关键也最容易出错的一步。YOLOv5基于PyTorch框架,而PyTorch如果需要GPU加速,就必须和CUDA(NVIDIA显卡的并行计算平台)版本匹配。

  1. 确认你的显卡和CUDA驱动:在命令行输入nvidia-smi。顶部会显示你的CUDA Driver Version(CUDA驱动版本)。例如,显示CUDA Version: 11.4记住这个数字,它决定了你能安装的最高CUDA Toolkit版本。
  2. 去PyTorch官网获取安装命令:打开PyTorch官网(pytorch.org),使用它的安装命令生成器。
    • PyTorch Build: 选择Stable (稳定版)
    • Your OS: 选择你的操作系统。
    • Package: 选择Conda(因为我们用Conda环境)。
    • Language: 选择Python
    • Compute Platform:这里要小心!如果你的nvidia-smi显示的CUDA版本是11.4,那么这里应该选择CUDA 11.3。这是因为PyTorch通常滞后于CUDA驱动版本,且CUDA Toolkit版本(这里选的)可以低于驱动版本。选择CUDA 11.3是最兼容的选择。如果你没有NVIDIA显卡,就选择CPU
  3. 执行安装命令:官网会生成类似下面的命令。在你的(yolov5)环境中执行它。
    # 例如,对于CUDA 11.3 conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch
    这个过程会下载不少东西,请保持网络通畅。

踩坑实录:最常见的问题就是PyTorch装完,训练时发现还在用CPU,或者直接报CUDA错误。90%的原因都是PyTorch版本和CUDA版本不匹配。安装完成后,务必在Python中验证:

import torch print(torch.__version__) # 打印PyTorch版本 print(torch.cuda.is_available()) # 打印True才说明GPU可用 print(torch.cuda.get_device_name(0)) # 打印你的显卡型号

如果torch.cuda.is_available()返回False,请检查上述步骤,尤其是CUDA版本的选择。

3.3 获取YOLOv5代码与安装剩余依赖

  1. 克隆代码:在你想存放项目的目录下,打开命令行(确保在yolov5环境中),使用Git克隆官方仓库:
    git clone https://github.com/ultralytics/yolov5 cd yolov5
    如果网络不好,也可以直接在GitHub页面下载ZIP包并解压。
  2. 安装项目依赖:YOLOv5项目根目录下有一个requirements.txt文件,列出了所有需要的Python包。使用pip安装:
    pip install -r requirements.txt
    这个命令会自动安装OpenCV-Python、Matplotlib、Pandas等所有必要的库。

3.4 验证环境:跑一个官方Demo

在投入自己的数据之前,最好用官方预训练模型和示例数据验证一下整个环境是否工作正常。这能帮你排除环境问题,确保后续步骤的顺利。

  1. 下载预训练模型:YOLOv5提供了从轻量级到高精度的一系列预训练模型(如yolov5s.pt, yolov5m.pt等)。我们可以用代码自动下载最小的yolov5s.pt,但也可以手动从GitHub Release页面下载,放到项目根目录。
  2. 运行检测脚本:在项目根目录下执行:
    python detect.py --source data/images --weights yolov5s.pt --conf 0.25
    • --source: 指定输入源,这里使用自带的示例图片。
    • --weights: 指定模型权重文件。
    • --conf: 置信度阈值,低于此值的目标将被过滤掉。
  3. 查看结果:运行结束后,结果会保存在runs/detect/exp目录下。打开里面的图片,如果能看到模型成功检测出人、自行车、汽车等目标并用框标出,那么恭喜你,环境搭建成功!

至此,你的“炼丹炉”已经架设完毕,并且通过了点火测试。接下来,我们就可以放入自己的“药材”(数据),开始真正的训练了。

4. 启动训练与参数解析:看懂每一行命令在做什么

环境就绪,数据备好,现在来到了最激动人心的环节:启动训练。很多新手只是机械地复制粘贴命令,却不知道每个参数背后的含义,导致出问题时无从下手。这一章,我们就来拆解训练命令,让你不仅会跑,更懂为什么这么跑。

4.1 最小化启动命令

最基本的训练命令如下所示。假设你的数据集配置文件是my_dataset.yaml,你希望使用轻量级的yolov5s.pt模型作为起点进行训练(这称为“迁移学习”,能大大加快训练速度并提升效果),训练100个周期(epoch)。

python train.py --img 640 --batch 16 --epochs 100 --data my_dataset.yaml --weights yolov5s.pt

我们来逐一解析这些核心参数:

  • --img 640: 这是输入图片的尺寸。YOLOv5在训练前会将所有图片统一缩放到这个尺寸(长边缩放到640,短边按比例缩放,然后进行填充)。为什么是640?这是一个在速度和精度之间取得较好平衡的默认值。增大尺寸(如1280)可以提升对小目标的检测能力,但会显著增加显存消耗和训练时间。减小尺寸(如320)则相反。对于新手,首次训练建议保持640。
  • --batch 16: 批处理大小(Batch Size)。即每次迭代送入模型训练的图片数量。这个参数至关重要,它直接受你的显卡显存(GPU Memory)限制。如果设置太大,会报“CUDA out of memory”错误。对于一张8GB显存的消费级显卡(如RTX 3070),--batch 16通常是安全的。如果你的显存更小(如6GB),可能需要降低到8或4。你可以先尝试16,如果报错,再逐步减半。
  • --epochs 100: 训练周期数。模型会完整地遍历整个训练集100次。太少可能学不够,太多可能导致过拟合(在训练集上表现很好,在验证集上变差)。100是一个常用的起始值,你可以通过观察后续的评估指标来决定是否需要增加。
  • --data my_dataset.yaml: 指定我们上一章创建的数据集配置文件路径。确保路径正确。
  • --weights yolov5s.pt: 指定预训练权重。这里我们使用在COCO数据集上预训练过的yolov5s.pt(s代表small)。从预训练模型开始,相当于让模型已经有了识别通用物体(边、角、纹理等)的基础能力,我们只需要教它识别我们的特定类别,这比从零开始训练快得多、好得多。

4.2 训练过程监控与输出解读

当你按下回车,训练就开始了。控制台会刷出大量信息,别被吓到,我们需要关注的是以下几类:

  1. 硬件与资源信息:一开始会显示GPU型号、CUDA是否可用、批处理大小等。确认GPU被正确使用。
  2. 数据集信息:会显示加载的类别名称和数量,检查是否正确。
  3. 训练进度条:显示当前epoch的进度。每个epoch结束后,会打印一系列评估指标。
  4. 关键指标解读(重中之重)
    • box_loss,obj_loss,cls_loss: 这是三个损失函数的值,它们应该在训练过程中总体呈下降趋势。损失值越低,说明模型的预测越接近真实标注。如果损失剧烈波动或上升,说明学习率可能设置不当或数据有问题。
    • metrics/mAP_0.5metrics/mAP_0.5:0.95:这是衡量模型性能的核心指标。
      • mAP_0.5:当交并比(IoU,预测框和真实框的重叠程度)阈值为0.5时的平均精度(mean Average Precision)。这个值越高越好,通常能达到0.8甚至0.9以上就非常不错了。
      • mAP_0.5:0.95:在IoU阈值从0.5到0.95(步长0.05)区间内,计算的平均mAP。这是一个更严格的指标,因为它要求预测框定位更精准。这个值通常会低很多,它的上升更能体现模型定位能力的提升。
    • val/box_loss等:这是在验证集上计算的损失,用于监控模型是否过拟合。理想情况下,训练损失和验证损失应该同步下降。如果训练损失持续下降,但验证损失停止下降甚至开始上升,这就是典型的过拟合信号,意味着模型只记住了训练数据,而没有学会泛化。

4.3 重要进阶参数与调优初探

当你跑通第一次训练后,可以尝试调整一些参数来提升效果:

  • --workers 8: 数据加载的进程数。可以加快数据从硬盘读到内存的速度。通常设置为CPU核心数。如果训练时出现内存错误,可以尝试降低此值。
  • --cache: 可选ramdisk。将数据集缓存到内存或磁盘,可以极大加速训练,尤其是当你的图片很多时。但需要足够大的内存。
  • --hyp data/hyps/hyp.scratch-low.yaml: 指定超参数配置文件。YOLOv5提供了一些预设的超参数组合(如针对低数据量的hyp.scratch-low.yaml)。超参数包括学习率、动量、权重衰减等,是控制模型学习行为的“旋钮”。新手可以先使用默认值,等有了经验再尝试微调。
  • --resume: 如果训练意外中断(比如断电),你可以使用这个参数接续上一次的训练。例如--resume runs/train/exp/weights/last.pt,它会从上次保存的最后一个权重继续训练。

实操心得:第一次训练时,我建议先用小批量数据(比如每个类别50张图)和较少的epoch(如20-30)跑一个“快速实验”。这能在几分钟到一小时内完成,目的是验证整个数据管道和训练流程是否畅通,避免在错误配置上浪费几个小时甚至几天时间。确认流程无误后,再用全量数据和更多epoch进行正式训练。

训练开始后,YOLOv5会在runs/train/目录下自动创建一个新的实验文件夹(如exp,exp2…)。里面包含了训练过程中所有的宝贵资料:模型权重文件(weights/best.pt是验证集上表现最好的,weights/last.pt是最后一个epoch的)、损失曲线和指标曲线图、验证集的检测结果示例等等。这些是你分析和改进模型的重要依据。

5. 模型评估与性能分析:你的模型真的“学会”了吗?

训练完成后,我们得到的best.pt文件就是最终的模型。但是,训练结束并不意味着万事大吉。我们必须客观地评估这个模型,弄清楚它到底学得怎么样,哪里强,哪里弱。这一章,我们就来学习如何解读训练结果,并使用工具对模型进行全面的“体检”。

5.1 可视化训练日志:从曲线中发现问题

训练过程中生成的各种图表是诊断模型健康状况的第一手资料。打开runs/train/exp目录(假设你的实验文件夹是exp),你会找到几个关键的.png图像文件:

  1. results.png:这是最重要的综合报告。它通常包含多个子图:
    • 损失曲线(Train/Validation Box, Object, Classification Loss):观察三条损失曲线是否平滑下降。如果验证损失在某个点后开始上升,而训练损失持续下降,这是过拟合的明确信号。此时应该考虑提前停止训练、增加数据增强的强度,或者为模型添加正则化(如Dropout)。
    • 精度/召回率曲线(Precision-Recall Curve):对于每个类别,都会有一条P-R曲线。曲线下的面积越大,说明模型在该类别上的性能越好。如果某个类别的曲线非常靠近左下角,说明模型很难检测出这个类别,可能需要补充更多该类别的训练样本。
    • mAP曲线(mAP@0.5, mAP@0.5:0.95):观察这两个指标随训练epoch的变化。理想情况下,它们应该稳步上升并最终趋于平稳。如果mAP在后期波动很大,可能是学习率设置过高。
  2. confusion_matrix.png:混淆矩阵。这个矩阵揭示了模型最容易混淆哪些类别。比如,矩阵中“猫”的行和“狗”的列如果有一个较高的值,说明模型经常把猫误认为狗,反之亦然。这提示我们,可能需要收集更多能清晰区分这两个类别的样本,或者在标注时确保边界更清晰。
  3. val_batchX_labels.jpgval_batchX_pred.jpg:这些是验证集批次的可视化结果。_labels.jpg显示的是真实标注(Ground Truth),_pred.jpg显示的是模型的预测结果。通过对比,你可以直观地看到模型漏检了哪些目标(False Negative)、错误地检测了哪些不存在的目标(False Positive),以及定位是否准确。

5.2 使用验证脚本进行定量评估

训练脚本在最后会自动在验证集上评估一次。但我们也可以手动运行评估脚本,以获得更详细或在不同设置下的指标。使用val.py脚本:

python val.py --weights runs/train/exp/weights/best.pt --data my_dataset.yaml --img 640 --batch 32 --task val

这个命令会加载我们训练好的最佳模型(best.pt),在验证集上重新跑一遍评估,并输出详细的性能指标表格。你会看到每个类别的精确率(Precision)、召回率(Recall)、mAP@0.5和mAP@0.5:0.95。

  • 精确率(Precision):模型预测为正的样本中,真正为正的比例。高精确率意味着模型“很谨慎”,它说有目标,那很可能真的有。但可能会漏掉一些目标。
  • 召回率(Recall):所有真实为正的样本中,被模型正确预测出来的比例。高召回率意味着模型“很敏感”,它能找出大部分目标。但可能会把一些背景误认为目标。

通常,我们需要在精确率和召回率之间进行权衡。通过调整预测时的置信度阈值(--conf参数)可以调节这个平衡:提高阈值,模型会更“谨慎”,精确率上升,召回率下降;降低阈值,模型会更“敏感”,召回率上升,精确率下降。

5.3 在真实场景中测试:定性分析

定量指标很重要,但最终模型是要用在真实场景中的。因此,用一些训练集和验证集之外的“新图片”进行测试至关重要。

使用detect.py脚本,用你自己的模型对任意图片或视频进行推理:

python detect.py --source path/to/your/test_image.jpg --weights runs/train/exp/weights/best.pt --conf 0.25 --save-txt
  • --source: 可以是一张图片、一个包含图片的文件夹、一个视频文件,甚至是摄像头(0代表电脑默认摄像头)。
  • --conf: 置信度阈值。你可以尝试调整(如0.4, 0.5),观察检测结果的变化,为你的应用场景选择一个最合适的值。
  • --save-txt: 将检测结果(类别、位置)保存为YOLO格式的txt文件,便于后续分析或处理。

测试时重点观察什么?

  1. 漏检(False Negative):图片里明明有目标,模型却没检测出来。可能原因:目标太小、太模糊、遮挡严重,或者训练数据中此类样本不足。
  2. 误检(False Positive):图片里没有目标,模型却误报了一个框。可能原因:背景中有与目标相似的纹理或形状。
  3. 定位不准:框的位置和大小与真实物体偏差较大。可能原因:目标形状不规则,或者数据标注的框本身就不够精确。

通过这种定性的“肉眼检查”,你能发现很多定量指标无法反映的问题,从而明确下一步改进的方向:是回去补充数据?还是调整数据增强策略?或者是修改模型结构?

6. 模型导出与应用:让你的模型“跑起来”

训练出一个指标不错的模型,只是完成了上半场。下半场是如何将这个模型部署到实际的应用环境中,比如变成一个可以处理视频流的服务,或者集成到手机App、嵌入式设备里。YOLOv5提供了非常便捷的模型导出功能,支持多种运行时格式。

6.1 为什么要导出模型?

我们训练保存的.pt文件是PyTorch的模型权重和结构文件,它依赖于PyTorch环境才能运行。在实际部署中,我们往往希望:

  • 脱离Python环境:在C++、Java等环境中调用。
  • 提升推理速度:使用专门的推理引擎进行优化。
  • 减少依赖:模型文件更小,加载更快。

因此,我们需要将PyTorch模型转换为其他更通用的格式。

6.2 导出为ONNX格式

ONNX(Open Neural Network Exchange)是一个开放的模型格式标准,被众多推理引擎支持(如TensorRT, OpenVINO, ONNX Runtime等)。导出ONNX通常是部署的第一步。

python export.py --weights runs/train/exp/weights/best.pt --include onnx --img 640 --batch 1 --dynamic
  • --weights: 指定训练好的模型。
  • --include onnx: 指定导出格式为ONNX。
  • --img 640: 指定输入图片的尺寸,必须与训练时一致或兼容。
  • --batch 1: 指定批处理大小。部署时通常为1(单张图片推理)。你也可以指定一个固定值(如--batch 32)以获得更优的静态图性能。
  • --dynamic: 允许导出的模型接受动态的批处理大小和图片尺寸。这增加了灵活性,但某些推理引擎对动态尺寸支持不好。如果确定部署环境的输入尺寸固定,可以不加此参数以获得更好性能。

执行成功后,你会得到一个best.onnx文件。你可以使用Netron(一个开源模型可视化工具)打开这个文件,查看模型的计算图结构。

6.3 导出为TensorRT引擎(针对NVIDIA GPU)

如果你在NVIDIA的GPU上部署,并且追求极致的推理速度,那么TensorRT是不二之选。TensorRT会对模型进行图优化、层融合、精度校准(FP16/INT8),大幅提升效率。

YOLOv5的export.py脚本也支持直接导出为TensorRT的引擎文件(.engine),但这个过程通常需要先导出ONNX,再用TensorRT的转换工具进行转换。更简单的方式是使用YOLOv5内置的TensorRT支持(需要提前安装TensorRT):

python export.py --weights runs/train/exp/weights/best.pt --include engine --img 640 --batch 1

注意:TensorRT的安装和配置相对复杂,涉及CUDA、cuDNN、TensorRT多个组件的版本匹配。对于新手,可以先将ONNX模型部署到ONNX Runtime上,这是一个更简单、跨平台的选择。

6.4 简单的推理示例:使用导出的ONNX模型

导出的模型可以脱离原始的YOLOv5训练代码运行。这里给出一个使用Python和ONNX Runtime进行推理的极简示例:

import cv2 import numpy as np import onnxruntime as ort # 1. 加载ONNX模型 session = ort.InferenceSession('best.onnx', providers=['CUDAExecutionProvider', 'CPUExecutionProvider']) # 获取输入输出信息 input_name = session.get_inputs()[0].name output_name = session.get_outputs()[0].name # 2. 准备输入图像 img = cv2.imread('test.jpg') # 预处理:缩放、归一化、转换通道顺序 (HWC to CHW) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_resized = cv2.resize(img_rgb, (640, 640)) input_img = img_resized.transpose(2, 0, 1).astype(np.float32) / 255.0 # HWC to CHW, 归一化 input_img = np.expand_dims(input_img, axis=0) # 添加批次维度: (1, 3, 640, 640) # 3. 运行推理 outputs = session.run([output_name], {input_name: input_img})[0] # outputs形状: (1, 25200, 85) # 4. 后处理(解析outputs,应用置信度阈值和NMS非极大值抑制) # 这里省略了复杂的后处理代码,YOLOv5官方提供了详细的示例。 # 后处理的目的是从outputs中提取出最终的框、置信度和类别。 # 5. 将检测框画回原图 # ... (后处理得到boxes, scores, class_ids) # for box in boxes: # x1, y1, x2, y2 = box # cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) # cv2.imshow('Result', img) # cv2.waitKey(0)

这个示例展示了核心流程:加载模型、预处理图像、运行推理、后处理结果。后处理部分(将模型输出的密集预测解码成具体的框)是YOLO系列模型推理中的关键步骤,涉及置信度过滤和NMS算法,代码相对固定但较长,你可以参考YOLOv5官方detect.pymodels/common.py中的相关函数。

6.5 部署思路拓展

有了ONNX模型,你的部署选项就非常丰富了:

  • 服务器端(Python):使用ONNX Runtime或TensorRT提供高性能的API服务(如FastAPI)。
  • 服务器端(C++):使用ONNX Runtime C++ API或TensorRT C++ API,获得更高的性能和更低的延迟。
  • 移动端/边缘设备:将ONNX模型转换为相应平台支持的格式,如使用NCNN(手机端)、MNN或TFLite,在安卓/iOS或树莓派等设备上运行。
  • Web端:甚至可以通过ONNX.js在浏览器中运行模型。

从训练到部署的完整闭环,是AI项目产生实际价值的关键一步。虽然每一步都有细节需要打磨,但YOLOv5已经为我们铺平了大部分道路。当你亲手训练的模型成功在某个真实场景中识别出目标时,那种成就感是无与伦比的。这不仅仅是学会了一个工具,更是掌握了将想法变为现实的能力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/15 6:14:21

PyTorch优化基础与最小二乘法实践指南

1. PyTorch优化基础与最小二乘法实践在深度学习框架PyTorch的实际应用中&#xff0c;优化算法扮演着至关重要的角色。最近在复现经典论文时&#xff0c;我重新梳理了优化思想的基础脉络&#xff0c;发现很多看似复杂的神经网络训练问题&#xff0c;其核心都可以追溯到最小二乘法…

作者头像 李华
网站建设 2026/8/15 6:12:42

告别Mac误触灾难:详解Command+Q防护方案与系统优化

1. 从一次“手滑”引发的数据灾难说起如果你和我一样&#xff0c;是个常年泡在Mac上的重度用户&#xff0c;那你一定对Command Q这个快捷键又爱又恨。爱的是&#xff0c;它确实高效&#xff0c;手指一抬一落&#xff0c;程序瞬间退出&#xff0c;干净利落。恨的是&#xff0c;…

作者头像 李华
网站建设 2026/8/15 6:12:39

《三国战纪119》终极攻略:从系统机制到角色精通

1. 从“119”说起&#xff1a;一个街机时代的版本密码如果你在街机厅里泡过&#xff0c;或者现在还在用模拟器回味老游戏&#xff0c;那“三国战纪”这四个字的分量&#xff0c;你肯定懂。但“119”这个后缀&#xff0c;对很多新入坑的朋友来说&#xff0c;可能就有点摸不着头脑…

作者头像 李华
网站建设 2026/8/15 6:11:08

VS Code代码颜色自定义指南:从原理到实践,打造个性化高亮方案

1. 为什么你需要自定义代码颜色&#xff1f;如果你每天在VS Code里敲代码的时间超过4小时&#xff0c;那么你眼睛的舒适度&#xff0c;很大程度上就取决于你面前那堆五颜六色的字符。默认的配色方案&#xff0c;比如“Dark”或者“Light”&#xff0c;是微软团队为大众口味调校…

作者头像 李华
网站建设 2026/8/15 6:10:33

解决WLAN无有效IP配置:从DHCP原理到Windows网络故障排查全攻略

1. 问题现象与核心原因剖析“WLAN没有有效的IP配置”这个弹窗&#xff0c;对于任何一个依赖无线网络工作或娱乐的人来说&#xff0c;都堪称一场噩梦。它通常表现为电脑右下角的网络图标上出现一个黄色的感叹号&#xff0c;点击后提示“无Internet访问”或直接显示这个错误。更具…

作者头像 李华
网站建设 2026/8/15 6:07:29

从AI工程化视角解析复杂系统架构:以AI编码助手为例

1. 从一次“意外”的源码泄露说起前几天&#xff0c;我像往常一样在几个技术社区和开源项目里“闲逛”&#xff0c;突然被一个讨论串吸引了。标题大概是“Claude Code的源码好像泄露了&#xff1f;”&#xff0c;点进去一看&#xff0c;讨论已经盖了几百楼。有人贴出了疑似源码…

作者头像 李华