YOLO 视觉模型训练
# YOLO 视觉模型训练
YOLO(You Only Look Once)是一类常用于目标检测的模型。它回答图片里有什么、分别在哪里,不是用文字生成图片。 因此这里将它作为模型训练的视觉扩展,与语言模型微调和 AIGC 区分开。
# 和大模型微调有什么不同
| 对比 | 语言模型 SFT | 目标检测训练 |
|---|---|---|
| 输入 | 指令、上下文、对话 | 图片 |
| 监督目标 | 期望回答的 Token | 类别和目标框 |
| 常见输出 | 文本或结构化响应 | 类别、置信度、位置 |
| 主要评估 | 任务正确率、格式、事实和安全 | Precision、Recall、mAP、推理速度 |
例如工厂识别零件缺陷,输入是一张零件照片,输出是某个矩形区域存在划痕,以及模型的置信度。训练前需要把已有照片里的划痕框出来,让模型知道要学什么;不是把图片改成客服问答格式。
# 检测数据怎么组织
下面使用 Ultralytics 的常见 YOLO 检测格式。图片与标签文件同名,每个目标一行,类别从 0 开始编号。
dataset/
images/train/part001.jpg
images/val/part101.jpg
labels/train/part001.txt
labels/val/part101.txt
2
3
4
5
标签行格式是 class_id x_center y_center width height,坐标除以图片宽高归一化到 0~1。例如 0 0.5 0.5 0.2 0.4 表示类别 0、框中心位于图片中央、宽占 20%、高占 40%,不是框左上角坐标。
如果图片为 1000 × 500,这个框的中心就是 (500, 250),宽为 200、高为 200 像素。换成左上角和右下角,就是 (400, 150) 与 (600, 350)。这能帮助检查标注工具导出的坐标是否正确。
实际标注可以使用支持 YOLO 导出的工具:先建立 scratch、dent 两个类别,再给图片中的每处缺陷画框,导出后检查类别顺序。没有目标的图片可以作为负样本,但不能把漏标缺陷的图片当成干净负样本,否则会教错模型。
同一段视频的连续帧非常相似,要按拍摄批次或场景划分训练与验证,不能随机拆帧后认为得到了独立测试。
# 最小训练与导出流程
在独立环境安装 ultralytics 和匹配硬件的 PyTorch,固定验证过的依赖版本。下面以受支持的 yolo11n.pt 为例,并非要求使用所谓最新模型。
准备好数据后,整个过程是:写数据配置 → 从预训练权重开始训练 → 加载最优权重评估 → 导出部署格式。先用少量已人工核对的样本确认路径和标签无误,再训练完整数据。
将配置保存为 parts.yaml:
# 使用当前机器的数据绝对路径;不要把别人的路径直接复制过来。
path: /absolute/path/to/dataset
train: images/train
val: images/val
names:
0: scratch # 划痕,必须与标签中的类别编号一致。
1: dent # 凹陷。
2
3
4
5
6
7
训练入口 train.py:
from ultralytics import YOLO
def main():
# 首次运行可能下载预训练权重;在此基础上训练,不是从零训练。
model = YOLO("yolo11n.pt")
model.train(
data="parts.yaml",
epochs=30, # 实验起点,不保证 30 轮就是最优。
imgsz=640,
batch=4, # 显存不足时先降低 batch。
device=0, # 第一张 CUDA GPU;CPU 可改为 "cpu",会更慢。
project="runs/parts",
name="baseline",
exist_ok=False, # 不覆盖已有同名实验。
)
# 从实际运行目录获取 best,避免实验自动编号后读错模型。
best = YOLO(str(model.trainer.best))
best.val(data="parts.yaml")
# ONNX 是交换格式,目标推理引擎仍需要验证支持的算子与前后处理。
best.export(format="onnx")
if __name__ == "__main__":
# Windows 多进程数据加载需要安全入口,避免重复启动训练。
main()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 指标怎样看
Precision 看检出的目标里有多少是对的;Recall 看真实目标有多少被找到了。IoU 是预测框与真实框交集面积除以并集面积,用来衡量位置重合程度。
假设真实有 10 处缺陷,模型报了 8 处,其中 6 处匹配正确:Precision 是 6 / 8 = 75%,Recall 是 6 / 10 = 60%。也就是误报了 2 处、漏掉了 4 处。这个例子按既定 IoU 匹配阈值统计,不是看类别名字一样就算位置正确。
AP 汇总一个类别在不同置信度阈值下的精确率与召回率表现,mAP 再对类别取平均。mAP@0.5 和跨多个 IoU 阈值的 mAP@0.5:0.95 不是同一个指标,不应混在一起比较。
部署前还要测小目标、遮挡、光照、误报和漏报。在质检场景,漏检缺陷与误报良品的业务代价不同,应分别决定阈值,而不是只追求一个总分。
# IoU、置信度与 NMS 分别管什么
置信度用来筛掉模型不够确定的预测;IoU 衡量两个框重合多少,二者不是同一个阈值。例如两个框各为 100 平方像素,交集为 60,并集就是 100 + 100 - 60 = 140,IoU 约为 0.429,在 IoU 0.5 的匹配要求下不能算定位正确。
同一个缺陷可能被预测出多个重叠框。常见的 NMS(Non-Maximum Suppression,非极大值抑制)先保留高置信度框,再去掉与它过度重叠的其他候选框;是否按类别分别处理取决于配置。它解决重复检测,不是提高模型的理解能力。部分端到端检测模型有不同后处理设计,不能把 NMS 当成所有 YOLO 版本必需的步骤。
在常见检测评测中,一个真实目标只能被匹配一次,多余的重复框会成为误报。AP 则会把预测按置信度排列,综合不同截断位置的 Precision 与 Recall,而不是只在一个阈值上数对错。因此 mAP 高,也仍要单独检查实际上线阈值下的漏检率。
# 从训练结果到现场可用,还差哪几步
先固定一组原图,让训练环境和导出后的推理引擎分别处理。核对图像通道顺序、缩放与补边、归一化、类别索引和后处理,再把框还原到原图坐标。比如宽图补边到正方形后,如果直接按宽高缩放回去而没有扣掉补边,框的位置就会偏移。
现场验证要按缺陷大小、相机、光照、拍摄批次分组。小缺陷漏检时,先检查标注和缩放后目标还剩多少像素,再考虑提高输入分辨率、切图或补数据;不是一律换大模型。误报集中在反光区域,则增加这类负样本并复核标签。
记录端到端耗时,包括取图、预处理、模型、后处理和结果传输,不只报 GPU 内核耗时。质检系统还应定义低置信度转人工复核的规则,降低无法确定时直接放行的风险。
# 使用边界
目标检测只是感知结果,不自动等于设备控制指令。ONNX 导出成功也不代表目标平台结果一致,需要核对缩放、归一化、类别映射和后处理。Ultralytics 提供 AGPL-3.0 与企业许可选项,商业集成前需按实际使用方式确认许可义务。
# 面试问答
1. 训练一个检测零件缺陷的模型,要做哪些事?参考答案
我先定义缺陷类别,收集不同批次、光照和角度的照片并标注位置,再按拍摄来源划分训练与测试,避免相似图片泄漏。训练后不只看 mAP,还看每类缺陷漏检和误报,以及目标设备的推理速度。最后导出模型,并在实际预处理和后处理流程中重新验证,不能把训练完成当成上线完成。
2. YOLO 训练和 LLM 微调有哪些共通点?参考答案
都需要先定义任务、整理高质量数据、划分独立测试,并与原模型基线比较。区别是监督目标和指标不同:客服学习怎样回答,检测模型学习类别和位置。训练 Loss 下降都不能直接替代真实场景验收,还要检查错误代价和部署性能。
3. mAP 很高,现场还是漏检,怎么处理?参考答案
我先检查测试数据是否代表现场,尤其是光照、相机和小目标分布,再按缺陷类别看召回率。总 mAP 可能掩盖某一类严重漏检,也不等于部署阈值下的表现。还要对比导出前后预处理和框坐标,确认不是部署错误,之后才调整阈值、数据或模型,并同时评估误报增加的代价。