Quantcast
Channel: Google Developers Japan
Viewing all articles
Browse latest Browse all 2207

EfficientNet-Lite による高精度視覚モデル

$
0
0
この記事は The TensorFlow Blog の記事 "Higher accuracy on vision models with EfficientNet-Lite" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
投稿者: ソフトウェア エンジニア、Renjie Liu


2019 年 5 月、Google は EfficientNetと呼ばれる一連の画像分類モデルをリリースしました。このモデルでは最高水準の精度を実現し、計算とパラメータを桁違いに削減できました。エッジデバイスで EfficientNet を実行できれば、計算リソースが限られているモバイルや IoT で新たな用途への扉を開くことができます。

本日は、 EfficientNet-LiteGitHubTFHub)についてお知らせします。EfficientNet-Lite は、モバイルの CPU や GPU、そして EdgeTPU で動作するように設計されており、TensorFlow Liteを使って実行します。EfficientNet-Lite は、EfficientNet のパワーをエッジデバイスに提供します。ユーザーは、低レイテンシ/小モデルサイズのオプション(EfficientNet-Lite0)から高精度オプション(EfficientNet-Lite4)まで、5 種類の中から選ぶことができます。その中で最も大きく、整数のみに量子化された EfficientNet-Lite4 は、Pixel 4 の CPU でリアルタイム(例: 1 イメージあたり 30ms)に動作しながら、ImageNet のトップ 1 で 80.4% の精度を実現します。次の図は、量子化した EfficientNet-Lite モデルと、同様に量子化したバージョンのいくつかの有名な画像分類モデルでパフォーマンスを比較した結果です。
図: 整数のみに量子化したモデルを Pixel 4 のCPU で 4 スレッドを使って実行

課題: 量子化と異種ハードウェア

エッジデバイス特有の性質により、いくつかの課題が生じます。

量子化: 浮動小数点のサポートが限られているエッジデバイスが多いため、量子化が広く用いられています。しかし、それには量子化に対応した複雑なトレーニング手続きが必要です。それがないと、トレーニング後の量子化モデルの精度が下がります。

ありがたいことに、私たちのツールキットに含まれる TensorFlow Lite トレーニング後量子化ワークフローを活用し、精度の低下を最小限に抑えてモデルを量子化することができました。

異種ハードウェア: モバイル GPU/EdgeTPU など、幅広いアクセラレータで同じモデルを実行するのは難しいことです。多くの場合、ハードウェアの特殊性から、こういったアクセラレータは限られたオペレーションでしかパフォーマンスを発揮しません。EfficientNet のオペレーションの中には、特定のアクセラレータでうまくサポートされないものがあることがわかりました。

この異種ハードウェア問題に対応するため、次のような簡単な修正によってオリジナルの EfficientNet を調整しました。
  • うまくサポートされていない squeeze-and-excitation ネットワークを削除しました。
  • すべての Swish 活性化関数を RELU6 に置き換えました。これにより、トレーニング後の量子化の質が大幅に改善しました(後述)。
  • スケーリングしたモデルのサイズと計算を減らすため、モデルをスケールアップする際のステムとヘッドを修正しました。

TensorFlow Model Optimization Toolkit によるトレーニング後の量子化

TensorFlow Model Optimization Toolkitのおかげで、簡単にモデルを量子化することができました。トレーニング後に整数のみに量子化することによって、多くの精度を失うこともありませんでした(詳細については、こちらのリンクをご覧ください)。その結果、モデルのサイズは 4 分の 1、推論速度は 2 倍になりました。
次に示すのは、精度とレイテンシについて、EfficientNet-Lite0 浮動小数モデルと、それを量子化したバージョンを比較した結果です。
* Pixel 4 の CPU で 4 スレッドを使ったベンチマーク
さらに、トレーニング後の量子化に関して、いくつかの経験を共有したいと思います。最初にトレーニング後の量子化を試したとき、精度が大幅に低下したことがわかりました。ImageNet データセットでのトップ 1 の精度が 75% から 46% に下がりました。
この問題の原因は、量子化後の出力範囲が広すぎたことだと判明しました。量子化は基本的に、浮動小数点値を int8 バケットに収まるようにアフィン変換することで行います。
量子化の図
今回の場合は、次に示すように、出力されるテンソルの範囲が -168 から 204 でした。 これは、精度が大きく失われた可能性があることを示しています。広範囲の浮動小数テンソルを int8 の範囲のバケットに収めるのは難しいからです。
この問題に対処するため、Swish 活性化関数を「範囲が限定された」活性化関数(relu6)に置き換えました。relu6 は、出力を [0, 6] に限定します。この変更後、ImageNet に対する量子化モデルのトップ 1 精度は、浮動小数点の基準値 75.1% に対して、74.4% まで回復しました。

皆さんのデータセットで EfficientNet-Lite をお試しください

皆さんのデータで EfficientNet-Lite のパワーを活用しましょう。TensorFlow Lite Model Makerを使うことをお勧めします。このツールを使うと、ユーザーの入力データを使って既存の TensorFlow モデルに転移学習を適用し、結果のモデルを TensorFlow Lite 形式にエクスポートすることができます。
TensorFlow Lite Model Maker は、MobileNetV2 や全種類の EfficientNet-Lite など、複数のモデル アーキテクチャをサポートしています。わずか 5 行のコードで EfficientNet-Lite0 画像分類モデルを構築する例を紹介します。
# Load your custom dataset
data = ImageClassifierDataLoader.from_folder(flower_path)
train_data, test_data = data.split(0.9)

# Customize the pre-trained TensorFlow model
model = image_classifier.create(train_data, model_spec=efficienetnet_lite0_spec)

# Evaluate the model
loss, accuracy = model.evaluate(test_data)

# Export as TensorFlow Lite model.
model.export('image_classifier.tflite', 'image_labels.txt')
花分類 notebookでライブラリを試してみてください。model_specパラメータを変更すると、異なるモデルに簡単に切り替えることができます。tf_flowersのような小さなデータセットでは、5 エポックのトレーニングを数分行うだけで、最大 92% の精度を実現できます。エポックやデータを増やしてトレーニングするか、モデル全体を細かくチューニングすることで、さらに精度を改善できます。
次に、このモデルを使ってモバイルアプリを作ってみましょう。まず、Image Classificationサンプルから着手します。このモバイルアプリは、EfficientNet-Lite で構築されており、すぐに実行することができます。アプリは Gradle タスクを使い、ImageNet データセットで事前トレーニングを行った EfficientNet-Lite モデルを assetsフォルダーに自動ダウンロードします。Model Maker で作ったカスタムモデルを試したい場合は、assetsフォルダーのモデルを置き換えます。
スクリーンショットからわかるように、EfficientNet-Lite モデルはリアルタイムに推論を実行します(30 fps 以上)。

さらに詳しく知りたい方は

リファレンス アプリをビルドし、いろいろ試してみましょう(手順)。また、TensorFlow Hub の EfficientNet-Liteを試し、TensorFlow Lite Model Makerを使って自分のタスク用にカスタマイズしてみましょう。TensorFlow Lite の詳細は、tensorflow.org/liteで学ぶことができます。TensorFlow モデル最適化を試し、tfhub.devで他の TensorFlow Lite モデルを探してみてください。

謝辞

Renjie Liu、Xunkai Zhang、Tian Lin、Yuqi Li、Mingxing Tan、Khanh LeViet、Chao Mei、Amy Jang、Luiz GUStavo Martins‎、Yunlu Li、Suharsh Sivakumar‎、Raziel Alvarez、Lawrence Chan、Jess Kim、Mike Liang、Shuangfeng Li、Sarah Sirajuddin

参考文献

[1] EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks: https://arxiv.org/abs/1905.11946

Reviewed by Khanh LeViet - Developer Relations Team

Viewing all articles
Browse latest Browse all 2207

Trending Articles