2020/07/23 Updated by

OpenPose

TensorFlow版OpenPoseをWindows上で動かす (GPU版)


[Up] Japanese English

[注意] GPUではなくCPUだけで動かすには、python仮想環境に導入する tensorflow-gpu を tensorflow に変更するだけでよい(2020/07/26確認済み)。以下のようにして python 仮想環境を pose → CPU版、 pose-gpu → GPU版 に変更した。

    (1) まずGPU版tensorflowが使える pose 環境を作った
      conda create -n pose python=3.6 jupyter
      conda activate pose
    (2) tf-openpose-estimationが動くように、下記のようにいろいろインストールする
    (3) base環境に移行する
      conda deactivate
    (3) poseをpose-gpuにcloneする。
      conda  create --name pose-gpu --clone pose
    (4) pose環境から tensorflow-gpuをuninstallして、tensorflowをインストールする
      conda activate pose
      pip uninstall tensorflow-gpu
      pip install tensorflow==1.14

環境


インストール手順

  1. OpenPose の TensorFlow 版が tf pose estimation として公開されている
  2. https://github.com/ildoonet/tf-pose-estimation
  3. downloadする
  4.     [Anaconda Prompt 上で]
        git clone https://www.github.com/ildoonet/tf-pose-estimation
    
  5. anaconda で python3をインストールする。
  6. conda 自体をupdateする。
  7.     [Anaconda Prompt 上で]
         conda update -n base -c defaults conda
    
  8. 仮想環境 pose を作成する。
  9.     [Anaconda Prompt 上で]
        conda create -n pose python=3.6 jupyter
    
  10. 作成したpython環境に切り換える
  11.     (base) % conda activate pose
    
  12. 必要そうなライブラリをインストールしておく。
  13.     (pose) % pip install cython                  → 0.29.21
        (pose) % pip install numpy                   → 1.19.1
        (pose) % pip install opencv-python           → 4.3.0.36
    
  14. tensorflowをバージョンを指定してインストールする
  15.     (pose) % pip install tensorflow-gpu==1.14    → 1.14.0
    
  16. README.md を読んでインストールする。
  17.     (pose) % cd tf-pose-estimation
        (pose) % pip install -r requirements.txt
    
         途中で次のエラーが起きる。
           ERROR: Failed building wheel for pycocotools
    
  18. 手動で pycocotools をインストールする。
  19.     (pose) % pip install "git+https://github.com/philferriere/cocoapi.git#egg=pycocotools&subdirectory=PythonAPI"
    
  20. もう一度、requirements.txt をインストールする
  21.     (pose) % pip install -r requirements.txt
         今度はエラーは起きなかった。
    
  22. swigをインストールする。
    1. SWIG websiteからzipファイルをダウンロードして、展開する。
    2.       swigwin-4.0.2
          
    3. 環境変数のPath 変数に、swig.exe のパスを追加する。
    4.     自分の場合は D:\sys\swig-4.0.2 を環境変数Pathの最後に追加した。
      
    5. SWIG Windows Examplesを参照して環境変数を設定する。
    6.     Pythonの場合 (pythonのバージョンの違いに気をつけて仮想環境のファイルへのパスを指定する)
            PYTHON_INCLUDE   D:\sys\Anaconda3\env\pose\include\Python.h
            PYTHON_LIB       D:\sys\Anaconda3\env\pose\libs\python36.lib
        
  23. 環境変数の設定を変更したら、Anaconda Prompt を起動し直す必要があることに注意すること。
  24. c++ライブラリをビルドする。
  25.     (pose) % cd tf_pose\pafprocess
        (pose) % swig -python -c++ pafprocess.i && python setup.py build_ext --inplace
    
  26. modelをダウンロードする。(bashを使うので)cygwinのウィンドウの中で以下のコマンドを実行する。wgetが使える cygwin のインストール方法はこちら
  27.   [cygwinのウィンドウの中で]
        cd models/graph/cmu
        bash download.sh
        cd ../../..
    
  28. 画像ファイルに対して実行する
  29.     (pose) % python run.py --model=mobilenet_thin --resize=432x368 --image=images/p1.jpg
        tf_pose/estimator.py で次のエラーが起きる。
        ModuleNotFoundError: No module named 'tensorflow.contrib.tensorrt'
    
  30. tf_pose/estimator.py を tensorrt を使わないように変更する。
  31. 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)
    
  32. 画像ファイルに対して実行する
  33.     (pose) % python run.py --model=mobilenet_thin --resize=432x368 --image=images/p1.jpg
        run.py 88行目で次のエラーが起きる。
    run.py:88: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
      plt.show()
        matplotlib のbackend が agg であるのがいけないようだ。
        import matplotlib
        matplotlib.use('Agg')
        みたいになっている部分を探して、TkAgg, WX, QTAgg, QT4Agg の順でbackendを試すといいようだ。
        pose_datase.py:223行目 と train.py:2行目 にある
        以下の変更を加えた。→ OK。正常に動作するようになった。
    
    
    
    diff -c run.org.py run.py
    *** run.org.py	2020-07-23 16:34:46.402974600 +0900
    --- run.py	2020-07-23 16:38:29.159986400 +0900
    ***************
    *** 53,58 ****
    --- 53,60 ----
          image = TfPoseEstimator.draw_humans(image, humans, imgcopy=False)
      
          try:
    +         import matplotlib
    +         matplotlib.use('TkAgg')
              import matplotlib.pyplot as plt
      
              fig = plt.figure()
    
  34. 画像ファイルに対して実行する
  35.     (pose) % python run.py --model=mobilenet_thin --resize=432x368 --image=images/p1.jpg
        正常に動作した。
    



  36. webカメラに対して実行する
  37.     python run_webcam.py --model=mobilenet_thin --resize=432x368 --camera=0
        正常に動作した。
    
  38. デモ画像
  39. tf-pose-estimation.mp4


http://ynitta.com