3、轻量化模型选型:MobileNet、EfficientNet-Lite、YOLO-Nano 的适用场景与性能对比。

做嵌入式视觉这几年,我最大的感触就是:模型选型这事儿,真不是看排行榜挑个精度最高的就完事了。你想想看,同样的模型在 PC 上跑得飞起,放到树莓派或者 RK3588 上,可能直接卡成 PPT。今天咱们就聊聊三个我实际用过、也踩过坑的轻量化模型——MobileNet、EfficientNet-Lite 和 YOLO-Nano。

嗯,先说明一下,这三兄弟的定位其实不太一样。MobileNet 和 EfficientNet-Lite 是分类网络,而 YOLO-Nano 是检测网络。但为什么放在一起比?因为在实际项目中,你经常需要它们协同工作——比如用 MobileNet 做场景分类,再用 YOLO-Nano 做目标检测。所以搞清楚各自的脾气,才能搭出靠谱的系统。

3.1 MobileNet:经典中的经典,但别盲目用 V1

MobileNet 系列我最早接触是在 2017 年,那时候做一个人脸检测的嵌入式项目。说实话,V1 版本虽然快,但精度确实有点拉胯。我个人习惯是:除非你的芯片算力实在捉襟见肘(比如 Cortex-M 系列),否则优先考虑 V2 或 V3

这里有个关键点——深度可分离卷积。说白了就是把标准卷积拆成两步:先逐通道卷积,再逐点卷积。这样做的好处是参数量和计算量直接降到原来的 1/8 到 1/9。我在项目中遇到过一个问题:同样的 MobileNetV2,在 STM32MP1 上跑 224x224 输入,帧率能到 30fps,但换成 V1 虽然更快,精度却掉了 5 个点,导致后续的检测任务误报率飙升。

适用场景总结:
  • MobileNetV1:极端低算力场景(<1 TOPS),比如 MCU、低端 DSP
  • MobileNetV2:通用嵌入式场景(1-4 TOPS),平衡性好,我用的最多
  • MobileNetV3:需要更高精度时,但注意它用了 h-swish 激活函数,某些老芯片不支持
我的小技巧: 如果芯片支持 INT8 量化,MobileNetV2 量化后精度损失通常小于 1%。我曾经在 RK3399 上把 V2 量化到 INT8,推理速度提升了 2.3 倍,而 Top-1 精度只掉了 0.7%。

3.2 EfficientNet-Lite:谷歌的「均衡派」,但部署有坑

EfficientNet-Lite 是谷歌专门为移动端和边缘设备优化的版本。它跟原版 EfficientNet 最大的区别是:去掉了 Swish 激活函数和 SE 模块中的某些复杂操作,换成了更友好的 ReLU6。为什么这么做?因为很多嵌入式推理框架对 Swish 的支持并不好,强行用的话要么速度慢,要么精度反而下降。

我记得有一次在华为 Atlas 200 上部署 EfficientNet-Lite0,原本以为直接转 OM 模型就行,结果发现它的 深度可分离卷积在 NHWC 布局下效率更高,而我的数据预处理默认是 NCHW。改了这个布局之后,推理时间从 45ms 降到了 28ms。嗯,这里要注意,数据布局对嵌入式推理的影响往往比模型本身还大

性能对比上,我拿 ImageNet 的 Top-1 精度做个参考(输入 224x224):

模型 参数量 计算量 (MAdds) Top-1 精度 适合芯片
MobileNetV2 3.4M 300M 72.0% 通用
MobileNetV3-Large 5.4M 219M 75.2% 中高端
EfficientNet-Lite0 4.7M 410M 75.1% 需框架支持
EfficientNet-Lite1 5.4M 580M 76.7% 需框架支持
避坑指南: 我曾经在部署 EfficientNet-Lite 时发现,某些 NPU 对 tf.nn.depthwise_conv2d 的优化不如 MobileNet 的 SeparableConv2D。所以如果你用的是自研芯片或者小众 NPU,建议先跑一遍 benchmark,别只看论文数据。

3.3 YOLO-Nano:检测界的「小钢炮」,但别指望它做分类

YOLO-Nano 是 YOLO 系列里专门为边缘设备设计的版本。它的核心思路是:用更浅的主干网络 + 更少的检测头。我最早在 Jetson Nano 上跑 YOLO-Nano,输入 416x416,FP16 精度下能到 25fps,mAP 在 COCO 上大概 25% 左右。说实话,这个 mAP 跟 YOLOv5s 的 37% 比差了不少,但你要知道,YOLOv5s 在同样设备上只能跑 12fps。

这里有个很实际的问题:YOLO-Nano 适合检测小目标吗? 我个人经验是——不太适合。因为它的特征图分辨率有限,对于 32x32 像素以下的目标,召回率会明显下降。我在做一个智能货柜项目时,用 YOLO-Nano 检测饮料瓶(大概 60x80 像素)没问题,但换成检测口香糖(20x30 像素)就经常漏检。后来我换成了 YOLOv5n,虽然慢了 5fps,但小目标召回率提升了 15%。

YOLO-Nano 的典型应用场景:
  • 实时视频流分析:比如安防摄像头、无人机巡检,对帧率要求高(>20fps)
  • 粗粒度目标检测:行人、车辆、大型物体,不需要区分太细的类别
  • 作为多模型流水线的前置:先用 YOLO-Nano 快速定位,再用高精度模型做细分类
我的经验: 如果你要在 YOLO-Nano 上做自定义数据集训练,建议把输入分辨率降到 320x320。我在一个车牌检测项目中试过,320 输入比 416 输入快了 40%,而 mAP 只掉了 1.2%。对于嵌入式设备来说,这个 trade-off 非常划算。

3.4 三模型协同:一个真实案例

最后分享一个我去年做的项目——智能垃圾分类终端。设备用的是瑞芯微 RK3588,算力 6 TOPS。整个流水线是这样的:

  1. 场景分类(MobileNetV3):先判断当前是「室内」还是「室外」场景。室内场景用更保守的检测参数,避免误报。
  2. 目标检测(YOLO-Nano):快速定位垃圾的位置,输出 bounding box。
  3. 细分类(EfficientNet-Lite1):对每个检测到的目标做精细分类,区分「塑料瓶」「易拉罐」「纸盒」等。

为什么这么设计?因为 YOLO-Nano 虽然快,但分类能力弱;EfficientNet-Lite 分类精度高,但做全图检测太慢。所以让 YOLO-Nano 负责「找」,EfficientNet-Lite 负责「认」,MobileNetV3 负责「调参」。最终整个流水线在 RK3588 上跑到了 18fps,分类准确率 94.7%。

注意: 多模型协同工作时,内存带宽往往是瓶颈。我建议把模型权重都加载到连续内存中,避免频繁的 DMA 拷贝。另外,如果两个模型共享同一个预处理模块(比如 Resize + Normalize),记得把中间结果复用,别重复计算。

好了,关于这三个模型的选型对比,今天就聊到这儿。说白了,没有最好的模型,只有最适合你场景的模型。下一章咱们聊聊模型量化与剪枝,这可是把模型塞进嵌入式设备的「最后一公里」。