YOLOv3模型训练全流程实战:从数据准备到调优部署

📅 发布时间:2026/8/11 4:49:56
YOLOv3模型训练全流程实战:从数据准备到调优部署 1. 项目概述从零到一亲手训练一个YOLOv3检测器搞目标检测YOLO系列绝对是绕不开的名字。从最初的YOLOv1到如今百花齐放的v5、v7、v8甚至各种变体这个家族一直以速度和精度的良好平衡著称。而YOLOv3在我看来是承前启后的关键一代。它不像初代那样“简陋”也不像后续版本那样集成了大量工程化技巧和复杂的模块其结构清晰原理相对直观是理解“一阶段one-stage”目标检测算法精髓的绝佳入口。很多朋友拿到一个预训练模型跑个Demo觉得效果不错但一旦要让它识别自己业务里的特定物体比如生产线上的瑕疵、果园里的成熟果实或者监控场景中的特定行为就发现模型“不认识”了。这时候模型训练就成了必须跨越的坎。今天我就以“yolov3一模型训练”为核心带你完整走一遍从环境搭建、数据准备、模型配置到训练调优的全过程。这不是一个简单的命令罗列我会把每一步背后的逻辑、我踩过的坑、以及那些能让训练事半功倍的小技巧都揉碎了讲给你听。无论你是刚入门的新手还是想系统梳理YOLOv3训练流程的开发者这篇文章都能给你提供一份可直接“抄作业”的实操指南。我们的目标很明确不依赖任何现成的、封装过度的训练平台就用最“原始”的代码比如Darknet原版或PyTorch复现版亲手打造一个能解决实际问题的YOLOv3模型。2. 核心思路与方案选型为什么是YOLOv3及如何选择实现框架在动手之前我们得先想清楚两个问题第一为什么在2023年甚至更晚我们还要学习训练YOLOv3第二面对众多的实现版本我们该选哪一个2.1 为何选择YOLOv3作为训练入门你可能听过YOLOv5更易用YOLOv8精度更高。但对于学习和深入理解目标检测的训练过程YOLOv3有不可替代的优势。结构透明易于理解YOLOv3的骨干网络是Darknet-53一个全卷积网络没有特别复杂的注意力机制或动态结构。它的三个检测头对应大、中、小目标设计直观特征金字塔网络FPN的思想也在这里得到了清晰的体现。你能清晰地看到特征图是如何从深层融合到浅层从而让模型同时具备识别大目标和小目标的能力。这种透明性让你在调试时能更准确地定位问题所在比如是特征提取能力不足还是检测头设计有问题。资源友好复现成本低相较于更大的模型如YOLOv4的CSPDarknet-53或一些Transformer-based的检测器YOLOv3对算力的要求相对亲民。在一张消费级的GPU如RTX 3060 12GB上你就能以不错的batch size进行训练。这意味着个人开发者、学生或小团队完全有能力在自己的机器上完成整个训练流程无需依赖昂贵的云端算力。生态成熟资料丰富YOLOv3是2018年提出的经过多年的沉淀其原版Darknet实现以及各种PyTorch、TensorFlow复现版本都非常成熟。你在训练中遇到的几乎任何问题都能在GitHub issues、Stack Overflow或相关博客中找到大量的讨论和解决方案。这种丰富的社区支持对于解决训练过程中的各种“玄学”问题至关重要。仍是有效的基线模型在很多对实时性要求高、但计算资源受限的边缘设备或移动端场景经过精心设计和剪枝、量化的YOLOv3变体仍然被广泛使用。理解其原生版本的训练是后续进行模型优化、轻量化部署的坚实基础。2.2 训练框架选型Darknet vs. PyTorch这是训练YOLOv3的第一个关键决策点。主流选择有两个Joseph Redmon原版的Darknet框架以及社区流行的PyTorch复现版本如ultralytics的旧版yolov3或mmdetection等。Darknet (原版)优点官方正统由YOLO作者编写最符合论文思想是事实上的“标准答案”。极致性能用C和CUDA编写推理速度通常是最快的。配置驱动网络结构、训练参数全部通过.cfg配置文件管理修改模型结构如更换骨干网络、调整检测头数量无需改动代码只需改配置文件非常清晰。缺点生态孤立Darknet是一个独立的深度学习框架与主流的PyTorch/TensorFlow生态不互通。加载预训练权重、使用其他数据增强库、或者想将训练好的模型方便地转换到其他框架如ONNX进行部署会多出许多转换步骤比较麻烦。调试不便C语言编写对于习惯Python动态调试的开发者来说定位训练中的bug如损失NaN会更困难。扩展性弱如果你想尝试新的损失函数、新的数据增强方法需要直接修改C源码并重新编译门槛较高。PyTorch (社区复现版)优点生态强大无缝融入PyTorch生态。可以轻松使用torchvision的数据增强、tensorboard进行可视化、利用丰富的预训练模型如用ImageNet预训练的Darknet-53权重虽然需要转换格式以及最终通过torch.jit或onnx进行灵活部署。调试友好Python编写可以方便地使用pdb或IDE设置断点逐行查看张量值调试训练过程异常轻松。易于定制和实验如果你想修改网络结构、尝试新的训练技巧如不同的学习率调度器、混合精度训练直接在Python脚本中修改即可快速迭代。社区活跃以PyTorch实现的版本通常有更活跃的维护和更新容易找到适配最新CUDA和PyTorch版本的代码。缺点性能开销纯Python实现的前向和反向传播通常比高度优化的C/CUDA代码Darknet慢一些尤其是在CPU上。实现变体多不同开发者复现的细节可能有差异如边界框损失函数的实现、正负样本匹配策略需要仔细甄别代码质量。我的选择与建议 对于学习和研究目的尤其是计划后续进行模型修改、实验对比的我强烈推荐使用PyTorch版本。它带来的调试便利性和生态红利远远超过那一点潜在的性能损失。本文后续的实操也将基于一个高质量、易于理解的PyTorch复现版本来展开。对于追求极致推理速度、且模型确定无需改动的生产环境可以考虑使用Darknet训练然后通过工具转换为其他推理引擎格式。注意无论选择哪个框架其训练的核心流程数据准备、配置、训练循环是相通的。理解了原理切换框架只是适应新API的问题。3. 训练前的核心准备工作数据、环境与配置兵马未动粮草先行。训练一个稳健的模型80%的功夫在训练开始之前。这部分工作琐碎但至关重要直接决定了训练的成败和模型的上限。3.1 数据准备与标注质量大于一切模型终究是从数据中学习规律的。糟糕的数据再高超的训练技巧也救不回来。1. 数据收集与清洗场景匹配确保你的训练图片来自与最终应用场景相同的分布。比如做交通监控就尽量用道路摄像头拍摄的图片而不是网络上的艺术照。多样性目标物体要有尺度、角度、光照、遮挡、背景的变化。例如要检测行人就需要有远距离的小行人、近距离的行人、侧面/背面行人、白天/夜晚、晴天/雨天的行人。数量要求YOLOv3这类中等复杂度模型每个类别至少需要几百到上千个标注实例才能学到有效的特征。当然数据越多越好但质量优先。清洗剔除模糊、无关、标注错误的图片。2. 数据标注格式 YOLO系列使用的是一种简洁的标注格式。每张图片对应一个同名的.txt文件。文件内容每一行代表一个标注框。每行格式class_id x_center y_center width heightclass_id物体的类别索引从0开始。x_center, y_center边界框中心点的坐标归一化到[0, 1]区间即除以图片宽度和高度。width, height边界框的宽度和高度同样归一化到[0, 1]区间。示例一张1024x768的图片中有一个类别为0比如“狗”的物体其边界框左上角坐标为(100, 200)右下角为(500, 600)。中心点 x (100 500) / 2 / 1024 600 / 2 / 1024 ≈ 0.293中心点 y (200 600) / 2 / 768 800 / 2 / 768 ≈ 0.521宽度 w (500 - 100) / 1024 ≈ 0.391高度 h (600 - 200) / 768 ≈ 0.521标注行即为0 0.293 0.521 0.391 0.521你可以使用LabelImg、CVAT、Roboflow等工具进行标注它们通常支持导出YOLO格式。3. 数据集组织 一个清晰的数据集目录结构能让后续步骤省心很多。我推荐如下结构your_dataset/ ├── images/ │ ├── train/ # 存放所有训练图片 │ │ ├── 001.jpg │ │ └── ... │ └── val/ # 存放所有验证图片 │ ├── 100.jpg │ └── ... └── labels/ ├── train/ # 存放所有训练标签(.txt文件)与images/train/一一对应 │ ├── 001.txt │ └── ... └── val/ # 存放所有验证标签 ├── 100.txt └── ...4. 创建数据集配置文件 我们需要一个.data文件Darknet风格或一个.yaml文件PyTorch风格更常见来告诉模型数据在哪里、有多少类。 以dataset.yaml为例# 数据集根目录路径 (建议使用绝对路径避免相对路径引发的错误) path: /home/user/projects/my_yolo_dataset # 训练集和验证集的图片路径 (相对于path或绝对路径) train: images/train val: images/val # 类别数量 nc: 2 # 类别名称列表 names: [cat, dog]3.2 训练环境搭建我们选择PyTorch环境。确保你的机器有NVIDIA GPU和对应的CUDA环境。创建并激活虚拟环境推荐conda create -n yolo_train python3.8 conda activate yolo_train安装PyTorch 前往 PyTorch官网 根据你的CUDA版本选择安装命令。例如对于CUDA 11.8pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118安装其他依赖 除了PyTorch我们还需要一些常用库。pip install opencv-python matplotlib tqdm scipy pyyaml tensorboard pandas seaborn # 如果需要安装albumentations用于高级数据增强 # pip install albumentations获取训练代码 我们需要一个YOLOv3的PyTorch实现。这里我推荐一个结构清晰、易于理解的版本例如一个简化版的yolov3目录。你可以从GitHub克隆或者自己根据论文实现一个基础版本。核心是拥有以下几个文件models/: 包含Darknet、YOLOLayer等模型定义。utils/: 包含数据加载datasets.py、损失计算loss.py、指标计算metrics.py等工具。train.py: 主训练脚本。test.py: 测试脚本。detect.py: 推理脚本。3.3 模型配置文件解析与修改YOLOv3的模型结构是通过配置文件定义的。在PyTorch复现中我们通常用一个Python字典或yaml文件来配置。但为了和原版对齐理解我们先看Darknet的.cfg文件因为其结构定义最为经典。一个典型的yolov3.cfg文件开头是网络结构[net] # 训练相关超参数 batch64 subdivisions16 width608 height608 channels3 ...然后是连续的[convolutional]、[shortcut]残差连接、[route]特征图拼接/路由、[upsample]上采样和[yolo]检测层模块。你需要重点关注并修改的地方输入尺寸([net]节下的width和height)必须是32的倍数因为网络有5次步长为2的下采样2^532。常见尺寸有416x416608x608。尺寸越大对小目标检测越好但训练和推理更慢显存占用更高。对于大多数场景416x416是一个不错的起点。类别数([yolo]层下的classes)文件中会有三个[yolo]层对应三个尺度的检测头。你需要将每个[yolo]层下的classes参数改为你自己的类别数例如classes2。先验框Anchors([yolo]层下的anchors)每个[yolo]层都有一组预设的anchors。这些anchors是在COCO等大数据集上通过k-means聚类得到的代表了目标常见的宽高比。强烈建议针对你自己的数据集重新聚类anchors。因为你的目标比如手机、遥控器的宽高比可能和COCO中的“人”、“车”差异很大。使用合适的anchors能显著提升模型收敛速度和最终精度。如何聚类你可以使用代码很多YOLO仓库的utils里都有kmeans_anchor.py这样的脚本对你的训练集所有标注框的宽高进行k-means聚类k9因为3个检测头各3个anchor得到9组新的(width, height)然后按尺度分配到三个[yolo]层尺度最小的检测头对应最大的anchor因为它在深层感受野大负责检测大目标。每个[yolo]层前的[convolutional]层的filters数量这个filters决定了输出通道数计算公式为filters (classes 5) * 3。其中5代表(x_center, y_center, width, height, confidence)3代表该检测层每个位置预测3个边界框。例如你有2个类别那么filters (2 5) * 3 21。你需要修改每个[yolo]层紧前面的那个[convolutional]层的filters参数。在PyTorch实现中这些配置可能被写在一个model.yaml或直接在代码中用字典定义。原理是完全相同的。4. 模型训练全流程实操与核心参数解读环境、数据、模型都准备好了现在可以启动训练了。训练脚本train.py是我们的大脑它控制着整个学习过程。4.1 启动训练命令与关键参数一个典型的训练启动命令如下假设我们使用一个名为train.py的脚本python train.py \ --data dataset.yaml \ --cfg yolov3.yaml \ --weights \ --epochs 300 \ --batch-size 16 \ --img-size 416 \ --device 0 \ --workers 4 \ --name my_first_yolov3_exp让我们逐一拆解这些参数理解它们背后的意义--data: 指向我们之前创建的dataset.yaml文件。脚本从这里知道数据在哪、有多少类。--cfg: 模型结构配置文件。如果是Darknet的.cfg文件脚本内部会解析并构建对应模型如果是PyTorch的.yaml则直接加载模型定义。--weights: 预训练权重的路径。这是影响训练速度和效果最关键的因素之一。如果设置为空字符串则从头开始随机初始化训练。不推荐除非你的数据量极大否则很难收敛到一个好结果。强烈建议加载在ImageNet上预训练的Darknet-53权重通常是一个.pth或.weights文件。这能让你的模型从优秀的图像特征提取能力开始学习大大加速收敛并提升最终精度。你可以从一些开源仓库下载转换好的PyTorch格式的Darknet-53权重。命令示例--weights ./weights/darknet53.conv.74.pth--epochs: 训练的总轮数。300是一个常用值但需要根据你的数据集大小和收敛情况调整。可以通过观察验证集指标早停。--batch-size: 每次输入模型的图片数量。受限于GPU显存。更大的batch size通常能使梯度估计更稳定可能有助于收敛但也会占用更多显存。如果出现OOM显存不足需要减小此值或减小img-size。--img-size: 输入图片的尺寸。需要和模型配置文件中的尺寸一致。训练时脚本会将所有图片统一缩放到此尺寸。--device: 指定GPU设备。0代表第一块GPU。如果有多个可以用0,1,2。--workers: 数据加载的子进程数。用于并行加载和预处理数据以提升数据吞吐避免训练循环等待数据。通常设置为CPU核心数左右。--name: 本次实验的名称。用于创建保存权重和日志的目录方便区分不同实验。4.2 训练过程监控与可视化训练启动后我们不能干等着。需要实时监控训练状态判断是否正常。1. 控制台输出信息解读 训练脚本会在每个batch或每个epoch后打印日志通常包括Epoch gpu_mem box obj cls total targets img_size 0/299 3.92G 0.12345 0.05678 0.03456 0.21479 12 416: 100%|██████████| 100/100 [01:2300:00, 1.20it/s] Class Images Labels P R mAP.5 mAP.5:.95: 100%|██████████| 20/20 [00:0500:00, 3.85it/s] all 400 2500 0.123 0.456 0.234 0.123gpu_mem: GPU显存使用情况检查是否接近上限。box,obj,cls,total: 分别是边界框回归损失、目标置信度损失、分类损失和总损失。关注总损失total是否在持续、平稳地下降这是训练正常的最重要标志。targets: 当前batch中被匹配为正样本的锚框数量。如果这个数长期为0或极低说明anchors可能设置得非常不合理或者正负样本匹配策略有问题。验证阶段会输出精度指标P(Precision): 精确率模型预测为正的样本中真正为正的比例。R(Recall): 召回率所有真实的正样本中被模型预测出来的比例。mAP.5: 在IoU阈值为0.5时的平均精度均值是目标检测的核心指标。mAP.5:.95: 在IoU阈值从0.5到0.95步长0.05区间内的平均mAP更严格的指标。2. 使用TensorBoard进行可视化 更强大的监控工具是TensorBoard。好的训练脚本会在runs/目录下生成日志。tensorboard --logdir runs/然后在浏览器打开localhost:6006。你需要重点关注以下几个面板Scalars: 查看损失、学习率、各项精度指标随训练步数/轮数的变化曲线。理想情况下训练损失平滑下降验证精度稳步上升。Images: 查看训练或验证过程中模型在当前权重下的预测结果。可以直观地看到模型“学得怎么样”哪些目标漏检、哪些误检。Distributions / Histograms: 查看模型权重、梯度的分布变化。如果权重或梯度突然变得异常大爆炸或变成NaN这里能看出来。4.3 学习率策略与优化器选择学习率是训练神经网络最重要的超参数之一。YOLOv3通常使用随机梯度下降SGD或Adam优化器。SGD with Momentum: 这是原版Darknet和很多稳定训练的首选。它虽然收敛可能慢一点但最终解往往更好泛化能力更强。学习率通常需要精心设计调度策略。Adam: 自适应学习率初期收敛快对初始学习率不那么敏感。但在一些报告中其最终精度可能略低于精调过的SGD。学习率调度策略 YOLOv3常用的是带热启动的余弦退火或分段常数衰减。热身Warmup: 在训练最开始如前几个epoch或若干步学习率从一个很小的值如1e-4线性增长到初始学习率如1e-2。这有助于稳定训练初期防止梯度爆炸。余弦退火Cosine Annealing: 学习率随着训练过程按余弦函数从初始值衰减到接近0。这种策略通常能取得更好的模型性能。分段衰减: 例如在总epoch的60%和80%时将学习率乘以0.1。这是一种更直接的手动策略。在你的train.py脚本中通常会有一个create_optimizer和create_scheduler函数来配置这些。初始学习率lr0需要根据你的batch size调整。一个经验法则是当batch size翻倍时初始学习率也可以大致翻倍。例如batch64时lr0.01那么batch16时lr可以设为0.0025左右。4.4 数据增强提升模型泛化能力的关键数据增强是在不增加真实数据的情况下扩充数据集多样性、提升模型泛化能力的核心技术。YOLOv3训练中通常会使用一系列增强。基础增强通常在数据加载器中实现随机水平翻转简单的几何变换对大多数场景有效。随机缩放和长宽比扭曲例如在0.5到1.5倍之间随机缩放图片并轻微改变宽高比模拟目标尺度变化。色彩空间扰动调整图像的色调、饱和度、亮度和对比度。模拟不同光照条件。马赛克增强Mosaic这是YOLOv4引入并被广泛采纳的强大增强。将4张训练图片随机拼接成一张大图。这能让模型在一个batch内看到更多不同尺度的目标并且学习在更复杂的上下文中识别物体对小目标检测尤其有益。混合MixUp以一定比例混合两张图片及其标签。能进一步增加数据多样性起到正则化作用。实操心得 数据增强不是越强越好。过于激进的增强如极大的旋转、裁剪可能会破坏目标的语义信息反而让模型学偏。建议循序渐进先使用基础增强翻转、缩放、色彩抖动训练一个基线模型。如果模型在验证集上过拟合训练损失很低验证精度上不去再逐步引入更复杂的增强如马赛克和MixUp。你可以通过TensorBoard的Images面板查看经过增强后的训练图片直观感受增强的效果是否合理。5. 训练过程中的典型问题与调优实战即使按照流程操作训练过程也 rarely 一帆风顺。下面是我在多次训练中遇到的典型问题及其解决方法。5.1 损失不下降或出现NaN这是最常见也最令人头疼的问题。可能原因1学习率过高现象训练刚开始损失值就急剧上升然后变成NaN。排查检查TensorBoard中权重的分布看是否有异常大的值。解决大幅降低初始学习率例如从1e-2降到1e-4或1e-5并启用Warmup。使用梯度裁剪torch.nn.utils.clip_grad_norm_也是一个好习惯可以防止梯度爆炸。可能原因2数据或标注有问题现象损失在几个epoch后停滞不降或波动很大。排查检查数据集中是否有损坏的图片用OpenCV的cv2.imread检查是否能正常读取。检查标注文件格式是否正确特别是归一化坐标是否在[0,1]区间内。一个常见的错误是x_center width/2 1.0这会导致计算IoU时出错。检查是否有标注框的中心点坐标或宽高为0。解决写一个简单的脚本遍历所有标注文件进行边界检查。清洗有问题的数据。可能原因3正负样本匹配问题现象训练日志中targets数量持续为0或极少。排查这通常意味着你的anchors设置与你的数据集目标尺寸严重不匹配。模型找不到合适的anchor来匹配真实框导致没有正样本自然无法学习。解决务必针对你的数据集重新聚类生成anchors。使用utils/目录下的kmeans_anchor.py脚本或类似工具输入你的训练集所有标注框的宽高聚类出9个新的anchors并更新到模型配置文件中。可能原因4数值不稳定现象损失偶尔出现NaN但并非一开始就出现。排查可能是损失函数如CIoU Loss中某些计算如除法、对数在极端情况下产生了inf或NaN。解决在损失计算代码中添加数值稳定措施例如加上一个极小的epsilon (eps1e-7)防止除零或使用torch.clamp限制输入范围。5.2 模型过拟合与欠拟合过拟合现象训练损失持续下降训练集精度很高但验证集损失早早就停止下降甚至上升验证集精度远低于训练集。原因模型过于复杂记住了训练数据的噪声而非一般规律。解决增强数据增强引入马赛克、MixUp、随机擦除等更强的正则化增强。使用权重衰减在优化器中设置weight_decay参数如5e-4对模型权重进行L2正则化。早停持续监控验证集mAP当其在连续多个epoch如10-20个不再提升时停止训练并回滚到验证集指标最好的那个epoch的权重。降低模型复杂度如果数据量确实很小可以考虑使用更小的模型如YOLOv3-tiny。欠拟合现象训练损失和验证损失都很高且下降缓慢两者精度都低。原因模型能力不足或训练不充分。解决增加训练时间增加epochs。调整学习率可能学习率太小尝试增大初始学习率或使用更激进的学习率调度如OneCycleLR。检查数据质量确保标注足够准确、一致。使用更强的预训练权重确保加载了在ImageNet上充分预训练的骨干网络权重。增加模型容量如果资源允许可以尝试使用更大的输入尺寸如从416提升到608或更深/更宽的网络但这通常不是YOLOv3的首选方案。5.3 评估指标解读与模型选择训练结束后我们会在验证集上得到最终的评估指标。如何解读mAP0.5 (mAP50): 最常用的指标。它计算的是当预测框与真实框的交并比(IoU)大于0.5时就被认为是正确检测的平均精度。这个指标比较宽松反映了模型“找到物体”的能力。mAP0.5:0.95 (mAP): 更严格的指标。它在IoU阈值从0.5到0.95间隔0.05的多个等级上计算mAP然后取平均。这要求预测框不仅要找到物体还要定位得非常精准。这个指标更能综合反映模型的性能。Precision-Recall曲线: 通过调整模型输出置信度的阈值可以得到一系列精确率和召回率点连成P-R曲线。曲线下的面积就是AP。一个理想的模型其P-R曲线应该尽可能靠近右上角。如何选择最终模型不要只看最后一个epoch的权重。通常我们会保存验证集mAP0.5:0.95最高的那个epoch的权重称为best.pt作为最终模型。因为训练后期可能会过拟合导致验证指标下降。你可以使用脚本提供的--evolve参数进行超参数进化搜索但这需要大量的计算资源。对于大多数项目手动根据上述经验进行几轮调参已经能得到一个不错的模型。6. 训练后的步骤测试、推理与模型导出模型训练完成保存了best.pt工作只完成了一半。我们需要知道它在真实场景下的表现并准备部署。6.1 在测试集上评估使用独立的测试集与训练集、验证集无交集进行最终评估得到最接近真实场景的指标。python test.py \ --data dataset.yaml \ --weights ./runs/train/my_first_yolov3_exp/weights/best.pt \ --task test \ --img-size 416 \ --device 0这会输出在测试集上的详细指标包括每个类别的AP、精确率、召回率等。仔细分析哪些类别表现好哪些差有助于你后续进行针对性的数据补充或调整。6.2 使用模型进行单张图片/视频推理使用detect.py脚本或类似功能进行推理。# 单张图片 python detect.py \ --source ./path/to/your/image.jpg \ --weights ./runs/train/my_first_yolov3_exp/weights/best.pt \ --img-size 416 \ --conf-thres 0.25 \ # 置信度阈值低于此值的预测将被过滤 --iou-thres 0.45 \ # NMS的IoU阈值用于合并重叠框 --device 0 \ --save-txt # 可选保存检测结果的标签文件 # 视频文件或摄像头 python detect.py --source ./path/to/video.mp4 # 或 --source 0 (摄像头)关键参数调整--conf-thres: 调高它会减少误检但可能增加漏检调低则相反。需要根据应用场景在精确率和召回率之间权衡。--iou-thres: 非极大值抑制的阈值。调高它会让NMS更“宽容”保留更多重叠的框调低则更“严格”只保留最有把握的一个。通常0.45是一个不错的默认值。6.3 模型导出为部署格式为了在边缘设备、移动端或使用其他推理引擎如TensorRT, OpenVINO, ONNX Runtime进行高效部署我们需要将PyTorch模型转换为通用格式。导出为ONNX ONNX是一种开放的模型交换格式。python export.py \ --weights ./runs/train/my_first_yolov3_exp/weights/best.pt \ --img-size 416 416 \ --batch-size 1 \ --device cpu \ --include onnx这会在权重文件同目录下生成一个.onnx文件。你可以使用Netron工具打开它可视化模型结构。导出时注意指定固定的输入尺寸--img-size和批次--batch-size因为很多推理引擎需要静态图。后续步骤 获得ONNX模型后你可以使用TensorRT: 将ONNX模型转换为TensorRT引擎在NVIDIA GPU上获得极致推理速度。OpenVINO: 将ONNX模型转换为IR格式在Intel CPU/GPU上优化部署。ONNX Runtime: 直接使用ONNX模型进行跨平台推理。这些部署优化是另一个广阔的话题但第一步永远是得到一个训练良好的模型而这正是我们本篇所聚焦的核心。训练一个YOLOv3模型就像打磨一件手工艺品需要耐心、细心和对每个环节的深入理解。从数据标注的严谨到anchors聚类的科学再到训练过程中对损失曲线的敏锐观察和超参数的精心调整每一步都影响着最终成品的质量。我个人的体会是不要害怕失败和反复。第一次训练效果不好是常态关键是要学会从TensorBoard的曲线、从验证图片的预测结果、从失败日志中寻找线索不断提出假设并验证。这个过程本身就是你对目标检测技术理解加深的过程。当你亲手训练的模型成功在你自己收集的图片中准确框出目标时那种成就感是无可替代的。希望这份详尽的指南能成为你探索路上的可靠地图。