MobileNet もばいるねっと
MobileNetDepthwise Separable Convolution軽量CNNエッジAIスマートフォンモバイル推論
MobileNetについて教えて
簡単に言うとこんな感じ!
MobileNetは「スマートフォンや組み込みデバイスで動く軽量CNN」だよ。通常の畳み込みを「Depthwise(チャンネルごと)+ Pointwise(チャンネル間)」に分解することで計算量を8〜9倍削減しながら、ほぼ同等の精度を保つ工夫が詰まってるんだ!
MobileNetとは
MobileNet は、2017年にGoogleが発表したモバイルデバイス・組み込みアプリ向けに最適化された軽量CNNアーキテクチャです。Depthwise Separable Convolution(深さ方向分離畳み込み) を核とする設計で、通常の畳み込みと比べて計算量を約8〜9分の1に削減します。
従来のCNNをスマートフォンで動かすには計算量が多すぎる問題がありました。MobileNetはこれを解決し、カメラアプリのリアルタイム推論・ARフィルター・顔認識など、デバイス上での推論(エッジAI)を実用的にしました。
現在はMobileNetV1(2017)・V2(2018)・V3(2019)とバージョンが進化しており、V3ではNeural Architecture Search(NAS)による自動設計も採用されています。
Depthwise Separable Convolutionの仕組み
通常の畳み込み(3×3, 64ch→128ch):
計算量 = 3×3×64×128 = 73,728
Depthwise Separable Convolution:
①Depthwise Conv(チャンネルごとに3×3畳み込み):
3×3×64 = 576
②Pointwise Conv(1×1で64→128に変換):
1×1×64×128 = 8,192
合計 = 576 + 8,192 = 8,768 ← 約8.4倍削減
import torch.nn as nn
# Depthwise Separable Convolutionの実装
class DepthwiseSeparableConv(nn.Module):
def __init__(self, in_channels, out_channels):
super().__init__()
self.depthwise = nn.Conv2d(
in_channels, in_channels,
kernel_size=3, padding=1,
groups=in_channels # チャンネルごとに独立した畳み込み
)
self.pointwise = nn.Conv2d(in_channels, out_channels, kernel_size=1)
def forward(self, x):
return self.pointwise(self.depthwise(x))
歴史と背景
- 2017年:MobileNetV1を発表。Depthwise Separable Convolutionで軽量化
- 2018年:V2で「逆残差ブロック(Inverted Residuals)」とLinear Bottleneckを導入
- 2019年:V3でNASと「ハードスウィッシュ活性化関数」でさらに効率化
- 現在:TensorFlow Lite・Core MLなどのモバイル推論フレームワークで標準モデルとして使用
MobileNetの世代別比較
| バージョン | 主な革新 | Top-1精度 |
|---|---|---|
| V1 | Depthwise Separable Conv | 70.6% |
| V2 | 逆残差ブロック、Linear Bottleneck | 72.0% |
| V3-Small | NAS、ハードスウィッシュ | 67.4% |
| V3-Large | NAS、ハードスウィッシュ | 75.2% |
関連用語
- CNN(畳み込みニューラルネットワーク) — MobileNetが採用する基本構造
- EfficientNet — MobileNetと同じく効率重視の高精度CNN
- エッジAI — MobileNetが活躍するデバイス上推論
- 畳み込み層 — MobileNetが軽量化した中核の処理