1、MobileNet家族概览:从V1到V3的演进之路,以及为什么嵌入式设备首选MobileNet
大家好,我是你们的老朋友。今天咱们正式开讲《MobileNet在嵌入式设备上的移植与调优实战》的第一章。
说实话,做嵌入式AI这几年,我接触最多的轻量级网络就是MobileNet。从V1到V3,我几乎每个版本都在实际项目里摸爬滚打过。今天就跟大家聊聊,这个家族到底是怎么演进的,以及——为什么嵌入式设备首选它。
1.1 为什么嵌入式设备需要“轻量级”网络?
先问大家一个问题:你手头的嵌入式设备,算力有多少?
我见过很多刚入行的朋友,上来就想把ResNet-152塞进STM32里。结果呢?内存爆了,推理时间几十秒,根本没法用。
嵌入式设备的痛点很明显:
- 算力有限:没有GPU,只有CPU或者NPU,主频通常几百MHz
- 内存紧张:RAM可能只有几MB到几十MB
- 功耗敏感:电池供电,不能一直跑满
- 实时性要求:比如目标检测,一秒钟要处理30帧
所以,我们需要一个“小而快”的网络。MobileNet就是为此而生的。
核心观点:MobileNet的设计哲学,就是用更少的计算量,换取可接受的精度。它不是追求极致准确率,而是在“算力-精度-速度”三角中找到一个最佳平衡点。
1.2 MobileNet V1:深度可分离卷积的“开山之作”
2017年,Google团队提出了MobileNet V1。我记得当时看到这篇论文,第一反应是:原来卷积还能这么玩?
V1的核心创新,就是深度可分离卷积(Depthwise Separable Convolution)。
咱们来拆解一下:
- 标准卷积:一个卷积核同时处理所有通道,计算量 = 输入通道数 × 输出通道数 × 卷积核大小 × 特征图大小
- 深度可分离卷积:分成两步走
- 深度卷积:每个通道单独用一个卷积核处理
- 逐点卷积:用1×1卷积把通道信息融合起来
你想想看,这样一拆,计算量能降多少?
举个例子:输入是112×112×32,输出是112×112×64,卷积核大小3×3。
- 标准卷积计算量:32 × 64 × 3 × 3 × 112 × 112 ≈ 2.3亿次
- 深度可分离卷积计算量:32 × 3 × 3 × 112 × 112 + 32 × 64 × 1 × 1 × 112 × 112 ≈ 0.29亿次
计算量直接降到原来的1/8左右!
我的经验:在实际项目中,V1的推理速度确实快,但精度损失也比较明显。比如在ImageNet上,V1的Top-1准确率大约70.6%,比标准卷积低了3-5个百分点。不过对于很多嵌入式场景,这个精度已经够用了。
1.3 MobileNet V2:倒残差与线性瓶颈
V1虽然快,但有个问题:深度卷积的参数量太少,表达能力有限。V2在2018年提出,主要解决了这个问题。
V2引入了两个关键设计:
- 倒残差结构(Inverted Residual):先升维,再深度卷积,最后降维。跟ResNet的残差结构正好相反。
- 线性瓶颈(Linear Bottleneck):在降维后的层去掉ReLU激活函数,避免信息丢失。
为什么会这样设计?
我个人的理解是:低维空间里,ReLU会“杀死”太多信息。你想想看,ReLU会把负数全部置零,如果特征维度本来就低,那信息损失就非常严重。所以V2在瓶颈层用线性激活,保留更多信息。
V2的效果怎么样?
| 模型 | 计算量(MAdd) | 参数量 | Top-1准确率 |
|---|---|---|---|
| MobileNet V1 | 569M | 4.2M | 70.6% |
| MobileNet V2 | 300M | 3.4M | 72.0% |
你看,V2的计算量更小,参数量更少,准确率反而更高了。这就是架构设计的魅力。
避坑指南:我曾经在移植V2到某个低端NPU时,发现倒残差结构中的升维操作导致中间特征图内存暴增。如果你的设备内存紧张,建议先评估一下中间层的峰值内存占用。
1.4 MobileNet V3:NAS搜索与硬件感知
到了V3(2019年),Google开始用神经网络架构搜索(NAS)来设计网络。说白了,就是让机器自己去试,找到最优的结构。
V3的主要改进:
- NAS搜索:自动搜索最优的层结构和通道数
- 硬件感知:针对不同硬件(CPU、GPU、NPU)优化
- 新的激活函数:h-swish,计算更高效
- SE模块:Squeeze-and-Excitation,注意力机制,提升精度
V3有两个版本:
- V3-Large:适合算力稍强的设备,准确率接近ResNet-50
- V3-Small:适合资源极度受限的设备,比如智能手表
我记得有个项目,需要在Cortex-M4上做人脸检测。V3-Small的模型大小只有2.5MB,推理一次只要50ms,效果出奇的好。
1.5 为什么嵌入式设备首选MobileNet?
说了这么多,咱们总结一下。我个人认为,MobileNet有这几个不可替代的优势:
- 计算量小:深度可分离卷积把计算量降到极致
- 模型小:参数量少,适合存储空间有限的设备
- 推理快:在CPU上也能跑出不错的帧率
- 生态好:TensorFlow、PyTorch、ONNX、TFLite都原生支持
- 版本丰富:从V1到V3,从Large到Small,总有一款适合你
一句话总结:如果你要在嵌入式设备上做视觉任务,又不想在模型选型上纠结太久,选MobileNet准没错。它可能不是最准的,但一定是最稳的。
1.6 本章小结
这一章我们快速过了一遍MobileNet家族的演进:
- V1:深度可分离卷积,奠定轻量级基础
- V2:倒残差+线性瓶颈,精度提升
- V3:NAS搜索+硬件感知,极致优化
下一章,我会带大家动手搭建MobileNet V2的完整网络结构,并讲解如何在嵌入式设备上做前向推理。到时候咱们再细聊。
嗯,今天就到这里。有问题欢迎在评论区留言,咱们下期见。
课后思考:MobileNet V2的倒残差结构,为什么先升维再降维?如果反过来,先降维再升维,会有什么问题?