A certain engineer "COMPLEX"

開発メモ134 OpenCVにlibjpeg-turboをリンクして性能比較

Introduction


掲題そのまま。
結構、このネタはそこら辺に転がっているんだけど、

  1. 計測していない
  2. エンコードだけ計測

みたいなネタでげんなりしたので自分で実施してみました。

実験ソースは下記になります

Sample source code for Demonstration, Experiment and Test - takuya-takeuchi/Demo

Condition


条件は下記になります。

  1. Intel Cire i7-8700 (3.20GHz)
  2. 32.0GB
  3. Visual Studio 2017 Update 7 (15.7)
  4. OpenCV 3.2.0 (動的リンク、world形式でビルド。IPP、CUDAは除外)
  5. libjpeg-turbo 1.5.3
  6. libjpeg-turbo.libをリンク

になります。
また、libjpeg.liblibjpeg-turbo.libのどちらをリンクするかで意見が割れていますが、ここではlibjpeg-turbo.libをリンクしました。

OpenCVのビルドのためのCMakeのコマンドは下記のようになります。

libjpeg-turbo 有効

libjpeg-turbo 無効

Test


実験は、

  1. libjpeg-turbo有効の自家製ビルドOpenCV
  2. libjpeg-turbo無効の自家製ビルドOpenCV
  3. 公式のOpenCVバイナリ

に対して比較します。
また、画像は、

  1. 640x360
  2. 1280x720
  3. 2560x1440

の3種類を用意し、それぞれのデータのデコードとエンコードを1000回繰り返します。

実験ソースは下記です。
ベースとして、下記のページを参考にさせていただきました。

Result

実験結果は下記になります。
速度はいずれも平均速度です。

Decode

 640x3601280x7202560x1440
Enable libjpeg-turbo1.16508 ms5.11916 ms28.0259 ms
Disable libjpeg-turbo2.15667 ms9.02238 ms40.7576 ms
original binary2.44517 ms10.1288 ms46.2685 ms

Encode

 640x3601280x7202560x1440
Enable libjpeg-turbo1.37863 ms5.03018 ms20.6569 ms
Disable libjpeg-turbo5.18752 ms19.4827 ms83.4678 ms
original binary5.69063 ms21.4501 ms91.6039 ms

Conclusion

エンコード性能は著しい改善を見せており、3.5-4.0倍の速度をたたき出しています。
デコードも、1.6-2.2倍の速度と良い感じです。

高々数十msの違いかもしれませんが、OpenCVのVideoCapture等でWebカメラをキャプチャした際、MotionJPEG形式ならデコード処理がそのままfpsに跳ね返ってきます。
1280X720で従来20ms要していたということは、30fpsのカメラでも事実上、1フレームに33ms+20msの53ms、つまり20fps程度しか性能が出なかったことになります。
これが5msになれば、33ms+5msの38msなら26fpsと改善できます。

Source Code

https://github.com/takuya-takeuchi/Demo/tree/master/libjpeg-turbo-decode

コメントを残す

メールアドレスが公開されることはありません。

%d人のブロガーが「いいね」をつけました。