ほろ酔い開発日誌

有意義な技術的Tipsを共有出来たら嬉しいです。Ruby、Railsが好きです。Web開発全般(Rails多め、フロント、サーバー、インフラ)、データ分析、機械学習あたりの記事が中心になる予定です。

Docker環境で姿勢推定をOpenPoseで実行する

f:id:seishin55:20190306165205j:plain

はじめに

姿勢推定のOpenPoseの実行を行ったのでその方法をまとめておきます。GPU環境があれば、Dockerを使うことで簡単に使うことができました。

github.com

公式の環境構築手順に沿うのはなかなか大変なので、Dockerで環境を用意して使いたいと思います。

環境構築

以下のDockerfileを使用しました。

note.mu

FROM nvidia/cuda:8.0-cudnn5-devel

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update -y \
    && apt-get install -y \
    build-essential \
    apt-utils \
    openssl \
    git \
    cmake \
    git \
    curl \
    vim \
    ca-certificates \
    libjpeg-dev \
    libfreetype6-dev \
    zlib1g-dev \
    openssh-client \
    bash \
    g++ \
    tzdata \
    mariadb-client \
    gcc \
    xz-utils \
    file \
    sudo \
    tmux \
    libmecab-dev \
    wget \
    unzip \
    lsof \
    lsb-core \
    libatlas-base-dev \
    libopencv-dev \
    python-opencv \
    python-pip \
    python3-pip \
    ffmpeg \
    zip \
    cython \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ENV PYTHONPATH /usr/local/python/openpose

WORKDIR /root

# openpose
RUN git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git
WORKDIR /root/openpose
RUN git checkout tags/v1.4.0 \
    && git submodule update --init --recursive \
    && sed -i -e "s/ubuntu\/Makefile.example/ubuntu_deprecated\/Makefile.example/g" ubuntu_deprecated/install_openpose_if_cuda8.sh \
    && sed -i -e "s/ubuntu\/Makefile.config/ubuntu_deprecated\/Makefile.config/g" ubuntu_deprecated/install_openpose_if_cuda8.sh \
    # && sed -i -e "s/git submodule update --init --recursive//g" ubuntu/install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh \
    && sed -i -e "s/ubuntu/ubuntu_deprecated/g" ubuntu_deprecated/install_caffe_and_openpose_if_cuda8.sh \
    && sync \
    && sleep 1 \
    && bash ./ubuntu_deprecated/install_caffe_and_openpose_if_cuda8.sh

# python API
RUN cd build && cmake -DBUILD_PYTHON=true ..
RUN cd build && make -j `nproc`
RUN cd build && sudo make install
$ nvidia-docker build . -t openpose

結構時間かかります。

実行

dataフォルダに処理したいデータを入れます。またresultディレクトリに処理後のデータを入れます。以下のようにデータのディレクトリをマウントして、runします。

$ nvidia-docker run -v /home/ubuntu/openpose/data:/root/openpose/data -v  /home/ubuntu/openpose/result:/root/openpose/result --rm -it openpose /bin/bash

あとは、docker内で以下のように処理を行います。出力はjson形式でだけ出しています。また、model_posecocoのデータポイントを出力するようにしています。defaultではBODY_25のデータポイントになるので注意が必要です。

$ ./build/examples/openpose/openpose.bin --image_dir data --write_json result --display 0 --render_pose 0 --model_pose COCO

引数の詳細はドキュメントや以下のhelpで確認して下さい。

./build/examples/openpose/openpose.bin --help

以上でresultディレクトリを確認するとデータがあるはずです。非常に簡単に実行することができました。

おまけ: nvidia-docker導入時のエラー

nvidia-dockerの導入は検索すればいくつか出てくると思いますが、試してみると、私の場合はUbuntu16.04環境で以下のようなエラーが出てしまいました。

docker: Error response from daemon: create nvidia_driver_367.35: VolumeDriver.Create: internal error, check logs for details.

以下のissueにあるようにすれば解決したので参考になれば。

github.com

$ systemctl edit nvidia-docker

以下を追記。

[Service]
ExecStart=
ExecStart=/usr/bin/nvidia-docker-plugin -s $SOCK_DIR -d /usr/local/nvidia-docker-test

以下を実行。

sudo mkdir /usr/local/nvidia-docker-test
sudo chown nvidia-docker /usr/local/nvidia-docker-test
sudo systemctl restart docker nvidia-docker