Docker上でOpenposeのPython APIを使う

OpenposeのPython APIをDockerで動かすのが面倒だったのでちょっとした備忘録。
(2019 2/27　もっといい方法が見つかったので追記　そちらを参考に)
基本は[この記事](https://note.mu/koichirot11/n/nf5f26b2271f3)を参考にしました。
#動作環境
- Ubuntu 16.04
- GeForce GTX 1080
- nvidia-docker
- Openpose v1.4.0

#Dockerfile
Dockerfileは参考記事のそのまま。

```Dockerfile:Dockerfile
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
```

#問題点
上記Dockerfileから作成したイメージをnvidi-dockerでコンテナにしてPython APIを使おうとしたときに問題が発生。
prottxtが参照できないと言われる。
これはデフォルトで /root/openpose/models/ 以下のサブディレクトリに入ってるファイルである。
prottxtの参照をDockerfileで設定した環境変数PYTHONPATHからの相対パスで参照しているのだが、それが正しい位置を記してない模様。
そこで環境変数を書き換える。この環境変数はPythonのOpenposeライブラリが存在する場所を示している。
Dockerfileで指定した /usr/local/python/openpose にライブラリが存在するので、そのディレクトリ直下のファイルたちを /root/openpose/python/openpose　以下にコピーする。

```
cp -r /usr/local/python/openpose/* /root/openpose/python/openpose/
```

そして環境変数を書き換える。取り敢えず一時的に書き換えるだけなのでexportを使った。（本当は永続的に書き換えたほうがいいのかもしれないけど.bash_profileとか新しいファイルを作りたくなかったのでそのままにした。何かいい方法が他にあるかもしれない）

```
export PYTHONPATH="/root/openpose/python/openpose"
```

しかしこのままだと　opnepose以下のmodelsディレクトリの指定が1階層ぶんずれている。
いい解決法が思い浮かばなかったのでmodelsディレクトリをそのまま1つ上の階層にコピーした。

```
cp -r /root/openpose/models /root/
```

以上でopenpose/build/example/tutorial_python/　にあるPythonのスクリプトが動くようになった。

# 改善点
環境変数を一時的に書き換えているだけなのでコンテナを起動するたびにいちいちexportしなきゃいけないのが面倒くさい。
modelsディレクトリを移動させるのではなくそのパスを指定しているファイルを書き換えたほうがいい気がする。

#参考にしたサイト
[DockerでOpenposeのpython(3) APIを使う](https://note.mu/koichirot11/n/nf5f26b2271f3)

#追記(2019 2/27)
modelsの階層がずれている問題といちいちライブラリをコピーしなければいけない問題は、PYTHONPATHをopenpose/build/python/openposeにすることで改善できた。
Dockerfileからイメージを作成したあと、

```
export PYTHONPATH="/root/openpose/build/python/openpose"
```
とすることで、ライブラリのコピーやmodelsのコピーをする必要はなくpythonAPIが実行できる。