VxWorksでTensorFlow Liteを試す
TensorFlow Liteとは
TensorFlow Lite は、組み込みデバイス上での推論を可能にするオープンソースのディープ ラーニング フレームワークになります。モバイルデバイスをはじめ、スマートデバイスなどで動作しており、自然言語処理や画像認識、音声認識など多岐の分野で使用されております。ただ現状では学習そのものはTensorFlowで行う必要があり、あくまで推論エンジンとしての立ち位置となります。
組込み製品で使う場合のハードル
対応デバイスがモバイルデバイス、組み込みLinux及びいくつかのマイクロコントローラになっており、それ以外の環境には移植が必要となります。そして、そのビルドにはC++11の対応が必要となるため、古いC言語の規格にしか対応していないコンパイラでは移植が困難になります。
VxWorks 7 21.07でサポート
VxWorks 7 21.07バージョンではReal Time Process(以下RTP)用にC++11に対応したコンパイラをサポートされている為、TensorFlow Liteをはじめとする多数のオープンソースのミドルウェアをサポートする事が可能となりました。
このことは移植の手間やサポートからユーザーが解放されたことを意味し、ユーザーは本来行うべきアプリケーションの作成に専念することができます。新しく対応されたミドルウェアに関する詳しい情報はVxWorks 7の情報をご覧ください。
デモの構成
以下デモ構成の概略です。今回はイノテック社製VX-6020ボードを使用してデモを構築しております。
他に必要なのは起動用のSDカード(※)と画像を撮るためのUSBカメラです。
必須ではないですがディスプレイがあれば画像を見ながら物体認識を実行できます。
※VX-6020ではSDカードからの起動は非推奨となります。製品開発時には信頼性のあるSSDなどをご使用ください。
デモの準備
-
「VxWorks Source Build」の設定&ビルド
「VxWorks Source Build」プロジェクトを作成し、「TENSORFLOW_LITE」「TENSORFLOW_LITE_EXAMPLE」を追加します。
TensorFlow Liteそのものは上記で使用できますが、デモに必要な機能「OPENCV」「FBDEV」「ITLI915」を追加してビルドします。
-
「VxWorks Image Project」の設定&ビルド
前述の「VxWorks Source Build」を指定して「VxWorks Image Project」のプロジェクトを作成し、以下のコンポーネントを追加、設定してビルドを行います。
※ComponentINCLUDE_EHCI_INITINCLUDE_USB_GEN2_VIDEO_INITINCLUDE_DOSFSINCLUDE_TENSORFLOW_LITE_SUPPORTINCLUDE_FBDEV_INITINCLUDE_FBDEV_ITLGMC_0INCLUDE_RAM_DISKINCLUDE_RAM_DISK_FORMAT_DOSFSDRV_PCI_SDHC_CTRL※ParameterCONSOLE_NAME “/ttyS2”
CONSOLE_BAUD_RATE (115200)
FILESYSTEM_SYMLINK_CONFIG_STR “<def>=/sd0a/deploy;/bin=<def>/bin;/usr=<def>/usr;/etc=<def>/etc;/lib=<def>/lib;”
ITLGMC_FBDEV_DISPLAY_0 “DP”
USB_MEM_PART_SIZE 0x2000000
RAM_DISK_SIZE 0x400000
前述の「VxWorks Source Build」を指定して「Real Time Process」のプロジェクトを作成し、プロパティに「opencv」「tbb」「gfxJpeg」ライブラリを追加してアプリケーションを作成します。
今回作成するモデルやラベルは以下のTensorFlow Liteのsampleで使用されているものを流用して物体認識を行います。
- Model : mobilenet_v1_1.0_224.tflite
-
Labels : mobilenet_v1_1.0_224/labels.txt
アプリケーションは以下の2つを作成します。
- tflitedemo … USBカメラから映像を取得し、ディスプレイへ投影。「shutter」が実行されるとその時の映像を用いて物体認識を行う
- shutter … 「tflitedemo」へシグナルを送信し、物体認識を行わせる
アプリケーションの起動
TensorFlow LiteのデモはRTPで実行する必要があるためLinuxライクな「cmd」シェルからの実行が便利です。
「cmd」コマンドでシェルを移行し、「tflitedemo &」コマンドを使い、TensorFlow LiteとUSBカメラ、ディスプレイの初期化をバックグラウンドで実行します。
Target Name: vxTarget _________ _________ \........\ /......../ \........\ /......../ \........\ /......../ \........\ /......../ \........\ \......./ \........\ \...../ VxWorks SMP 64-bit \........\ \.../ \........\ \./ Release version: 21.07 \........\ - Build date: Oct 28 2021 18:32:37 \........\ \......./ Copyright Wind River Systems, Inc. \...../ - 1984-2021 \.../ /.\ \./ /...\ - ------- Board: x86_64 Processor (ACPI_BOOT_OP) SMP/SMT CPU Count: 2 OS Memory Size: ~3926MB ED&R Policy Mode: Deployed Debug Agent: Not started Stop Mode Agent: Not started Loading symbol table from /host.host/vxWorks.sym ...done -> cmd [vxWorks *]# tflitedemo & Launching process 'tflitedemo' ... Process 'tflitedemo' (process Id = 0xffff800000778040) launched. Attachment number for process 'tflitedemo' is %1. Error opening /dev/fb2. Open device:/dev/fb0 instead Screen information. Width: 1920 Height: 1080 Stride: 7680 Channels: 4 Buffers: 3 Pixel format = 0x2
「shutter」コマンドを使って、その際に映像を入力画像として物体認識をさせます。下記のログは以下の画像が映っている時の解析結果です。ログを見ると1600msの時間を掛けて、69.24%の確率でPC用マウスとして認識しています。
[vxWorks *]# shutter Launching process 'shutter' ... Process 'shutter' (process Id = 0xffff80000078c070) launched. Shutter pressed ! [vxWorks *]# INFO: Loaded model /usr/share/mobilenet_v1_1.0_224.tflite INFO: resolved reporter INFO: invoked INFO: average time: 1600 ms INFO: 0.692461: 674 674:mouse, computer mouse INFO: 0.0673922: 883 883:vacuum, vacuum cleaner INFO: 0.0536963: 675 675:mousetrap INFO: 0.027106: 623 623:lens cap, lens cover INFO: 0.0128276: 519 519:crash helmet
まとめ
VxWorks上のTensorFlow Liteで機械学習したモデルを推論エンジンとして動かすことにより、属人的であった経験と解析からなる判定アルゴリズムだけではなく、機械学習をベースとした判定は今までとは異なるアプローチでの判定を可能とする為、より精度を増した判定が可能になるはずです。また機械学習の分野は急速な発展をしている為、そのモデルによる判定の精度の向上も見込めるでしょう。
次回以降の予定
現在のVxWorks 7 21.07ではGPUのサポートは無い為、次回はCPUによる推論エンジンのパフォーマンスへの影響を調べてみたいと思います。ソフトウェアをそのままに、数種類のターゲットでそのパフォーマンスを測定する予定です。
注
※ Wind RiverおよびVxWorksは、Wind River Systemsの登録商標です。
※ TensorFlow、TensorFlowロゴ、その他関連するマークはGoogle Inc.の登録商標です。