第 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。下载包包含本课使用的辅助模块与样例。
参考与进一步阅读
原始论文或官方文档用于核对结构、接口和适用范围。本篇代码是围绕教学目标编写的最小实验;除明确注明的完整入口外,不视为对应论文模型的完整复现。