AI-深度学习

嵌入式视觉模型进阶 12:训练自己的检测器与错误分析

展开合集目录
  1. 嵌入式视觉模型进阶 01:怎样读懂一个实际模型
  2. 嵌入式视觉模型进阶 02:卷积进阶:分组、深度、逐点与空洞卷积
  3. 嵌入式视觉模型进阶 03:MobileNet:深度可分离卷积与倒残差
  4. 嵌入式视觉模型进阶 04:通道注意力与 MobileNetV3
  5. 嵌入式视觉模型进阶 05:ShuffleNet:通道拆分与重排
  6. 嵌入式视觉模型进阶 06:结构重参数化:训练分支怎样合为一个卷积
  7. 嵌入式视觉模型进阶 07:Backbone、Neck、Head 与多尺度特征
  8. 嵌入式视觉模型进阶 08:FPN 与 PAN:怎样融合不同尺度的信息
  9. 嵌入式视觉模型进阶 09:检测头:分类、位置与置信度
  10. 嵌入式视觉模型进阶 10:检测训练:标签分配与损失计算
  11. 嵌入式视觉模型进阶 11:完整 YOLOv8 推理:从图片到原图目标框
  12. 嵌入式视觉模型进阶 12:训练自己的检测器与错误分析
  13. 嵌入式视觉模型进阶 13:检测器导出对照与其他结构路线
  14. 嵌入式视觉模型进阶 14:跟踪基础:运动预测、匹配与轨迹生命周期
  15. 嵌入式视觉模型进阶 15:ByteTrack 思路:用低分框恢复已有轨迹
  16. 嵌入式视觉模型进阶 16:外观特征与 ReID:怎样比较两个目标
  17. 嵌入式视觉模型进阶 17:目标跟随:从轨迹到云台控制接口
  18. 嵌入式视觉模型进阶 18:视频系统:队列、时间戳与异步流水线
  19. 嵌入式视觉模型进阶 19:人脸处理流程:检测、关键点与对齐
  20. 嵌入式视觉模型进阶 20:特征识别:人脸向量、相似度与阈值
  21. 嵌入式视觉模型进阶 21:人体关键点与姿态估计
  22. 嵌入式视觉模型进阶 22:OCR 检测:从文字区域到矫正图片
  23. 嵌入式视觉模型进阶 23:OCR 识别:序列模型与 CTC
  24. 嵌入式视觉模型进阶 24:完整 OCR 流程与识别错误分析
  25. 嵌入式视觉模型进阶 25:轻量语义分割与实例分割
  26. 嵌入式视觉模型进阶 26:工业异常检测:缺陷样本少时怎么办
  27. 嵌入式视觉模型进阶 27:深度估计与图像恢复:两个专题入口
  28. 嵌入式视觉模型进阶 28:面向 NPU 的计算图与算子兼容
  29. 嵌入式视觉模型进阶 29:量化、蒸馏与剪枝的实际取舍
  30. 嵌入式视觉模型进阶 30:综合项目:检测、跟踪与云台跟随验收
嵌入式视觉模型进阶 12:训练自己的检测器与错误分析的封面

第 12 / 30 课。 前置:上一课。本篇的运行范围以实验说明和验证记录为准,构造样例不代表真实任务精度或板端性能。

先让标注与部署任务一致

YOLO 文本标签通常是一行一个目标:class cx cy w h,坐标归一化到对应原图。标签 ID 从 0 开始,框宽高应为正,中心与边界应满足任务约定。空标签文件可以表达没有目标,缺失文件则可能是漏标,不能无条件等同。

本课默认构造一个两类小清单,检查格式与边界,并计算一组预测的匹配错误。它不下载数据,也不伪造真实检测成绩。真实训练脚本在包内 train_real.py,依赖单列在 requirements-real.txt。

划分以来源为单位

同一视频相邻帧通常高度相似,应按视频、设备或采集时段分组,再划分训练、验证和测试。先抽帧再随机分图片会产生泄漏。增强只作用于训练;验证协议固定后才能比较模型。

先用小数据确认能过拟合少量训练样本,排除标签与损失连接错误;随后恢复正式划分。验证集选择 checkpoint,测试集只用于最终报告。

训练入口与结果解释

准备本地数据 YAML 和本地 YOLOv8 模型 YAML 后运行 python3 train_real.py --data dataset.yaml --model yolov8n.yaml --epochs 20。入口从本地结构随机初始化,不自动获取预训练权重。数据 YAML 需自行提供 images、labels、类别与划分,不包含自动下载脚本。

固定软件版本、随机种子、输入尺寸和设备;保存训练输出与最佳权重。不能拿默认构造框的匹配数字当作真实 mAP。

看错误而非只看平均分

分类错误、定位偏差、重复框和完全漏检应分开统计。IoU 匹配时一个真值最多被匹配一次。空场景误报、远处小目标和夜间图像需要单列,整体指标可能掩盖这些失败。

本课练习把一个预测框复制三次,观察额外框成为误报;再移动真值边界,观察 IoU 阈值附近的匹配变化。参考结论:降低分数阈值可能增加召回,也增加误报,阈值应在验证集按应用代价选择。

配套实验与运行记录

实验:训练自己的检测器与错误分析

查看完整代码:main.py
"""检查 YOLO 标注、按来源划分数据,并提供真实数据训练入口。"""

import numpy as np


def check_label(line, classes):
    values = list(map(float, line.split()))
    if len(values) != 5 or not np.isfinite(values).all():
        raise ValueError("five finite values required")
    c, x, y, w, h = values
    if (
        c != int(c)
        or not 0 <= c < classes
        or min(w, h) <= 0
        or not 0 <= x - w / 2 <= x + w / 2 <= 1
        or not 0 <= y - h / 2 <= y + h / 2 <= 1
    ):
        raise ValueError("invalid class or box")
    return int(c), np.array([x - w / 2, y - h / 2, x + w / 2, y + h / 2])


def iou(a, b):
    inter = np.maximum(np.minimum(a[2:], b[2:]) - np.maximum(a[:2], b[:2]), 0).prod()
    return float(inter / ((a[2:] - a[:2]).prod() + (b[2:] - b[:2]).prod() - inter))


def main():
    truth = [check_label("0 .3 .3 .2 .2", 2), check_label("1 .7 .7 .2 .2", 2)]
    predictions = [(0, truth[0][1], 0.9), (0, truth[0][1], 0.8), (0, truth[1][1], 0.7)]
    used = set()
    tp = 0
    for c, box, score in sorted(predictions, key=lambda p: -p[2]):
        candidates = [
            (iou(box, b), i)
            for i, (label, b) in enumerate(truth)
            if label == c and i not in used
        ]
        if candidates and max(candidates)[0] >= 0.5:
            tp += 1
            used.add(max(candidates)[1])
    fp = len(predictions) - tp
    fn = len(truth) - tp
    assert (tp, fp, fn) == (1, 2, 1)
    print("constructed TP/FP/FN:", tp, fp, fn)
    try:
        check_label("0 .9 .9 .4 .4", 2)
    except ValueError:
        print("invalid boundary rejected")
    else:
        raise AssertionError("invalid label accepted")


if __name__ == "__main__":
    main()
下载代码

在项目根目录执行;下载包解压后,在解压目录执行 python3 main.py。

cd 'content/posts/AI-深度学习/嵌入式视觉模型进阶/12-训练自己的检测器与错误分析/code' && python3 main.py

在本篇代码目录执行 python3 main.py。依赖安装、可选入口见包内 README.md;实际运行结果见 verification.md。下载包包含本课使用的辅助模块与样例。

参考与进一步阅读

原始论文或官方文档用于核对结构、接口和适用范围。本篇代码是围绕教学目标编写的最小实验;除明确注明的完整入口外,不视为对应论文模型的完整复现。


完整进阶目录 · 入门系列 · 上一篇 · 下一篇