United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

Movidius NCSでTensorFlowを利用してみよう

 convolution2_e82d812f1b271bcffc87566063838dc94e544190.png

 

Google社が提供する深層学習エンジン TensorFlowがNeural Compute Stickをサポート!

今回ご紹介するMovidius NCS(Neural Compute Stick)(139-3655)は、低消費端末上で深層学習処理をサポートするUSBスティック型のモジュールだ。これにより、ネットワーク上のエッジにおいてAI、すなわち人工知能処理が可能なる。このコンパクトなUSB3.0デバイスはCaffeフレームワークをサポートしており、これと同じ例を以前の投稿でも確認できる。この時の記事にて、私はNCSについての所見とそのサンプルを提供している。今回は新たに更新されたSDKに一度立ち返り、最近アナウンスがあったTensorFlowのサポートに注目してみようと思う。この”TensorFlow”とはGoogle社が提供する2世代目の機械学習システムだ。

Tensorとは何か?

StressTensor_151dae3af667f9be5d4e81fc94dfbcbc16cde5eb.jpg

Stress tensor, source Wikimedia Commons, CC BY-SA 3.0

TensorFlowが何か、についてインターネットの検索結果から(比較的に)簡単に見つけることができた。その理解を助けてくれる説明がPhysLink.comにある。ここでは次のように説明されている。「数学的に定義されているTensorsは、座標の変化に従って変形する単純な数の並び、もしくは関数の配列である。特に、物理学においては、tensorsは物理システム(物理的な仕組み)を特徴づけるものである。」

TensorFlowはデータフロー図を利用した数値計算のためのオープンソースライブラリである、と述べられている。このデータフロー図において、ノードは数学的な演算子を示しており、その終端は複数次元配列(tensors)を示しており、互いにやりとりが行われるようだ。

幸いTensorFlowの例を試し、その動きの概要を学ぶにあたって、私たちは数学的な詳細を完全に理解する必要はない。しかし実は、こういった理解がなくとも、実際に無料で利用可能なニューラルネットワークは既に多くのアプリケーションにて利用されている例は多く存在するだろう。

TensorFlowはCPUとGPUの両方のサポートを行っている。当然のことながら、Neural Compute Stickに搭載されている2つのMyriad VPU(Visual Processing Unit)により、さらにエネルギー効率の向上が実現されているのだ。

SDKのインストール

make-examples_afdebbc9c8b6d55433eb63f19deb70a55f762d3d.jpg

それではMovidius NCSのスタートガイドに戻ってみよう。まず初めにGitHubにあるアーカイブのダウンロードからだ。GitHubに利用により、変更やSDKのアップデート、トラックの変更などをより簡単にしてくれるため是非利用しよう。そのためのインストールのコマンドは以下を参考にしてほしい。

$ git clone https://github.com/movidius/ncsdk.git

$ cd ncsdk

$ sudo make install

 

Neural Compute Stick SDKは以下のようにインストールされている。

  • NCS Libraries → /usr/local/lib
  • NCS Toolkit binaries → /usr/local/bin
  • NCS Include files → /usr/local/include
  • NCS Python API → /opt/movidius

また、PYTHONPATH環境変数についても同時に更新されている。

 

それでは次にサンプルをビルドしていこう。しかし、その前にNCSが挿入されているか確認してほしい。

$ make examples

この過程における出力の一部は上のようになるはずだ。

TensorFlowサンプル

convolution2_e82d812f1b271bcffc87566063838dc94e544190.png

Inception v1 Network Analysisの詳細

Google社から提供されているv1またはv3のInceptionアーキテクチャについては以下の論文を参考にしてほしい。

またNicolò Valigi氏によるブログへの投稿も参考になるだろう(a short history of the Inception deep learning architecture.)。

用意されているSDKは先ほど述べたv1もしくはv3のInceptionアーキテクチャに向けたものだ。

それではTensorFlowのサンプルを実行していこう。v1のサンプルを実行するために、私たちは以下のようなコマンドを最初に実行する。

$ cd examples/tensorflow/inception_v1

$ make all

 

これにより、NCSにおけるネットワークをプロファイリングし、ネットワークの記述と訓練された重みが記述されたファイルを利用して、Myriad 2 VPU上で実行される二分木(二分決定図)をコンパイルする。

 

次は以下のコマンドを入力しよう。

$ make run

このコマンドにより、NCSに一つの画像ファイルがダウンロードされ、1,001種類ものカテゴリのなかから、その推論結果が表示される。

nps_electric_guitar_e7674289d71663d5ae2b7e009734de5f39e36b52.jpg

通常の場合、利用される画像は上のようなエレキギターである。

GYTFO_Inception_v1_Output_8fb65b477bce5d5692ba05d08f71d6691a92caab.jpg

少しわかりにくいが、マシンにおける推論結果を上に示す。これから、エレキギターのスコア(エレキギターであるという度合)が0.97314と最も高くなっていることが確認できるだろう。2番目はアコースティックギターであるが、そのスコアは0.011597と非常に小さいため、今回は十分にエレキギターであるという推論が得られた。

テストするための画像ファイルの選択は複数提供されており、異なる画像ファイルについても推論することができる。そのためにはrun.pyというPythonプログラムを少し編集するだけでよい。ソースコード中にimage_filenameという記述を見つけることができるだろうか。

from mvnc import mvncapi as mvnc
import sys
import numpy
import cv2

path_to_networks = './'
path_to_images = '../../data/images/'
graph_filename = 'graph'
image_filename = path_to_images + 'nps_guac.png'

 

では今度はメキシコ料理のワカモレ(guacamole)で試してみよう。ワカモレはアボカド、トマト、タマネギなどを磨り潰しトルティーヤをディップする食べ物だ。

nps_guac_4b1d70ed70a2bcc8a950daa855ec673e97d216bd.jpg

先ほどと同様に実行すると、以下のような結果が得られる。

make_run-guac_0e36ec1f8a203265e4783710bc5b56d4556005c7.jpg

今回もワカモレ(guacamole)が最もスコアが高くなっていることが確認できる。

全く新しいニューラルネットワークアーキテクチャの開発はAI/ML (人工知能/機械学習)の領域であるが、その一方、これらをただこうして“利用するのみ”なら、こんなに短いソースで実現できるのだ。今回の run.pyは著作権ヘッダを含めてもたった93行である。そう、ニューラルネットワークコンピューティングAPIとすでに訓練済み(学習済み)のネットワークを利用することはこんなにも簡単なのだ。

今回のrun.pyスクリプトを簡単に説明すると以下のような流れになっている。

  1. NCS、数値ライブラリ、OpenCVのインポートのサポート
  2. NCS機器を確認し、開く(存在しない場合はエラーを出力して終了)
  3. 既にコンパイル済みの二分木(二分決定図)を読み込む
  4. 入力画像を適した形式へ変換する
  5. 画像(今回の入力tensor)を読み込む
  6. 上位5つの推論結果のスコアを出力する
  7. NCSデバイスを閉じる

非常にシンプルであることがわかっていただけるだろう。さらに、異なる環境やアプリケーションに合わせて、既に訓練されたニューラルネットワークを利用できるため、より様々な用途において使用することを想像するのは容易いだろう。

“zoo”への旅

GYTFO_stream_ty_gn_8704250911999978dc9f039119d381078e0eb0cf.jpg

TinyTolo + GoogLeNeを利用したビデオストリームの例

Intelは、Movidus NCSを使ったデモの共有、再利用、そして無料で利用できるサンプルの数を増やすため、Nural Compute Applicatio Zoo(以下NC App Zoo)というGitHubレポジトリを作った。ここでは、モデルをダウンロードし、CaffeとTensorFlow用のグラフをコンパイルするためのスクリプトを提供している。さらに、サンプルアプリケーションとデータについても提供している。

また、今回の記事を執筆している時点で、NC App Zooで利用可能なアプリケーションには、複数のネットワークを実行できるように、複数のNCSを利用することを想定したアプリケーションも提供されている。ビデオストリームを使用した以下のようなstream_ty_gnがその例だ。

  1. TinyYolo推論を実行して、フレーム内で認識した20のカテゴリのいずれかに一致するすべてのオブジェクトを推論する
  2. 認識された各オブジェクトについて切り抜く
  3. より詳細な分類のために、小さくした画像をGoogLeNetネットワークへ渡す

あなた自身がNC App Zooへの貢献のための招待を受け、作成したサンプルの簡単なガイドラインのセットを提供し、GitHubのプルリクエストからサンプルを提出できるのだ。

最後に

なぜTensorFlowなのか?あなたがTensorFlowを利用して何か新しいものを作成しようとする。そのときにweb検索を行うならば、ブログの投稿、記事、さらに紹介の動画などが足りない、といったことはないだろう。より高度な種類のトピックにおいて、さまざまなアプリケーションで利用されているからなのだ。Google社のTensorFlowは、2年足らずで最先端の研究のためのアクティブなプラットフォームを提供するだけでなく、製品アプリケーションにおいても利用されおり、現在大きな関心を集めている。こうしたTensorFlowと今回紹介したNCSのサポートにより、組み込みシステムにおける深層学習の開発を加速させることができるに違いないだろう。

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.