UbuntuでOpenCVをlibjpeg-turboつきでビルドする

都道府県別の一人あたり魚介類消費量では、青森県がトップで、以下秋田、鳥取、新潟、富山と日本海側の県が続きます。島国・沖縄が意外にも最下位です。

さて、OpenCVで画像をロードするのを速くしたくて、JPEGについてはlibjpeg-turboというのが使えることを知りました。
libjpeg-turboはlibjpegをSIMDなどによって高速化したものでAPIレベルの互換性を保っています。
条件が良ければデコードが数倍速くなるということで、これをOpenCVに組み込んでビルドする方法をメモ。

libjpeg-turboのダウンロード&ビルド

libjpeg-turboの最新版はこちらでダウンロードできます。
https://sourceforge.net/projects/libjpeg-turbo/files/

% sudo apt-get install nasm
% cd /tmp
% wget https://jaist.dl.sourceforge.net/project/libjpeg-turbo/1.5.1/libjpeg-turbo-1.5.1.tar.gz
% tar xf libjpeg-turbo-1.5.1.tar.gz
% cd libjpeg-turbo-1.5.1
% CFLAGS='-O3' ./configure --prefix=$HOME
% make
% make install

$HOME下のincludeおよびlibの中にインストールされます。

make中、下記のようなエラー?が出ましたが、手元では放置して問題なさそうでした(放置せずに頑張ったらもっと速くなる、とかあるのかもしれませんが、とりあえず深追いしていません)。

libtool:   error: ignoring unknown tag NASM
OpenCVのビルド

基本的には手動でOpenCVをビルドするときに、cmakeに対していくつかのパラメータを追加するのみです。

% cd /tmp
% git clone https://github.com/opencv/opencv.git
% cd opencv
% mkdir build
% cd build
% cmake -D WITH_JPEG=ON -D BUILD_JPEG=OFF -D JPEG_INCLUDE_DIR=$HOME/include -D JPEG_LIBRARY=$HOME/lib/libjpeg.so ..
% make -j128
% make install

BUILD_JPEGは3rdpartyに含まれたlibjpegをOpenCVと一緒にビルドする設定なのでオフにします。
JPEG_INCLUDE_DIRおよびJPEG_LIBRARY_PATHに指定するパスは、libjpeg-turboのビルド時に指定した場所に従ってよろしく書き換えてください。

ベンチマーク

下記のようなかんたんなPython3コードで、JPEG画像のデコード速度を測ってみました。
なお、このベンチマークを走らせるにはPython3サポートつきでのOpenCVビルドが必要になります(上記cmakeオプションには含まれていません)。
OpenCV with Pythonサポートのビルド方法については他をご参照ください。

Before

mean=16.60989224910736ms, stdev=1.9476584857329726ms

After

mean=9.50382836163044ms, stdev=1.1629280634224415ms

検定をするまでもなく、2倍近く高速になりました。
圧縮率や画像サイズによって変わるとは思いますが、これはおいしいフリーランチです。

参考

コメントを残す

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