AI-深度学习

嵌入式视觉模型进阶 09:检测头:分类、位置与置信度

展开合集目录
  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:综合项目:检测、跟踪与云台跟随验收
嵌入式视觉模型进阶 09:检测头:分类、位置与置信度的封面

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

输出数组必须带语义解释

假设某层为 [N,6,H,W],它可能是四个位置量加两个类别,也可能是四个位置量、objectness 和一个类别。仅凭通道数无法确定。必须结合模型实现、训练损失和导出说明确认。

Anchor-based 的一个典型参数化以预设框为参考:中心偏移乘参考宽高,再加参考中心;宽高对 log-space 偏移取 exp 后乘参考宽高。不同模型会使用 sigmoid、系数或不同单位,不能把本课公式直接套到所有 YOLO。

Anchor-free 的一种参数化从特征格中心出发,回归左上右下距离 l、t、r、b。若单位为特征格,再乘 stride 变成输入像素。anchor-free 仍可能使用参考点,并不意味着没有坐标基准。

分类与目标存在性

某些头单独预测 objectness,某些头不包含这个量;类别分数还可能融合质量信息。禁止在不知道输出契约时盲目把第 5 个数字乘进所有类别分数。

本课只用几何构造比较两种表示,输出同一个 xyxy 框。这里没有训练检测头,也没有模拟真实置信度。

练习与定位错误

把 stride 从 8 改成 16,判断哪些数应该跟着变。将宽高设为负数,说明它是否是合法物理框;采用 exp 预测宽高可保证正数,但仍要防止数值溢出。

交付 head 接口说明:张量布局、各通道语义、是否已 sigmoid、是否已解码、坐标单位、是否包含 NMS。遇到“框都挤在角落”,优先排查单位、轴顺序和缩放,而不是重训模型。

配套实验与运行记录

实验:检测头:分类、位置与置信度

查看完整代码:main.py
"""比较 anchor 偏移与距离回归,分清坐标解码和分数含义。"""

import math
import numpy as np


def anchor_decode(anchor, delta):
    cx, cy, w, h = anchor
    dx, dy, dw, dh = delta
    cx, cy = cx + dx * w, cy + dy * h
    w, h = w * math.exp(dw), h * math.exp(dh)
    return np.array([cx - w / 2, cy - h / 2, cx + w / 2, cy + h / 2])


def distance_decode(point, ltrb, stride):
    x, y = point
    l, t, r, b = ltrb
    if min(ltrb) < 0:
        raise ValueError("distances must be nonnegative")
    return np.array([x - l, y - t, x + r, y + b]) * stride


def main():
    a = anchor_decode([40, 40, 16, 16], [0, 0, 0, 0])
    b = distance_decode([5, 5], [1, 1, 1, 1], 8)
    np.testing.assert_allclose(a, b)
    print("same xyxy:", a.tolist())
    feature = np.zeros((1, 6, 4, 4))
    print("example head shape", feature.shape, "four distances + two class logits")


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

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

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

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

参考与进一步阅读

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


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