DockerでGpuMat用OpenCVビルド

CentOS7上にGeForceのCUDAドライバをインストールし、CUDAを利用できるDocker環境を整えます。GPUをDocker上で使うためにはdockerコマンドの代わりにnvidia-dockerコマンドを使う必要があり、CentOS7へのnvidia-dockerのインストールまでの手順はこちらで解説しています。今回は、すでにCUDA Toolkit 8.0がインストールされているDockerイメージ上でOpenCV 3.2.0をソースコードからコンパイルし、GPUオプションをONにしたOpenCVをインストールしています。

Dockerfile

#Dockerfile
FROM nvidia/cuda:8.0-devel-ubuntu16.04

RUN apt-get update && apt-get install -y --no-install-recommends \
    wget git cmake libeigen3-dev libgtk-3-dev qt5-default freeglut3-dev libvtk6-qt-dev libtbb-dev \
    libjpeg-dev libjasper-dev libpng++-dev libtiff-dev libopenexr-dev libwebp-dev \
    libhdf5-dev libopenblas-dev liblapacke-dev \
    libpython3.5-dev python-numpy python-scipy python-matplotlib python3-numpy python3-scipy python3-matplotlib

COPY opencv-3.2.0.tar.gz .
RUN tar xfvz opencv-3.2.0.tar.gz
COPY opencv3.2_build-ubuntu16.04.sh /opencv-3.2.0/
RUN cd opencv-3.2.0 && chmod 777 opencv3.2_build-ubuntu16.04.sh && ./opencv3.2_build-ubuntu16.04.sh && cd build && make -j4
RUN cd opencv-3.2.0/build && make install && ldconfig

RUN apt-get install -y nano \
    && rm -rf /var/lib/apt/lists/*

イメージのビルド

OpenCVのソースコードを先にダウンロードしてDockerfileと同じディレクトリに入れておきます。異なるバージョン、ファイル名の場合はDockerfileを適宜書き換えてください。また、ビルドオプションはopencv3.2_build-ubuntu16.04.shを参考にしましたが、GpuMatを使うためにcudev等をONにしています。 opencv3.2_build-ubuntu16.04.sh (7 ダウンロード)

ls
------------------------------
Dockerfile          opencv3.2_build-ubuntu16.04.sh
opencv-3.2.0.tar.gz
------------------------------
docker build -t opencv_gpu .
------------------------------
Successfully tagged opencv_gpu:latest
------------------------------

起動とOpenCVコードのコンパイル

nvidia-dockerを使います。GPUコードを書かない場合にはdockerで十分です。

起動
nvidia-docker run -it opencv_gpu:latest /bin/bash
コード(GPUコードなし)
//test.cpp
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>

int main(int argc, const char* argv[])
{
  system("wget http://www.cellstat.net/wp-content/uploads/2016/10/sample.jpg");
  cv::Mat src = cv::imread("sample.jpg", cv::IMREAD_COLOR);
  cv::imwrite("output.jpg", src);
  return 0;
}
コンパイルと実行(GPUコードなし)
g++ test.cpp -o test.out `pkg-config --cflags opencv` `pkg-config --libs opencv` -L/usr/local/cuda-8.0/lib64

./test.out

Dockerのファイル掃除

いろいろ試行錯誤しているうちに余計なファイルが溜まるので、その削除方法です。

docker rm $(docker ps -aq) #すべてのコンテナを削除
docker images | awk '/<none/{print $3}' | xargs docker rmi #タグがnoneになっているimageを削除