物体検出アルゴリズムYOLOv5をエッジデバイスで動作させてみる
Qualcomm® QCS610 SoCを搭載したTurboX™ C610 Open Kitの上で、物体検出アルゴリズムであるYOLOv5を動作させてみます。YOLO(You Only Look Once)は、その速度と精度から最も有名な物体検出アルゴリズムの1つであり、YOLOv5はPyTorchベースで作られた最新の物体検出モデルです。
今回ご紹介する手順では、クアルコム社が用意しているGStreamerプラグイン(qtimlesnpe)を使用し、SoC内のハードウェアアクセラレーター(SNPE : Snapdragon Neural Processing Engine)を利用したAI推論処理をおこないます。
関連リンク:Qualcomm® QCS610 SoC
事前準備
Linux PCの環境セットアップに関して、以下については事前に完了している事を前提とし、今回は以降の手順について紹介します。
・Ubuntu 18.04のインストール(参考リンク:WSL2を使用してUbuntuをインストールする)
・Miniconda3のインストール(参考リンク:Miniconda3をUbuntuへインストールする)
・TurboX™ C610 Open Kit向けLE SDKのダウンロード&ビルド、TurboX™ C610 Open Kitへのイメージ書き込み
LE SDKのバージョンについて、今回の手順の中ではLE1.0.CS.r002007.1を使用しています。
・Qualcomm Neural Processing SDK for AI (a.k.a SNPE SDK)のダウンロード
SNPE SDKのバージョンについて、今回の手順の中ではsnpe-1.58.0_3160を使用しています。
環境セットアップ
学習済みモデルのONNXへのエクスポート
Linux PC上で以下の手順にて conda で仮想環境を作成し必要なパッケージのインストールをおこない、YOLOv5のPyTorchトレーニングモデルをONNXへエクスポートします。
hostPC$ conda create --name snpe_yolov5 python=3.6.8
hostPC$ conda activate snpe_yolov5
hostPC$ pip install onnx==1.6.0
hostPC$ pip install onnx-simplifier==0.2.6
hostPC$ pip install onnxoptimizer==0.2.6
hostPC$ pip install onnxruntime==1.1.0
hostPC$ pip install numpy==1.16.5
hostPC$ pip install protobuf==3.17.3
hostPC$ conda install pytorch==1.7.0 torchvision==0.8.0 torchaudio==0.7.0 cpuonly -c pytorch
hostPC$ pip install torch==1.10.0
hostPC$ pip install torchvsion==0.11.1
hostPC$ mkdir snpe_yolov5
hostPC$ cd snpe_yolov5
hostPC$ git clone https://github.com/ultralytics/yolov5.git
hostPC$ cd yolov5
hostPC$ git checkout v6.0
hostPC$ pip install -r requirements.txt
hostPC$ pip install coremltools>=4.1 onnx==1.6.0 scikit-learn==0.19.2
hostPC$ python ../yolov5/export.py --weights ../yolov5/yolov5n.pt --optimize --opset 11 --simplify
hostPC$ ../
ONNXからDLCフォーマットへの変換
続けて、Linux PC上で以下の手順にてSNPE SDKのセットアップをおこない、ONNXからDLCフォーマットへ変換します。
hostPC$ unzip snpe-1.58.0_3160.zip
hostPC$ source snpe-1.58.0.3160/bin/dependencies.sh
hostPC$ source snpe-1.58.0.3160/bin/check_python_depends.sh
hostPC$ export ANDROID_NDK_ROOT=/<Android NDKを展開したPATH>/android-ndk-r17c/
hostPC$ export ONNX_DIR=/<Miniconda3のインストールPATH>/miniconda3/envs/snpe_yolov5/lib/python3.6/site-packages/onnx/
hostPC$ cd snpe-1.58.0.3160/
hostPC$ source bin/envsetup.sh -o $ONNX_DIR
hostPC$ cd ../yolov5
hostPC$ snpe-onnx-to-dlc -i ../yolov5/yolov5n.onnx --out_node 326 --out_node 379 --out_node 432
<補足>
・DLC(Deep Learning Container):Snapdragon NPE(Neural Processing Engine) Runtimeで利用するためのファイル形式です。
・Android NDKダウンロードリンク:android-ndk-r17c 、SNEP SDKのセットアップのためにPATHを指定していますが、
今回の手順の中でAndroid NDK自体の利用はしません。
・SNPEが5D operatorを現状サポートしていないため、ONNXからDLCフォーマットへ変換する際に、5D Reshapre前段のoutput nodesを
指定しています。下図の通り、今回の手順の中で使用したyolov5n.onnxの場合、326(Conv_198), 379(Conv_232), 432(Conv_266)
となっていました。output nodesに関して、Netron(ニューラルネットワークモデルのビジュアライズツール)を用いて確認しました。

DLCフォーマットへの変換が完了したら、実行中の conda 仮想環境を終了します。
hostPC$ conda deactivate
qtimlesnpeの有効化とYOLO向けPost-Processingの追加
TurboX™ C610 Open Kit向けLE SDKを使用し、qtimlesnpe(GStreamerプラグイン)の有効化とYOLO向けのPost-Processingの追加をおこないます。
hostPC$ cd /<LE SDKのダウンロードPATH>/apps_proc/poky/meta-qti-bsp/conf/distro/
hostPC$ vi qti-distro-fullstack-virtualization-debug.conf
以下の一行をqti-distro-fullstack-virtualization-debug.confの末尾に追加しファイル保存:
DISTRO_FEATURES_append = " qti-snpe"
hostPC$ cd /<LE SDKのダウンロードPATH>/apps_proc/poky/meta-qti-ml-prop/recipes/snpe-sdk/
hostPC$ mkdir files
hostPC$ cp snpe-1.58.0_3160.zip /<LE SDKのダウンロードPATH>/apps_proc/poky/meta-qti-ml-prop/recipes/snpe-sdk/files/
hostPC$ cd /<LE SDKのダウンロードPATH>/apps_proc/poky/meta-qti-ml-prop/recipes/snpe-sdk/files/
hostPC$ unzip snpe-1.58.0_3160.zip
hostPC$ mv snpe-1.58.0_3160 snpe
hostPC$ cd /<LE SDKのダウンロードPATH>/apps_proc/poky/meta-qti-ml-prop/recipes/snpe-sdk/files/snpe/lib/aarch64-oe-linux-gcc8.2/
hostPC$ rm libatomic.so.1
追加するPost-Processingに関して、今回の手順の中ではyolov5n.patchという形で記しています。
yolov5n.patchの入手を希望される場合は弊社へお問い合わせください。
hostPC$ cp yolov5n.patch /<LE SDKのダウンロードPATH>/apps_proc/src/vendor/qcom/opensource/gst-plugin-qti-oss/
hostPC$ cd /<LE SDKのダウンロードPATH>/apps_proc/src/vendor/qcom/opensource/gst-plugin-qti-oss/
hostPC$ patch -p1 < yolov5n.patch
qtimlesnpeのリビルド
以下の手順にて、qtimlesnpe(GStreamerプラグイン)をリビルドします。
hostPC$ export SHELL=/bin/bash
hostPC$ cd /<LE SDKのダウンロードPATH>/apps_proc/
hostPC$ MACHINE=qcs610-odk-64 DISTRO=qti-distro-fullstack-virtualization-debug
hostPC$ source poky/qti-conf/set_bb_env.sh
hostPC$ bitbake -c install gstreamer1.0-plugins-qti-oss-mle
TurboX™ C610 Open Kitのセットアップ
PCとTurboX™ C610 Open KitをUSBケーブルで接続し、adbを使用して必要なファイルをTurboX™ C610 Open Kitへそれぞれpushします。
- qtimlesnpe関連libraryの転送。
hostPC$ adb root
hostPC$ adb disable-verity
hostPC$ adb reboot
hostPC$ adb wait-for-device
hostPC$ adb root
hostPC$ adb remount
hostPC$ adb shell mount -o remount,rw /
hostPC$ cd /<LE SDKのダウンロードPATH>/apps_proc/build-qti-distro-fullstack-virtualization-debug/tmp-glibc/work/aarch64-oe-linux/gstreamer1.0-plugins-qti-oss-mle/1.0-r0/build/mle_engine/
hostPC$ adb push libEngine_MLE.so /usr/lib/
hostPC$ cd /<LE SDKのダウンロードPATH>/apps_proc/build-qti-distro-fullstack-virtualization-debug/tmp-glibc/work/aarch64-oe-linux/gstreamer1.0-plugins-qti-oss-mle/1.0-r0/build/mle_gst_snpe/
hostPC$ adb push libgstqtimlesnpe.so /usr/lib/gstreamer-1.0/
- モデル、ラベル、テスト用動画ファイル、Configファイルの転送。
hostPC$ adb push yolov5n.dlc /data/misc/camera/
hostPC$ adb push coco_labels.txt /data/misc/camera/
hostPC$ adb push test.mp4 /data/misc/camera/
hostPC$ cd /<LE SDKのダウンロードPATH>/apps_proc/src/vendor/qcom/opensource/gst-plugins-qti-oss/gst-plugin-mle/mle_gst_snpe/
hostPC$ adb push mle_snpeyolov5n.config /data/misc/camera/
<補足>
・ラベルデータのダウンロードリンク:coco_labels.txt
・mle_snpeyolov5n.configの記述内容に関して、output_layersの値は使用するモデルに合わせて修正します。
今回の手順の中ではConv_198(326), Conv_232(379), Conv_266(432)に修正済み。
物体検出アルゴリズムYOLOv5によるAI推論処理
TurboX™ C610 Open Kit上でYOLOv5による物体検出を動かしてみましょう。
GStreamer実行時のコマンド例をいくつか紹介します。
(1). AI推論処理の結果をmp4ファイル形式で保存する。
(Open Kit)# gst-launch-1.0 filesrc location=/data/misc/camera/test.mp4 ! qtdemux name=demux demux. ! queue ! h264parse ! qtivdec ! video/x-raw\(memory:GBM\) ! qtimlesnpe config=/data/misc/camera/mle_snpeyolov5n.config postprocessing=yolov5detection ! qtioverlay bbox-color=0x00FFFFFF ! queue ! omxh264enc control-rate=max-bitrate target-bitrate=6000000 interval-intraframes=29 periodicity-idr=1 ! queue ! h264parse ! mp4mux ! queue ! filesink location=/data/misc/camera/output.mp4
処理が完了するとfilesink locationで指定したディレクトリーにoutput.mp4という動画ファイルが作成されます。以下の動画ファイルのように、検出結果のラベルとバウンディングボックスが描画されています。
(2). Cameraからの入力映像にリアルタイムでAI推論処理をおこない、検出結果をオーバーレイしてLCDに出力する。
(Open Kit)# export XDG_RUNTIME_DIR=/dev/socket/weston
(Open Kit)# mkdir -p $XDG_RUNTIME_DIR
(Open Kit)# chmod 0700 $XDG_RUNTIME_DIR
(Open Kit)# weston --tty =1 --idle-time=0 &
(Open Kit)# gst-launch-1.0 qtiqmmfsrc ! video/x-raw\(memory:GBM\), format=NV12, width=1280, height=720, framerate=30/1, camera=0 ! qtimlesnpe config=/data/misc/camera/mle_snpeyolov5n.config postprocessing=yolov5detection ! qtioverlay bbox-color=0x00FFFFFF ! qtivtransform rotate=1 ! waylandsink async=true fullscreen=true
今回はQualcomm® QCS610 SoCを搭載したTurboX™ C610 Open Kitの上で、物体検出アルゴリズムであるYOLOv5を動かしてみました。
今後も様々な事例をご紹介していきたいと思います。
お客様が「カメラ + AI推論処理を実行可能なエッジデバイス」の開発をされる際に、クアルコム社Snapdragonプラットフォームを有力候補としてご検討頂く機会が増えています。クアルコム社はIoTデバイス/組み込み機器向けにも高性能なSoCラインアップを多数ご用意していますので詳しい情報をお求めの方はぜひ弊社へお問い合わせください。
お問い合わせ / お見積り
製品に関するお問い合わせ、開発キットのお見積りは以下リンクよりご用命ください。