セグメンテーションとは?
セグメンテーションは画像を構成するピクセルひとつひとつに対してラベル付けを行う手法です。画像を特定の形状や境界線を持つ領域に分割し、画像分類や物体検出などのさらなる処理のために潜在的に意味のある領域を定義します。
例えば、下図の左の画像は物体検出を行い、その位置のみを強調しています。右の画像はセグメンテーションのイメージで、ピクセル単位でクラス分類することで物体の輪郭まで表示しています。

Qualcomm社 AIソフトウェア開発キットでセグメンテーションを試してみた
Qualcomm社はSnapdragon向けのAI開発をサポートする『Snapdragon Neural Processing Engine SDK』(以下SNPE)と呼ばれる無償のソフトウェア開発キットをリリースしています。今回はセグメンテーション用の学習済みAIモデルをSNPEを用いて変換し、推論処理を行ってみました。また、推論結果をもとに画像の背景をグレースケールに変換する処理を加えてみたいと思います。
AIモデルにはDeepLab-v3を使いました。DeepLab-v3はGoogleのAI研究チームが開発しているCNNベースのセマンティックセグメンテーションモデルで、オープンになっている学習済みモデルを入手することができます。
テスト環境
・Ubuntu 18.04
・Qualcomm Snapdragon Neural Processing Engine SDK v1.68
・Python 3.6.9
・(venv)
1. Python関連ツールをインストール
$ sudo apt update && sudo apt upgrade
$ sudo apt install python3-dev python3-pip python3-venv protobuf-compiler python-pil python-lxml python-tk
venv環境で使用したPythonパッケージのバージョン
・protobuf==3.6.0
・matplotlib==3.0.3
・sphinx==2.2.1
・scipy==1.3.1
・numpy==1.16.5
・scikit-image==0.15.0
・Pillow==7.2
・tensorflow==1.6
2. SNPE動作環境のセットアップ
任意のパスにSNPE SDKのzipファイルを置き、環境をセットアップしていきます。
(venv) $ unzip snpe-1.68.0.zip
(venv) $ export SNPE_ROOT=<snpe-1.68.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
3. DeepLab v3の学習済みモデルをダウンロード
DeepLab v3モデル用のディレクトリを作成しTensorFlowのモデルをダウンロードします。
$ cd $SNPE_ROOT/models && mkdir deeplabv3
$ cd deeplabv3
$ wget http://download.tensorflow.org/models/deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz
$ tar -xzvf deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz
4. AIモデルをDLCフォーマットに変換する
snpe-tensorflow-to-dlcを用いて、先に用意しておいたTensorFlowモデルをDLCフォーマットに変換します。DLCはQualcomm Snapdragon上で実行できるAIモデルのフォーマットです。
参考: https://developer.qualcomm.com/sites/default/files/docs/snpe/overview.html(Qualcomm社のWebページが別ウィンドウで開きます)
$ snpe-tensorflow-to-dlc --input_network deeplabv3_mnv2_pascal_train_aug/frozen_inference_graph.pb --input_dim sub_7 1,513,513,3 --out_node ArgMax --output_path deeplabv3.dlc
カレントディレクトリにdeeplabv3.dlcが生成されます。
5. 推論実行の準備
SNPEでの推論処理は直接JPEGやPNGなどの画像フォーマットを入力せず、画像をRAWフォーマットに変換してから入力することになります。RAW変換のアプリケーションは下記のgithubリポジトリを参考にしました。
参考: https://github.com/globaledgesoft/deeplabv3-application-using-neural-processing-sdk.git(GitHubのWebページが別ウィンドウで開きます)
$ git clone https://github.com/globaledgesoft/deeplabv3-application-using-neural-processing-sdk.git
オリジナル画像データ、前処理後のデータ、後処理後のデータを格納するディレクトリを作成し、image_originalディレクトリにオリジナル画像データを保存します。
$ mkdir image_original image_preprocessed image_postprocessed
今回は人物が映っている画像を使用し、ファイル名はimg_1.jpgに設定しました。

画像の前処理を行います。Pythonスクリプトを実行するとimage_preprocessedディレクトリにblob.rawが生成されます。
$ cd image_preprocessed
$ python ../deeplabv3-application-using-neural-processing-sdk/BoardApplication/src/deep_input_raw.py --img_path ../image_original/img_1.jpg
blob.rawのパスを記述したテキストファイルを作成します。(例)raw_list.txt
$ touch raw_list.txt
$ echo $SNPE_ROOT/models/deeplabv3/image_preprocessed/blob.raw > raw_list.txt
これで前処理は完了です。
6. 推論実行
SNPE SDKに含まれるsnpe-net-runというアプリケーションで推論処理を実行できます。ここまでのステップで用意したDLCファイル(step4)とraw_list.txt(step5)をオプションの引数に指定して実行します。
$ cd $SNPE_ROOT/models/deeplabv3
$ snpe-net-run --container deeplabv3.dlc --input_list image_preprocessed/raw_list.txt
自動的にoutputというディレクトリが作成され、ディレクトリ内にArgmax:0.rawが生成されます。このrawファイルに人物の領域を定義したデータが含まれています。最後にオリジナルの画像と組み合わせて、認識したオブジェクト以外の領域をグレースケール化してみます。
$ cd image_postprocessed
$ python ../deeplabv3-application-using-neural-processing-sdk/BoardApplication/src/post_process_deeplab_output.py --output_raw ../output/Result_0/ArgMax:0.raw --img_file_path ../image_original/img_1.jpg
image_postprocessedディレクトリにimage_with_background_changed.jpgが出力されます。画像を確認してみると人物以外の領域をグレースケール化することができていました。


実開発においてはユースケースに合わせてAIモデルの開発を進めることになりますので、今回使用したモデルの認識精度は参考情報としてお取り扱いください。
今後も様々なAIモデル/アルゴリズムの実行例を紹介していきます。AIを実装可能なプラットフォームとしてさまざまなラインナップを取り揃えていますので、Qualcomm Snapdragon関連の詳しい製品情報をお求めの方はぜひお問い合わせください。
お問い合わせ
本ページの内容に関するご質問や製品詳細情報をご希望の方はこちらからお問い合わせください。