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
1
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     # 凹陷。
1
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()
1
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 可能掩盖某一类严重漏检,也不等于部署阈值下的表现。还要对比导出前后预处理和框坐标,确认不是部署错误,之后才调整阈值、数据或模型,并同时评估误报增加的代价。

# 参考资料