【目标检测课题救星!】YOLOv5 系统学习顺序:入门→拓展→进阶→部署一次理清,做课题就按这个顺序来,省下3个月无效摸索!
很多刚接触目标检测的同学,第一次听到“YOLOv5”时,往往会被两件事劝退:一是满屏的环境配置教程,CUDA、cuDNN、PyTorch、conda 来回折腾,还没跑通第一个模型就已经想放弃;二是资料太多太杂,B 站视频、GitHub 仓库、公众号文章各说各话,今天让你改 anchor,明天让你调损失函数,最后发现时间全花在“试错”而不是“学习”上。
如果你正在做毕业设计、课程项目、竞赛,或者实验室课题,这篇文章就是来帮你把整个 YOLOv5 的学习路线理清楚的。我不会上来就贴一堆代码,而是先用一个全局视角告诉你:从零开始做目标检测课题,到底应该先学什么、后学什么、哪些东西可以暂时不学、哪些坑可以提前避开。然后逐步进入环境搭建、数据集制作、模型训练、评估指标解读、模型部署这些核心环节,每一部分都给你可操作的步骤和判断标准。
按照这条路线走,正常来说两周到一个月就能把主线跑通,而不是花费两三个月去零散地查资料。这篇文章适合的目标读者很明确:正在做目标检测相关课题、需要训练自己的数据集、并且最终希望把模型用起来(部署到本地或服务器)的同学。如果你是纯算法研究、打算从零手写检测器,那 YOLOv5 对你更多是 baseline 参考,路线会有所不同。
1. 这篇文章真正要解决的问题
先说实话:YOLOv5 的学习难点从来不在模型本身。它的代码结构清晰、文档齐全、社区资料丰富,真正难的是“不知道按什么顺序学”,以及“不知道学到什么程度算够用”。
拿最常见的课题场景来说,比如你要做一个“基于 YOLOv5 的交通标志检测系统”,表面上看,任务是训练一个模型识别红绿灯、限速牌、行人标志。但实际做起来,你会发现要经历这些环节:
- 准备环境:Python、PyTorch、CUDA、显卡驱动,版本一不对就报错;
- 准备数据:标注工具选哪个,标注格式怎么转成 YOLO 格式,数据集怎么划分;
- 训练模型:超参数怎么设,训练到多少个 epoch 合适,怎么判断过拟合;
- 评估模型:mAP、Precision、Recall、F1 这些指标到底代表什么,怎么根据指标反推模型哪里出了问题;
- 部署模型:训练好的 .pt 权重怎么转成 ONNX、TensorRT,怎么在 CPU 或边缘设备上跑起来。
这五个环节,每一个单独拎出来都能写好几篇博客。但作为课题执行者,你不需要把每个点都挖到极致,而是需要一条“主线路径”。只要主线清楚,任何环节出现报错,你都能知道问题出在哪个模块、该去哪里查。
这篇文章要解决的核心问题就是:把 YOLOv5 做课题从入门到部署的完整顺序梳理清楚,并且给出每个阶段的学习重点、判断标准和常见坑。
文章不会做以下事情:
- 不会贴完整源码逐行解释(源码解析是另一篇长文的量);
- 不会帮你决定用 YOLOv5 还是 YOLOv8、YOLOv11(这个最后会给出判断方法);
- 不会教你从零实现反向传播或 YOLO 损失函数细节。
文章会做的事情:
- 画出学习路线框架;
- 教你搭建一个最简可运行环境;
- 带你制作并管理自己的数据集;
- 跑通一次完整训练,并理解关键指标;
- 介绍最稳妥的部署思路;
- 给出每个阶段最值得避开的坑。
2. 认识 YOLOv5:它到底是什么,解决什么问题
2.1 从目标检测说起
目标检测的任务,对一张图片不仅要回答“图里有什么”(分类),还要回答“这些东西分别在哪”(定位)。传统做法是滑动窗口加手工特征,效率低、泛化差。深度学习时代,R-CNN 系列开启了 two-stage 路线,先产生候选区域再分类;YOLO 系列则把检测当作回归问题,一次前向传播同时输出类别和边界框,所以叫 one-stage。
YOLOv5 是 Ultralytics 公司在 2020 年 6 月开源的,虽然名字里有 v5,但它并不是官方 YOLO 系列的延续,而是基于 YOLOv3/v4 思想的重写实现。它的优势非常明显:
- 工程化程度高:训练、验证、推理、导出都通过一条命令行完成,对新手友好;
- 推理速度快:相比 two-stage 模型,在保证精度的前提下速度优势很大;
- 社区资料丰富:中文教程、常见问题解决方案几乎全覆盖;
- 可扩展性强:支持自定义数据集、多种模型规模(n/s/m/l/x)、多种导出格式。
很多学校课题和工业落地项目选择 YOLOv5,不是因为它在每个公开数据集上都刷新 SOTA,而是因为它在“效果、速度、易用性”之间取得了很好的平衡。你不需要成为深度学习专家,也能用它训练出一个可用的检测模型。
2.2 YOLOv5 的学习难点不在算法,而在工程链路
如果你去看 YOLOv5 的源码,会发现核心检测部分的代码并不算多,大多数代码都在处理数据加载、增强、训练循环、日志、导出等工程问题。这意味着,真正的难点是“串联整个流程”的能力,而不是读懂某个公式。
比如,训练一个自定义数据集,你需要经历:
graph LR A[原始图片] --> B[标注] B --> C[YOLO格式txt] C --> D[数据集配置yaml] D --> E[训练] E --> F[评估] F --> G[导出/部署](注:本博客不支持 mermaid 渲染,这里用文字表示即可:原始图片→标注→YOLO格式txt→数据集配置yaml→训练→评估→导出/部署)
这个流程中,任何一步出错,都可能导致训练失败或模型效果差。很多同学卡在“标注完数据集,训练时报错 class 数不匹配”“loss 降了但 mAP 很低”“导出 ONNX 后推理结果不对”这类问题,本质都是链路没打通。
所以,这篇文章会将这条链路按“入门→拓展→进阶→部署”拆成四个阶段,每个阶段都有明确的任务和验收标准。
3. 学习路线总览:四个阶段一张图理清
先给你一个全局地图,后面每一节都会详细展开。
| 阶段 | 学习重点 | 可交付成果 | 时间参考 |
|---|---|---|---|
| 入门阶段 | 环境搭建、跑通官方推理 | 能用官方权重对图片/视频/摄像头进行检测 | 2~3天 |
| 拓展阶段 | 制作自己的数据集、训练自定义模型 | 能训练并评估一个属于自己的检测模型 | 5~7天 |
| 进阶阶段 | 理解训练细节、参数调优、解决效果差问题 | 模型指标改善,掌握常见调参手段 | 1~2周 |
| 部署阶段 | 模型导出、推理加速、简单应用集成 | 将模型部署到服务器或本地程序 | 3~5天 |
注意,时间参考并不是绝对的。如果你对 Python 和 PyTorch 比较熟悉,入门阶段半天就可以搞定;如果你是纯新手,光环境配置就可能卡两三天。关键在于,每个阶段要明确“做完什么可以进入下一阶段”,而不是漫无目的地刷资料。
4. 入门阶段:跑通官方推理,建立自信
4.1 环境准备:显卡不是必须,但强烈建议有
YOLOv5 推理和训练都支持 CPU,但速度差异巨大。如果你只是验证一下官方模型效果,CPU 也能跑,一张图片推理大约需要几百毫秒到几秒;如果是训练自己的模型,CPU 训练一个中等规模数据集可能要几天,而一张入门级显卡(比如 GTX 1660、RTX 3050)可能几小时就能完成。
所以,如果有条件,尽量使用 NVIDIA 显卡,并安装 CUDA 和 cuDNN。没有显卡的同学也不要放弃,可以先在 CPU 上跑通流程,训练部分可以使用小模型(yolov5n/yolov5s)搭配小数据集来验证,后面再租云 GPU。
环境配置的核心点:
- Python 版本:推荐 3.8~3.10,太新的版本可能遇到依赖兼容问题;
- PyTorch:根据你的 CUDA 版本安装,建议用 PyTorch 官方命令安装,不要直接
pip install torch装 CPU 版; - 显卡驱动:确保
nvidia-smi能正常显示 GPU 信息; - YOLOv5 源码:使用官方 GitHub 仓库。
这里必须强调一个版本问题:YOLOv5 的代码一直在更新,不同 commit 对应的依赖不同。建议直接使用官方最新版仓库,不要找第三方魔改版。如果后面出现报错,优先考虑换一个较新的稳定 commit,而不是去搜索“YOLOv5 报错”随便改代码。
4.2 安装步骤参考
以 Windows/Linux 为例,假设已经安装好 Anaconda 和 NVIDIA 驱动,步骤如下:
# 1. 创建虚拟环境 conda create -n yolov5 python=3.9 -y conda activate yolov5 # 2. 安装 PyTorch(以 CUDA 11.8 为例) # 具体命令请参考 PyTorch 官网,根据你的 CUDA 版本选择 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 3. 克隆 YOLOv5 仓库 git clone https://github.com/ultralytics/yolov5.git cd yolov5 # 4. 安装依赖 pip install -r requirements.txt如果你的 CUDA 版本是 12.x,PyTorch 请选择 cu121 或 cu124 的 index-url。建议先查看nvidia-smi输出的 CUDA 版本,但注意,这只是驱动支持的最高版本,实际使用 PyTorch 时可以安装低于这个版本的 CUDA 运行库,比如驱动支持 12.4,但 PyTorch 用 cu121 通常没问题。
安装完成后,先下载官方权重,然后运行一次推理验证:
# 下载权重并从官方图片测试 python detect.py --weights yolov5s.pt --source data/images/bus.jpg首次运行会自动下载yolov5s.pt权重文件。运行成功后,在runs/detect/exp目录下会生成标注了检测框的bus.jpg。看到图片上的检测框,说明你的环境已经通了。
4.3 入门阶段验收标准
不要急着看训练代码,先学会用 YOLOv5 做推理。尝试对一张自己拍的图片、一个视频文件或摄像头视频流进行检测:
# 对视频检测 python detect.py --weights yolov5s.pt --source test.mp4 # 对摄像头检测 python detect.py --weights yolov5s.pt --source 0如果这些都跑通了,你对 YOLOv5 的“输入-处理-输出”就会有一个直观认识:输入任意图片或视频,经过 YOLOv5 模型,输出每个目标的类别、置信度和边界框坐标。入门阶段的目标不是理解内部原理,而是熟悉工具的基本使用方式。
另外建议做一个动作:打开detect.py文件,粗略看一下主要参数(--weights、--source、--conf-thres、--iou-thres),不用看懂代码逻辑,只需要知道这些参数控制什么。这能为后面拓展阶段打下基础。
5. 拓展阶段:训练自己的数据集
阶段入门后,你已经会“用别人训好的模型”了。但做课题,核心任务是训练一个属于你自己数据集的模型。这一阶段分四步:数据采集、数据标注、数据集格式转换、执行训练。
5.1 数据采集与标注
数据采集有几个原则:
- 尽量真实场景;如果做交通标志,就去拍实际的交通标志,而不是网图;
- 类别数量一开始不宜过多,先做 5 类以内,跑通后再扩展;
- 图片数量每类至少 200 张以上,多角度、多光照、多背景;
- 训练集:验证集:测试集 按 8:1:1 或 9:1 划分。
标注工具推荐 LabelImg 或 Labelme。LabelImg 比较老牌,输出 PASCAL VOC 格式(xml);Labelme 输出 JSON 格式。实际用 LabelImg 的人更多一些,因为 YOLOv5 官方支持xml转txt的脚本。
标注的核心是:每个目标都要画矩形框,并给一个类别标签。矩形框要尽量贴合目标边缘,不要留太多背景,也不要裁剪掉目标的一部分。
5.2 标注格式转换
YOLOv5 训练需要的是每个图片对应一个同名.txt文件,文件每行格式为:
class x_center y_center width height其中x_center、y_center、width、height都归一化到 0~1 之间,基于图片宽高计算。LabelImg 默认保存为 VOC xml 格式,需要转换。
YOLOv5 仓库自带转换脚本utils/下没有直接的 GUI 工具,但你可以参考labelme2yolo.py或自己写一个脚本。最省事的办法是使用labelImg时,在保存格式里直接选择 YOLO 格式,这样标注时就直接生成.txt,不需要转换。
如果你已经有 VOC 格式的 xml,可以用下面的简单脚本转换:
# 文件路径:voc2yolo.py import os import xml.etree.ElementTree as ET from pathlib import Path def convert_voc_to_yolo(xml_file, class_names, output_dir): tree = ET.parse(xml_file) root = tree.getroot() width = int(root.find('size/width').text) height = int(root.find('size/height').text) txt_name = Path(xml_file).stem + '.txt' with open(os.path.join(output_dir, txt_name), 'w') as f: for obj in root.iter('object'): cls = obj.find('name').text if cls not in class_names: continue cls_id = class_names.index(cls) bbox = obj.find('bndbox') xmin = float(bbox.find('xmin').text) ymin = float(bbox.find('ymin').text) xmax = float(bbox.find('xmax').text) ymax = float(bbox.find('ymax').text) x_center = (xmin + xmax) / 2 / width y_center = (ymin + ymax) / 2 / height w = (xmax - xmin) / width h = (ymax - ymin) / height f.write(f"{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n") # 使用示例 if __name__ == '__main__': class_names = ['helmet', 'person'] # 改为你的类别 xml_dir = 'annotations' yolo_dir = 'labels' os.makedirs(yolo_dir, exist_ok=True) for xml_file in Path(xml_dir).glob('*.xml'): convert_voc_to_yolo(str(xml_file), class_names, yolo_dir)运行后,每个 xml 会在 labels 目录下生成对应 yolo 格式 txt。
5.3 数据集目录结构与配置文件
YOLOv5 要求数据集目录结构如下:
datasets/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/图片和标签的名字必须一一对应(不含扩展名)。推荐使用官方提供的coco128作为模板,先复制一份再修改。
然后创建一个数据集配置文件mydata.yaml,放在项目根目录或任意位置。内容示例:
# 文件路径:mydata.yaml train: D:/yolov5/datasets/images/train val: D:/yolov5/datasets/images/val nc: 2 names: ['helmet', 'person']注意:train和val路径必须是绝对路径或相对 YOLOv5 项目的相对路径。nc是类别数,names列表的顺序必须和标注 txt 中的 class id 对应。这一步做错,训练很可能报错或类别识别错乱。
5.4 训练自己的模型
数据集准备好之后,执行训练命令:
python train.py --data mydata.yaml --weights yolov5s.pt --epochs 100 --batch-size 8 --imgsz 640参数含义:
--data:指定数据集配置文件;--weights:预训练权重,一般用yolov5s.pt,它是在 COCO 上预训练的,作为迁移学习起点;--epochs:训练轮数,新手可以先设 100,实际根据学习曲线调整;--batch-size:根据显卡显存调整,显存不够就调小;--imgsz:输入图片尺寸,默认 640,一般不需要改。
训练过程会输出类似下面的日志:
Epoch gpu_mem box_loss obj_loss cls_loss Instances Size 1/100 2.34G 0.098 0.072 0.012 6 640同时会保存每个 epoch 的权重到runs/train/exp/weights/。训练结束后,可以用best.pt(验证集上指标最优)和last.pt(最后一轮)。
5.5 训练后验证与推理测试
训练完成后,先对训练时划分的验证集做一次验证:
python val.py --data mydata.yaml --weights runs/train/exp/weights/best.pt会输出 mAP50、mAP50-95、Precision、Recall 等指标。然后用一批之前没见过的图片测试:
python detect.py --weights runs/train/exp/weights/best.pt --source test_images/肉眼检查检测效果:有没有漏检、误检、框的贴合度如何。如果效果很差,进入下一阶段调优。
5.6 拓展阶段验收标准
你用自己的数据集训练出了模型,并且在验证集上 mAP50 达到一个可以接受的水平(具体数值因任务难度而异,一般 0.5 以上是底线,常见任务 0.8 左右算可用)。同时,你能说清楚自己的数据集类别、数量、划分方式,以及模型指标含义。
6. 进阶阶段:理解训练细节与常见调优手段
很多课题做到训练出模型,发现效果“能用但不够好”,比如误检很多、小目标老是漏掉、边界框偏移。这时候需要进入进阶阶段,学会分析问题来源并制定调优策略。
6.1 理解关键指标:Precision、Recall、mAP
YOLOv5 训练日志里有两个最重要的指标:mAP50和mAP50-95。
Precision(精确率):预测为正样本中真正正确的比例。高 Precision 意味着模型预测出的框很少是错的。Recall(召回率):所有真实目标中被正确检出的比例。高 Recall 意味着模型很少漏检。mAP50:IoU 阈值为 0.5 时,所有类别 AP 的平均值。这是最常用的指标。mAP50-95:IoU 阈值从 0.5 到 0.95,步长 0.05 的平均 AP,更严格,更关注边界框定位精度。
实际课题评审中,如果任务不是特别高精度,一般看 mAP50 和 mAP50-95 两个值。如果 mAP50 高但 mAP50-95 低,说明你的框定位不够精确,可能需要调整回归分支或使用更高分辨率输入。
6.2 训练曲线怎么看
在runs/train/exp/目录下会生成results.png,包含损失曲线和指标曲线。你需要关注:
train/box_loss、train/obj_loss、train/cls_loss是否平稳下降;val/box_loss等验证损失是否下降;metrics/mAP50是否逐步上升并趋于平缓。
如果train loss持续下降但val loss后期回升,说明过拟合了。解决方法是增加数据增强、减少 epoch、使用早停或降低模型复杂度。
6.3 提高模型效果的手段(按优先级排序)
在实际课题中,提高效果最有效的手段通常不是调整网络结构,而是:
- 增加数据量和多样性:最有效,没有之一。同类目标多拍不同角度、不同尺度、不同光照的图片;
- 使用更好的预训练权重:用
yolov5m或yolov5l当预训练权重,比从yolov5s开始效果更强,但显存和速度消耗也更大; - 选择更大的模型:同样数据下,
yolov5s换到yolov5m通常能提升几个点 mAP; - 调整输入分辨率:
--imgsz 640换成--imgsz 1280能明显提升小目标检测效果,但显存占用急剧上升; - 优化超参数:YOLOv5 提供了
--hyp参数指定超参数文件,新手不建议手动大改,可以先用默认值; - 数据增强微调:在
hyp.scratch-low.yaml中调整hsv_h、hsv_s、degrees、translate、scale等参数,比如小目标数据适合增加scale范围。
6.4 经典问题:为什么我训练完 loss 降了但指标很低?
这种情况很常见,尤其是自己做数据集的同学。原因通常是:
- 标注错误太多:框不贴合、漏标、类别标错;
- 类别不平衡:某些类别图片太多,某些太少;
- 数据划分不一致:训练集和验证集有重复或分布差异太大;
- 学习率不合适:默认学习率一般没问题,但如果你调整了 batch-size,学习率可能需要同步调整。
遇到 issue 时,不要急着改模型或调参数,第一件事是抽样检查训练集和验证集的标注质量。你可以用下面这行代码快速可视化标注:
python detect.py --weights runs/train/exp/weights/best.pt --source val_images/ --save-txt如果检测出的框位置和实际标注差距大,检查原始标注是否准确。
6.5 训练阶段的工程建议
- 每次训练前备份
mydata.yaml和模型参数,方便复现; - 使用固定随机种子:
python train.py --seed 42,便于结果对比; - 多利用
--cache参数缓存图片到内存,能加速训练;显存不足时要关闭; - 训练过程监控 GPU 利用率:
nvidia-smi -l 1,如果 GPU 利用率很低,可能数据读取成为瓶颈,此时增大--workers。
7. 部署阶段:从权重到可用的检测服务
训练出满意的模型之后,课题往往需要一个“应用”来体现成果,比如桌面软件、Web 服务或嵌入式端。这就涉及模型部署。YOLOv5 部署有别于训练,它的核心是把 PyTorch 的.pt权重转换为更轻量、更适合推理的格式。
7.1 模型导出:ONNX 与 TensorRT
YOLOv5 官方支持多种导出格式,最常用的是 ONNX 和 TensorRT。ONNX 是一种中间格式,方便跨框架推理;TensorRT 是 NVIDIA 的高性能推理引擎,能极大提升 GPU 推理速度。
PYTORCH 模型转换为 ONNX:
python export.py --weights runs/train/exp/weights/best.pt --include onnx --opset 12导出后得到best.onnx,可以用 ONNX Runtime 或 TensorRT 加载。
如果要在 GPU 上使用 TensorRT 加速:
python export.py --weights runs/train/exp/weights/best.pt --include engine --device 0但 TensorRT 在 Windows 下的安装比较麻烦,且依赖 CUDA 和 TensorRT 版本匹配,建议新手先尝试 ONNX + ONNX Runtime,速度已经比纯 PyTorch 快不少。如果课题要求实时检测,再考虑 TensorRT。
7.2 用 ONNX Runtime 部署推理
ONNX Runtime 是微软开源的推理引擎,安装简单:
pip install onnxruntime-gpu推理代码需要自己处理预处理和数据转换,这里给出一个最小可运行的 Python 示例:
# 文件路径:onnx_infer.py import cv2 import numpy as np import onnxruntime as ort # 加载 ONNX 模型 session = ort.InferenceSession("best.onnx", providers=['CUDAExecutionProvider', 'CPUExecutionProvider']) def preprocess(img, size=640): h, w = img.shape[:2] r = min(size / h, size / w) new_h, new_w = int(round(h * r)), int(round(w * r)) img_resized = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LINEAR) canvas = np.full((size, size, 3), 114, dtype=np.float32) canvas[:new_h, :new_w] = img_resized canvas = canvas[:, :, ::-1].transpose(2, 0, 1) # BGR2RGB and HWC2CHW canvas = np.ascontiguousarray(canvas) canvas = canvas.astype(np.float32) / 255.0 return canvas, r, new_w, new_h def postprocess(outputs, r, new_w, new_h): # outputs shape: (1, 25200, 6) 或 (1, 25200, 5+num_classes) preds = outputs[0][0] conf = preds[:, 4] mask = conf > 0.25 preds = preds[mask] if len(preds) == 0: return [] boxes = preds[:, :4] boxes[:, 0] -= (640 - new_w) / 2 boxes[:, 2] -= (640 - new_w) / 2 boxes[:, 1] -= (640 - new_h) / 2 boxes[:, 3] -= (640 - new_h) / 2 boxes /= r return boxes img = cv2.imread("test.jpg") tensor, r, new_w, new_h = preprocess(img) outputs = session.run(None, {session.get_inputs()[0].name: tensor[None]}) boxes = postprocess(outputs, r, new_w, new_h) print("检测到目标数量:", len(boxes))这个示例在代码层面可能因 ONNX 输出的顺序而异,但思路是通用的:预处理、推理、后处理(解码框、置信度过滤、NMS)。如果对后处理不熟悉,更简单的办法是直接使用 YOLOv5 自带的detect.py加载 ONNX 格式:
python detect.py --weights best.onnx --source test.jpg这样虽然不算“部署应用”,但验证了 ONNX 模型可以正常工作。
7.3 部署到 Web 服务的简单方案
如果课题需要做成 Web 系统,例如上传一张图片返回检测结果,可以使用 Flask/FastAPI 封装。这里以 FastAPI 为例,给出最小接口思路:
# 文件路径:app.py from fastapi import FastAPI, UploadFile import cv2 import numpy as np import onnxruntime as ort app = FastAPI() session = ort.InferenceSession("best.onnx") @app.post("/detect") async def detect(file: UploadFile): content = await file.read() img = cv2.imdecode(np.frombuffer(content, np.uint8), cv2.IMREAD_COLOR) # 这里可以复用上面示例中的 preprocess / session.run / postprocess # 由于代码较长,省略,实际实现时接线即可 return {"message": "detect ok", "num": 0}部署到云端时,注意开放端口和安全访问控制,不要在没有鉴权的公网端口上随意暴露推理接口。
7.4 部署阶段验收标准
你能把训练好的best.pt成功导出为 ONNX 或 TensorRT,并能在脱离 PyTorch 的环境中使用 ONNX Runtime 对单张图片进行推理,得到和 PyTorch 相近的结果。同时,你理解导出后模型输出的形状和含义。
8. 常见问题与排查思路
下面这些是初学者在 YOLOv5 学习过程中最高频踩到的问题,整理成表格,方便你直接定位排查。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 运行 detect.py 报 ModuleNotFoundError | 没有安装 requirements.txt 或激活环境 | 检查pip list,确认在 conda 环境中 | 重新激活环境并安装依赖 |
训练时报CUDA out of memory | batch-size 太大或显卡显存不足 | 查看nvidia-smi显存占用 | 调小 batch-size 或使用更小的模型,如 yolov5n |
| 训练后 mAP 接近 0 | 数据格式错误、标注类别和配置不一致 | 打开一张训练图片和对应 txt,可视化检查 | 修正标注或配置文件 |
| 验证集指标好但实际检测差 | 过拟合或训练/验证集分布不一致 | 收集更多多样化的测试数据 | 增加数据增强,或重新划分数据集 |
| 导出 ONNX 后推理不出框 | 后处理不对或输入尺寸不匹配 | 查看 ONNX 输出的 shape,用 python 打印 preds | 按输出格式调整后处理代码 |
| 训练 loss 为 NaN | 学习率过大或数据集存在异常图片 | 降低学习率,检查图片是否损坏 | 使用默认学习率,清理坏图 |
| 摄像头检测卡顿 | 推理速度慢或设备性能不足 | 统计单帧推理时间 | 换用 TensorRT 或降低输入分辨率 |
除了这些,还有一个容易忽略的问题:训练路径中的中文名。Windows 环境下,如果数据集路径包含中文,或者用户名是中文,可能会导致读取文件编码错误。建议把所有路径设置为纯英文。
9. 最佳实践与工程建议
9.1 学习路径上的优先级建议
如果你是做课题做系统,而不是研究算法,请克制住“把源码每一行读懂”的冲动。YOLOv5 源码接近 200 个文件,逐行读完既不现实也没必要。建议的学习优先级是:
- 跑通官方推理;
- 做自己的数据集并训练;
- 会看指标并做简单调优;
- 会部署成一种可调用服务。
读源码、改结构、自己实现损失函数,都放到后面。优先把主线走通,再考虑加深理解。
9.2 数据管理的工程习惯
- 图片和标签统一命名:建议用时间戳或序号,不要用中文和特殊字符;
- 每次数据集修改后,备份一份并标注版本;
- 保留一个独立的验证集,只在最后模型评估时使用,避免反复污染;
- 训练前做一次标签可视化:将标注框画到图片上检查,这一步能避免很多低级错误。
9.3 训练过程的资源控制
- 使用
--cache可以加快读取,但显存不足时不要用; - 在训练前设置
--workers,Windows 上建议设为 0 或 4 以内,避免 dataloader 报错; - 使用
--patience参数实现提前停止,例如--patience 50,当 50 轮没有改善时自动停止; - 及时备份
best.pt,后续部署和对比都靠它。
9.4 部署的安全与性能
- 部署到公网前,做好接口鉴权,至少使用简单的 Token;
- 对于实时性要求高的场景,尽可能使用 TensorRT 或 INT8 量化;
- 如果模型类别很少(只有一两类),可以裁剪模型输出分支提升速度;
- 建议记录推理耗时和峰值显存,作为课题验收材料。
10. 到底选择 YOLOv5 还是 YOLOv8/YOLOv11?
这个问题很容易让初学者纠结。我的判断是:如果你的课题周期短、重点是完成一个检测系统并展示效果,YOLOv5 依然是稳妥选择。理由有三点:
- 资料存量最多。网上绝大部分中文教程和踩坑记录都基于 YOLOv5,遇到问题更容易找到答案;
- 代码稳定,部署生态成熟。ONNX/TensorRT 转换方案丰富,遇到兼容性问题的概率更低;
- 你的课题评审不会因为模型版本新就加分,更多看任务复杂度、数据质量和系统完整性。
如果课题明确要求使用最新模型,或者你想在算法层面做改进,可以直接看 YOLOv8 或 YOLOv11,它们也是 Ultralytics 维护的,API 风格接近。但从零开始学,YOLOv5 的“低摩擦系数”优势很大。
11. 总结与后续学习方向
这篇文章给你分了一条清晰的路线:入门时先跑通官方推理,拓展时制作自己的数据集并训练模型,进阶时理解指标和进行调优,部署时把模型导出到 ONNX 或 TensorRT 并封装应用。按这个顺序走,你其实不用经历“东学一点、西看一篇”的无序状态。
下一步,你可以选择一个具体小任务立刻实践:比如找 300 张“猫和狗”的图片,标注后训练一个检测模型。把这个流程从头跑到尾,你就能完全理解 YOLOv5 做课题的完整链路。之后如果时间充裕,再去看数据增强、模型剪枝、知识蒸馏、NMS 优化等进阶话题;如果想深入嵌入式部署,可以从树莓派或 Jetson Nano 开始。
最后提醒一点:做目标检测课题,数据永远比模型更重要。与其花时间去调一个复杂网络结构,不如认真做一份干净、丰富、标注可靠的数据集。这条经验在 YOLOv5 上适用,在 YOLOv8、YOLOv11、甚至未来的新模型上依然适用。把这套方法沉淀下来,你的课题才能顺利结题,自己的工程能力也会上一个台阶。