AI-深度学习

嵌入式视觉模型进阶 02:卷积进阶:分组、深度、逐点与空洞卷积

展开合集目录
  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:综合项目:检测、跟踪与云台跟随验收
嵌入式视觉模型进阶 02:卷积进阶:分组、深度、逐点与空洞卷积的封面

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

先区分四个独立旋钮

卷积核 K 决定一次采样多少空间位置,stride 决定输出步进,dilation 决定采样点间隔,groups 决定通道之间的连接。它们不能互相替代。输入输出通道都必须能被 groups 整除。

忽略 bias,分组卷积参数量为 Cout × (Cin/groups) × K²。depthwise 是每个输入通道分别做空间卷积;本课取 groups=Cin=Cout。pointwise 是 1×1 卷积,用于混合通道。把两者串起来得到深度可分离卷积,和一个任意普通卷积并不具有完全相同的表达集合。

空洞率改变采样范围

有效核宽为 dilation × (K−1)+1。例如 3×3 核、dilation=2,覆盖范围是 5×5,但只有 9 个采样点,不是拥有 25 个独立参数。过大的空洞率可能跳过细小结构。输出尺寸仍应代入包含 dilation 的公式,不能只看 kernel_size。

运行对照如何解释

脚本固定 [1,16,32,32] 输入,执行普通、四组、depthwise、depthwise+pointwise 和空洞卷积,打印参数量和输出形状。计时前先预热,重复测量并报告中位数。CPU 计时只是本机观察,不是 NPU 排名,也不包括图片解码。

练习与排错

把 groups 改成 3,说明为什么配置无效;再把 dilation 从 2 改为 3,同时修改 padding 以保持输出大小。最后只减小输入空间尺寸,观察权重数量不变但耗时可能变化。

参考结论:groups=3 无法整除 16 个输入通道;3×3、dilation=3 时保持大小需要 padding=3。部署时要确认目标支持该组数、空洞率与通道排列,而不只是确认它支持名为 Conv 的算子。

配套实验与运行记录

实验:卷积进阶:分组、深度、逐点与空洞卷积

查看完整代码:main.py
"""通过真实算子运行区分连接关系、感受野和理论计算量。"""

import statistics, time
import torch
from torch import nn


def main():
    torch.manual_seed(7)
    torch.set_num_threads(2)
    ops = {
        "regular": nn.Conv2d(16, 32, 3, padding=1, bias=False),
        "groups4": nn.Conv2d(16, 32, 3, padding=1, groups=4, bias=False),
        "depthwise": nn.Conv2d(16, 16, 3, padding=1, groups=16, bias=False),
        "separable": nn.Sequential(
            nn.Conv2d(16, 16, 3, padding=1, groups=16, bias=False),
            nn.Conv2d(16, 32, 1, bias=False),
        ),
        "dilation2": nn.Conv2d(16, 32, 3, padding=2, dilation=2, bias=False),
    }
    x = torch.rand(1, 16, 32, 32)
    with torch.inference_mode():
        for name, op in ops.items():
            op.eval()
            for _ in range(5):
                op(x)
            elapsed = []
            for _ in range(30):
                start = time.perf_counter_ns()
                y = op(x)
                elapsed.append((time.perf_counter_ns() - start) / 1e6)
            assert y.shape[-2:] == (32, 32)
            print(
                name,
                "parameters",
                sum(p.numel() for p in op.parameters()),
                "shape",
                list(y.shape),
                "CPU median ms",
                round(statistics.median(elapsed), 4),
            )
    assert sum(p.numel() for p in ops["regular"].parameters()) == 4608


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

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

cd 'content/posts/AI-深度学习/嵌入式视觉模型进阶/02-卷积进阶/code' && python3 main.py

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

参考与进一步阅读

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


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