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 激活函数,某些老芯片不支持
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% | 需框架支持 |
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%。
- 实时视频流分析:比如安防摄像头、无人机巡检,对帧率要求高(>20fps)
- 粗粒度目标检测:行人、车辆、大型物体,不需要区分太细的类别
- 作为多模型流水线的前置:先用 YOLO-Nano 快速定位,再用高精度模型做细分类
3.4 三模型协同:一个真实案例
最后分享一个我去年做的项目——智能垃圾分类终端。设备用的是瑞芯微 RK3588,算力 6 TOPS。整个流水线是这样的:
- 场景分类(MobileNetV3):先判断当前是「室内」还是「室外」场景。室内场景用更保守的检测参数,避免误报。
- 目标检测(YOLO-Nano):快速定位垃圾的位置,输出 bounding box。
- 细分类(EfficientNet-Lite1):对每个检测到的目标做精细分类,区分「塑料瓶」「易拉罐」「纸盒」等。
为什么这么设计?因为 YOLO-Nano 虽然快,但分类能力弱;EfficientNet-Lite 分类精度高,但做全图检测太慢。所以让 YOLO-Nano 负责「找」,EfficientNet-Lite 负责「认」,MobileNetV3 负责「调参」。最终整个流水线在 RK3588 上跑到了 18fps,分类准确率 94.7%。
好了,关于这三个模型的选型对比,今天就聊到这儿。说白了,没有最好的模型,只有最适合你场景的模型。下一章咱们聊聊模型量化与剪枝,这可是把模型塞进嵌入式设备的「最后一公里」。