「画像処理」と一口に言っても、その範囲はとても広いです。ここでの「画像処理」はフィルター、特徴抽出、幾何学変換など、特にAI分野に限らず、画像に対して広く使われる処理とさせていただきます。
[Jetsonビデオ処理プログラミング]
第1話 NVIDIA提供 JetPackとSDKでできること
第2話 ビデオ入力(CSI接続のLibargus準拠カメラ)
第8話 画像処理
実装方法
Jetson上の画像処理の場合も、その実装に利用するAPIには複数の選択肢があります。以下の表でそれぞれの特長を見てみましょう。
API | プログラミング言語 | コメント |
NVIDIA Vision Programming Interface (VPI) |
|
|
CUDA |
|
|
OpenCV |
|
|
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ワークステーションの選定やサポート、また顔認証、導線分析、骨格検知のアルゴリズム、さらに学習環境構築サービスなどを取り揃えております。お困りの際は、ぜひお問い合わせください。