コンピュータービジョン

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精度
V1Depthwise Separable Conv70.6%
V2逆残差ブロック、Linear Bottleneck72.0%
V3-SmallNAS、ハードスウィッシュ67.4%
V3-LargeNAS、ハードスウィッシュ75.2%

関連用語