2020/07/26 Updated by
2020/07/22 Updated by

OpenPose TensorFlow版

Mac上でデモを動かしてみる(正常動作確認済み)


[Up] Japanese English

環境


tf-openpose を動かす

  1. OpenPose の TensorFlow 版が tf pose estimation として公開されている
  2. https://github.com/ildoonet/tf-pose-estimation
  3. anaconda で python3をインストールする。
  4. 仮想環境 pose を作成する。
  5.     Termnial上で
        conda create -n pose python=3.6 jupyter
    
  6. 作成したpython環境に切り換える
  7.     (pose) % conda activate pose
    
  8. python仮想環境 pose がactivate/deactivate された時に、PATH変数が変更されるようにshell scriptを作成する。 [重要]この環境ではpythonコマンドで3.6が参照されるようになる。
  9. 仮想環境の中にディレクトリ ./env/conda/{,de}activate.d/を作成する。 これらのディレクトリ内のスクリプトは conda activate/deactivate のときにそれぞれ実行される。
      (pose) % cd ${CONDA_PREFIX}
      (pose) % mkdir -p ./etc/conda/{,de}activate.d
      (pose) % touch ./etc/conda/*/{,de}activate.d/env_path.sh
    
    ${CONDA_PREFIX}/etc/conda/activate/env_path.sh
    #!/bin/zsh
    export PATH_BACK=$PATH
    export PATH=${CONDA_PREFIX}/bin:$PATH
    
    ${CONDA_PREFIX}/etc/conda/deactivate/env_path.sh
    #!/bin/zsh
    if [ -z "$PATH_BACK" ]; then
    else
        export PATH=$PATH_BACK
    fi
    
  10. python仮想環境pose を一旦 deactivate して、再び activate する。
  11.     (pose) % conda deactivate
        (base) % conda activate pose
        (pose) %
    
    上記の deactivate.d/env_path.sh は環境変数PATH_BACKが定義されていない場合も正しく動作するはずである。しかし、設定を間違えた場合は環境変数PATHがおかしくなるので、その場合は一旦shellも終了してから新しいshellを起動し、仮想環境poseに切り換えること。
        (pose) % conda deactivate
        (base) % exit    ← shellを終了する(PATH変数がおかしくなっているので)
    [新しいターミナルで]
        (base) % conda activate pose
        (pose) %
    
    ちなみに私の手元のMacではPath変数は次のように変化する。
    (base) % conda activate pose2
    (pose2) % echo $path
    /Users/nitta/anaconda3/envs/pose2/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin /Library/TeX/texbin /Library/Apple/usr/bin /Library/Frameworks/Mono.framework/Versions/Current/Commands /Users/nitta/anaconda3/envs/pose2/bin /opt/anaconda3/condabin /Users/nitta/bin
    (pose2) % conda deactivate  
    (base) % echo $path
    /usr/local/bin /usr/bin /bin /usr/sbin /sbin /Library/TeX/texbin /Library/Apple/usr/bin /Library/Frameworks/Mono.framework/Versions/Current/Commands /Users/nitta/anaconda3/envs/pose2/bin /opt/anaconda3/condabin /Users/nitta/bin
    
  12. tensorflowをバージョンを指定してインストールする
  13.     (pose) % pip install tensorflow==1.5
    
  14. README.md を読んでインストールする。
  15.     (pose) % git clone https://www.github.com/ildoonet/tf-pose-estimation
        (pose) % cd tf-pose-estimation
        (pose) % pip install -r requirements.txt
    
  16. modelをダウンロードする
  17.     (pose) % cd models/graph/cmu
        (pose) % bash download.sh
        (pose) % cd ../../..
    
  18. post processing として c++ library をビルドする。
  19. https://github.com/ildoonet/tf-pose-estimation/tree/master/tf_pose/pafprocess
        (pose) % brew install swig
        (pose) % cd tf_pose/pafprocess
        (pose) % swig -python -c++ pafprocess.i && python setup.py build_ext --inplace
        (pose) % cd ../..
    

    _pafprocess.cpython-36m-darwin.so が作成された。

    [注意]もしも上記の path 再設定の定義をしていないと python3.8用ができて、あとでimportに失敗する。 もしかしたら、下記で python3の部分を pytho3.6 としておけばpython3.6用が生成されたかもしれないが、 上記の設定が正しいと思うのでこれ以上追求しない。

        (pose) % brew install swig
        (pose) % cd tf_pose/pafprocess
        (pose) % swig -python -c++ pafprocess.i && python3 setup.py build_ext --inplace
        (pose) % cd ../..
    
    tf_pose/pafprocess/_pafprocess.cpython-38-darwin.so ができる。この38はpythonのバージョンではないか?それならばまずい。 python → 2.7.16 python3 → 3.8.5 python3.6 &raa; 3.6.10 conda でpythonの仮想環境を指定したときに、どれも 3.6 が見えるようになってもらいたい。
  20. opencvのバージョンアップ
  21.     (pose) % pip install opencv-python==3.4.0.14
    

    [注意] opencvは現在version 4.x だが、version 3.x である必要があるのでバージョンを指定してインストールする。インストールできるバージョンのチェック方法は以下の通り。

      [インストール済みのパージョンを調べる]
      pip list | grep opencv-python
      pip show opencv-python
    
      [インストール可能なパージョンを調べる]
      pip install opencv-python==
    
  22. run.pyを実行したときに、tensorflow.contrib.tensorrtがないというエラーが起きる
  23.   [エラーへの対処方法]
      pip uninstall tensorflow
      pip install tensorflow==1.14
    
  24. 「tensorrtがない」というエラーへの対処
  25. tf_pose/estimator.py で以下をコメントアウトする。
        14行目 import 文
        315-328行目 if文
    
    diff -c estimator.org.py estimator.py
    *** estimator.org.py	2020-07-23 15:29:36.524690000 +0900
    --- estimator.py	2020-07-23 15:36:20.364439100 +0900
    ***************
    *** 11,17 ****
      from tf_pose import common
      from tf_pose.common import CocoPart
      from tf_pose.tensblur.smoother import Smoother
    ! import tensorflow.contrib.tensorrt as trt
      
      try:
          from tf_pose.pafprocess import pafprocess
    --- 11,17 ----
      from tf_pose import common
      from tf_pose.common import CocoPart
      from tf_pose.tensblur.smoother import Smoother
    ! #import tensorflow.contrib.tensorrt as trt
      
      try:
          from tf_pose.pafprocess import pafprocess
    ***************
    *** 311,317 ****
              with tf.gfile.GFile(graph_path, 'rb') as f:
                  graph_def = tf.GraphDef()
                  graph_def.ParseFromString(f.read())
    ! 
              if trt_bool is True:
                  output_nodes = ["Openpose/concat_stage7"]
                  graph_def = trt.create_inference_graph(
    --- 311,317 ----
              with tf.gfile.GFile(graph_path, 'rb') as f:
                  graph_def = tf.GraphDef()
                  graph_def.ParseFromString(f.read())
    !         '''
              if trt_bool is True:
                  output_nodes = ["Openpose/concat_stage7"]
                  graph_def = trt.create_inference_graph(
    ***************
    *** 326,332 ****
                      maximum_cached_engines=int(1e3),
                      use_calibration=True,
                  )
    ! 
              self.graph = tf.get_default_graph()
              tf.import_graph_def(graph_def, name='TfPoseEstimator')
              self.persistent_sess = tf.Session(graph=self.graph, config=tf_config)
    --- 326,332 ----
                      maximum_cached_engines=int(1e3),
                      use_calibration=True,
                  )
    !         '''
              self.graph = tf.get_default_graph()
              tf.import_graph_def(graph_def, name='TfPoseEstimator')
              self.persistent_sess = tf.Session(graph=self.graph, config=tf_config)
    
  26. 画像ファイルに対して実行する
  27.     (pose) % python run.py --model=mobilenet_thin --resize=432x368 --image=images/p1.jpg
    
    python3.6でうごいていることに注意。 正常に動作した。


  28. デモ画像
  29. tf-pose-estimation.mp4