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があなたと一緒に世界を旅します

ブログ    
ブログ    
ブログ    

推薦する

Google、人工知能をより有効活用できるよう複数のAIツールをリリース

Google は今週開催された Cloud Next カンファレンスで、さまざまな機械学習ツール、顧...

凌創志新は、AI商業化の閉ループを作成するための最初のデータアノテーションビジネスを立ち上げました

アジアのビッグデータおよび人工知能企業である凌創志信は、同社の伝統的なリテイン事業であるデータラベリ...

...

人工知能はどのようにして銀行をより「インテリジェント」にすることができるのでしょうか?

[[263447]]人工知能技術の継続的な導入は、新たな産業発展の中核的な原動力となり、さまざまな...

ロボットが人間の「仲間」となり、人間と機械の関係が変化する。これは良いことなのか、悪いことなのか?

最近南京で開催された2020年世界知能製造会議において、中国工程院の研究者らは、人類の発展の観点から...

ブロックチェーンと人工知能の関係は何ですか?ブロックチェーンは人工知能に影響を与えることができるか?

ブロックチェーンと人工知能の関係は何ですか?ブロックチェーンは人工知能に影響を与えることができるか?...

NeurIPS 2023 入学結果が発表され、合格率は 26.1% でした

NeurIPS は世界で最も権威のある AI 学術会議の 1 つです。正式名称は Neural I...

機械学習について学びたい方はこちらをご覧ください。1ステップで専門家になる方法をお教えします!

パターン認識や機械学習のファンであれば、機械学習では避けられない重要な問題であるサポートベクターマシ...

...

Google の社内機械学習プロジェクト「Project Ninja」の秘密を解明します。

すべての製品に人工知能を統合したい場合は、強力な機械学習チームを育成する必要があります。 Googl...

100キーワード学習法による人工知能(AI)の学習

100キーワード学習法は、キーワード(つまり、キーポイント)を中心に学習するという、効率的な学習法で...

...

トニー先生に別れを告げる:海外の専門家が流行中に独自の美容ロボットを製作

パンデミック中にどうやって髪を切っていますか?どうやって見た目を維持していますか?多くの人がオンライ...

...

AIを活用したリアルタイムの脅威インテリジェンスでサイバー脅威に対抗する方法

多くの企業のセキュリティ運用センター チームにとって、サイバー攻撃に対する防御は、ますます高度化する...