4、模型选型原则:轻量化网络与参数量-推理速度的平衡

模型选型这事儿,说难不难,说简单也不简单。我见过太多团队,一上来就选个 ResNet-152,结果在嵌入式设备上一跑,帧率只有个位数。嗯,那场面确实有点尴尬。

说白了,嵌入式 AI 的模型选型,核心就一句话:在算力、内存、功耗的约束下,找到那个“刚刚好”的模型。不是越大越好,也不是越小越好,而是刚刚好。

4.1 轻量化网络三剑客

目前主流的轻量化网络,我习惯把它们分成三派。每一派都有自己的看家本领。

4.1.1 MobileNet 系列

MobileNet 的核心思想,是用深度可分离卷积替代标准卷积。你想想看,标准卷积既要提取空间特征,又要融合通道信息,一锅端。而深度可分离卷积把这两步拆开了:先逐通道卷积(Depthwise Conv),再逐点卷积(Pointwise Conv)。

我在项目中做过对比,同样的输入尺寸,MobileNetV2 的参数量只有标准卷积的 1/8 到 1/10。但要注意,深度可分离卷积对硬件不友好,尤其是在某些老款 DSP 上,反而跑不快。

关键版本对比:

  • MobileNetV1:结构简单,适合快速部署。但精度偏低。
  • MobileNetV2:引入了倒残差结构和线性瓶颈。我个人最喜欢这个版本,精度和速度的平衡做得最好。
  • MobileNetV3:加入了 NAS 搜索和硬 swish 激活。精度更高,但有些算子嵌入式平台不支持。

4.1.2 ShuffleNet 系列

ShuffleNet 的思路很有意思。它用分组卷积来减少计算量,但分组卷积有个问题:组与组之间信息不流通。怎么办?它搞了个“通道混洗”(Channel Shuffle)操作,让信息在组间流动起来。

我曾经在一个智能门锁项目里用过 ShuffleNetV2。当时设备的内存只有 256KB,MobileNet 都塞不下。ShuffleNetV2 的参数量更小,而且它的设计原则很实用:输入输出通道数相等时,内存访问成本最低。这一点,很多论文不会告诉你,但实际跑起来差别很大。

我的经验:如果你的设备内存特别紧张(比如 < 512KB),优先考虑 ShuffleNetV2。它的 MAC(内存访问成本)更低,实际推理速度往往比 MobileNet 快 20%-30%。

4.1.3 EfficientNet-Lite

EfficientNet 本身是用 NAS 搜出来的,精度很高。但原版 EfficientNet 用了 Swish 激活和 SE 模块,在嵌入式设备上跑不动。Google 后来推出了 EfficientNet-Lite,做了三件事:

  • 把 Swish 换成了 ReLU(很多嵌入式芯片对 ReLU 有硬件加速)
  • 去掉了 SE 模块(减少计算量)
  • 调整了分辨率缩放策略(让输入尺寸更友好)

说白了,EfficientNet-Lite 就是为嵌入式平台“减配”过的版本。我建议你在算力相对充裕的设备上(比如有 NPU 的芯片)使用它,精度确实比前两者高出一截。

4.2 参数量与推理速度的平衡

很多人有个误区:觉得参数量越小,推理速度就越快。其实不完全对。

我举个例子。假设有两个模型:

  • 模型 A:参数量 1M,但用了很多分组卷积,内存访问不连续
  • 模型 B:参数量 2M,但结构规整,内存访问连续

在实际的 ARM Cortex-M 芯片上,模型 B 可能跑得比模型 A 还快。为什么?因为内存访问的瓶颈往往比计算瓶颈更严重

避坑指南:我曾经在一个项目里,把模型参数量从 3M 压缩到 1.5M,结果推理速度反而变慢了。后来发现是通道数变得不规整,导致内存碎片化严重。所以,不要只看参数量,要看实际的内存访问模式

4.3 我的选型决策流程

在实际项目中,我一般按这个顺序做决策:

  1. 先看硬件约束:RAM 多大?Flash 多大?有没有硬件加速器?
  2. 再定精度底线:任务要求 Top-1 准确率多少?能容忍多少损失?
  3. 然后选主干网络:根据前两步,从 MobileNet、ShuffleNet、EfficientNet-Lite 里选一个
  4. 最后调超参:调整宽度因子(alpha)、分辨率因子(rho),找到最佳平衡点

这里我整理了一份选型参考表,你可以直接拿来用:

硬件平台 推荐模型 宽度因子 输入分辨率 预期推理时间(ms)
Cortex-M4 (200MHz) ShuffleNetV2 0.5 128x128 50-80
Cortex-M7 (400MHz) MobileNetV2 0.75 160x160 30-50
ARM A53 (1.5GHz) MobileNetV3 1.0 224x224 10-20
带 NPU 的芯片 EfficientNet-Lite 1.0 224x224 5-10

一个小技巧:如果你不确定选哪个,先用 MobileNetV2 宽度因子 0.75 跑一遍。这个配置在大多数嵌入式平台上都能跑,而且精度还算过得去。等后面再根据实际瓶颈做优化。

4.4 实战中的坑与对策

最后,分享几个我在项目中踩过的坑:

  • 坑一:模型量化后精度暴跌。对策:选模型时就要考虑量化友好性。MobileNetV2 的 ReLU6 对量化更友好,而某些 NAS 搜出来的激活函数量化后精度损失很大。
  • 坑二:模型在 PC 上跑得飞快,上板子就卡。对策:一定要在目标硬件上做 profiling,不要只看 FLOPs。FLOPs 只是理论值,实际速度受内存带宽、缓存大小影响很大。
  • 坑三:模型参数量很小,但内存占用却很大。对策:注意中间特征图的大小。有些模型虽然参数量小,但中间层特征图很大,会撑爆 RAM。

嗯,模型选型这块,说到底就是个“权衡”的艺术。没有银弹,只有最适合你当前场景的方案。多跑实验,多记笔记,慢慢就有感觉了。