Jetsonビデオ処理プログラミング 第8話 画像処理

「画像処理」と一口に言っても、その範囲はとても広いです。ここでの「画像処理」はフィルター、特徴抽出、幾何学変換など、特にAI分野に限らず、画像に対して広く使われる処理とさせていただきます。

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

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

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

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

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

第5話 画像表示

第6話 動画エンコード

第7話 動画デコード

第8話 画像処理

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

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

実装方法

Jetson上の画像処理の場合も、その実装に利用するAPIには複数の選択肢があります。以下の表でそれぞれの特長を見てみましょう。

API プログラミング言語 コメント
NVIDIA Vision Programming Interface (VPI)
  • C++
  • Python(本記事作成時はDeveloper Preview)
  • Jetsonの持つ複数のハードウェア処理ユニット(CPU, GPU, PVA, VIC)に処理を分散可能で、かつそれぞれの処理ユニットに最適化されている
CUDA
  • C
  • オープンソース利用でPythonも可
  • 開発者による最大限の最適化と、詳細な制御が可能
OpenCV
  • C
  • Python
  • マルチプラットフォーム
  • オープン

VPIの利用

NVIDIA Vision Programming Interface(VPI)はJetson及びNVIDIA社GPUカードを搭載したx86プラットフォームで動作する画像処理ライブラリーです。VPIは複数の計算リソースにシームレスにアクセスし、かつ、それらの処理性能を犠牲にすることなく、コンピュータービジョンおよび画像処理のAPIを提供します。Jetsonの場合、VPIがアクセスできる計算リソースはCPU、GPU(CUDA)、PVAそしてVICです。VPIの提供する各アルゴリズムがどの計算リソースに対応するかを表したのが次の表です。

アルゴリズム バックエンドサポート
CPU CUDA PVA1 VIC2 NVENC2
Box Filter yes yes yes no no
Bilateral Filter yes yes no no no
Gaussian Filter yes yes yes no no
Gaussian Pyramid Generator yes yes yes no no
Laplacian Pyramid Generator yes yes no no no
Convolution yes yes yes no no
Separable Convolution yes yes yes no no
Convert Image Format yes yes no yes no
Rescale yes yes no yes no
Remap yes yes no yes1 no
Perspective Warp yes yes no yes1 no
FFT yes yes no no no
Inverse FFT yes yes no no no
Lens Distortion Correction yes yes no yes1 no
Stereo Disparity Estimator yes yes yes no no
KLT Feature Tracker yes yes yes no no
Harris Corner Detector yes yes yes no no
Temporal Noise Reduction no yes no yes no
Pyramidal LK Optical Flow yes yes no no no
Dense Optical Flow no no no no yes1
Image Histogram yes yes no no no
Equalize Histogram yes yes no no no
Background Subtractor yes yes no no no

1Jetson Xavier NX と Jetson AGX Xavier シリーズのみ利用可能
2Jetson プラットフォームのみ利用可能(GPUカード製品では未対応)

VPIの利用方法に関しては以下の記事を参考にしてください。

「OpenCV ArUcoマーカーで画像の幾何学補正に挑戦~NVIDIA VPI活用術:Perspective Warp編~」

この記事が示す例のとおり、VPIはOpenCVとの相互運用性を提供します。

VPIサンプルプログラム

VPIにはサンプルプログラムが付属します。vpi1_install_samples.shスクリプトで、ユーザーが指定したディレクトリにサンプルプログラム一式を用意します。その後は、サンプルプログラムのディレクトリー内で、cmakeによりMakefileを作成し、makeでサンプルプログラムをビルドできます。

以下の例は、ホームディレクトリーにサンプルプログラム一式を用意し、Temporal Noise Reductionサンプルプログラムをビルド、実行します。ノイズ除去後の結果は、denoised_cuda.mp4という名前の動画ファイルとして出力されます。

詳細は以下のウェブページをご覧ください。

VPI - Vision Programming Interface Documentation : Sample Applications

jetson@jetson-desktop:~$ vpi1_install_samples.sh $HOME
Copying samples to /home/jetson/NVIDIA_VPI-1.1-samples now...
Finished copying samples.
jetson@jetson-desktop:~$ cd $HOME/NVIDIA_VPI-1.1-samples
jetson@jetson-desktop:~/NVIDIA_VPI-1.1-samples$ ls
01-convolve_2d       05-benchmark          09-tnr         13-optflow_dense
02-stereo_disparity  06-klt_tracker        10-perspwarp   14-background_subtractor
03-harris_corners    07-fft                11-fisheye     assets
04-rescale           08-cross_aarch64_l4t  12-optflow_lk  tutorial_blur
jetson@jetson-desktop:~/NVIDIA_VPI-1.1-samples$ cd 09-tnr/
jetson@jetson-desktop:~/NVIDIA_VPI-1.1-samples/09-tnr$ cmake .
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /usr (found version "4.1.1") 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jetson/NVIDIA_VPI-1.1-samples/09-tnr
jetson@jetson-desktop:~/NVIDIA_VPI-1.1-samples/09-tnr$ make
Scanning dependencies of target vpi_sample_09_tnr
[ 50%] Building CXX object CMakeFiles/vpi_sample_09_tnr.dir/main.cpp.o
[100%] Linking CXX executable vpi_sample_09_tnr
[100%] Built target vpi_sample_09_tnr
jetson@jetson-desktop:~/NVIDIA_VPI-1.1-samples/09-tnr$ ./vpi_sample_09_tnr cuda ../assets/noisy.mp4
NVMEDIA_ARRAY:   53,  Version 2.1
NVMEDIA_VPI :  172,  Version 2.4
Frame: 1
Frame: 2
Frame: 3
Frame: 4
Frame: 5
...
Frame: 146
Frame: 147
Frame: 148
Frame: 149
Frame: 150
jetson@jetson-desktop:~/NVIDIA_VPI-1.1-samples/09-tnr$ ls
CMakeCache.txt  cmake_install.cmake  denoised_cuda.mp4  main.py   vpi_sample_09_tnr
CMakeFiles      CMakeLists.txt       main.cpp           Makefile

CUDAの利用

ユーザー固有の特殊な処理は、CUDA Toolkitを利用したユーザープログラムにより実現できます。一般的な処理は、NVIDIA社が開発したCUDAライブラリーであるNVIDIA PERFORMANCE PRIMITIVES(NPP)を利用できます。

CUDAサンプルプログラム

CUDAサンプルプログラムの利用は以下のウェブページをご参照ください。

CUDA Toolkit Documentation: 2. Getting Started

画像処理のサンプルは3_Imagingディレクトリーに、NPPによるサンプルは7_CUDALibrariesディレクトリーにあります。

OpenCVの利用

本連載で繰り返し述べていますが、JetPackに最初から含まれているOpenCVはCUDA無効でビルドされたものです。そのため、OpenCVの処理はすべてCPU上で処理されます。OpenCVをソースコードから、CUDA有効で再ビルドすればCUDAコアによる高速処理が期待できます。(cv::cuda名前空間の関数に限ります。)ただし、先に紹介しましたVPIやNPPに比較すると、OpenCVはCUDAに適したプログラミングモデルとは言えないため、性能を優先する場合は、VPIやNPPがおすすめです。なお、CUDA無効のOpenCVとVPIの性能比較は以下のウェブページで参照いただけます。

VPI - Vision Programming Interface Documentation:Performance Comparison

次回は、ディープラーニング推論について解説します!

連載記事「Jetsonビデオ処理プログラミング」の第8話、画像処理についてご紹介しましたがいかがでしたでしょうか。

次回は、ディープラーニング推論についてご紹介します。

お困りのことがあれば、ぜひお問い合わせください

弊社ではハードウェアのNVIDIA GPUカードやGPUワークステーションの選定やサポート、また顔認証、導線分析、骨格検知のアルゴリズム、さらに学習環境構築サービスなどを取り揃えております。お困りの際は、ぜひお問い合わせください。