画像処理の前処理として、リサイズ(拡大/縮小)とフォーマット変換は一般的な処理です。そのため、これらの処理が非効率な実装であると、予想外に計算リソースを消費してしまい、スループットが上がりません。連載記事第4話は、リサイズとフォーマット変換をJetsonで実装する手段について考えてみましょう。
[Jetsonビデオ処理プログラミング]
第1話 NVIDIA提供 JetPackとSDKでできること
第2話 ビデオ入力(CSI接続のLibargus準拠カメラ)
第4話 リサイズとフォーマット変換
実装方法の比較
リサイズ、フォーマット変換、共に、複数の方法で実装できます。下表はそれらの比較です。
API |
プログラミング言語 |
長所 |
短所/課題 |
GStreamer |
C Python |
・明解なインターフェース ・パイプライン処理により効率的 ・マルチプラットフォーム |
・リサイズ処理、フォーマット変換処理のみに利用するには使いづらい(すべての画像処理をGStreamerで行うべき) ・GStreamer特有の概念に慣れるのに少し時間がかかる |
OpenCV |
C Python |
・明解なインターフェース ・使いこなすための参考情報が豊富 ・マルチプラットフォーム |
・JetPackに含まれているものはCUDA(GPU)無効でビルドされている ・CUDA有効でビルドしても、他の方式と比べると、CUDAの利用は効率的とは言えない |
VPI |
C++ Pythonも対応予定 |
・複数のバックエンド(CPU / CUDA / PVA / VIC)が使える ・Jetsonに最適化された実装で高性能 ・OpenCVとの併用も考慮されている ・使いやすさと性能のバランスが取れている |
・参考情報が少ない |
Multimedia API | C++ |
・ハードウェアに近い低レベルAPIなので高性能 ・詳細な制御が可能 |
・参考情報が少ない ・少々、難解 |
NVIDIA Performance Primitives(NPP) | C |
・最も低レベルなAPIで、高性能 ・詳細な制御が可能 |
・CUDAプログラミングそのものは必要なく使えるが、CUDAコア(GPU)を意識してアプリケーションを構築する必要がある |
GStreamerを利用する場合
nvvidconvプラグインで実装できます。以下に例を示します。この例は、コマンドラインで実行できますが、アプリケーションに組み込むときは、GStreamer API(CまたはPython)を利用してプログラムする必要があります。
注:テストに利用したウェブカメラ(ロジクールC270n HDウェブカメラ)の出力形式(YUYV)が、nvvidconvプラグインへの入力(sink)形式に対応していないため、videoconvertプラグインでnvvidconvプラグインの対応形式(本例ではNV12)へ変換しています。
$ gst-launch-1.0 -e \
v4l2src device="/dev/video0" ! \
"video/x-raw, width=(int)640, height=(int)480" ! \
videoconvert ! \
"video/x-raw, format=(string)NV12" ! \
nvvidconv interpolation-method=Bilinear flip-method=horizontal-flip ! \
"video/x-raw(memory:NVMM), format=(string)RGBA, width=(int)1280, height=(int)960" ! \
nv3dsink
OpenCVを利用する場合
JetPackに含まれているOpenCVはCUDA無効でビルドされています。CUDA版の関数を利用する場合は、CUDAを有効にしてビルド、インストールする必要があります。
VPIを利用する場合
Vision Programming Interface(VPI)を利用することで、バックエンド(CPU / CUDA / PVA / VIC)が異なる処理を、同じAPIで記述できます。
リサイズとフォーマット変換の詳細はConvert Image Formatで確認できます。
Image Resamplingサンプルプログラムで使い方を理解することができます。このサンプルプログラムの実行方法を以下にご紹介します。
$ cp -r /opt/nvidia/vpi1/samples/04-rescale/ ./
$ cd 04-rescale/
$ mkdir build
$ cd build
$ cmake ..
$ ./vpi_sample_04_rescale cuda /opt/nvidia/vpi1/samples/assets/kodim08.png
Multimedia APIを利用する場合
07_video_convertサンプルコードで使い方を確認できます。サンプルプログラムは以下のパスに存在します。
/usr/src/jetson_multimedia_api/samples/07_video_convert
NPPを利用する場合
NVIDIA Performance Primitives(NPP)を利用することで、非常に高いスループットのリサイズやフォーマット変換を実現できます。
次回、画像表示方法を解説!
連載記事「Jetsonビデオ処理プログラミング」の第4話、リサイズとフォーマット変換ついてご紹介しましたがいかがでしたでしょうか。
次回の第5話は画像表示の方法ついてご紹介します。
お困りのことがあれば、ぜひお問い合わせください
弊社ではハードウェアのNVIDIA GPUカードやGPUワークステーションの選定やサポート、また顔認証、導線分析、骨格検知のアルゴリズム、さらに学習環境構築サービスなどを取り揃えております。お困りの際は、ぜひお問い合わせください。