OpenCV
OpenCL
TinkerBoard
OpenCVDay 3

ASUS tinker boardのMali T764をOpenCV 3.3.1のOpenCLで酷使してみる

はじめに

この記事はOpenCV Advent Calendar 2017の3日目の記事です。他の記事は目次にまとめられています。

ASUS tinker board とは?

ASUS Tinker Boardは、RK3288(Cortex-A17/Mali T764)を搭載した、SBC1です。OpenCL FullProfile が使えるので、Umatを使うとGPGPUで画像処理できることが期待されます!!
以上を鑑みて、安価なSBCで、OpenCLでの高速化の恩恵があずかれるか確認してみました。

方法

OpenCVのソースコードでOpenCLのカーネルがある関数の中から、Sobel/Canny/cvtColorを対象とした。読み込み済み画像に当該関数の処理をする関数の呼び出しを100回を繰り返した処理時間の平均値を、代表値として用いる。23

処理時間とCPU負荷

左図はMatで処理する時の時間を1,00とした場合の、処理時間比較、小さいほど早い(左ほど早い)。
右図はCPU使用率。小さいほど、CPUに負荷をかけていない(左ほど軽い)。

  • Sobel(CV_16S)

    • CPU負荷軽減できるが(30%->5%)、個々の処理時間は伸びてしまう。 image.png
  • Sobel(CV_8U) 2017/12/3 9:50 更新

    • だんでらいおん先生に指摘され、再度コードを見直したところ、 cv::Sobel(u_src, u_dst, CV_8U, 1, 0); とあるべきところが、cv::Sobel(u_src, u_dst, CV_16S, 1, 0); になっていることが判明。やり直したところ、こちらもGPUのほうが早い+CPU負荷も小さい、となりました。 image.png
  • cvtColor(BGR2GRAY)

    • cvtColor(BGR2GRAY)は、処理時間はほぼ変わらずに、CPU負荷をかなり軽減できる(40%->10%)。 image.png
  • cvtColor(BGR2HSV)

    • cvtColor(BGR2HSV)は、CPU負荷軽減できるうえに(80%->10%)、個々の処理時間も短縮できる。 image.png

GPUを使った場合のオーバーヘッド

オーバーヘッドを観測するために、cvtColor(RGB2HSV)を実行した時のそれぞれの処理時間をグラフ化してみる。なお、実装は「同一プロセス内」で行われている(毎回再起動しているわけではない)。

  • 初回実行時には、300msほどかかり、平均性能を引き下げる。
  • 2回目以後については、カーネルコンパイル済みであるため、そのオーバーヘッドが軽減されている。
  • 最終的にはCPU性能と同等以上の処理時間にまで短縮している。(そのうえ、CPU負荷も低い)。

image.png

まとめ

SBC環境でも、(一部機能であれば)、OpenCLによって処理負荷軽減・高速化できることが確認できた! OpenCL FullProfile対応のSBCが今後も増えていくと、据え置き型デバイスのみならず、可搬デバイスにまでOpenCVの活用範囲が広がることが期待できます。

更に、現在、Raspberry pi上でもOpenCLが使えるように検討をしている方 もいます。RasPi ZERO上のOpenCVでもそこそこの性能が出せるようになる事に強い期待を持ち、本アドベントカレンダーのまとめとします(つまり、来年はほぼこの内容でRaspiを検討すれば1日分の記事に…?)。

明日は、tomoaki_teshima さんの投稿で、執筆時点でのタイトルは 「OpenCVのコマンドラインパーサ」 です!コマンドラインのオプションに対する処理、移植性まで考えると面倒ですよね!CUI大好きおじさんとしては大いにワクワクしています!

Appendix

データ概略

linaro@tinkerboard:~/work$ jpeginfo lena.jpg
lena.jpg 512 x 512 24bit JFIF N 91814
linaro@tinkerboard:~/work$ jpeginfo nakau.jpg
nakau.jpg 1920 x 1080 24bit Exif P 684309
linaro@tinkerboard:~/work$ jpeginfo matsuya.jpg
matsuya.jpg 3264 x 2448 24bit Exif N 1364147

実験環境

  • tinker board
    • CPU
    • Quad core Cortex-A17 1.8GHz
    • CPUの速度固定( $ sudo cpupower frequency-set -g performance )
    • GPU
    • 600 MHz Mali-T760 MP4
    • GPUの速度固定( # echo "performance" > /sys/devices/platform/ffa30000.gpu/devfreq/ffa30000.gpu/governor )
  • OpenCV 3.3.1
    • pthreadによる並列化が行われている

  1. single board computerの略。Raspberry PiのようにCPU/Memory等をオンボードし、単体で動作可能になっているコンピュータボード。  

  2. 今回はGPU側にやや不利な条件として、毎回CPUから画像転送する形でテストを行う。実際には1画像に対して複数のフィルタをかけるため、これよりも負荷は低くなることが予想される。 

  3. Cannyの場合、GPUを叩いてくれなかったことが分かったので、泣く泣く結果から除外しました。