画像認識の分野では、高い精度を求めると計算コストが膨大になり、計算コストを抑えると精度が犠牲になる、というトレードオフが長年の課題でした。
この問題を解決する画期的なアプローチとして、2019年にGoogleから発表されたのがEfficientNetです。
従来のモデルと比較して、パラメータ数を大幅に削減しながら高い精度を実現し、画像認識AIの世界に革命をもたらしました。
この記事では、EfficientNetの基本から最新のV2まで、その仕組みと活用方法を中学生でも理解できるよう分かりやすく解説します。
EfficientNetとは
EfficientNet(エフィシェントネット)は、2019年5月にGoogle AIの研究者Mingxing Tan氏とQuoc V. Le氏によって発表された画像分類モデルです。
論文「EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks」は、機械学習のトップカンファレンスICML 2019で発表され、大きな注目を集めました。
EfficientNetの名前は「Efficient(効率的)」と「Net(ネットワーク)」を組み合わせたもので、その名の通り、高い効率性を実現することに重点を置いています。
EfficientNetが優れている理由:
- 少ないパラメータ数で高い精度を達成
- 学習と推論の速度が速い
- モバイルデバイスでも動作可能
- 転移学習での性能が優秀
開発の背景と歴史
従来のモデルの課題
画像認識モデルは、一般的に固定された計算資源(メモリやGPU)で開発され、より良い精度を得るために後からスケールアップされます。
例えば、ResNetはResNet-18からResNet-200まで、層の数を増やすことでスケールアップされてきました。
従来のスケーリング方法の問題点:
- 深さ(層の数)、幅(チャンネル数)、解像度(入力画像サイズ)のいずれか1つだけを変更
- 手動での調整が必要で時間がかかる
- 最適なバランスが見つけにくい
EfficientNetの登場
この課題に対してGoogleの研究チームは、「複数の次元を同時にバランスよくスケールできないか」という発想から研究をスタートしました。
その結果、Compound Scaling(複合スケーリング)という革新的な手法を開発し、EfficientNetが誕生しました。
EfficientNetの最大の特徴:Compound Scaling
Compound Scaling(複合スケーリング)は、EfficientNetの核となる技術です。
これは、ニューラルネットワークの3つの次元を同時にバランスよく調整する手法です。
3つの次元とは
- 深さ(Depth)
層の数を増やすことで、より複雑なパターンを学習できます。
ただし、深すぎると学習が難しくなります。 - 幅(Width)
各層のチャンネル数(ニューロンの数)を増やすことで、より多くの特徴を捕捉できます。
ただし、幅だけを広げても深さがないと効果が限定的です。 - 解像度(Resolution)
入力画像のサイズを大きくすることで、より細かいパターンを認識できます。
ただし、高解像度の画像は計算コストが大きくなります。
Compound Scalingの仕組み
従来の方法では、これらの次元を個別にスケールしていました。
例えば、「層を2倍に増やす」「チャンネル数を1.5倍にする」などです。
Compound Scalingでは、これらの3つの次元を特定の比率で同時にスケールします。
スケーリングの計算式:
深さ(d) = α^φ
幅(w) = β^φ
解像度(r) = γ^φ
ここで:
- φ(ファイ):ユーザーが設定するスケール係数
- α、β、γ:最適な比率を決める係数
論文では、グリッドサーチの結果、α=1.2、β=1.1、γ=1.15が最適であることが示されました。
なぜ同時スケーリングが効果的なのか
例えば、高解像度の画像を使う場合、細かい特徴を捕捉するために、より深く、より幅の広いネットワークが必要になります。
1つの次元だけを変更するよりも、3つの次元をバランスよく調整した方が、効率的に性能を向上させることができます。
EfficientNetのアーキテクチャ
基本構造
EfficientNetのベースとなるモデル(EfficientNet-B0)は、AutoML技術の一つであるNeural Architecture Search(NAS)を使って設計されました。
具体的には、MNASフレームワークを使用して、精度と効率(FLOPS)の両方を最適化しています。
MBConv(Mobile Inverted Bottleneck Convolution)
EfficientNetの主要な構成要素は、MBConvブロックです。
これはMobileNetV2で導入されたInverted Residual Blockと同様の構造で、以下の特徴があります。
MBConvの特徴:
- Depthwise Separable Convolution(深さ方向分離畳み込み)を使用
- パラメータ数と計算量を大幅に削減
- Squeeze-and-Excitation(SE)ブロックでチャンネル間の関係を学習
EfficientNet-B0の構造
EfficientNet-B0は18の畳み込み層で構成されています。
入力解像度は224×224ピクセルで、以下のようなステージに分かれています。
主要なステージ:
- ステージ1:畳み込み層(3×3、stride=2)
- ステージ2-8:MBConvブロックの積み重ね
- 最終層:畳み込み層(1×1)と全結合層
各ステージでは、MBConvブロックの拡張率(expansion ratio)、カーネルサイズ、繰り返し回数が異なります。
モデルファミリー:B0からB7まで
EfficientNetは、B0からB7までの8つのモデルバリアントで構成されています。
B0が最も小さい基本モデルで、B1からB7はB0をCompound Scalingでスケールアップしたモデルです。
各モデルの特徴
- EfficientNet-B0(基本モデル)
入力解像度:224×224
パラメータ数:約530万
用途:モバイルデバイスや計算資源が限られた環境 - EfficientNet-B1
入力解像度:240×240
パラメータ数:約780万
用途:B0より高精度が必要な場合 - EfficientNet-B2
入力解像度:260×260
パラメータ数:約910万
用途:中程度の精度と速度のバランス - EfficientNet-B3
入力解像度:300×300
パラメータ数:約1,200万
用途:高精度が求められるアプリケーション - EfficientNet-B4
入力解像度:380×380
パラメータ数:約1,900万
用途:より高度な画像認識タスク - EfficientNet-B5
入力解像度:456×456
パラメータ数:約3,000万
用途:研究用途や高精度が必須の場面 - EfficientNet-B6
入力解像度:528×528
パラメータ数:約4,300万
用途:最高精度を追求する場合 - EfficientNet-B7
入力解像度:600×600
パラメータ数:約6,600万
用途:最先端の精度を必要とする研究やコンペティション
モデル選択のガイドライン
モバイル・エッジデバイス:
B0、B1を推奨。
リアルタイム処理が必要な場合に適しています。
一般的なアプリケーション:
B2、B3、B4を推奨。
精度と速度のバランスが良好です。
研究・高精度要求:
B5、B6、B7を推奨。
計算資源に余裕がある場合に使用します。
性能と精度
ImageNetでの成果
EfficientNetは、ImageNetデータセットで驚異的な性能を達成しました。
EfficientNet-B7の成績:
- Top-1精度:84.4%
- Top-5精度:97.1%
- パラメータ数:6,600万個
従来モデル(GPipe)との比較:
- GPipeと同等の精度を達成
- パラメータ数:8.4倍削減(557M → 66M)
- CPU推論速度:6.1倍高速化
ResNet-50との比較
EfficientNet-B4とResNet-50を比較すると:
ResNet-50:
- Top-1精度:76.3%
- パラメータ数:約2,560万
- 計算量:約4.1 GFLOPs
EfficientNet-B4:
- Top-1精度:82.6%
- パラメータ数:約1,900万
- 計算量:約4.2 GFLOPs
同程度の計算量で、精度を6.3%向上させ、パラメータ数も削減しています。
転移学習での性能
EfficientNetは、転移学習でも優れた性能を発揮します。
ImageNetで事前学習したモデルを他のデータセットでファインチューニングした結果:
CIFAR-100:
91.7%の精度を達成(他のモデルより大幅に優秀)
Flowers:
98.8%の精度を達成
その他のデータセット:
3つの転移学習データセットで最高精度を記録
重要な点として、これらの高精度を達成しながら、パラメータ数は他のモデルの1/10以下です。
EfficientNetV2:さらなる進化
2021年4月、Googleは改良版のEfficientNetV2を発表しました。
論文「EfficientNetV2: Smaller Models and Faster Training」は、ICML 2021で発表されました。
V2の主な改良点
- Fused-MBConvの導入
通常のMBConvに加えて、Fused-MBConvという新しいブロックを使用。
初期段階では通常の畳み込みが効率的に動作することを発見し、適材適所で使い分けています。 - Progressive Learning(段階的学習)
学習の初期段階では小さい画像と弱い正則化を使用。
学習が進むにつれて、画像サイズを大きくし、正則化を強化。
これにより、学習速度を向上させながら精度を維持できます。 - アーキテクチャの最適化
- 小さい3×3カーネルを多用
- ステージの調整(V1の最後のstride=1ステージを削除)
- 拡張率の調整
V2の性能
学習速度と精度:
EfficientNetV2-Mは、V1のB7と同程度の精度を11倍速い学習速度で達成しました。
ViT(Vision Transformer)との比較:
EfficientNetV2-LがViT-L/16と比較して:
- 精度:1.5%向上(87.3% vs 85.8%)
- パラメータ数:2.5倍少ない
- 計算量(FLOPs):3.6倍少ない
- 学習・推論速度:6-7倍高速
V2のモデルファミリー
EfficientNetV2には以下のバリエーションがあります。
EfficientNetV2-S(Small):
軽量で高速なモデル。
モバイルやエッジデバイスに最適。
EfficientNetV2-M(Medium):
精度と速度のバランスが優れたモデル。
一般的なアプリケーションに推奨。
EfficientNetV2-L(Large):
最高精度を追求するモデル。
研究や高度なアプリケーション向け。
EfficientNetV2-XL(Extra Large):
ImageNet-21Kで事前学習された最大モデル。
超高精度が必要な場合に使用。
実装方法
EfficientNetは、主要な深層学習フレームワークで簡単に利用できます。
TensorFlow / Keras
Keras Applicationsに公式実装が含まれています。
import tensorflow as tf
from tensorflow import keras
# EfficientNet-B0を読み込む
model = keras.applications.EfficientNetB0(
include_top=True,
weights='imagenet',
input_shape=(224, 224, 3),
classes=1000
)
# 画像の読み込みと前処理
img = keras.preprocessing.image.load_img(
'sample.jpg', target_size=(224, 224)
)
img_array = keras.preprocessing.image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0)
# 予測
predictions = model.predict(img_array)
EfficientNetV2の場合:
from tensorflow import keras
# EfficientNetV2-Sを読み込む
model = keras.applications.EfficientNetV2S(
include_top=True,
weights='imagenet',
input_shape=(384, 384, 3)
)
PyTorch
PyTorchでは、timm(PyTorch Image Models)ライブラリを使用します。
import timm
import torch
# EfficientNet-B0を読み込む
model = timm.create_model('efficientnet_b0', pretrained=True)
model.eval()
# 画像の前処理
from torchvision import transforms
from PIL import Image
transform = transforms.Compose([
transforms.Resize(224),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
img = Image.open('sample.jpg')
img_tensor = transform(img).unsqueeze(0)
# 予測
with torch.no_grad():
output = model(img_tensor)
転移学習の例
独自のデータセットで転移学習を行う場合:
import tensorflow as tf
from tensorflow import keras
# ベースモデルを読み込む(最終層を除く)
base_model = keras.applications.EfficientNetB3(
include_top=False,
weights='imagenet',
input_shape=(300, 300, 3)
)
# ベースモデルを凍結
base_model.trainable = False
# 新しいモデルを構築
model = keras.Sequential([
base_model,
keras.layers.GlobalAveragePooling2D(),
keras.layers.Dropout(0.2),
keras.layers.Dense(10, activation='softmax') # 10クラス分類
])
# コンパイル
model.compile(
optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy']
)
# 学習
model.fit(train_dataset, epochs=10, validation_data=val_dataset)
EfficientNetの活用事例
EfficientNetは、様々な分野で実用化されています。
医療画像診断
応用例:
- 胸部X線画像からの病気診断
- 皮膚病の分類
- 病理画像の解析
利点:
少ない計算資源で高精度な診断が可能。
医療現場での実用性が高い。
実際の研究では、ISIC 2019データセットを使用した皮膚病分類で、EfficientNetV2ベースのモデルが高い精度を達成しています。
農業分野
応用例:
- 作物の病害虫検出
- 収穫適期の判定
- 農作物の品質評価
例えば、キャッサバの葉の病気分類コンペティション(Kaggle)では、EfficientNetを使用したモデルが上位にランクインしました。
製造業・品質管理
応用例:
- 製品の外観検査
- 不良品の検出
- 部品の分類
モバイルデバイスでリアルタイム検査が可能なため、製造ラインでの導入が進んでいます。
感情認識・顔認識
応用例:
- リアルタイム感情分析
- 顔認証システム
- 表情分類
モバイルデバイスでのリアルタイム処理が可能なため、接客トレーニングやユーザー体験向上に活用されています。
自動運転
応用例:
- 道路標識の認識
- 歩行者検出
- 物体認識
エッジデバイスでの高速処理が可能なため、リアルタイム性が求められる自動運転システムに適しています。
EfficientNetの長所と短所
長所
- 高い精度と効率性
少ないパラメータで高精度を実現。 - 転移学習での優秀な性能
事前学習モデルが様々なタスクで高性能を発揮。 - モバイル対応
小さいモデル(B0、B1)はモバイルデバイスで動作可能。 - 実装が容易
主要なフレームワークで公式サポートあり。 - 豊富なモデルバリエーション
用途に応じてB0からB7まで選択可能。
短所
- 大きいモデルの推論速度
B6、B7などの大きいモデルは推論に時間がかかる。 - メモリ使用量
高解像度入力を使う大きいモデルはメモリを多く消費。 - 学習の計算コスト
V1の学習は時間がかかる(V2で改善)。 - ハードウェア依存
最適な性能を得るにはGPUが必要。
ResNet、MobileNetとの比較
ResNet(Residual Network)との比較
ResNet:
- 深い層を持つことで高精度を実現
- Skip Connection(残差接続)が特徴
- パラメータ数が多い
EfficientNet:
- Compound Scalingで効率的にスケール
- 同等の精度でパラメータ数が大幅に少ない
- ResNet-50の6.3%上の精度をより少ないパラメータで達成
MobileNetとの比較
MobileNet:
- モバイル向けに設計された軽量モデル
- Depthwise Separable Convolutionを使用
- 速度重視で精度はやや劣る
EfficientNet:
- MobileNetと同様の技術を使用
- さらにCompound Scalingで精度を向上
- モバイル向け(B0、B1)から高精度向け(B7)まで幅広い
よくある質問
Q1. EfficientNetとEfficientNetV2の違いは何ですか?
V2は学習速度と推論速度が大幅に向上しています。
Fused-MBConvの導入とProgressive Learningにより、V1の約11倍の速さで学習できます。
精度も向上しており、特に転移学習での性能が優れています。
Q2. どのモデルを選べばよいですか?
用途によって異なります。
モバイルアプリ:
B0またはB1を推奨。
一般的なアプリケーション:
B3またはB4が精度と速度のバランスが良好。
研究や最高精度が必要:
V2-LまたはB7を推奨。
Q3. 独自データで学習させる方法は?
転移学習が推奨されます。
ImageNetで事前学習されたモデルをベースに、最終層を自分のタスク用に置き換えてファインチューニングします。
データ量が少ない場合でも高い精度を達成できます。
Q4. GPUは必須ですか?
学習にはGPUが強く推奨されます。
推論のみであれば、小さいモデル(B0、B1)はCPUでも動作しますが、GPUを使用した方が高速です。
Q5. 他の最新モデル(ViT、ConvNeXtなど)と比べてどうですか?
EfficientNetV2は、ViT(Vision Transformer)と比較して、同等以上の精度を少ないパラメータと高速な処理で達成しています。
ConvNeXtなどの新しいモデルも登場していますが、EfficientNetは依然として効率性の面で優れた選択肢です。
まとめ
EfficientNetは、Compound Scalingという革新的なアプローチにより、画像認識の分野に大きなインパクトを与えたモデルです。
高い精度と効率性を両立し、モバイルデバイスからクラウドまで幅広い環境で活用できます。
EfficientNetの主なポイント:
- Compound Scalingで深さ、幅、解像度を同時に最適化
- B0からB7まで、用途に応じて選べる8つのモデル
- 少ないパラメータで高精度を実現
- 転移学習での性能が優秀
- V2でさらなる高速化と精度向上を達成
画像認識AIを実装する際、EfficientNetは最初に検討すべき選択肢の一つです。
特に、計算資源が限られている環境や、モバイルデバイスでの実行を考慮する場合には、EfficientNetの効率性が大きなメリットとなります。
2024年以降も、EfficientNetをベースとした研究や応用が続いており、今後も画像認識分野で重要な役割を果たし続けるでしょう。
参考情報
- EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks(論文)
- EfficientNetV2: Smaller Models and Faster Training(論文)
- Google AI Blog: EfficientNet
- TensorFlow Keras Applications: EfficientNet
- TensorFlow Keras Applications: EfficientNetV2
- PyTorch Image Models (timm)
- Hugging Face: EfficientNet Models
- 2019年最強の画像認識モデルEfficientNet解説 – Qiita
- 2021年最強になるか!?最新の画像認識モデルEfficientNetV2を解説 – Qiita

コメント