今回の記事では、AutoML Visionで学習した画像のカスタムモデルを、推論に特化したエッジ向けTPUである「Coral Edge TPU」用に作成し(Google Cloud Next 2019で発表された「AutoML Vision Edge」を使用)、ラズパイのカメラを使ってリアルタイムに分類できるか試してみます。
目次
Edge TPUとAutoMLについて
Edge TPUとAutoMLについて軽く触れておきます。
TPUとは
画像識別のタスクにおいてディープラーニングは非常に高い精度を誇っています。一方で、ディープラーニングのための演算は負荷が高く、通常我々が使用するコンピュータのプロセッサ(CPU)では十分な処理速度が出ません。そういった中で、どうにかして演算を高速化するために、各社が様々なデバイスを作っています。
エヌビディアのGPUや、FPGAなどが有名ですが、GoogleではTPU(Tensor Processing Unit)と呼ばれるディープラーニングに特化した独自のプロセッサを打ち出しています。CPUやGPUはコンピュータ上でのあらゆるタスクをこなす汎用プロセッサですが、そこで発生するメモリの読み書きは、ディープラーニングで行われる行列演算にとってはボトルネックになります。
TPUでは、演算結果を(メモリを経由せず)直接次の回路に渡すことで、処理効率を高めています(ディープラーニングのために最適化されたプロセッサと言えるでしょう)。デバイス自体も安価で消費電力も少なく、ソフトウェアとの相性も良い(後述するTensorFlow Liteがフルサポートしている)ため、速くて安くて美味いという非常にコスパの良いデバイスになっています。
TPUについては以下の記事が詳しいですので、こちらを参照してみてください。
GoogleのTPUって結局どんなもの? 日本法人が分かりやすく説明@IT
Edge TPUとCoral
TPUやGPUはディープラーニングの学習を高速化しますが、いざモデルができてユーザがモデルの推論を実行しようとした場合だと、どんなに高速なプロセッサであったとしても(インターネットを経由する以上は)インターネット回線より速いスピードは出ません。そこで考え出されたのが、Edge(端末)側にプロセッサを置き、インターネットを介さず端末側でそのまま推論を行ってしまおうというアイディアです。
一般ユーザが組み込みAIの技術を簡単に利用できるように、GoogleはCoralというブランドでEdge TPUとTensorFlow、クラウドを結ぶ統合的な開発環境(ハードウェア+ソフトウェア)をサポートしています。現在(2019/6/6)、以下の4つのプロダクトを販売しています。
- Dev Board:
Edge TPUがSBC(シングルボードコンピュータ)上に搭載されたデバイス。Edge TPUがSBCと直接繋がっているため、インターフェース由来のレイテンシ(処理遅れ)が発生せず、Edge TPU本来の性能が発揮できる。OSはMendel Linux(Debian派生)、フレームワークや言語はTensorFlow Lite、Python、C++をサポート。AutoML Vision Edgeモデルをエクスポートできる。日本では輸入不可→ 技適に通ったので近々輸入可能となるようです。 -
USB Accelerator:
Edge TPUのUSBアクセサリ版。USB AcceleratorはUSB3.0だが、SBCとして推奨されるラズパイはUSB2.0(最新版の3B+)のため、オーバーヘッドが生じてしまう(理論上はUSB2.0が480Mbps、USB3.0が5Gbpsで、約10倍の差がある)。OSはDebian Linux、フレームワークはTensorFlow Liteをサポート。SBCと接続することでAutoML Vision Edgeモデルの推論が可能。現在、日本に輸入可能な唯一のCoral製品。→ 「Dev Board」も追加されそうです。 -
Camera:
Dev Boardに接続可能な5メガピクセルのカメラモジュール。日本では輸入不可。 -
Environmental Sensor Board:
IoTアプリケーション用の温度、光、および湿度センサーを提供するアクセサリボード。Dev Boardとラズパイに接続可能。Cloud IoT Coreと連携可能。日本では輸入不可。
AutoML Vision Edgeとは
GCPのクラウド上でノンプログラミングで高精度な機械学習のカスタムモデルが作れるAutoMLですが、先日のGoogle Cloud Next 2019において、作成した画像分類モデルをEdgeデバイスへエクスポートできる機能である「AutoML Vision Edge」が発表されました。
Expanding Google Cloud AI to make it easier for developers to build and deploy AIGoogle Cloud Blog
今回の記事で取り上げているEdge TPUはもちろんのこと、Android端末やiPhoneなどのモバイルデバイスにもエクスポートが可能です。興味のある方は以下の記事を参照してみてください。
GCP Cloud AutoML Vision Edgeを使ってカスタムモデルを作ってエッジデバイスで動かす話(Firebase ML Kit)Qiita
Firebase MLKit AutoML Vision Edgeを触ってみたQiita
検証の流れ
では、実際に試してみましょう。今回の検証の流れをざっくり説明すると、
- ナッツの画像データを準備する
- AutoML Vision Edgeで画像を学習させてカスタム分類モデルを作る
- 作成したモデルをラズパイとCoral Edge TPU環境にデプロイする
- ラズパイのカメラでリアルタイムにナッツの識別をしてみる
のようになります。少々長いですが、ぜひ最後まで読んで頂けると幸いです。
AutoML Vision Edgeで画像分類モデルを作る
お題:ナッツ6種の分類
学習に使うデータはスーパーマーケットで購入したナッツ系のおつまみ6種類の画像です。
- almonds:アーモンド
- walnuts:くるみ
- tiger_nuts:タイガーナッツ
- goji_berries:ゴジベリー
- banana_chips:バナナチップス
- cashews:カシューナッツ
AutoMLでの学習に使うナッツと、Edge TPU上でのリアルタイム画像分類に使うナッツは別々の商品を用います。
データセットの準備
上記のようにお皿に取り分けたナッツをそれぞれスマホカメラのムービーで撮影します。
その後、動画を静止画に分割し、AutoMLのデータセット用にアップロードします。以下のように合計2858枚の画像が読み込まれました。スマホの動画では距離や角度を変えて繰り返し撮ったので、似た画像も含まれていますね。背景(机)やお皿は白に統一し、AutoMLが分類の対象物として背景を中心としてしまわないようにデータセットを作成しました。
AutoML Visionで学習させる
各クラス500枚前後でAutoMLで推奨される枚数より少ないですが、クラスごとの偏りもなく、さっと作った割にはそこそこ良いデータセットができた気がします。
それでは学習を開始してみます。以下のように選択します。
- Model type(モデルタイプ):「Edge」
- Optimize model for(何を最適化するか):「Lowest latency」(もっとも速い)
- Show latency estimates for(デバイスのタイプ?):「Edge TPU」
- Set a node hour budget(学習時間):「4 node hours(recommended)」(4ノード時間(推奨))
今回はCoral Edge TPUのスピードを検証したかったのでこういう設定にしましたが、より精度が重視されるケースにおいては「Higher accuracy」を選ぶこともできます。デバイスと何を最適化するかの選び方によってモデルサイズが変わってきますが、一般的にはモデルサイズが小さくなると相対的に精度は低下するため、速度と精度のトレードオフを考慮したバランスの良いモデル(Best trade-off)も用意されています。ユースケースに応じてこういった使い分けができるのは嬉しいですね。
学習完了後にメールの通知が来るので、この画面は閉じておきます。
モデルの評価と精度
学習は2時間ほどで終了しました。それでは精度を見てみます。
なんと、Avg precisionが1.0、つまり精度が100%のモデルができました。
混同行列も見てみましょう。
全て100%です。
学習にかかった料金
今回は2時間の学習で1000円ちょっとかかりました。
モデルの評価についての考察
今回用意したデータセットでは、ナッツの動画を静止画に分割し、学習用or検証用orテスト用の区別なくランダムにAutoMLに読み込んだため、 学習用とテスト用で非常に類似した画像が含まれていることがわかります。今回のデータセットの構成上、AutoMLは100%の数値を出していますが、「精度が100%」の機械学習モデルは現実には存在しないため、Coral Edge TPUで実際にリアルタイム分類した時にどれほど分類できているかを見て判断する事にしましょう。(機械学習に詳しい方からは、「もうちょっと良いデータセットの作り方があったのでは」とのお叱りを受けそうですが、今回はCoral Edge TPUのスピードを見るのが目的のため、一先ず良しとして先に進みます。)
モデルのエクスポート
「PREDICT」→「EDGE DEVICES」→「Edge TPU」を選択します。
すると、Edge TPU用モデルのエクスポート先としてGCS(Google Cloud Storage)へのパスが表示されます。「EXPORT」ボタンを押して、モデルファイルが配置された事を確認してみましょう。
GCSに3つのファイルがエクスポートされました。
モデルファイル群の内容と予測プログラム実行用に修正
それぞれの役割は以下の通りです。
- dict.txt
モデルのラベル名が書かれたファイル。dictとあるので辞書構成かと思いきや、↓の左図のようにラベル名だけが記載されています。後で使うCoralのサンプルコードでは、インデックス列を追加(半角スペースつなぎ)して実行してみてください。
- edgetpu_model.tflite
tflite形式のモデルファイル。TensorFlowモデルがEdge TPU用にコンパイルされています。
- tfile_metadata.json
モデルのメタ情報が記載されたファイル。バッチサイズや画像チャネル数、画像サイズなどがわかります。
「Coral Edge TPU + ラズパイ + AutoML Vision Edge」で リアルタイム分類の実行
ラズパイとカメラの準備
ラズパイの選定や、ラズパイ用カメラの取り付け方、ラズパイ + Coral Edge TPUで機械学習モデルを動作させる方法などは、Coralの公式リファレンスの他に以下の記事を参考にさせて頂きました。(大変勉強になりましたので、この場を借りてお礼申し上げます。)
Google Edge TPUを購入してラズベリーパイと機械学習してみたエンジニアの電気屋さん
自分のPCからラズパイにSSH接続
ラズパイのセットアップが完了したら、自分のMacからラズパイにsshで接続し作業します。「VNC(Virtual Network Computing)」を使うと簡単に設定ができます。
VNCでPCからデスクトップ画面操作JellyWare
ssh接続の設定を保存でき、再度接続したい場合でもGUIからポチッとするだけでいけます。
Macのデスクトップからラズパイにアクセスできました。
モデル実行環境の準備とプログラムの実行方法
Coralのサイトにある「Get started with the USB Accelerator」と「Python API overview & demos」のチュートリアルを参考にします。
Get started with the USB AcceleratorCoral beta
Python API overview & demosCoral beta
全く同じコードですが、こちらにも掲載しておきます。
(以下、ラズパイのコンソール上で実行します。)
1. Edge TPUランタイムとPythonライブラリのインストール
cd ~/
wget https://dl.google.com/coral/edgetpu_api/edgetpu_api_latest.tar.gz -O edgetpu_api.tar.gz --trust-server-names
tar xzf edgetpu_api.tar.gz
cd edgetpu_api
bash ./install.sh
2. GCSからモデルファイルをラズパイにコピーしてくる
Coralのサンプルでは「~/Downloads」配下にモデルファイルを置くのが通例のようですので、今回作成したモデルもこちらに配置しておきます。
2-1. ラズパイにgsutilコマンドをインストールしておきます。
gsutil をインストールするGoogle Cloud
2-2. ラズパイを日本語設定にしている場合には「~/ダウンロード」になっているので、予め「~/Downloads」を作っておくと良いです。
mkdir ~/Downloads
gsutil cp -r gs://xxxxx-vcm/models/edge/ICNxxxxxxxxxxxxxxxxxx(モデルID置き換えてください)/2019-06-05_11-54-27-458_edgetpu-tflite ~/Downloads/
3. リアルタイム分類用のPythonプログラムを実行
Coralはサンプルコードが充実しています。予め用意されている「classify_capture.py」にモデルのパス、先ほど修正したラベル辞書のパスを指定し実行します。
※) 「classify_capture.py」の実行前に、「dict.txt」ファイルを「モデルファイル群の内容と予測プログラム実行用に修正」にある内容に修正してから実行してみてください。(筆者は、ラズパイのデフォルトだとvimの設定が辛かったので、「ラズパイメニュー>アクセサリ>Text Editor」で直接編集しました。)
cd /usr/local/lib/python3.5/dist-packages/edgetpu/demo
python3 classify_capture.py --model ~/Downloads/2019-06-05_11-54-27-458_edgetpu-tflite/edgetpu_model.tflite --label ~/Downloads/2019-06-05_11-54-27-458_edgetpu-tflite/dict.txt
エラーなく実行できた場合、ラズパイ上でカメラが起動します。初期設定だとリモートデスクトップからはカメラの映像は見れないので、ラズパイにディスプレイを繋いで直接確認してみてください。
推論用にナッツと機材を配置
リアルタイム分類用に、学習に使ったナッツとは別の商品で試してみます。
以下のようにお皿に並べました。
ラズパイ、Coral Edge TPU、ディスプレイは以下のように接続しています。ラズパイ本体にカメラを埋め込んで、ライブビューと分類結果をディスプレイに表示します。(天井が写っていますが、6種類のいずれかに分類しないといけないので、「tiger_nuts」となっています。「0.89」は予測確率、「10.50ms(ミリ秒)」は分類にかかった時間です。)
結果を見る
では、実際にナッツをリアルタイム分類した結果を見てみます。
いかがだったでしょうか。上段右上のバナナチップ以外はまずまずの分類ができてそうです。また、ラズパイ側がUSB2.0なのであまり分類速度は出ないだろうと思っていたのですが、実際には思ったよりも速いという印象を持ちました。
後記
バナナチップが上手く分類できなかったのは、以下のように推論用と学習用でかなり形が違ってしまった事が原因だと考えられます。他の5種類のナッツに関しては推論用と学習用で別の商品ではありましたがわりと形が似ていました。本番環境と全く同じデータが学習時に揃っているとは限らないので、(そういった事が可能なケースであれば)都度都度学習用データを増強しモデルを作り直す必要がありそうです。
まとめ
「AutoML Vision Edge + Coral Edge TPU + ラズパイ」の組み合わせでリアルタイム画像分類を試してみました。非常に簡単な手順でEdge AIの機能が実現できたと思います。今回はCoral Edge TPUのフル性能は検証できていないですが、精度や速度に関してもまずまずの結果が出たと言えるのではないでしょうか。
また、現時点(2019/6/20)ですとAutoML Visionは「classification(分類)」しかEdge機能をサポートしていないですが、今後「object detection(物体検出)」もサポートされていくものと思われます。ハードウェア、ソフトウェアの基盤も揃い画像識別の実現に関しては非常にハードルが下がってきているので、あとは如何にして有効な活用方法を見つけるかが重要になってきそうです。是非みなさんも試してみてください。
参考・引用
- GoogleのTPUって結局どんなもの? 日本法人が分かりやすく説明
- Expanding Google Cloud AI to make it easier for developers to build and deploy AI
- GCP Cloud AutoML Vision Edgeを使ってカスタムモデルを作ってエッジデバイスで動かす話(Firebase ML Kit)
- Firebase MLKit AutoML Vision Edgeを触ってみた
- Google Edge TPUを購入してラズベリーパイと機械学習してみた
- VNCでPCからデスクトップ画面操作
- Get started with the USB Accelerator
- Python API overview & demos