LoginSignup
4
3

More than 5 years have passed since last update.

Docker上でOpenposeのPython APIを使う

Last updated at Posted at 2019-02-14

OpenposeのPython APIをDockerで動かすのが面倒だったのでちょっとした備忘録。
(2019 2/27 もっといい方法が見つかったので追記 そちらを参考に)
基本はこの記事を参考にしました。

動作環境

  • Ubuntu 16.04
  • GeForce GTX 1080
  • nvidia-docker
  • Openpose v1.4.0

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を使う

追記(2019 2/27)

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

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

とすることで、ライブラリのコピーやmodelsのコピーをする必要はなくpythonAPIが実行できる。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3