
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这个开源工具它简单直观非常适合新手。安装LabelImg可以通过pip安装pip install labelimg然后在命令行输入labelimg即可打开。标注过程用LabelImg打开图片用矩形框快捷键w框住目标物体然后输入类别名称如“helmet”。框的位置要尽可能紧密地贴合目标物体。保存格式在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环境。强烈建议使用Anaconda或Miniconda来管理环境它可以避免不同项目间的包版本冲突。安装Conda去Anaconda官网下载并安装适合你系统的版本。安装时记得勾选“Add Anaconda to my PATH environment variable”将Anaconda添加到环境变量这能避免后续很多命令找不到的问题。创建虚拟环境打开Anaconda PromptWindows或终端Mac/Linux执行以下命令创建一个名为yolov5的Python 3.8环境Python 3.8是经过大量验证与YOLOv5兼容性较好的版本conda create -n yolov5 python3.8激活这个环境conda activate yolov5你会看到命令行提示符前面从(base)变成了(yolov5)表示你已经在这个独立环境中了。3.2 核心依赖PyTorch与CUDA这是最关键也最容易出错的一步。YOLOv5基于PyTorch框架而PyTorch如果需要GPU加速就必须和CUDANVIDIA显卡的并行计算平台版本匹配。确认你的显卡和CUDA驱动在命令行输入nvidia-smi。顶部会显示你的CUDA Driver VersionCUDA驱动版本。例如显示CUDA Version: 11.4。记住这个数字它决定了你能安装的最高CUDA Toolkit版本。去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。执行安装命令官网会生成类似下面的命令。在你的(yolov5)环境中执行它。# 例如对于CUDA 11.3 conda install pytorch torchvision torchaudio cudatoolkit11.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代码与安装剩余依赖克隆代码在你想存放项目的目录下打开命令行确保在yolov5环境中使用Git克隆官方仓库git clone https://github.com/ultralytics/yolov5 cd yolov5如果网络不好也可以直接在GitHub页面下载ZIP包并解压。安装项目依赖YOLOv5项目根目录下有一个requirements.txt文件列出了所有需要的Python包。使用pip安装pip install -r requirements.txt这个命令会自动安装OpenCV-Python、Matplotlib、Pandas等所有必要的库。3.4 验证环境跑一个官方Demo在投入自己的数据之前最好用官方预训练模型和示例数据验证一下整个环境是否工作正常。这能帮你排除环境问题确保后续步骤的顺利。下载预训练模型YOLOv5提供了从轻量级到高精度的一系列预训练模型如yolov5s.pt, yolov5m.pt等。我们可以用代码自动下载最小的yolov5s.pt但也可以手动从GitHub Release页面下载放到项目根目录。运行检测脚本在项目根目录下执行python detect.py --source data/images --weights yolov5s.pt --conf 0.25--source: 指定输入源这里使用自带的示例图片。--weights: 指定模型权重文件。--conf: 置信度阈值低于此值的目标将被过滤掉。查看结果运行结束后结果会保存在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.pts代表small。从预训练模型开始相当于让模型已经有了识别通用物体边、角、纹理等的基础能力我们只需要教它识别我们的特定类别这比从零开始训练快得多、好得多。4.2 训练过程监控与输出解读当你按下回车训练就开始了。控制台会刷出大量信息别被吓到我们需要关注的是以下几类硬件与资源信息一开始会显示GPU型号、CUDA是否可用、批处理大小等。确认GPU被正确使用。数据集信息会显示加载的类别名称和数量检查是否正确。训练进度条显示当前epoch的进度。每个epoch结束后会打印一系列评估指标。关键指标解读重中之重box_loss,obj_loss,cls_loss: 这是三个损失函数的值它们应该在训练过程中总体呈下降趋势。损失值越低说明模型的预测越接近真实标注。如果损失剧烈波动或上升说明学习率可能设置不当或数据有问题。metrics/mAP_0.5和metrics/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: 可选ram或disk。将数据集缓存到内存或磁盘可以极大加速训练尤其是当你的图片很多时。但需要足够大的内存。--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图像文件results.png这是最重要的综合报告。它通常包含多个子图损失曲线Train/Validation Box, Object, Classification Loss观察三条损失曲线是否平滑下降。如果验证损失在某个点后开始上升而训练损失持续下降这是过拟合的明确信号。此时应该考虑提前停止训练、增加数据增强的强度或者为模型添加正则化如Dropout。精度/召回率曲线Precision-Recall Curve对于每个类别都会有一条P-R曲线。曲线下的面积越大说明模型在该类别上的性能越好。如果某个类别的曲线非常靠近左下角说明模型很难检测出这个类别可能需要补充更多该类别的训练样本。mAP曲线mAP0.5, mAP0.5:0.95观察这两个指标随训练epoch的变化。理想情况下它们应该稳步上升并最终趋于平稳。如果mAP在后期波动很大可能是学习率设置过高。confusion_matrix.png混淆矩阵。这个矩阵揭示了模型最容易混淆哪些类别。比如矩阵中“猫”的行和“狗”的列如果有一个较高的值说明模型经常把猫误认为狗反之亦然。这提示我们可能需要收集更多能清晰区分这两个类别的样本或者在标注时确保边界更清晰。val_batchX_labels.jpg和val_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、mAP0.5和mAP0.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文件便于后续分析或处理。测试时重点观察什么漏检False Negative图片里明明有目标模型却没检测出来。可能原因目标太小、太模糊、遮挡严重或者训练数据中此类样本不足。误检False Positive图片里没有目标模型却误报了一个框。可能原因背景中有与目标相似的纹理或形状。定位不准框的位置和大小与真实物体偏差较大。可能原因目标形状不规则或者数据标注的框本身就不够精确。通过这种定性的“肉眼检查”你能发现很多定量指标无法反映的问题从而明确下一步改进的方向是回去补充数据还是调整数据增强策略或者是修改模型结构6. 模型导出与应用让你的模型“跑起来”训练出一个指标不错的模型只是完成了上半场。下半场是如何将这个模型部署到实际的应用环境中比如变成一个可以处理视频流的服务或者集成到手机App、嵌入式设备里。YOLOv5提供了非常便捷的模型导出功能支持多种运行时格式。6.1 为什么要导出模型我们训练保存的.pt文件是PyTorch的模型权重和结构文件它依赖于PyTorch环境才能运行。在实际部署中我们往往希望脱离Python环境在C、Java等环境中调用。提升推理速度使用专门的推理引擎进行优化。减少依赖模型文件更小加载更快。因此我们需要将PyTorch模型转换为其他更通用的格式。6.2 导出为ONNX格式ONNXOpen 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支持需要提前安装TensorRTpython 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, axis0) # 添加批次维度: (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.py或models/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已经为我们铺平了大部分道路。当你亲手训练的模型成功在某个真实场景中识别出目标时那种成就感是无与伦比的。这不仅仅是学会了一个工具更是掌握了将想法变为现实的能力。