エッジコンピューティングをGoogle edge TPUで実施してみました。機械学習で画像認識させて指定の物を検出した場合にはリアルタイムでGPIO制御(LED出力)させるようにプログラムしてみました。
エッジコンピューティングとは?
詳細の説明は省略しますが、エッジコンピューティングとは「端末(エッジ)側」でデータ処理(コンピューティング)することです。
端末側でデータ処理をすることでクラウド・ネットワークの負荷を減らす意図があります。
クラウドコンピューティングとエッジコンピューティングの違い
クラウドコンピューティングの場合、各デバイスの情報を毎回クラウドでデータ処理するので通信データ量が膨大になりクラウド・ネットワークへの負荷が重くなります。
エッジコンピューティングはネットワーク上の端末(エッジ)側に近い機器でデータ処理を行い、「ネットワークの負荷が軽くなる」「クラウドへの負荷が減る」ことでリアルタイム性が期待できます。
エッジコンピューティング用のGoogleのデバイス
Googleがエッジコンピューティング用のデバイスである「Google Edge TPU」を発売しました。公式HPはこちらです
Googleが数年前から機械学習に特化したエッジ向けのデバイスを開発していました(現在は第3世代ということです)。購入した際に書いた記事が下記になります。
今まで機械学習はデータ処理能力があるサーバー・クラウド上で行われることが多かったのですが、スペックが足りない端末(エッジ)機器でも高速に処理できるようになるデバイスです。
raspberry piでエッジコンピューティング
今までラズベリーパイ(raspberry pi)だけだと「デバイス」としての使い方がほとんどでしたが、「Google Edge TPU」も使うことで「エッジコンピューティング」できるようになりました。
「Google Edge TPU」+「ラズベリーパイ」を組み合わせることで「デバイス」と「エッジコンピューティング」の両方を対応できる機器となります。
下記がGoogle edge TPUの使い方をまとめた記事です。リアルタイムの画像認識のデモを試してみました。動かすだけならば簡単にできますのでおススメです
特定な物を画像検出した場合にLED出力をさせる
前回はカメラで動画を撮りつつ画物を分類していました。
今回は単に画像認識デモだけでなく、特定な物を画像検出した場合にはラズベリーパイ(raspberry pi)からGPIO制御(LED出力)するようにプログラムします。
今回はリアルタイムで「テニスボール」を検出した場合は赤LED出力、「定規」を検出した場合には緑LED出力させるようにしました。
Tensorflow liteのモデル・ラベルの中身を確認する
まずは今回の検出目標である「テニスボール」・「定規」がTensorflow liteのラベルでどのように定義されているかを確認します。
モデル・ラベルに関しては前回記事の分類(Image classification)で使ったものと同じものですので「MobileNet V2 (ImageNet) 」です。
ラベルに関してはテキスト「.txt」になっており簡単に確認できます。どのテキストエディッタでも構いませんのでファイルを開いて検索します。
1000個ある中から見つけました。テニスボール(tennis ball)が「853」で定規(ruler)が「770」でした。
今回は筆者の身近に在るものを適当に選びましたが、もし皆様で同様に実施する場合は好きな物を選びラベル内にあるかを確認してもらえれば構いません。
Edge TPUのPythonライブラリの中身を確認する
Google edge TPUのデモプログラム・ライブラリはPython(.py)で書かれています。ラズベリーパイ(raspberry pi)ならばデフォルトでエディタも入っていますので直接中身を確認していきます
ちなみに筆者は少し前までPython初心者でしたが、下記記事で紹介しているUdemy で勉強することで今回のレベルのことは出来るようになりました。
初心者が高い参考書を買って一人でPython勉強するよりは「非常に分かりやすく」「費用が抑えられる」はずですのでご参考ください。リンク先はこちらから
PythonでGPIO出力部のプログラムを並列処理させる
「/home/pi/python-tflite-source/edgetpu/demo」の中にある「classify_capture.py」を見ていきます。
これより下のプログラム箇所は技術的に大分拙い箇所があると思いますが、素人に毛が生えたハード屋が遊んでいるというレベルで見てもらえれば幸いです。
さらっと中身を見ていきますとresult[0][0]箇所に分類済のラベル番号のようですので、これを参考にフラグを立てて処理をしていきます。
高速で機械学習(画像認識)している中にGPIO制御入れていいのかが筆者の経験では分からず、一応並列処理させる形で対応しました。
LEDを出力するにはGPIO制御する必要がありますので最初にモジュールをインポートさせつつ、分類ラベルのフラグを共有させて
スレッドを「Google edge TPU」と「GPIO」で分けて(並列・平行処理して)対応しました。
一応何とか動くテストプログラムができました(笑)。
ラズベリーパイのGPIO回路図
今回の回路図はGPIOでLEDを光らせているだけですが一応載せておきます。
GPIO20が赤LEDでテニスボール、GPIO21が緑LEDで定規を検知した際に点灯します
制限抵抗値は330Ωと動画で分かるように光量を上げるため電流量を増やしています
リアルタイム性のエッジコンピューティングを試してみる
コマンド実行方法に関しては前回記事と同様です。「classify_capture_kai.py」部分が新規作成したテストプログラムです。
まずは前回同様にキーボード(keyboard)を試します。「テニスボール」「定規」でないのでLEDが点灯しないことを確認できました。仕様通りでOKです。
次はテニスボール(tennis ball)を試してみます。すぐにテニスボールと認識して赤LEDが点灯して問題無しです。
最後に定規(ruler)は少し反応が悪かったですが最後には緑LED点灯して認識できていました。
今回は動画も撮ってYoutubeに上げてみました。リアルタイム(数十ms)で物を検出・認識しつつGPIO制御(赤・緑LED点灯)できていることが分かります。
~16秒 プログラム実行
~25秒 キーボード(Keyboard)を認識させてLED点灯しないことを確認
~35秒 テニスボード(tennis ball)を認識させて赤LED点灯を確認
~50秒 定規(ruler)を認識させて緑LED点灯を確認
まとめ・感想
如何でしたでしょうか、エッジコンピューティングをしつつリアルタイムで画像検出+GPIO制御(LED出力)まで対応させることができました。
またラズベリーパイ(USB2.0)のためGoogle edge TPU(USB3.0)のベストパフォーマンスは発揮できていない中で数十msのリアルタイム性の画像認識ができていました。
USB3.0対応のデバイスで試せばより高速のエッジコンピューティングができ、さらに色々なケースで応用できるのではと考えています。ぜひ皆様も試してみてください。
<<20190413追記>>
「機械学習を使った画像認識」+「ラダー・PLCで動く工場の機器」を連携させてみました。Pythonとラズベリーパイでデバッグしましたのでぜひご覧ください。
一応AmazonなどでもCoral USB Acceleratorが仲介業者から売られているので貼っておきますが、2019/4頭時点では数量が出回っていないのか高額になっています。
もし(2019/4頭時点で)購入する場合は下記記事で紹介したMouserの方が安く済むと思います。ご連絡まで
コメント