Android Things と TensorFlow を使用して IoT に機械学習を適用する方法

Android Things と TensorFlow を使用して IoT に機械学習を適用する方法

Android Things を Tensorflow と統合する方法と、機械学習を IoT システムに適用する方法を学びます。 Android Things を搭載した Raspberry Pi で Tensorflow を使用して画像分類を行う方法を学びます。

このプロジェクトでは、機械学習をモノのインターネットに適用する方法を探ります。具体的には、IoT プラットフォームとしてAndroid Thingsを使用し、機械学習エンジンとしてGoogle TensorFlow を使用します。

現在、Android Things は Android Things 1.0 という安定バージョンになっており、実稼働システムで使用できます。すでにご存知かもしれませんが、Raspberry Pi は開発とプロトタイピングのために Android Things 1.0 をサポートできるプラットフォームです。このチュートリアルでは Android Things 1.0 と Raspberry Pi を使用しますが、コードを変更せずにサポートされている他のプラットフォームに切り替えることもできます。このチュートリアルでは、Android Things Raspberry Pi を使用して、モノのインターネット (IoT) に機械学習を適用する方法について説明します。

IoT における機械学習は最もホットなトピックの 1 つです。機械学習の最も簡単な定義は、おそらく Wikipedia にあるものです。

機械学習は、明示的にプログラムすることなく、データを使用してコンピューターが「学習」(つまり、特定のタスクでのパフォーマンスを徐々に向上させること)できるようにするコンピューターサイエンスの分野です。

言い換えれば、一度トレーニングすれば、システムは特にプログラムされていなくても結果を予測できるようになります。一方、モノのインターネットと接続デバイスの概念は誰もが知っています。最も有望な分野の一つは、機械学習をモノのインターネットに適用し、エキスパートシステムを構築して、「学習」できるシステムを開発する方法です。さらに、この知識は物理的なオブジェクトの制御と管理にも使用できます。 Android Things の詳細に入る前に、まずデバイスにインストールする必要があります。 Android Things を初めて使用する場合は、デバイスに Android Things をインストールする方法に関するこのチュートリアルをお読みください。

機械学習と IoT を適用することで大きな価値を生み出すことができる領域はいくつかあります。以下に、興味深い領域をいくつか挙げます。

  • 産業用 IoT (IIoT) における予測メンテナンス
  • 消費者向け IoT では、機械学習によってデバイスを私たちの習慣に合わせて調整することで、よりスマートにすることができます。

このチュートリアルでは、Android Things と TensorFlow を使用して、機械学習をモノのインターネットに適用する方法について説明します。このAdnroid Things IoTプロジェクトの基本的なアイデアは、前方の道路上の基本的な形状(矢印など)を認識し、道路の方向を制御できる自動運転車の構築方法を探ることです。 Android Things を使用して自動運転車を構築する方法についてはすでに説明しましたので、このプロジェクトを開始する前にそのチュートリアルを読むことをお勧めします。

この機械学習と IoT プロジェクトでは、次のトピックを取り上げます。

  • Docker を使用して TensorFlow 環境を構成する方法
  • TensorFlow システムをトレーニングする方法
  • TensorFlow を Android Things と統合する方法
  • TensorFlow の結果を利用して自動運転車を制御する方法

このプロジェクトは、Android Things TensorFlow 画像分類器から生まれました。

さあ始めましょう!

画像認識にTensorflowを使用する方法

始める前に、TensorFlow 環境をインストールして構成する必要があります。私は機械学習の専門家ではないので、TensorFlow 画像認識エンジンを構築できるように、何か迅速かつ便利なものを見つける必要がありました。これを行うには、Docker を使用して TensorFlow イメージを実行します。手順は次のとおりです。

1. TensorFlow リポジトリをクローンします。

  1. git clone https : //github.com/tensorflow/tensorflow.git
  2. cd / tensorflow
  3. git checkout v1 . 5.0

2. このプロジェクトで使用するすべてのファイルを保存するディレクトリ ( /tf-data ) を作成します。

3. Dockerを実行します。

  1. docker run - it \
  2. -- volume / tf - data :/ tf - data \
  3. -- volume / tensorflow :/ tensorflow \
  4. -- workdir / tensorflow tensorflow / tensorflow : 1.5 . 0 bash

このコマンドを使用すると、インタラクティブな TensorFlow 環境を実行し、プロジェクトの作業中に使用するいくつかのディレクトリをマウントします。

TensorFlow をトレーニングして画像を認識する方法

Android Things システムが画像を認識できるようにするには、まず TensorFlow エンジンをトレーニングしてモデルを構築できるようにする必要があります。これを行うには、いくつかの画像を収集する必要があります。前述したように、Android Things の無人運転車を制御するには矢印を使用する必要があるため、少なくとも 4 種類の矢印を収集する必要があります。

  • 上向き矢印
  • 下向き矢印
  • 左向き矢印
  • 右向き矢印

システムをトレーニングするために、これら 4 つの異なるカテゴリの画像を使用して「知識ベース」が作成されます。 /tf-dataディレクトリにimagesというディレクトリを作成し、その下に次の名前の 4 つのサブディレクトリを作成します。

  • up-arrow
  • down-arrow
  • left-arrow
  • right-arrow

さて、写真を探しに行きましょう。私はGoogle画像検索を使用しましたが、他の方法も使用できます。画像のダウンロードプロセスを簡素化するために、Chrome ダウンロード拡張機能をインストールして、選択した画像をワンクリックでダウンロードできるようにすることができます。トレーニング効果を高めるために、より多くの画像をダウンロードすることを忘れないでください。もちろん、モデルの作成時間はそれに応じて長くなります。

さらに読む

  • APIを使用してAndroid Thingsを統合する方法
  • Firebase で Android Things を使用する方法

ブラウザを開いて、次の 4 種類の矢印の画像を探し始めます。

TensorFlow 画像分類器

カテゴリーごとに80枚の画像をダウンロードしました。画像ファイルの拡張子については心配する必要はありません。

すべてのカテゴリのイメージに対して次の操作を実行します (Docker インターフェース内)。

  1. python / tensorflow / examples / image_retraining / retrain . py \
  2. -- bottleneck_dir = tf_files / bottlenecks \
  3. -- how_many_training_steps = 4000 \
  4. -- output_graph = /tf-data/ retrained_graph . pb \
  5. -- output_labels = /tf-data/ retrained_labels . txt \
  6. -- image_dir = /tf-data/ images

このプロセスには長い時間がかかるため、忍耐強く待つ必要があります。完了すると、 /tf-dataディレクトリに次の 2 つのファイルが作成されます。

  1. retrained_graph.pb
  2. retrained_labels.txt

最初のファイルには TensorFlow トレーニング プロセスによって生成された結果モデルが含まれ、2 番目のファイルには 4 つの画像クラスに関連付けられたラベルが含まれます。

Tensorflow モデルのテスト方法

このモデルをテストして期待どおりに動作するかどうかを確認する場合は、次のコマンドを使用できます。

  1. python scripts . label_image \
  2. -- graph = /tf-data/ retrained - graph . pb \
  3. -- image = /tf-data/ images /[ category ]/[ image_name . jpg ]

モデルの最適化

Android Things プロジェクトで TensorFlow モデルを使用する前に、最適化する必要があります。

  1. python / tensorflow / python / tools / optimize_for_inference . py \
  2. -- input = /tf-data/ retrained_graph . pb \
  3. -- output = /tf-data/ opt_graph . pb \
  4. -- input_names = "Mul" \
  5. -- output_names = "final_result"

それが私たちのモデルのすべてです。このモデルを使用して、TensorFlow を Android Things と統合し、機械学習を IoT などのタスクに適用します。目標は、Android Things アプリケーションを使用して矢印画像をインテリジェントに認識し、その後の自動運転車の方向制御に反応することです。

TensorFlow とモデルの生成方法について詳しく知りたい場合は、公式ドキュメントとこのチュートリアルをご覧ください。

Android Things と TensorFlow を使用して IoT に機械学習を適用する方法

TensorFlow データ モデルの準備ができたので、次のステップである、Android Things を TensorFlow と統合する方法に進みます。この目的のために、このタスクを 2 つのステップに分割します。

  1. ハードウェア部分では、モーターやその他のコンポーネントを Android Things 開発ボードに接続します。
  2. このアプリケーションの実装

Android Things の図

周辺機器コンポーネントの接続方法を説明する前に、この Android Things プロジェクトで使用されるコンポーネントのリストを示します。

  1. Android Things 開発ボード (Raspberry Pi 3)
  2. ラズベリーパイカメラ
  3. LEDライト
  4. LN298NデュアルHブリッジモータードライバーモジュール(制御モーターを接続)
  5. 二輪無人自動車のシャシー

Android Things を使用してモーターを制御する方法については、以前の記事ですでに説明されているため、ここでは繰り返しません。

ここに図があります:

Android Things と IoT の統合

上の写真にはカメラは写っていません。最終結果は次のとおりです。

[[238649]]

Android Things と TensorFlow の統合

TensorFlow を使用した Android Things アプリケーションの実装

最後のステップは、Android Things アプリケーションを実装することです。これを行うには、Github にある TensorFlow Image Classifier Example というサンプル コードを再利用できます。始める前に、ソース コードを変更できるように Github リポジトリをクローンします。

この Android Things アプリは、次の点で元のアプリと異なります。

  1. カメラ画像のキャプチャを開始するためのボタンは使用しません
  2. 異なるモデルを使用する
  3. リマインダーとして点滅する LED ライトを使用し、LED の点滅が止まるとカメラが写真を撮影します。
  4. TensorFlow は画像 (矢印) を検出するとモーターを制御します。さらに、ステップ 3 のサイクルが開始する前に、モーターが 5 秒間オンになります。

LED を点滅させるには、次のコードを使用します。

  1. private Handler blinkingHandler = new Handler ();
  2. private Runnable blinkingLED = new Runnable () {
  3. @Override
  4. public void run () {
  5. try {
  6. // If the motor is running the app does not start the cam
  7. if ( mc . getStatus ())
  8. return ;
  9. Log . d ( TAG , "Blinking.." );
  10. mReadyLED . setValue (! mReadyLED . getValue ());
  11. if ( currentValue <= NUM_OF_TIMES ) {
  12. currentValue ++;
  13. blinkingHandler . postDelayed ( blinkingLED ,
  14. BLINKING_INTERVAL_MS );
  15. }
  16. else {
  17. mReadyLED . setValue ( false );
  18. currentValue = 0 ;
  19. mBackgroundHandler . post ( mBackgroundClickHandler );
  20. }
  21. } catch ( IOException e ) {
  22. e . printStackTrace ();
  23. }
  24. }
  25. };

LED の点滅が止まると、アプリケーションは写真をキャプチャします。

ここで、検出された画像に基づいてモーターを制御する方法について考える必要があります。このメソッドを変更します:

  1. @Override
  2. public void onImageAvailable ( ImageReader reader ) {
  3. final Bitmap bitmap ;
  4. try ( Image image = reader . acquireNextImage ()) {
  5. bitmap = mImagePreprocessor . preprocessImage ( image );
  6. }
  7. final List < Classifier . Recognition > results =
  8. mTensorFlowClassifier . doRecognize ( bitmap );
  9. Log . d ( TAG ,
  10. "Got the following results from Tensorflow: " + results );
  11. // Check the result
  12. if ( results == null || results . size () == 0 ) {
  13. Log . d ( TAG , "No command.." );
  14. blinkingHandler . post ( blinkingLED );
  15. return ;
  16. }
  17. Classifier . Recognition rec = results . get ( 0 );
  18. Float confidence = rec . getConfidence ();
  19. Log . d ( TAG , "Confidence " + confidence . floatValue ());
  20. if ( confidence . floatValue () & lt ; 0.55 ) {
  21. Log . d ( TAG , "Confidence too low.." );
  22. blinkingHandler . post ( blinkingLED );
  23. return ;
  24. }
  25. String command = rec . getTitle ();
  26. Log . d ( TAG , "Command: " + rec . getTitle ());
  27. if ( command . indexOf ( "down" ) != - 1 )
  28. mc . backward ();
  29. else if ( command . indexOf ( "up" ) != - 1 )
  30. mc . forward ();
  31. else if ( command . indexOf ( "left" ) != - 1 )
  32. mc . turnLeft ();
  33. else if ( command . indexOf ( "right" ) != - 1 )
  34. mc . turnRight ();
  35. }

この方法では、TensorFlow がキャプチャされた画像に一致する可能性のあるラベルを返した後、アプリケーションはこの結果を可能性のある方向と比較し、それに応じてモーターを制御します。

***では、先ほど作成したモデルを使用します。既存のファイルを置き換えるには、 assetsフォルダー内のopt_graph.pbreatrained_labels.txtをコピーします。

Helper.javaを開き、次の行を変更します。

  1. public static final int IMAGE_SIZE = 299 ;
  2. private static final int IMAGE_MEAN = 128 ;
  3. private static final float IMAGE_STD = 128 ;
  4. private static final String LABELS_FILE = "retrained_labels.txt" ;
  5. public static final String MODEL_FILE = "file:///android_asset/opt_graph.pb" ;
  6. public static final String INPUT_NAME = "Mul" ;
  7. public static final String OUTPUT_OPERATION = "output" ;
  8. public static final String OUTPUT_NAME = "final_result" ;

アプリを実行し、カメラにさまざまな矢印を表示して、どのように反応するかを確認します。無人運転車は表示される矢印に従って移動します。

要約する

これでチュートリアルは終了です。Android Things と TensorFlow を使用して IoT に機械学習を適用する方法について説明しました。自動運転車の動きを制御するために画像を使用します。

<<:  ブロックチェーン技術は人工知能の欠点をどのように解決できるのでしょうか?

>>:  世界はとても広い。AIがあなたと一緒に世界を旅します

ブログ    

推薦する

...

ヘルスケアにおけるAI導入が難しい理由

私たちはほぼ毎日、人工知能と医療業界におけるその応用に関する最新の記事を読んでおり、医療機関などのク...

ボストンのロボットが話題になった後、別のヒューマノイドロボットがデビューした

10年以上前、テヘラン大学の研究者らは、Surenaと呼ばれる原始的なヒューマノイドロボットを発表し...

...

...

自動運転車は「交通渋滞をさらに悪化させる可能性がある」

西オーストラリア大学の研究者らは、交通渋滞を緩和するために設計された無人運転車が逆の効果をもたらして...

AI がエッジ コンピューティングと IoT をよりスマートにする方法

[[391125]]エッジで AI を導入すると、ネットワークの遅延と運用コストを削減できるだけでな...

ザッカーバーグがマスクの家を盗んだ! MetaはTwitterの混乱を利用して競合製品を急いで発売し、明後日発売される予定だ。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

DeepSpeed ZeRO++: ネットワーク通信を4倍削減し、大規模モデルやChatGPTのようなモデルのトレーニング効率を大幅に向上

大規模な AI モデルがデジタルの世界を変えています。大規模言語モデル (LLM) に基づく Tur...

政府規制のAIの時代が到来

スティーブン・ホーキング博士はかつてこう言った。「効果的な人工知能の開発に成功すれば、私たちの文明史...

調査によると、2024年は「AIメガネ」市場元年となる

AppleのVision Proヘッドセットは2024年第1四半期に発売される予定だが、業界の専門家...

2019年にAI分野で何が起こったのでしょうか?

2019年は確かに忙しい年でした。人工知能に関する進歩やニュースが頻繁に報道されるにつれ、私たちの...

ドローンは農業にも活用されており、植物保護ドローンは侵入の防止と制御に非常に効果的です。

今日のドローンは、ビデオ録画だけでなく、害虫や病気の問題を防ぐための農業での使用など、幅広い用途に使...