1.はじめに
2018年12月に複数人のポーズ推定に関する論文が提案されました。今回は、その論文内容を実装したOpenPoseについてご紹介します。
OpenPoseは、体、顔、手、足の推定のためのリアルタイムの複数人のキーポイント検出ライブラリで、今回は、これをGoogle ColabのGPUを使って動かしてみます。
2.OpenPoseの概要
OpenPoseは、先に姿勢の推定の鍵となるキーポイントを抽出して,その後にキーポイントを人物ごとにマッチングさせるという考え方です.
(a)Imput Image から 人のキーポイントを表す (b)Part Confidence Map とキーポイントとキーポイントの繋がりを表す (c)Part Affimity Fields を抽出します。そして、その繋がりを (d)Bipartite Matching でマッチングさせ、結果 (e)Parsing Results を出力します。
つまり、一人一人を検出してから各人のキーポイントと繋がりを見つけて行くのではなく、キーポイントと繋がりだけを見つけてマッチングさせることで、高速な処理を実現しています。
(b)Part Confidence Map と (c)Part Affimity Fields のネットワークは、
Stageと呼ばれる単位で青色やベージュ色で囲まれた部分を重ねていきます。そして青色部分を4Stage,ベージュ色部分を2Stage重ねた形で実装しています。
3.コード
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、各プロジェクトファイルからCMakeでOpenPoseをビルドします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import os from os.path import exists, join, basename, splitext git_repo_url = 'https://github.com/CMU-Perceptual-Computing-Lab/openpose.git' project_name = splitext(basename(git_repo_url))[0] if not exists(project_name): # see: https://github.com/CMU-Perceptual-Computing-Lab/openpose/issues/949 # install new CMake becaue of CUDA10 !wget -q https://cmake.org/files/v3.13/cmake-3.13.0-Linux-x86_64.tar.gz !tar xfz cmake-3.13.0-Linux-x86_64.tar.gz --strip-components=1 -C /usr/local # clone openpose !git clone -q --depth 1 $git_repo_url !sed -i 's/execute_process(COMMAND git checkout master WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}\/3rdparty\/caffe)/execute_process(COMMAND git checkout f019d0dfe86f49d1140961f8c7dec22130c83154 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}\/3rdparty\/caffe)/g' openpose/CMakeLists.txt # install system dependencies !apt-get -qq install -y libatlas-base-dev libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev opencl-headers ocl-icd-opencl-dev libviennacl-dev # install python dependencies !pip install -q youtube-dl # build openpose !cd openpose && rm -rf build || true && mkdir build && cd build && cmake .. && make -j`nproc` |
インターネット環境にもよりますが、1時間弱くらい掛かりますので、別の事でもやりながら、のんびり待ちます。
次に、ダウンロードするYoutube動画を指定します。
Youtube動画の共有ボタンを押すと、下記の様な表示がされますので、YOUTUBE_ID
に赤枠内の共有コードを設定します。コードを実行すると、対象となるYoutubeビデオが確認できます。
1 2 3 |
from IPython.display import YouTubeVideo YOUTUBE_ID ='Sa3k_7ZtoCA' YouTubeVideo(YOUTUBE_ID) |
そして、指定したYoutube動画をダウンロードし、20秒に編集し content/video.mp4
に保存します。
1 2 3 4 |
# download the youtube with the given ID !youtube-dl -f 'bestvideo[ext=mp4]' --output "youtube.%(ext)s" https://www.youtube.com/watch?v=$YOUTUBE_ID # cut the seconds 20 seconds from 03:13 !ffmpeg -y -loglevel info -i youtube.mp4 -ss 00:03:13.0 -t 20 video.mp4 |
!ffmpeg -y -loglevel info -i youtube.mp4 -ss 00:03:13.0 -t 20 video.mp4
では、ビデオ開始から3分13秒後から20秒間を使用する指定をしています。
content/video.mp4
からポーズ推定した動画を作成します。自分の用意した動画を使う場合は、content/video.mp4
を置き換えて下さい。
1 2 3 4 |
# detect poses !cd openpose && ./build/examples/openpose/openpose.bin --video ../video.mp4 --write_json ./output/ --display 0 --write_video ../openpose.avi --face --hand # convert the result into MP4 !ffmpeg -y -loglevel info -i openpose.avi output.mp4 |
最後に、Google colab のインラインにmp4ファイルを表示させます。
1 2 3 4 5 6 7 8 9 10 |
def show_local_mp4_video(file_name, width=640, height=480): import io import base64 from IPython.display import HTML video_encoded = base64.b64encode(io.open(file_name, 'rb').read()) return HTML(data='''<video width="{0}" height="{1}" alt="test" controls> <source src="data:video/mp4;base64,{2}" type="video/mp4" /> </video>'''.format(width, height, video_encoded.decode('ascii'))) show_local_mp4_video('output.mp4', width=960, height=720) |
凄い!これなら、Pose推定完璧じゃん!と思うのは気が早い。動画をコマ送りで見ると、結構外しています(笑)。
検出精度に関しては、照明やスピードによる画像ブレなどは考慮すべきで、どんな状態でも完璧と言うわけではないです。
では、また。
(参考)https://github.com/CMU-Perceptual-Computing-Lab/openpose
(Twitterへの投稿)
新たな動画をTwitterへ投稿しました。
Cedro様
お世話になります。いつも楽しく拝見しております。
さて、小職も本サイトに記載されている方法にて、姿勢推定に挑戦しております。
なにぶんAIやプログラミングについては何も知りませんので、丸写しで実行しているだけですが、
いくつかは姿勢推定できております。
本サイトのやり方でもYoutubeの動画については私でも他の動画で姿勢推定に成功しました。
一方、自前の動画での姿勢推定については、
「自分の用意した動画を使う場合は、content/video.mp4 を置き換えて下さい。」
「content/video.mp4」これがどこにあるのかが分からず、頓挫しています。
ColabのWindowの左に見えているフォルダ階層で、以下はみえていますが、content/video.mp4はどこにあるのでしょう?
sample_data
readme.md
anscombe.json
california_housing_test.csv
california_housing_train.csv
mnist_test.csv
mnist_train_small.csv
初歩的な質問かと思いますが、ご教示賜りたく、よろしくお願いいたします。
Siggyさん
コメントありがとうございます。
contentはルートディレクトリなので、単にvideo.mp4と書いてあるファイルを置き換えて貰えばOKです。
ご連絡頂いたファイルリストは、sample_dataの中身ですね。
今、自分でも再現してみましたが、スタートから左側のwindowを何も触らなければ、video.mp4が見えているはずです。
もう一度確認してみて下さい。