[RISC-V技術ブログ連載第10回] SiFive最新リリース HiFive Unmatchedボードのご紹介⑥ ~HiFive UnmatchedでTensorFlow Liteを試す~

SiFive技術ブログ・アイキャッチ画像 RISC-V

1.はじめに

 前回、RISC-V技術ブログ連載第9回「SiFive最新リリース HiFive Unmatchedボードのご紹介⑤ 」では、HiFive UnmatchedボードでFreedom U SDK(FUSDK)を用いた際のブートフローを、デバッガで確認する様子と合わせて少し掘り下げてお伝えしました。
 今回は、FUSDKを使うことでとても簡単に機械学習フレームワークの一つであるTensorFlow Liteを試すことができる点をお伝えしたいと思います。

2.TensorFlow Liteとは

 TensorFlow Liteとは、Googleによって開発されたデバイス上での推論を可能にする、オープンソースのディープラーニングフレームワークです。モバイル デバイス、組込みデバイス、IoTデバイスでTensorFlowモデルを実行できるようにするツールセットです。低レイテンシでバイナリサイズを抑えつつ、機械学習の推論を行うことができます(※1)。

 下図に示すように、TensorFlowによって作られた学習済みモデル(Learned Model)をConverterを使ってTensorFlow Liteが利用できるフォーマットに変換します。TensorFlow Lite Interpreterでは変換されたモデルを利用して推論を行います。


 ※1 出所:「TensorFlow Liteガイド」https://www.tensorflow.org/lite/guide?hl=ja

3.TensorFlow Liteの特徴

 TensorFlow Liteは以下のような特徴を持っています。

  •  軽い (Lightweight)
    処理能力が低い携帯電話のデバイス上でも起動や初期化が素早く行えるよう設計されている
  • 複数のプラットフォームで動く
    – Windows、Android、iOS、組込みLinux
    – Raspberry Pi、その他各種マイクロコントローラ
  • 速い
    IoTデバイスなどに最適化されていて、モデルの読み込みなどが劇的に速い

 また、下表にTensorFlow Liteを使ってできることの例を挙げます(※2)。

概要
画像分類人、動き、動物、植物、場所など、何百ものオブジェクトを識別する。
オブジェクト検出境界ボックスで複数のオブジェクトを検出する。
姿勢検出1人または複数人の姿勢を推定する。
音声認識キーワードを認識して音声コマンドを識別する。
ジェスチャー認識ウェブカメラを使ってジェスチャー認識をする。
テキスト分類フリーテキストを定義済みのグループに分類する。
自然言語で質問に回答BERT(※3)を使用して、特定の文章の内容に基づいて質問に回答する。
数字分類器手書きの数字を分類する。
画風変換入力された画像にスタイルを適用し、新たにアーティスティックな画像を作成する。
スマートリプライ会話型チャットメッセージを入力するための返信候補を生成する。
超解像低解像度の画像から超解像の画像を生成する。
音声分類拍手、指のスナップ、タイピングの音声を分類する。

 ※2 出所:「TensorFlow Liteを使用しているアプリの例」 https://www.tensorflow.org/lite/examples?hl=ja
 ※3  BERTとは、”Bidirectional Encoder Representations from Transformers”の略で、Googleによって開発された自然言語処理技術(NLP)の一種です。文章の文脈を理解することができるという特徴を持っています。

4.HiFive UnmatchedボードでTensorFlow Liteを試す

 現在リリースされている最新のFUSDK(2021.08.00)のイメージファイル(※4)には、Python3、TensorFlow Lite Interpreter、TensorFlow Liteサンプルプログラムが含まれており、とてもお手軽にTensorFlow Liteを試すことができます。
 本章では、前章でご紹介した数字分類器(Digits Classification)と画像分類(Image Classification)について、実際にHiFive Unmatchedボードでサンプルプログラムを動作させて見ていきます。

4.1.動作環境

①ハードウェア
 ・PC
  メモリ:8GB以上推奨
 ・HiFive Unmatchedボード
 ・microSDカード(FUSDK(2021.08.00)(※4) Linux起動イメージ書き込み済み)
 ・ATX電源
  HiFive Unmatchedボード起動用
 ・USBケーブル(TypeA⇔MicroB)
  データ通信用
 ・LANケーブルおよびインターネット接続環境

②ソフトウェア
 ・OS
  Windows 10 64bit
 ・ターミナルソフト
  TeraTerm(ver.4.106)

 ※4 FUSDK(2021.08.00)イメージファイルはこちら(https://github.com/sifive/freedom-u-sdk/releases/tag/2021.08.00)から入手可能です。

4.2.数字分類器(Digits Classification)を試す

 MNIST(※5)を用いた手書き文字を認識する簡単なサンプルプログラム(mnist.py)がFUSDKに含まれており、Linux起動後すぐに試すことができます。

 下図に示すように、数字の’5’を手書きした画像をテキストファイル化したdigit5.txtとMNIST(※5)を用いて学習済みモデルを利用し、数字分類結果を出力するサンプルプログラムです。


 FUSDKのLinuxにログイン後、以下を行います。

 # cd /usr/share/doc/python3-tensorflow-lite-demo/example
 # python3 mnist.py

 すると、このような結果が表示されます。

0: 00.00%
1: 00.00%
2: 00.00%
3: 00.20%
4: 00.00%
5: 99.80%
6: 00.00%
7: 00.00%
8: 00.00%
9: 00.00%

 ”5:99.80%”となっていることから、99.80%の確率で’5’であると認識されたことがわかります。mnist.pyをテキストエディタで開いて見ましょう。

 f = open('digit5.txt', 'r')

と書かれている箇所が見つかります。上記で説明しましたように、”digit5.txt”とは数字の’5’を手書きした画像をテキストファイルに変換したものです。このことから期待した認識結果であることがわかります。

 ※5  MNIST(Mixed National Institute of Standards and Technology database)とは、60,000枚の手書き数字画像とその教師データ、10,000枚のテスト画像と教師データで構成されるデータセットです。

4.3.画像分類(Image Classification)を試す

 TensorFlowによって学習されたモデル(Mobile Net v1)をTensorFlow Liteフォーマットに変換したものを利用して、指定した画像内からオブジェクトを認識するサンプルプログラムを試します。


 以下に手順を示します。
 ①Python3用画像処理ライブラリPillowのインストール

 # pip3 install Pillow

 ②サンプルプログラムのダウンロード

 # wget https://raw.githubusercontent.com/tensorflow/tensorflow/master/tensorflow/lite/examples/python/label_image.py

 ③TensorFlow Lite用にlabel_image.pyを変更する
  1) import tensorflow as tf → import tflite_runtime.interpreter as tflite
  2)interpreter = tf.lite.Interpreter(model_path=args.model_file, num_threads=args.num_threads) → interpreter = tflite.Interpreter(model_path=args.model_file)

 ④サンプル画像をダウンロードする

 # curl https://raw.githubusercontent.com/tensorflow/tensorflow/master/tensorflow/lite/examples/label_image/testdata/grace_hopper.bmp > /tmp/grace_hopper.bmp

 ⑤モデル(Mobile Net v1)とラベル(教師データ)をダウンロードする

 # curl https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_2018_02_22/mobilenet_v1_1.0_224.tgz | tar xzv -C /tmp
 # curl https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_1.0_224_frozen.tgz  | tar xzv -C /tmp  mobilenet_v1_1.0_224/labels.txt
 # mv /tmp/mobilenet_v1_1.0_224/labels.txt /tmp/

 ⑥サンプルプログラムを実行する

 # python3 label_image.py \ 
  --model_file /tmp/mobilenet_v1_1.0_224.tflite \ 
  --label_file /tmp/labels.txt \
  --image /tmp/grace_hopper.bmp

 ⑦実行結果
  以下のように92%の確率でmilitary uniform(軍服)であると認識されました。

0.919720: 653:military uniform
0.017762: 907:Windsor tie
0.007507: 668:mortarboard
0.005419: 466:bulletproof vest
0.003828: 458:bow tie, bow-tie, bowtie

 ⑧おまけ
  以下の画像でも試してみます。

 するとこのような結果となりました。

0.580873: 682:notebook, notebook computer
0.263391: 621:laptop, laptop computer
0.053190: 528:desktop computer
0.047769: 527:desk
0.014423: 509:computer keyboard, keypad

 ぜひ色んな画像を使って実際に試してみてください。

5.まとめ

 いかがでしたでしょうか。今回はいかに簡単にHiFive UnmatchedボードでTensorFlow Liteを試すことができるかを重視した内容をお伝えしました。HiFive Unmatchedボードを使って、今回のようなTensorFlow Liteを使った推論だけでなく、学習やモデルの作成を行うことももちろん可能です。機会がありましたら、そのような内容についても本ブログでお伝えできればと思います。

 なお、SiFive Performance Family(https://www.sifive.com/cores/performance)やSiFive Intelligence Family(https://www.sifive.com/cores/intelligence)といったSiFiveが提供するRISC-Vコアでは、RISC-Vのベクトル拡張命令(RVV)がサポートされることで、データを一度にまとめて演算する並列処理が可能となります。これにより高速な機械学習が実現できるため、RVVに対応した機械学習フレームワークと合わせて使用することでRISC-Vの活用範囲が一層広がりそうですね。

 次回は、SiFiveが提供するFreedom E SDK(FESDK)を用いることで、OSなしで動作するプログラムをHiFive Unmatchedボードで動作させることにチャレンジしてみようと思います。

■■DTSインサイトの「システムLSI設計ソリューションサービス」■■
 DTSインサイトでは、システムLSI/FPGA設計の受託も行っています。
 当社のノウハウを活かした、ソフトウェアの移行(マイグレーション)
 サービスも提供しておりますので、お気軽にご相談ください。

システムLSI設計ソリューションサービス紹介は こちら