很多同学做目标检测相关课题时,第一反应就是“先跑通 YOLOv5”,结果一上来就被环境配置、数据集格式、训练参数、模型部署各种概念淹没。网上的资料虽然多,但碎片化严重:今天看到一个讲 backbone 的视频,明天刷到一个调参的博客,学了一两周还在原地打转,时间就这样浪费掉了。
这篇文章我结合自己做目标检测课题和项目的经验,把 YOLOv5 的学习路径重新梳理了一遍,分成“入门 → 拓展 → 进阶 → 部署”四个阶段。每个阶段需要掌握什么、需要做哪些实验、常见的坑在哪里,都会讲清楚。如果你正在做目标检测相关的毕业设计、课程项目或者科研课题,按这个顺序走,可以少走很多弯路。
1. 先搞清楚目标检测和 YOLOv5 到底是什么
1.1 目标检测解决什么问题
在正式开始学 YOLOv5 之前,先把目标检测这个任务本身搞清楚,后面所有操作才有方向。
目标检测的任务是:在一张图片中找出所有感兴趣的目标,并同时给出每个目标的类别和位置。位置通常用一个矩形框(Bounding Box)来表示,比如左上角坐标、宽和高。
目标检测和图像分类的区别很直观:
| 任务 | 输入 | 输出 |
|---|---|---|
| 图像分类 | 一张图 | 这张图的类别,比如“猫” |
| 目标检测 | 一张图 | 图中每个目标的类别和位置,比如“猫在(x1,y1,x2,y2)” |
| 图像分割 | 一张图 | 图中每个像素的类别,目标边界更精细 |
所以目标检测比分类更难,它不仅要回答“这是什么”,还要回答“在哪里”。
1.2 YOLO 系列的核心思想
YOLO 的全称是 You Only Look Once,意思是“你只需要看一次”。这个思想在 2016 年由 Joseph Redmon 提出,和当时主流的 Two-Stage 方法(比如 Faster R-CNN)思路完全不同。
Two-Stage 方法是先产生候选区域(Region Proposal),再对候选区域进行分类和回归,精度高但速度慢。YOLO 选择了一条更激进的路:把检测问题直接定义为一个回归问题,一次前向传播同时输出所有目标的类别和位置。
YOLO 的推理过程可以概括为三步:
- 把输入图片划分成 S×S 的网格。
- 每个网格负责预测固定数量的边界框。
- 通过网络一次前向计算,直接输出所有框的坐标、置信度和类别概率。
这也是“You Only Look Once”名字的来源。因为只有一次前向计算,YOLO 的速度非常快,实时性很强,非常适合视频流、嵌入式设备这类对推理速度有要求的场景。
1.3 为什么课题选 YOLOv5
YOLOv5 是 Ultralytics 公司在 2020 年发布的 YOLO 系列版本。虽然 YOLOv5 这个名字在学术圈有一定争议(因为作者没有发表正式论文),但在工程落地和课题研究层面,它依然是一个非常合适的选择,原因如下:
- 代码结构清晰,文档齐全:YOLOv5 官方仓库的代码组织得很规范,数据加载、模型定义、训练流程、推理脚本都比较容易读懂。
- 生态成熟,资料丰富:网上关于 YOLOv5 的教程、博客、视频、开源项目非常多,遇到问题基本都能搜到解决方案。
- 训练和部署成本适中:相比更新的一些大模型,YOLOv5 对显存的要求不算高,普通单卡 GPU 就能训练,部署到 CPU、移动端、边缘设备都有成熟的方案。
- 改进空间大:很多课题都需要在 baseline 上做改进,YOLOv5 的结构简单清晰,改起来相对容易,适合做创新点。
如果你的课题方向是“基于改进 YOLOv5 的××检测”,那 YOLOv5 天然就是你的 baseline,后面的学习路线完全适用。
2. 整体学习路线一览
我把 YOLOv5 的学习分成四个阶段,每个阶段有明确的目标和里程碑。
| 阶段 | 核心目标 | 关键动作 | 产出成果 |
|---|---|---|---|
| 第一阶段:入门 | 跑通 YOLOv5 官方代码,理解基本概念 | 环境搭建、官方推理、训练自己的数据集 | 能用自己的数据训练出一个模型 |
| 第二阶段:拓展 | 理解训练细节,掌握调参与评估 | 数据增强、超参数分析、评价指标、训练策略 | 能分析模型好坏,知道怎么调参 |
| 第三阶段:进阶 | 理解网络结构,做模型改进 | 源码阅读、模块改进、注意力机制、轻量化 | 能提出并实现自己的改进方案 |
| 第四阶段:部署 | 把模型部署到实际场景 | ONNX 导出、推理优化、嵌入式部署 | 模型在目标平台跑起来 |
这四阶段不是完全割裂的,而是层层递进。入门阶段解决“能不能跑”,拓展阶段解决“跑得好不好”,进阶阶段解决“怎么改得更好”,部署阶段解决“怎么用起来”。
如果你是初学者,千万别跳过第二阶段直接进入第三阶段。很多人一上来就去看 YOLOv5 的网络结构源码,结果因为对训练流程、损失函数、评价指标不熟,看得云里雾里。先跑通实验、看懂指标,再去看结构,效率会高很多。
3. 第一阶段:入门——先跑通,再理解
3.1 环境搭建
YOLOv5 的环境搭建是整个学习过程中第一个“劝退点”,但其实只要搞清楚依赖关系,并不复杂。
YOLOv5 基于 PyTorch 实现,核心环境包括:
- Python 3.8 及以上
- PyTorch 1.8 及以上(建议用稳定版)
- CUDA 和 cuDNN(如果使用 GPU 训练)
- OpenCV、Matplotlib、Pillow、tqdm、numpy 等常用库
建议使用 Anaconda 创建独立的虚拟环境,避免和系统 Python 环境互相干扰:
# 创建虚拟环境 conda create -n yolov5 python=3.8 # 激活虚拟环境 conda activate yolov5 # 安装 PyTorch(根据你的 CUDA 版本选择命令,这里以 CUDA 11.3 为例) pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113不一定要完全照搬这个版本号,但要注意 PyTorch、CUDA、显卡驱动三者之间的对应关系。一个简单的判断方式是:在终端输入nvidia-smi查看驱动支持的 CUDA 版本,然后选择不高于这个版本的 CUDA 对应 PyTorch。
安装完成后,克隆 YOLOv5 仓库并安装依赖:
git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt这里要注意,requirements.txt里包含了训练和推理所需的所有 Python 包,缺一不可。如果安装过程中网络不稳定,可以分段安装。
3.2 跑官方推理,感受一下效果
环境搭建完成后,先不要急着训练。先用官方训练好的权重跑一下推理,看看 YOLOv5 的效果和输出格式。
python detect.py --weights yolov5s.pt --source data/images/bus.jpg第一次运行会自动下载yolov5s.pt预训练权重文件,并在runs/detect/目录下生成带检测框的结果图片。看到检测框的那一刻,你对 YOLOv5 的“输入-输出”关系就有了直观感受。
detect.py支持的输入源很丰富,包括单张图片、文件夹、视频文件和摄像头:
# 检测视频 python detect.py --weights yolov5s.pt --source test.mp4 # 检测摄像头(0表示本机第一个摄像头) python detect.py --weights yolov5s.pt --source 0这一阶段不用深究代码内部逻辑,只需要搞清楚几个问题:
- 输入图片经过网络后输出了什么?
- 输出的坐标是什么坐标系下的?
- 置信度阈值和 NMS 起什么作用?
3.3 准备自己的数据集
课题研究几乎都要用到自己的数据集。YOLOv5 支持两种标注格式,但最常用的是 YOLO 格式。
YOLO 格式的标注文件是.txt文件,每一行代表一个目标,格式如下:
类别id 中心点x 中心点y 宽度w 高度h注意,这里的 x、y、w、h 都是相对图片宽高的归一化值,取值范围在 0 到 1 之间。比如,一张 640×640 的图片上有一个目标,中心点在 (320, 320),宽高都是 160,那么标注行是:
0 0.5 0.5 0.25 0.25数据集目录结构需要按 YOLOv5 的要求组织:
datasets/ └── mydataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/标注工具推荐 LabelImg 或 X-AnyLabeling。LabelImg 是老牌工具,X-AnyLabeling 支持更多辅助标注功能。标注完成后,会生成与图片同名的.txt文件。
数据集准备好后,需要写一个数据集配置文件mydataset.yaml:
# 文件路径:yolov5/data/mydataset.yaml path: ../datasets/mydataset # 数据集根目录 train: images/train # 训练集图片路径 val: images/val # 验证集图片路径 nc: 2 # 类别数量 names: ['cat', 'dog'] # 类别名称,顺序要和标注id对应3.4 训练自己的第一个模型
数据准备好了,开始训练:
python train.py \ --data mydataset.yaml \ --weights yolov5s.pt \ --epochs 100 \ --batch-size 16 \ --img 640这里解释几个关键参数:
--data:数据集配置文件路径。--weights:预训练权重路径。使用yolov5s.pt做迁移学习初始化,比从头训练收敛快得多。--epochs:训练轮数。课题前期可以先跑 100 轮看效果。--batch-size:批大小,受限于 GPU 显存。显存不够就调小。--img:输入图片分辨率。YOLOv5 默认是 640。
训练过程中,终端会打印每个 epoch 的 loss、mAP、速度等信息,同时在runs/train/下生成训练日志和图表。训练结束后,runs/train/exp/weights/目录下会生成best.pt(验证集上效果最好的权重)和last.pt(最后一轮的权重)。
到这里,你已经完成了“用自己的数据训练模型”的完整流程。这一阶段的目标就达成了。
4. 第二阶段:拓展——搞懂训练细节和评价标准
4.1 训练过程中评价标准:mAP 怎么看
很多初学者训练完模型后,只盯着 loss 曲线看,其实更重要的是 mAP 指标。
mAP 的全称是 mean Average Precision,中文是“平均精度均值”。它综合考虑了模型在不同置信度阈值下的精度和召回率,是目标检测领域最常用的评价指标。
要理解 mAP,先要理解几个基础概念:
| 概念 | 含义 |
|---|---|
| TP (True Positive) | 预测正确,且 IoU 大于阈值的检测框 |
| FP (False Positive) | 预测错误,IoU 小于阈值或预测了不存在的目标 |
| FN (False Negative) | 漏检,真实目标没有被检测出来 |
| Precision 精度 | TP / (TP + FP),检测出来的框有多少是准确的 |
| Recall 召回率 | TP / (TP + FN),真实目标有多少被检测出来了 |
mAP 的常见变体有mAP@0.5和mAP@0.5:0.95。前者表示 IoU 阈值为 0.5 时的 mAP,后者表示 IoU 从 0.5 到 0.95(步长 0.05)共 10 个阈值下的平均 mAP。YOLOv5 训练日志中默认会同时输出这两个指标。
看训练结果时有一个常见误区:只看 mAP@0.5,忽略 mAP@0.5:0.95。如果你的课题需要精确定位(比如医学图像、工业质检),mAP@0.5:0.95 更重要。如果你的课题只关心目标大致位置,mAP@0.5 也够用。
4.2 数据增强策略
YOLOv5 内置了丰富的数据增强策略,包括:
- Mosaic:把 4 张图拼接成一张,增加目标尺度的多样性。
- MixUp:两张图按比例混合。
- 随机 HSV 变化、平移、缩放、旋转、翻转。
这些数据增强策略在hyp.scratch-low.yaml中通过超参数控制。比如:
# hyp.scratch-low.yaml 片段 hsv_h: 0.015 # 色调变化范围 hsv_s: 0.7 # 饱和度变化范围 hsv_v: 0.4 # 明度变化范围 degrees: 0.0 # 旋转角度 translate: 0.1 # 平移比例 scale: 0.5 # 缩放比例 fliplr: 0.5 # 水平翻转概率 mosaic: 1.0 # Mosaic 增强概率在课题中,数据增强策略完全可以作为改进点。比如小目标检测任务中,Mosaic 对小目标效果较好,但如果你的数据集目标尺度本身很单一,过度增强反而可能影响性能。这时候可以针对性地调整增强参数,并通过对比实验证明你的策略更优。
4.3 超参数调优
YOLOv5 训练涉及的超参数很多,但课题阶段不需要全部调整,重点关注的只有几个:
| 超参数 | 默认值 | 作用 | 调整建议 |
|---|---|---|---|
| lr0 | 0.01 | 初始学习率 | 学习率过大容易发散,过小收敛慢 |
| batch-size | 16 | 批大小 | 显存允许时尽量大一些,训练更稳定 |
| img-size | 640 | 输入分辨率 | 小目标任务可以提高到 1280 |
| epochs | 100-300 | 训练轮数 | 先跑 100 轮看趋势 |
| patience | 100 | 早停耐心值 | 验证集不提升时自动停止 |
YOLOv5 还提供了自动调参工具,可以通过遗传算法搜索超参数组合:
python train.py --data mydataset.yaml --weights yolov5s.pt --evolve --epochs 50不过这个功能计算量很大,课题时间有限的情况下不建议在初期使用。建议先手动跑几组对比实验,找到大致合适的范围,再用工具精调。
4.4 训练策略与迁移学习
训练 YOLOv5 时,是否使用预训练权重对最终效果影响很大。从头训练(--weights '')需要更多的数据和更长的训练时间,尤其对小型数据集来说,效果往往不如迁移学习。
使用预训练权重时,有两个细节值得注意:
- 冻结权重训练:可以先用
--freeze 10冻结前 10 层,让模型先适应新数据集的数据分布,后续再解冻微调。 - 不同规模的预训练模型:
yolov5s.pt、yolov5m.pt、yolov5l.pt对应不同大小的模型。计算资源有限时用yolov5s起步,课题对精度要求高并且显存足够时再升级到yolov5m或yolov5l。
5. 第三阶段:进阶——读懂源码并做出改进
5.1 YOLOv5 网络结构拆解
YOLOv5 的网络结构主要由三部分组成:
输入图片 ↓ Backbone(骨干网络) ↓ Neck(特征融合网络) ↓ Head(检测头) ↓ 输出检测结果Backbone负责提取图片特征。YOLOv5 的 Backbone 基于 CSPNet 设计,核心模块是 C3(CSP Bottleneck with 3 convolutions)。C3 模块把特征图分成两条路径,一条经过若干 Bottleneck,另一条直接连接,最后在末端融合。这种结构在减少计算量的同时保持了特征提取能力。
Neck负责多尺度特征融合。YOLOv5 使用 PANet(Path Aggregation Network)结构,它包含自顶向下和自底向上两条路径。自顶向下路径把高层语义信息传递到底层特征,自底向上路径把底层细节信息传递到高层特征。这样,不同尺度的特征图都能同时包含语义信息和空间信息。
Head负责最终预测。YOLOv5 的 Head 在三个不同尺度的特征图上分别预测,形成三组输出。每组输出包含边界框坐标、置信度和类别概率。最后通过 NMS(非极大值抑制)去除重复的检测框。
5.2 注意力机制改进
课题中最常见的改进思路是引入注意力机制。注意力机制可以让模型自动关注图片中更重要的区域,忽略无关信息。
以 SE(Squeeze-and-Excitation)注意力机制为例,它的核心思想是:通过学习每个通道的权重,让模型知道哪些特征通道更重要。
# 伪代码示意:SE 注意力模块 class SEBlock(nn.Module): def __init__(self, channels, reduction=16): super().__init__() self.squeeze = nn.AdaptiveAvgPool2d(1) self.excitation = nn.Sequential( nn.Linear(channels, channels // reduction), nn.ReLU(), nn.Linear(channels // reduction, channels), nn.Sigmoid() ) def forward(self, x): # x shape: [B, C, H, W] b, c, _, _ = x.size() y = self.squeeze(x).view(b, c) y = self.excitation(y).view(b, c, 1, 1) return x * y.expand_as(x)把 SE 模块嵌入 YOLOv5 的 C3 模块中,或者替换 Neck 部分的模块,就构成了一个简单的改进方案。类似的注意力机制还有 CBAM、ECA、CA 等,都可以作为课题创新点。
需要提醒的是,改进不能只是为了“换一个模块”。一个合格的课题改进需要回答三个问题:
- 为什么要改进?现有方法的瓶颈在哪里?
- 改进是否针对你的任务特点?
- 通过对比实验证明改进有效。
5.3 小目标检测改进
如果课题涉及小目标检测,有一个专门的方向值得关注:增加小目标检测头。
YOLOv5 默认在三个尺度上做预测,分别是下采样 8 倍、16 倍和 32 倍的特征图。对于小目标(比如图片中只有十几个像素的目标),下采样 32 倍后的特征图基本丢失了目标信息。一种常见的改进是再增加一个下采样 4 倍的特征图用于预测,也就是增加 P2 检测头。
# 修改 YOLOv5 模型配置文件中的检测头部分 # detect: [nc, anchors, [P2, P3, P4, P5]] # 由3个尺度改为4个尺度这种改动会带来一定的计算量增加,但对小目标检测精度的提升往往非常明显。类似的思路还有在 Neck 中加入更浅层的特征,或者使用更精细的上采样方式。
5.4 损失函数与训练细节优化
YOLOv5 默认使用 CIoU 作为边界框回归损失,它综合考虑了重叠面积、中心点距离和长宽比。除了 CIoU,常见的还有 GIoU、DIoU、SIoU 等。
如果你发现模型收敛慢或者边界框定位不准,可以尝试替换损失函数。YOLOv5 的损失函数在utils/loss.py中定义,改动相对简单。
在训练细节上,有几个容易被忽略的点:
- 学习率调度:YOLOv5 默认使用余弦退火调度,可以在训练后期有效微调模型。
- Warmup:训练开始阶段先使用较小的学习率热身,避免模型初期震荡。
- EMA(指数移动平均):对模型参数做指数移动平均,相当于取多轮训练参数的加权平均,可以提升模型的泛化能力。
6. 第四阶段:部署——让模型真正跑起来
6.1 部署的基本思路
训练和部署是两个不同的问题。训练阶段关注精度,部署阶段关注速度、内存占用和运行环境。
YOLOv5 官方提供了完善的导出工具,可以把 PyTorch 模型转换成多种部署格式:
| 导出格式 | 后缀 | 适用场景 |
|---|---|---|
| PyTorch | .pt | 继续训练、推理验证 |
| ONNX | .onnx | 跨平台通用,适合服务端部署 |
| TensorRT | .engine | NVIDIA GPU 上推理速度最快 |
| TorchScript | .torchscript | C++ 调用、移动端部署 |
| CoreML | .mlmodel | Apple 设备 |
| TFLite | .tflite | 移动端、嵌入式设备 |
导出命令示例:
python export.py --weights runs/train/exp/weights/best.pt --include onnx6.2 ONNX 导出与推理
ONNX(Open Neural Network Exchange)是一种跨框架的模型表示格式。导出 ONNX 的最大意义是解耦训练框架和推理框架。
ONNX 导出时常见的问题是算子兼容性。有些 PyTorch 算子可能无法直接映射到 ONNX 算子,或者不同版本之间行为有差异。遇到这类问题,可以尝试:
- 升级 ONNX 和 onnxruntime 版本。
- 检查 PyTorch 中是否有自定义算子。
- 设置
--opset 12或更高版本。
ONNX 模型可以使用 onnxruntime 进行推理:
import onnxruntime as ort import numpy as np from PIL import Image # 加载 ONNX 模型 session = ort.InferenceSession('best.onnx', providers=['CUDAExecutionProvider', 'CPUExecutionProvider']) # 输入预处理(以 640x640 输入为例) image = Image.open('test.jpg').resize((640, 640)) input_data = np.array(image).astype(np.float32) / 255.0 input_data = np.transpose(input_data, (2, 0, 1))[None, ...] # 模型推理 outputs = session.run(None, {session.get_inputs()[0].name: input_data})6.3 TensorRT 部署与加速
如果部署环境是 NVIDIA GPU,TensorRT 是性能最优的方案。TensorRT 会对模型做层融合、精度校准、内存优化等操作,推理速度可以比原始 PyTorch 模型快几倍。
YOLOv5 导出 TensorRT 引擎的流程大致如下:
python export.py --weights best.pt --include engine --device 0TensorRT 支持 FP16 和 INT8 量化。FP16 量化通常能带来近一倍的加速,而精度损失很小。INT8 量化加速效果更明显,但需要校准数据,且精度损失可能比较大。课题部署阶段建议先尝试 FP16。
6.4 常见部署场景
YOLOv5 的部署场景主要有三种:
服务端部署:模型部署在服务器上,通过 HTTP 接口(比如 FastAPI)对外提供服务。这种方案的优点是通用性好,客户端无需安装深度学习环境。核心流程是加载模型、接收图片、前处理、推理、后处理、返回结果。
# FastAPI 部署示例(核心片段) from fastapi import FastAPI, UploadFile import uvicorn app = FastAPI() @app.post("/detect") async def detect(file: UploadFile): image_bytes = await file.read() # 这里写图片解码、模型推理、结果封装逻辑 return {"result": "检测结果"} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)嵌入式部署:部署到 Jetson Nano、树莓派等边缘设备上。树莓派上跑 YOLOv5 可以先用官方导出为 TorchScript 或 ONNX,再配合 OpenCV 做视频流推理,需要注意设备散热和功耗限制。
移动端部署:导出为 TFLite 或 CoreML 后集成到 App 中。移动端部署需要关注模型大小和内存占用,通常还需要做模型压缩和量化。
6.5 部署时的前后处理
部署后处理是整个推理链路中最容易出错的地方。YOLOv5 的原始输出是一个很大的张量,需要通过后处理得到最终的检测框。
关键步骤包括:
- 解码:把网络输出的偏移量还原为真实的边界框坐标。
- 过滤:根据置信度阈值过滤低质量检测框。
- NMS:去除重复的检测框。
- 坐标变换:把归一化坐标映射回原图尺寸。
其中 NMS 在后处理中计算量最大,当检测目标数量很多时可能成为瓶颈。可以使用 Fast NMS 或者降低输入分辨率来优化。
7. 目标检测课题高频问题排查
7.1 环境相关问题
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 训练时不使用 GPU | PyTorch 版本和 CUDA 不匹配 | 检查torch.cuda.is_available(),重装匹配版本的 PyTorch |
| 显存不足 OOM | batch-size 过大或输入分辨率过高 | 调小 batch-size,或使用梯度累积 |
| 训练时 CPU 占用过高 | 数据加载线程数设置过大 | 调小--workers参数 |
| 程序启动时报缺包 | requirements.txt 未完整安装 | 重新执行pip install -r requirements.txt |
7.2 数据集与训练问题
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| loss 一直不降 | 学习率过大或数据标注有误 | 降低学习率,检查标注文件 |
| mAP 为 0 | 数据集配置类别数或类别名称错误 | 检查yaml文件和标注 id 是否对应 |
| 训练结果都是背景 | 正负样本不均衡 | 增加数据增强,调整置信度阈值 |
| 验证集指标很低但训练集很高 | 过拟合 | 增加数据量,使用更强数据增强,增大正则化 |
7.3 部署问题
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| ONNX 导出失败 | 算子不兼容或版本过低 | 升级 onnx、设置更高的 opset |
| 推理结果和 PyTorch 不一样 | 预处理和后处理不一致 | 严格对齐输入尺寸、归一化方式 |
| TensorRT 引擎构建慢 | 模型较大 | 使用 FP16 构建,或分批次构建 |
| 嵌入式设备推理帧率低 | 模型过大、算力不够 | 使用轻量化模型、量化、裁剪输入分辨率 |
8. 目标检测课题的工程建议
8.1 建立实验记录习惯
做课题研究,最忌讳“训练完就忘”。每次实验都要记录以下信息:
- 数据集版本和划分方式。
- 训练超参数配置。
- 使用的预训练权重。
- 关键指标(mAP@0.5、mAP@0.5:0.95、参数量、推理耗时)。
- 修改的代码或配置。
推荐使用表格记录,也可以直接用 Markdown 写实验日志。很多同学到写论文时才想起来补数据,结果发现当时没记录,非常被动。
8.2 关注数据质量而不是只调参数
当训练效果不理想时,优先检查数据,而不是盲目调参。以下几个数据问题比超参数更容易影响模型效果:
- 标注框是否准确:标注不准确会直接限制模型的上限。
- 类别是否平衡:某些类别样本过少,模型容易欠拟合这些类。
- 训练集和验证集划分是否合理:如果划分不当,验证集指标会失真。
- 图片清晰度:模糊、过暗的图片会让模型学习到错误特征。
8.3 对比实验的设计
课题中需要做对比实验来证明改进方法的有效性。建议保持以下变量一致:
- 相同的数据集和训练/验证划分。
- 相同的训练超参数和训练轮数。
- 相同的输入分辨率和测试方式。
一次只改变一个变量。如果你同时改了网络结构和损失函数,实验结果无法归因于任何一个改进点。
8.4 不要盲目追求高指标
很多同学陷入一个误区:mAP 越高越好,于是疯狂调参、堆模块,最后模型复杂度太高,完全无法部署。实际上,课题和工程都应该在“精度-速度-复杂度”之间找到平衡点。
一个实用的做法是:除了 mAP,同时记录模型的参数量、计算量(FLOPs)、单帧推理时间。这样的对比才有说服力,也符合工程实践的习惯。
9. 学习资源与下一步方向
9.1 核心学习资源
- YOLOv5 官方仓库:源码、模型配置、训练教程都在这里。
- Ultralytics 官方文档:参数解释比较全,适合查阅。
- YOLOv5 源码解析类博客:可以帮助理解模型细节,但要自己动手验证。
看源码时有一个建议:不要从头到尾一行行读,而是带着问题看。比如“C3 模块的 forward 做了什么”“损失函数是怎么计算的”“NMS 在哪一步执行”。带着问题看代码,效率更高。
9.2 下一步可以深入的方向
掌握 YOLOv5 之后,可以按兴趣往以下几个方向深入:
- YOLOv8 或更新版本:了解 YOLO 系列的发展趋势和各自的改进点。
- 轻量化模型:MobileNet、ShuffleNet 等骨干网络替换。
- Transformer 检测器:DETR、Deformable DETR 等基于注意力机制的检测模型。
- 多模态目标检测:结合红外、深度图等其他模态的信息。
- 模型量化与剪枝:进一步的模型压缩和加速技术。
如果课题时间充足,建议至少了解 YOLOv8 和 DETR 的基本思想。做目标检测只会一个 YOLOv5 是不够的,但在入门阶段,YOLOv5 依然是最好的起点。
10. 总结
这篇文章把 YOLOv5 的学习过程拆成了四个阶段:入门阶段跑通环境并训练自己的模型,拓展阶段搞懂数据增强、超参数和评价指标,进阶阶段阅读源码并做出改进,部署阶段把模型转换到目标平台。按照这个顺序走,目标检测课题从零到出成果的时间可以大大缩短。
最后想说的是,学 YOLOv5 最忌讳的是“只看不练”。环境配好了就立刻跑一次推理,数据集准备好了就马上启动训练,遇到报错先去查日志而不是直接百度答案。只有亲手跑通一次完整的“数据-训练-评估-部署”流程,你才算真正迈进了目标检测的大门。
如果这篇文章对你有帮助,可以收藏备用,也欢迎在评论区交流你在 YOLOv5 训练和部署中遇到的问题。