画像処理の前処理として、リサイズ(拡大/縮小)とフォーマット変換は一般的な処理です。そのため、これらの処理が非効率な実装であると、予想外に計算リソースを消費してしまい、スループットが上がりません。連載記事第4話は、リサイズとフォーマット変換をJetsonで実装する手段について考えてみましょう。

 

[Jetsonビデオ処理プログラミング]

第1話 NVIDIA提供 JetPackとSDKでできること

第2話 ビデオ入力(CSI接続のLibargus準拠カメラ)

第3話 ビデオ入力(USB接続のV4L2準拠カメラ)

第4話 リサイズとフォーマット変換

第5話 画像表示

第6話 動画エンコード

第7話 動画デコード

第8話 画像処理

第9話 ディープラーニング推論

第10話 計算リソースの最大活用

実装方法の比較

リサイズ、フォーマット変換、共に、複数の方法で実装できます。下表はそれらの比較です。

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を有効にしてビルド、インストールする必要があります。

参考:JEP/script/install_opencv4.5.0_Jetson.sh

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ワークステーションの選定やサポート、また顔認証、導線分析、骨格検知のアルゴリズム、さらに学習環境構築サービスなどを取り揃えております。お困りの際は、ぜひお問い合わせください。