AI-深度学习

嵌入式视觉模型进阶 01:怎样读懂一个实际模型

展开合集目录
  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:综合项目:检测、跟踪与云台跟随验收
嵌入式视觉模型进阶 01:怎样读懂一个实际模型的封面

第 1 / 30 课。 前置:从零搭建视觉模型。本篇的运行范围以实验说明和验证记录为准,构造样例不代表真实任务精度或板端性能。

从一个模型文件开始,先问什么

拿到 model.onnx 后不要立即接摄像头。先建立接口表:输入名字、类型、布局、尺寸、颜色顺序、缩放与均值方差;输出名字、形状、坐标单位、类别映射和后处理。形状相同只表示容器兼容,例如 RGB 与 BGR 都是三个通道,但值的意义不同。

本系列承接入门课程。学完后应能独立审查一个模型、实现任务流程并进行部署对照。01~18 与 28~30 组成检测跟随主线;19~27 可按项目选学。每课代码包独立,先运行原始配置,再修改练习。

用层级和数据流交叉阅读

模块列表回答“有什么层”,前向计算回答“这些层怎样连接”。残差相加、切片和 reshape 未必表现为独立模块,所以不能只统计 children()。先以一次固定输入记录叶子模块的形状,再对照 forward 中的函数调用。hook 应在检查后移除,以免重复注册和保留张量。

本课用随机初始化 MobileNetV2,把输入限定为 [1,3,64,64]。实际预训练权重的输入处理必须另行读取权重说明;64×64 只是本实验的结构探针。网络输出 [1,1000] 并不表示它已经能识别 1000 类。

结构、参数与模式各自负责什么

结构决定计算关系,参数决定具体映射,eval() 决定 BatchNorm、Dropout 等模块的行为。inference_mode() 关闭梯度相关开销,不会代替 eval()。同时保留两者,是因为它们解决不同的问题。

参数量是张量元素数量之和。把它乘以每个元素的字节数只能估计权重空间,不能代表峰值内存;中间激活、运行库工作区与输入缓冲也占空间。

动手检查与交付

运行实验,核对第一层、最后一层和输出。将输入改为 [2,3,96,96],预测哪些维度变化。再把输入通道改为 1,读取报错,定位失败发生在哪个接口。

参考结论:批量维跟随 N,空间维由步长与池化改变,分类通道数由 head 决定。灰度图不能仅靠“改 shape”变成模型接受的 RGB 输入。交付一张输入输出契约表,并把模型文件哈希、来源及版本与它放在一起。

课程地图与学习顺序

部分 课次 学完后的交付
网络结构与轻量主干 01~06 输入输出契约、轻量模块、融合数值对照
完整检测流程 07~13 多尺度结构、标签检查、推理与导出入口
视频跟踪与云台 14~18 轨迹生命周期、目标锁定、时序与停止规则
人脸、姿态与 OCR 19~24 对齐、阈值、关键点、文字处理流程
按项目选学的视觉专题 25~27 分割、异常检测、深度与恢复的实验基线
部署优化与综合验收 28~30 计算图审查、压缩对照、检测跟随回放

优先顺序为 01~18 → 28~30;19~27 按项目选学。完整 30 课均已提供独立实验。真实权重、真实数据和硬件验收需遵守各课明确的输入与运行条件,教学实验通过不等于这些项目环节已经完成。

配套实验与运行记录

实验:怎样读懂一个实际模型

查看完整代码:main.py
"""从输入契约、层级结构和输出语义出发,检查模型形状、参数与运行模式。"""

import torch
from torchvision.models import mobilenet_v2


def main():
    torch.manual_seed(7)
    torch.set_num_threads(2)
    model = mobilenet_v2(weights=None).eval()
    records, handles = [], []

    def hook(name):
        def record(module, args, output):
            records.append((name, list(args[0].shape), list(output.shape)))

        return record

    for name, module in model.named_modules():
        if name and not list(module.children()):
            handles.append(module.register_forward_hook(hook(name)))
    with torch.inference_mode():
        output = model(torch.zeros(1, 3, 64, 64))
    for handle in handles:
        handle.remove()
    assert output.shape == (1, 1000)
    for row in records[:4] + records[-4:]:
        print(row)
    print("parameters:", sum(p.numel() for p in model.parameters()))
    print("output:", list(output.shape), "random weights: structure check only")


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

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

cd 'content/posts/AI-深度学习/嵌入式视觉模型进阶/01-怎样读懂一个实际模型/code' && python3 main.py

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

参考与进一步阅读

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


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