AI-深度学习

嵌入式视觉模型进阶 10:检测训练:标签分配与损失计算

展开合集目录
  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:综合项目:检测、跟踪与云台跟随验收
嵌入式视觉模型进阶 10:检测训练:标签分配与损失计算的封面

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

框标签怎样对应到输出位置

分类任务每张图一个标签,检测任务一张图可能有多个框,而输出包含许多位置。标签分配负责决定哪些位置学习哪个目标,哪些位置作为背景。一个目标覆盖多个位置,并不意味着所有位置都必然作为正样本。

本课限定每图一个目标、4×4 输出网格,选择包含目标中心的格子为唯一正样本。这是教学分配规则,不是 YOLOv8 的 Task-Aligned Assigner。先把规则做小,才能看清损失在哪些位置计算。

三类误差分别计算

objectness 使用所有位置的二分类损失;类别损失只对正样本计算;框回归也只对正样本计算。框用归一化 xyxy 表示,示例用 Smooth L1,未实现 IoU/DFL 损失。为缓解一正多负的数量差异,示例对正样本设置权重。

背景格没有有效框目标,不能让它们参与框损失。否则模型会被大量“背景框应为零”的信号淹没。真实多目标分配还需要处理位置冲突、无目标图片、忽略区域和不同尺度。

运行一个训练步

脚本把输入、标注、正样本位置和三个输出分支放在同一文件,执行前向、损失、反向和更新,并检查所有参数梯度有限。它只证明训练连接正确,不证明检测收敛。

修改任务

移动目标中心到另一个格子,确认正样本索引随之改变;保持中心不变只改框大小,确认位置分配不变而回归目标变化。再尝试无目标图片:正确处理应跳过空的类别/框损失,仍训练背景存在性。

真实训练必须记录各损失分量和正样本数。如果总损失下降但框不动,先检查回归是否被正确掩码和是否真的存在正样本。

配套实验与运行记录

实验:检测训练:标签分配与损失计算

查看完整代码:main.py
"""完成一个明确的中心分配与分类框回归训练步,理解正样本和损失掩码。"""

import torch
from torch import nn
import torch.nn.functional as F


def main():
    torch.manual_seed(7)
    torch.set_num_threads(2)
    net = nn.Sequential(
        nn.Conv2d(3, 16, 3, padding=1),
        nn.ReLU(),
        nn.AdaptiveAvgPool2d(4),
        nn.Conv2d(16, 7, 1),
    )
    x = torch.rand(1, 3, 32, 32)
    box = torch.tensor([[0.2, 0.3, 0.6, 0.8]])
    label = torch.tensor([1])
    center = (box[0, :2] + box[0, 2:]) / 2
    gx, gy = (center * 4).long().tolist()
    logits = net(x)
    target = torch.zeros_like(logits[:, 0])
    target[0, gy, gx] = 1
    loss_obj = F.binary_cross_entropy_with_logits(
        logits[:, 0], target, pos_weight=torch.tensor(15.0)
    )
    loss_cls = F.cross_entropy(logits[:, 1:3, gy, gx], label)
    loss_box = F.smooth_l1_loss(logits[:, 3:7, gy, gx].sigmoid(), box)
    loss = loss_obj + loss_cls + 5 * loss_box
    opt = torch.optim.SGD(net.parameters(), lr=0.01)
    opt.zero_grad()
    loss.backward()
    assert all(
        p.grad is not None and torch.isfinite(p.grad).all() for p in net.parameters()
    )
    opt.step()
    print(
        "positive (x,y):",
        gx,
        gy,
        "object/class/box:",
        *[round(v.item(), 5) for v in [loss_obj, loss_cls, loss_box]]
    )


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

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

cd 'content/posts/AI-深度学习/嵌入式视觉模型进阶/10-检测训练/code' && python3 main.py

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

参考与进一步阅读

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


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