【AIモデル変換編】Snapdragon Neural Processing Engine SDKチュートリアル

AIモデルってどうやってSnapdragonに載せるの?

AI(人工知能)の技術発展に伴い、多種多様な組み込み機器にAI機能が実装されるようになっています。近年は組み込み機器向けのSoCにも注力しているクアルコム社もAIを意識した高性能なSoCを続々とリリースしており、その流れは加速する一方です。

一般的なフレームワークで作成したAIモデルをSoCに組み込む際、ベンダー各社が提供している開発ツールが必要になる場合があります。クアルコム社からはSnapdragonに対応した『Snapdragon Neural Processing Engine SDK』(以下SNPE)と呼ばれる無償のソフトウェア開発キットがリリースされています。SNPE SDKについてご興味がある方はダウンロード方法などご案内いたしますので、弊社までお問い合わせください。



本記事ではSNPEを使用してAIモデルの変換を試してみたいと思います。

SNPEのワークフロー

上段で示しているのはモデルの準備(学習)フェーズです。SNPEに対応しているAIフレームワークはTensorFlow/TensorFlow Lite/Caffe/Caffe2/ONNX/PyTorchとなっていますので、これらのフレームワークに沿って作成したモデルを用意しておきます。今回は事前学習済みのTensorFlowベースのモデルを使用しています。下段がSnapdragonに対応したモデルへの変換および推論実行のフェーズを示しています。本記事では図中の赤枠で囲んだ、モデルの変換部分を試してみます。

モデル変換をやってみる

テスト環境

・Ubuntu 18.04
・Snapdragon Neural Processing Engine SDK v1.61

・Python 3.6.9

Python関連のツールをインストールする

$ sudo apt update && sudo apt upgrade -y
$ sudo apt install python3-dev python3-pip python3-venv -y

venvで仮想環境を作成する

$ python3 -m venv venv
$ source venv/bin/activate

venv環境で使用したPythonパッケージのバージョン

・protobuf==3.6.0
・matplotlib==3.0.3
・sphinx==2.2.1
・scipy==1.3.1
・Pillow==7.2
・numpy==1.16.5
・scikit-image==0.15.0
・tensorflow==1.11

SNPEの動作環境をセットアップする

# 任意のパスにSNPE SDKのzipファイルを置く(SDKの入手方法はお問い合わせください)
(venv) $ unzip -X snpe-1.61.0.zip
(venv) $ export SNPE_ROOT=<snpe-1.61.0.zipを展開したパス>
(venv) $ source $SNPE_ROOT/bin/dependencies.sh
(venv) $ source $SNPE_ROOT/bin/check_python_depends.sh
(venv) $ export TENSORFLOW_DIR=<TensorFlowをインストールしたパス>
(venv) $ cd $SNPE_ROOT
(venv) $ source bin/envsetup.sh -t $TENSORFLOW_DIR

TensorFlow Model Gardenのリポジトリを取得する

(venv) $ cd models && mkdir tfmodels && cd tfmodels
(venv) $ git clone https://github.com/tensorflow/models.git
(venv) $ cd models
(venv) $ git checkout ad386df597c069873ace235b931578671526ee00

PYTHONPATHを通す

(venv) $ cd $SNPE_ROOT/models/tfmodels/models/research
(venv) $ export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

プロトコルバッファーコンパイラでPythonファイルを生成する

(venv) $ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.0/protoc-3.6.0-linux-x86_64.zip
(venv) $ unzip protoc-3.6.0-linux-x86_64.zip 
(venv) $ ./bin/protoc object_detection/protos/*.proto --python_out=.

Mobilenet-SSDのモデルを取得しInference Graphに変換する

(venv) $ cd $SNPE_ROOT/models
(venv) $ mkdir mobilenet && cd mobilenet
(venv) $ wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_quantized_300x300_coco_2019_01_03.tar.gz
(venv) $ tar -xzvf ssd_mobilenet_v2_quantized_300x300_coco_2019_01_03.tar.gz
(venv) $ mv ssd_mobilenet_v2_quantized_300x300_coco_2019_01_03 saved_model
(venv) $ cd saved_model
(venv) $ mkdir exported
(venv) $ cd $SNPE_ROOT/models/tfmodels/models/research/
(venv) $ INPUT_TYPE=image_tensor
(venv) $ PIPELINE_CONFIG_PATH=$SNPE_ROOT/models/mobilenet/saved_model/pipeline.config
(venv) $ TRAINED_CKPT_PREFIX=$SNPE_ROOT/models/mobilenet/saved_model/model.ckpt
(venv) $ EXPORT_DIR=$SNPE_ROOT/models/mobilenet/saved_model/exported
(venv) $ python object_detection/export_inference_graph.py --input_type=${INPUT_TYPE} --pipeline_config_path=${PIPELINE_CONFIG_PATH} --trained_checkpoint_prefix=${TRAINED_CKPT_PREFIX} --output_directory=${EXPORT_DIR}

DLCフォーマットに変換する

(venv) $ cd $SNPE_ROOT/models/mobilenet && mkdir dlc
(venv) $ snpe-tensorflow-to-dlc --input_network saved_model/exported/frozen_inference_graph.pb --input_dim Preprocessor/sub 1,300,300,3 --out_node detection_classes --out_node detection_boxes --out_node detection_scores --output_path dlc/mobilenet_ssd.dlc

変換に成功すると次のような出力が表示されます。

INFO - INFO_CONVERSION_SUCCESS: Conversion completed successfully

モデル出力先に設定したパスにdlc形式のファイルが生成されていることを確認できました。これでAIモデルの変換まで完了です。

次回以降の記事では、今回生成したモデルをSnapdragonが搭載されたハードウェア上で動かしてみたいと思います。

お問い合わせ

製品に関する詳細情報などご希望の方はこちらからお問い合わせください。

クアルコム メーカー情報Topへ