2021年08月9日
Amazon SageMaker Neoを利用したTensorFlowモデルのVieurekaカメラアプリ開発
パナソニック システムデザイン株式会社の田頭です。弊社はVieurekaチームと共にVieurekaプラットフォーム拡充を進めております。そして現在は、AIを活用したアプリケーション開発にも挑戦しております。本記事は第3回目のディープラーニング活用の取り組み事例です。ぜひ、第1回、第2回の取り組みもご覧ください!
Vieurekaカメラは、2021年4月にリリースされたファームウェアにおいて、Amazon SageMaker Neoに対応しました。
Amazon SageMaker Neoとは、TensorFlowやPytorchといった各種AIフレームワークモデルを、精度を損なうことなく変換し、ターゲットハードウェア用にモデルを最適化できる、AWSが提供するサービスです。
Amazon SageMaker Neo についての詳細はAWSの公式HPをご覧ください。
(https://aws.amazon.com/jp/sagemaker/neo/)
そこで今回は、TensorFlowの画像分類モデル(mobilenet_v1_1.0_224_frozen.pb)を例にして、Amazon SageMaker Neoを用いたVieurekaカメラアプリの開発方法の紹介と、アプリの実行結果の確認をします。
Vieurekaカメラアプリの開発の手順は以下の通りです。
- 推論モデルを変換
- アプリパッケージに推論モデルを追加
- ソースコードを記述
まず、「1. 推論モデルを変換」する手順を説明します。
モデルの変換にはAWSアカウントが必要です。
TensorFlowの推論モデルを「.tar.gz」形式で圧縮し、S3バケットへアップロードします。
次に、Amazon SageMakerのページ内からコンパイルジョブの画面を開き、「コンパイルジョブの作成」を行います。
「ジョブ設定」
- ジョブ名:コンパイルする毎に、一意な名前にします。
- ロール名:任意のロールを指定します。
「入力設定」
- アーティファクトの場所:アップロード済み推論モデルのS3 URIを指定します。
- データ入力設定:基本的に「{“入力名”:[入力形状]}」の形式で設定します。この項目は各種推論モデル毎に形式が異なります。リンク先で設定方法を参照できます。
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/APIReference/API_InputConfig.html - -機械学習フレームワーク:変換元のAIフレームワークを選択します。
「出力設定」
ターゲットプラットフォームを選択します。
- OS:LINUXを選択。
- アーキテクト:ARM64を選択。
- アクセラレータ:MALIを選択。※1
- S3 出力先:コンパイル済みモデルを出力するS3 URIを指定。
コンパイルが成功したら、ステータスに「COMPLETED」と表示されますので、S3出力先からコンパイル済みモデルをダウンロードします。
今回のコンパイル済みモデルの名前は
「mobilenet_v1_1.0_224_frozen-LINUX_ARM64_MALI.tar.gz」です。
※1 アクセラレータを指定しない場合はCPUで動作するモデルに変換されます。
今回は、「MALI(GPU)」を選択して、GPU処理に最適化したモデルへと変換をしています。
続いて、「2. アプリパッケージに推論モデルを追加」する方法を説明します。
アプリケーションパッケージのdataフォルダ配下に任意名のディレクトリ(ここではmodel-dir)を用意し、その中にコンパイル済みモデル「mobilenet_v1_1.0_224_frozen-LINUX_ARM64_MALI.tar.gz」を解凍した中身のファイル群を配置します。
最後に、「3. ソースコードを記述」(Python)の内容を説明します。
以下は、画像のコールバック関数内で、推論を実行しているソースコードの記述例です。
import adam
import numpy as np
#ランタイムライブラリのインポート
from dlr import DLRModel
“””
各PFのimport等
“””
#初期化関数
def _init_():
#推論モデルインスタンス生成
dlr_model = DLRModel(adam.AppDataDirPath + "/model-dir", 'opencl')
“””
その他初期化処理等
“””
#イメージコールバック関数
def image_callback(img, clipInfo, dateTime):
“””
imgをモデルの入力形式に合わせて変換する処理等
“””
#推論実行
result = dlr_model.run({'input': img})
#ここからは推論モデル毎に異なる処理を行う
#ソートするために、推論結果から余分な次元を削除
scores = np.squeeze(result)
#推論結果を信頼度の高い順番にソートし、インデックスを取得
sorted_index = np.argsort(scores)[::-1]
“””
出力のためのデータ整形処理等
“””
推論実行は返り値(例では「result」)に格納され、リスト形式になっています。
今回例に挙げた画像分類モデルはこのような出力になりました。
[np.array([[各分類クラスの信頼度]]), dtype=float32)
次に、実行結果を確認します。画像分類モデルは、カメラ画像内の物や風景を推定します。
比較のために、変換前のTensorFlowモデルと、Amazon SageMaker Neoで変換したモデルの動作を確認します。バージョン情報は下記の通りです。
「TensorFlow」:v2.5.0
「Amazon SageMaker Neo」:v1.8.0
まず、変換前のTensorFlowの画像分類モデルを“PC上”で実行した場合の分類結果を確認します。
入力画像の上部に分類結果を表示しています。
スコアが最も高いのは「desk(約74%)」である、という分類結果が得られました。
続いて、Amazon SageMaker Neoで変換したTensorFlow画像分類モデルを“Vieurekaカメラ上“で実行した場合の分類結果を確認します。
PC上での推論に使用した画像と、出来る限り同じ画角になるように撮影します。
画像分類モデルが動作していることが確認できました。また、スコアが最も高いのは「desk(約68%)」である、という分類結果が得られました。
どちらのモデルも、分類結果は同じ「desk」を出力しましたが、スコアには違いが表れています。これは、入力画像の違いが影響している可能性があります。
一般的にカメラは、同じ場所・同じ画角で撮影をしたとしても、光の加減等で画像データ自体が異なる値になってしまいます。
そこで、PC上での推論に使用した画像をVieurekaカメラにも画像ファイルとして入力し、分類結果を確認したいと思います。
分類結果は「desk(約75%)」となりました。こちらも、PC上での推論結果のスコアとは異なっています。
変換前後の推論モデルに同じ画像データを入力した場合にも、スコアは1%程度の違いが生じていることから、推論モデルの変換が完全に等価になるわけではないと推察されます。しかし、スコアの差は誤差の範囲と見なせ、かつ、全体の結果にもほぼ違いはないことから、等価に近いモデル変換が出来ていると思われます。
ここまで、TensorFlowの画像分類モデルを例に、Amazon SageMaker Neoを用いたVieurekaカメラアプリの開発方法の紹介と、アプリの実行結果の確認をしてきました。Amazon SageMaker Neoを搭載したことにより、Vieurekaカメラ上では、様々なAIフレームワークの推論モデルが実行可能になります。
今後は、Vieurekaカメラ上でPytorchやONNX等、他のAIフレームワークモデルを活用した、Vieurekaカメラアプリケーション開発に挑戦していきたいです!
また、次回第4回では、引き続きTensorFlowの画像分類モデルを例に、変換時のアクセラレータの指定の有無による、性能の比較結果についてご紹介します。
弊社はVieurekaパートナーとして、様々なリアル空間のデジタル化に挑戦し、新たな価値創造を目指していきます。
パナソニック システムデザイン株式会社
https://panasonic.co.jp/cns/psd/
ソリューション
ご専門分野: システム開発、サービス開発
問い合わせ先:
〒222-0033 神奈川県横浜市港北区新横浜3丁目1番9号 アリーナタワー
TEL:(045)471-9160
(Webサイトの問い合わせフォームをご利用ください)
担当:Vieureka推進窓口