Skip to content

MobileNet 与移动端推理

MobileNet 是 Google 专为移动和嵌入式设备设计的轻量级卷积网络系列。它以**深度可分离卷积(Depthwise Separable Convolution,将空间滤波和通道混合拆分的卷积方式)**为核心,在极低的计算量和参数量下实现接近标准 CNN 的精度,是手机端实时视觉推理的工业标准。前置阅读:卷积神经网络 CNN、EfficientNet 与轻量网络。

标准卷积做的事情是”同时混合空间信息和通道信息”——一个 3x3 卷积核既在看周围像素(空间),也在混合所有输入通道(通道)。这看似高效,其实极其浪费:绝大多数计算量花在了通道混合上。

MobileNet 的核心洞察是把这两步拆开:

  1. 先做深度卷积(depthwise):每个输入通道单独用一个小卷积核做空间滤波,完全不做通道混合——极其便宜
  2. 再做逐点卷积(pointwise):用 1x1 卷积做通道混合

这种”深度可分离卷积”将计算量降到了标准卷积的八分之一到九分之一,精度损失却很小。

标准 3x3 卷积:假设输入 N 个通道、输出 M 个通道。每个输出通道需要一个 3x3xN 的卷积核,共 M 个核。总计算量正比于 9 乘 N 乘 M。

深度可分离卷积分两步:

  • 深度卷积:N 个 3x3x1 的卷积核,每个只作用于一个通道。计算量正比于 9 乘 N。
  • 逐点卷积:M 个 1x1xN 的卷积核做通道投影。计算量正比于 N 乘 M。
  • 总计算量正比于 9N + NM = N 乘 (9 + M)。

两者的比值约为 9 / M。当 M=64 时,深度可分离卷积仅需标准卷积约 1/8 的计算量。

用更具体的数字:对一张 224x224 的 RGB 图片做一层标准 3x3 卷积(输入 3 通道,输出 64 通道),计算量约为 9 * 3 * 64 * 224 * 224 = 86.7M 次乘加。用深度可分离卷积则为 9 * 3 * 224 * 224 + 3 * 64 * 224 * 224 = 1.4M + 9.6M = 11M,省了约 87%。

MobileNet 引入两个全局缩放因子来进一步压缩:

  • 宽度乘子 alpha:将每层通道数乘以 alpha(如 0.75、0.5、0.25),计算量和参数量按 alpha 的平方缩减
  • 分辨率乘子 rho:将输入分辨率乘以 rho(如 224 降到 160 或 128),计算量按 rho 的平方缩减

这两个因子让开发者可以在精度和速度之间灵活权衡——手机算力不够就用 alpha=0.5,需要更高精度就用 alpha=1.0。

组合后的总计算量缩放公式:

总计算量 ≈ 原始计算量 × alpha² × rho²

例如 alpha=0.5, rho=0.714(224→160)时,总计算量约为原始的 0.25 * 0.51 = 12.8%。

第一个版本就是”标准 CNN 结构 + 深度可分离卷积”。28 层,以 VGG 的结构为骨架,把所有标准卷积替换为深度可分离卷积。简单但有效。

V1 的结构非常直接:一个标准 3x3 卷积做初始特征提取(stride=2),然后堆叠 13 个深度可分离卷积层,最后接全局平均池化(Global Average Pooling)和全连接分类头。每层结构是 DW(3x3) → BN → ReLU6 → PW(1x1) → BN → ReLU6。BN(Batch Normalization,批归一化)放在卷积后、激活前,用于稳定训练。

ReLU6 的含义:V1 用 ReLU6(将输出裁剪到 [0, 6] 区间)而非普通 ReLU。这是因为在低精度(INT8)量化时,无上界的 ReLU 可能产生极大值导致量化溢出,ReLU6 的有界输出对量化更友好。

MobileNetV2(2018):倒残差 + 线性瓶颈

Section titled “MobileNetV2(2018):倒残差 + 线性瓶颈”

V2 的核心创新是倒残差块(Inverted Residual Block):

  1. 先用 1x1 卷积升维(将通道扩展 t 倍,如 6 倍)
  2. 在高维空间做深度可分离卷积
  3. 再用 1x1 卷积降维回原始通道数
  4. 当 stride=1 且输入输出通道相同时加残差连接

这和 ResNet 的瓶颈”降维-卷积-升维”恰好相反。为什么倒过来?因为深度可分离卷积在低维下表达能力很差——先升维再做卷积,可以保留更多特征信息。

具体来说,升维后的高维空间有更多通道来表达丰富的特征,而深度卷积(逐通道独立做空间滤波)在高维空间中不会显著增加计算量(因为不做通道混合),所以”先升维”几乎是免费的性能提升。

线性瓶颈(Linear Bottleneck):最后一个 1x1 降维卷积后不加 ReLU。因为 ReLU 在低维空间会丢失大量信息(负值全变成零),线性映射能更好地保留特征。

用数学解释为什么线性很重要:假设降维后的特征是 s 维向量(s 较小),ReLU 对每个分量独立截断。如果原始信号流形(manifold,即数据分布的内在低维结构)的某些方向需要负值来表示,ReLU 会将其硬性置零,造成不可逆的信息丢失。在升维前的低维空间,这种丢失尤为严重。

一个完整的 MobileNetV2 倒残差块的数据流:

输入: [B, C_in, H, W]
│
├─ 1x1 升维: [B, C_in * t, H, W] # t=6, 通道扩展 6 倍
│ └─ BN + ReLU6
│
├─ 3x3 DW 卷积: [B, C_in * t, H', W'] # 空间滤波, stride 决定 H'/W'
│ └─ BN + ReLU6
│
├─ 1x1 降维: [B, C_out, H', W'] # 压缩回低维
│ └─ BN (无 ReLU! 这就是"线性瓶颈")
│
└─ 残差连接 (仅当 stride=1 且 C_in == C_out)

MobileNetV3(2019):NAS + SE + 硬件感知

Section titled “MobileNetV3(2019):NAS + SE + 硬件感知”

V3 由神经架构搜索(NAS,Neural Architecture Search,即用算法自动搜索最优网络结构的方法)自动搜索最优结构,并引入了三个改进:

  1. SE 通道注意力(Squeeze-and-Excitation):对通道维度做自适应加权。具体做法是:先用全局平均池化把每个通道压缩成一个标量(squeeze),再用两层全连接生成各通道的权重系数(excitation),最后用这些系数重新缩放各通道特征。这让网络学会”哪些通道更重要”。
  2. h-swish 激活函数:Swish 的硬近似版本,在低精度量化下表现更好。Swish 函数定义为 x * sigmoid(x),h-swish 用硬近似替代 sigmoid:
# Swish 原始定义
swish(x) = x * sigmoid(x) = x * (1 / (1 + exp(-x)))
# h-swish:用硬 sigmoid 近似(分段线性,量化友好)
h-swish(x) = x * relu6(x + 3) / 6
# 对比 h-sigmoid(SE 模块中用)
h-sigmoid(x) = relu6(x + 3) / 6

h-swish 的优势是避免了指数运算(sigmoid 的 exp),用简单的 ReLU6 分段函数替代,在移动端推理时计算量显著降低。

  1. 硬件感知搜索(Hardware-Aware Search):在搜索时将实际设备的延迟纳入目标函数,确保搜索出的结构在特定硬件上真正高效。V3 论文中针对不同处理器(如 Qualcomm DSP、Pixel 神经加速器)分别搜索,得到了延迟-精度帕累托前沿上的最优解。

V3 比 V2 在 ImageNet 上精度高约 3%,同时推理更快。V3 分为 Large 和 Small 两个版本:Large 面向高端手机(5.4M 参数,75.3% Top-1),Small 面向低端设备(2.5M 参数,67.4% Top-1)。

V3 还做了几个结构性优化:

  • 重新设计网络头尾:V2 的前几层用了昂贵的标准卷积,V3 换成了更高效的 h-swish + 延迟降低策略,减少初始层的计算开销。
  • SE 模块的选择性放置:SE 模块只在部分层使用(如后半段的高分辨率层),避免在每一层都增加额外计算。
  • 尾部修改:将最后的 1x1 卷积通道数从 1280 降到 1024,减少了全连接层的输入维度。
  • 层级混合:V3-Large 用 NAS 搜索了整体结构中每个 block 的扩展因子(expansion ratio)和 kernel size(3x3 或 5x5),V2 则是统一参数。

PyTorch:加载 MobileNetV3 并测量推理速度

Section titled “PyTorch:加载 MobileNetV3 并测量推理速度”
import torch, time
from torchvision import models
# 加载 MobileNetV3-Large 预训练模型
model = models.mobilenet_v3_large(weights=models.MobileNet_V3_Large_Weights.DEFAULT)
model.eval()
# 在 CPU 上测量推理速度(模拟移动端环境)
dummy = torch.randn(1, 3, 224, 224)
with torch.no_grad():
for _ in range(10): # 预热
model(dummy)
t0 = time.time()
for _ in range(100):
model(dummy)
elapsed = (time.time() - t0) / 100 * 1000
print(f"MobileNetV3-Large CPU 推理: {elapsed:.1f} ms/帧")
params = sum(p.numel() for p in model.parameters()) / 1e6
print(f"参数量: {params:.1f}M") # 约 5.4M
import torch
from torchvision import models
model = models.mobilenet_v3_small(weights=models.MobileNet_V3_Small_Weights.DEFAULT)
model.eval()
dummy = torch.randn(1, 3, 224, 224)
# 导出 ONNX 模型(可在 Android / iOS / 边缘设备上运行)
torch.onnx.export(
model, dummy, "mobilenet_v3_small.onnx",
input_names=["input"], output_names=["output"],
opset_version=13,
)
print("导出完成,可用 ONNX Runtime 或 NCNN 加载")

TFLite 量化部署(Android/嵌入式)

Section titled “TFLite 量化部署(Android/嵌入式)”
import tensorflow as tf
# 加载预训练 MobileNetV3 的 Keras 模型
model = tf.keras.applications.MobileNetV3Small(
weights='imagenet', include_top=True)
# 训练后全整数量化(INT8)——体积压缩 4x,推理加速 2-3x
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
# 提供代表性数据集做校准(从训练集采 100-500 张图片)
def representative_dataset():
for _ in range(100):
data = np.random.rand(1, 224, 224, 3).astype(np.float32)
yield [data]
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8 # 输入也是 INT8
converter.inference_output_type = tf.int8 # 输出也是 INT8
quantized_model = converter.convert()
with open('mobilenet_v3_small_int8.tflite', 'wb') as f:
f.write(quantized_model)
print(f"量化后模型大小: {len(quantized_model) / 1e6:.1f} MB")
  • **V3-Small(2.5M 参数)**适合实时检测、分类等低延迟场景;V3-Large(5.4M)精度更高,适合对精度要求更高的离线分析。
  • 在典型手机上,V3-Small 约 5-7ms/帧,V3-Large 约 10-15ms/帧(具体取决于芯片和推理框架)。
  • INT8 量化可将模型体积压缩 4 倍、推理速度提升 2-3 倍。TFLite 的训练后量化对 MobileNet 支持非常成熟。
  • 量化感知训练(QAT):如果训练后量化精度损失过大(>2%),可在训练时模拟量化误差(QAT),通常能恢复到接近 FP32 的精度。详见模型压缩与加速。
  • MobileNet 在 ImageNet 上训练通常用 RMSprop 或 SGD + Momentum,初始学习率 0.045-0.1,配合余弦退火(Cosine Annealing,学习率从大到小平滑下降)。
  • 标签平滑(Label Smoothing, epsilon=0.1)几乎是标配——MobileNet 容量小,标签平滑能防止过拟合、提升 0.5-1% 的 Top-1 精度。
  • 标准增强:随机裁剪、水平翻转、颜色抖动(Color Jittering)。
  • AutoAugment / RandAugment:Google 搜索出的自动数据增强策略,对 MobileNet 的精度提升尤为明显(1-2%),因为小模型更依赖数据多样性来弥补容量不足。
  • Mixup / CutMix:将两张图片以一定比例混合,进一步正则化。
  • Android:用 TFLite 或 NCNN;iOS 用 Core ML;跨平台用 ONNX Runtime Mobile。不同框架对不同硬件的优化程度差异很大,建议实测对比。
  • NCNN 对 ARM CPU 做了极致优化,在骁龙芯片上往往比 TFLite 快 20-30%,但不支持 GPU 加速。
  • 宽度乘子的权衡:alpha=0.75 可以再快一倍,精度降 2-3 个点;alpha=0.5 适合极度受限的设备(如微控制器)。
  • 输入分辨率的影响:MobileNet 默认 224x224,降到 160x160 可再提速近一倍,适合检测场景中作为初步筛选。
  • MobileNet 专注于极致轻量(5M 以内),EfficientNet-B0 也在这个量级但精度更高。追求极限速度选 MobileNetV3-Small,追求精度选 EfficientNet-B0。
  • 但 EfficientNet 的缩放公式(同时放大宽度、深度、分辨率)在移动端不如 MobileNet 的简单 alpha/rho 缩放直观易控。

MobileViT:卷积与 Transformer 的融合

Section titled “MobileViT:卷积与 Transformer 的融合”

Apple 在 2022 年提出 MobileViT,将轻量 Transformer 引入移动端网络。核心思路是把标准卷积的”局部空间建模”替换为 Transformer 的”全局自注意力”,用极少的计算量换取更好的全局感受野。2024-2025 年的后续工作(MobileViTv2、MobileViTv3)进一步优化了注意力机制的计算效率,在某些视觉任务上超过了 MobileNetV3。

Apple 在 2023 年提出 MobileOne,核心发现是:MobileNetV2 的倒残差块在训练阶段存在”结构瓶颈”(多头结构并行分支导致梯度流不畅)。MobileOne 在训练时用多分支结构(conv + 1x1 + identity 并行),推理时将这些分支等价重参数化为单分支,推理时与 V1 一样简单但精度大幅超越 V3。在 iPhone 12 上 MobileOne 比 MobileNetV3 快 5-8%,Top-1 精度高 2%。

EfficientFormer / FastViT:端侧 Transformer

Section titled “EfficientFormer / FastViT:端侧 Transformer”

随着 Vision Transformer(ViT)的普及,研究者开始探索移动端的 Transformer 架构。EfficientFormer 和 FastViT 通过精心设计的 token 混合策略和维度变换,让 Transformer 在手机上也能实时运行。2025 年的趋势是 混合架构(Hybrid CNN-Transformer):前几层用 CNN 做高效特征提取,后几层用 Transformer 做高级语义建模。

2024-2025 年最显著的趋势是在手机上直接运行小型语言模型(如 Llama-3.2-1B、Gemma-2-2B、Qwen-2.5-1.5B)。这催生了一批新的端侧推理框架和技术:

  • Apple Intelligence(2024-2025):苹果在其芯片(A17 Pro / M4)上原生支持端侧 LLM 推理,使用了高度优化的量化技术(4-bit 甚至更低精度)和内存带宽优化。
  • Google Gemini Nano:Pixel 8/9 上直接运行的端侧多模态模型,用 MobileNet 系列做图像特征提取的前端。
  • LLM 端侧推理引擎:MLC-LLM、MediaPipe LLM Inference、ExecuTorch 等框架让 MobileNet 积累的移动端优化经验扩展到 Transformer 模型。详见模型压缩与加速。

2024-2025 年的手机芯片普遍配备了强大的 NPU(Neural Processing Unit,神经网络处理器),如高通 Hexagon DSP、苹果 Neural Engine、联发科 APU。新的移动端网络设计开始针对 NPU 特性优化:NPU 对大块矩阵乘法的加速比远高于碎片化的深度卷积,因此有些新架构(如 RepVGG、FastViT)刻意避免深度可分离卷积,改用等价重参数化技术将多分支结构在推理时融合为标准卷积,更好地利用 NPU。

  • 手机端实时目标检测:SSD-MobileNet 在手机上实现 20+ FPS 的实时检测,Google Pixel 相机的人像模式背景虚化就用了 MobileNet 做实时分割。
  • AR 滤镜与人脸关键点:Snapchat、抖音的 AR 滤镜在移动端实时检测人脸并叠加特效。
  • 拍照搜索与植物识别:淘宝拍立淘、形色等 APP 用 MobileNet 在端上做特征提取。
  • 端侧 OCR:身份证识别、银行卡识别等场景用 MobileNet 做文字检测,完全在手机上运行。详见OCR 文字识别。
  • 自动驾驶辅助:MobileNet 在车载芯片上做实时车道线检测和行人预警。
  • 端侧 LLM 的视觉前端:Gemini Nano、Apple Intelligence 等端侧多模态模型的图像理解部分仍然依赖 MobileNet 级别的轻量 CNN 做特征提取和预处理。
类库语言说明
torchvision.modelsPythonPyTorch 官方视觉库,提供 MobileNetV2/V3 预训练模型
TensorFlow LitePython / C++ / Java移动端推理首选,提供完整的 MobileNet 量化部署方案
NCNNC++腾讯开源的移动端推理框架,对 ARM 做了极致优化
Core MLSwift / Objective-CApple 设备原生推理框架,支持 MobileNet 模型转换
ONNX Runtime MobileC++ / Java跨平台移动端推理引擎,包体小、启动快
MediaPipeC++ / PythonGoogle 的跨平台多媒体 ML 框架,内置 MobileNet 方案
ExecuTorchPython / C++PyTorch 官方端侧推理框架(2024 推出),支持 MobileNet 和小 LLM
MLC-LLMPython / C++通用机器学习编译框架,支持端侧 LLM + MobileNet 联合部署
术语英文解释
深度可分离卷积Depthwise Separable Convolution将标准卷积拆为逐通道深度卷积 + 1x1 逐点卷积,计算量降约 8-9 倍
深度卷积Depthwise Convolution每个输入通道单独用一个卷积核做空间滤波,不做通道混合
逐点卷积Pointwise Convolution1x1 卷积,用于混合通道信息
宽度乘子Width Multiplier (alpha)全局缩放每层通道数的因子,alpha=0.5 可将计算量降为原来的四分之一
分辨率乘子Resolution Multiplier (rho)全局缩放输入分辨率的因子
倒残差块Inverted Residual BlockV2 的核心结构:先升维再深度卷积再降维,与 ResNet 瓶颈相反
线性瓶颈Linear BottleneckV2 中最后一层降维不加 ReLU,避免低维空间信息丢失
SE 注意力Squeeze-and-Excitation通道注意力机制,对通道特征做自适应加权
h-swishHard SwishV3 使用的 Swish 激活函数的硬近似版本,量化友好
神经架构搜索NAS用算法自动搜索最优网络结构,V3 的结构即由 NAS 搜索得到
NPUNeural Processing Unit专用神经网络处理器,手机芯片中加速 AI 推理的硬件单元
重参数化Reparameterization训练时用多分支结构,推理时等价融合为单分支,兼顾训练效果和推理速度
  • Howard et al., 「MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications」(2017):MobileNetV1 论文,系统提出深度可分离卷积在移动端的应用。
  • Sandler et al., 「MobileNetV2: Inverted Residuals and Linear Bottlenecks」(CVPR 2018):V2 论文,提出倒残差块和线性瓶颈,理解 EfficientNet MBConv 的基础。
  • Howard et al., 「Searching for MobileNetV3」(ICCV 2019):V3 论文,结合 NAS 搜索 + SE + h-swish,在移动端达到新的精度-速度前沿。
  • Andrew G. Howard et al., 「Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference」(CVPR 2018):Google 的量化训练论文,MobileNet 在移动端高效推理的配套技术。
  • Mehta et al., 「MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer」(ICLR 2022):将 Transformer 引入移动端,开创 MobileViT 系列。
  • Vasu et al., 「MobileOne: An Improved One millisecond Mobile Backbone」(CVPR 2023):重参数化思路在移动端的最新应用。
  • Cai et al., 「Once-for-All: Train One Network and Specialize it for Efficient Deployment」(ICLR 2020):OFA 网络,一次训练后可自适应不同硬件部署,MobileNet 的进化方向。