AI-深度学习

嵌入式视觉模型进阶 07:Backbone、Neck、Head 与多尺度特征

展开合集目录
  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:综合项目:检测、跟踪与云台跟随验收
嵌入式视觉模型进阶 07:Backbone、Neck、Head 与多尺度特征的封面

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

三个角色不等于三个固定文件

Backbone 把图片变为多层特征;Neck 整合来自不同层的表示;Head 根据任务产生分类、位置或掩码输出。某些网络把这些角色混在同一模块中,读代码时应按数据作用识别,而不是只看类名。

本课构建五个 stride=2 的卷积 stage,输入 [1,3,128,128]。取第三、四、五层作为 C3、C4、C5,步长分别为 8、16、32,形状是 [1,32,16,16]、[1,64,8,8]、[1,128,4,4]。这里 C3 的编号是教学命名,不保证与所有网络一致。

一个特征格子不是一个像素

stride=8 表示相邻输出格在输入坐标中相距约 8 像素,不代表每个格只看 8×8 区域。感受野取决于整个前序网络。把小目标缩到不足几个像素后,后续上采样不能凭空恢复被丢弃的细节。

高分辨率层通常保留更多空间位置,深层通常整合更大范围的信息。多尺度检测利用这种互补,但也增加内存和后处理候选数。

运行与检查

脚本记录三层输出,并用反向传播检查三层都接入计算图。不要把“梯度存在”写成“学到了有效特征”,后者必须用任务数据评价。

动手任务

输入改为 130×130,手算每次 padding=1、kernel=3、stride=2 的尺寸。结果按向上取整逐层变化,不一定严格等于 H/8、H/16、H/32。后续融合使用目标尺寸插值,避免默认乘二造成拼接失败。

交付一张层名、通道、步长、空间大小、元素数表;若显存不足,先找哪些特征被同时保留,而不是只看模型文件大小。

配套实验与运行记录

实验:Backbone、Neck、Head 与多尺度特征

查看完整代码:main.py
"""从不同步长的特征图理解检测网络的分工与小目标信息。"""

import torch
from torch import nn


class Backbone(nn.Module):
    def __init__(self):
        super().__init__()
        channels = [3, 8, 16, 32, 64, 128]
        self.stages = nn.ModuleList(
            [
                nn.Sequential(nn.Conv2d(a, b, 3, 2, 1), nn.ReLU())
                for a, b in zip(channels, channels[1:])
            ]
        )

    def forward(self, x):
        result = []
        for i, stage in enumerate(self.stages):
            x = stage(x)
            if i >= 2:
                result.append(x)
        return result


def main():
    torch.manual_seed(7)
    torch.set_num_threads(2)
    net = Backbone()
    for size in [128, 130]:
        net.zero_grad()
        features = net(torch.randn(1, 3, size, size))
        sum(y.square().mean() for y in features).backward()
        assert all(p.grad is not None for p in net.parameters())
        print("input", size, [(list(y.shape), y.numel()) for y in features])
    assert [y.shape[-1] for y in features] == [17, 9, 5]


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

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

cd 'content/posts/AI-深度学习/嵌入式视觉模型进阶/07-Backbone、Neck、Head 与多尺度特征/code' && python3 main.py

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

参考与进一步阅读

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


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