ディープラーニング

[ディープラーニング]人の写真から3D姿勢推定(ポーズ推定)を試す

投稿日:

スポンサードリンク

はじめに

ドワンゴが公開している3D姿勢推定技術のオープンソースを使って画像の人物の姿勢推定を動かしてみました。従来…といっても数年前に写真から2次元的な姿勢推定をするという研究が進んでいたのですがそれの発展版で3次元的な姿勢推定ができるようになったというものです。これができれば写真からポーズデータを抽出することも可能になるはず!ということで試してみました。

ライセンスはMITのようです。

環境

環境は以下の通りです。Windows10上にAnacondaの仮想環境を使いました。Anacondaに関しては「【DeepLearning】物体検出手法のSSD(Keras版)を試す (Ubuntu14.04)」で初めて使いました。また、IDEはPycharmでAnacondaと連携して使いました。

OS:Windows10
仮想環境:Anaconda
Python:3.6(Anaconda仮想環境上に作成)

環境構築

上記のPythonやAnacondaの構築に関してはスキップします。各自好みの環境をご用意ください。

pipインストール

公式のREADMEを読んでおけば大丈夫だと思っていましたが、ちょっと躓いたので以下メモしておきます。インストールするライブラリは下記です。

pip install chainer==4.0
pip install cupy==4.0
pip install opencv-python==3.4.1.15
pip install scipy==1.3.1

上記のchainerとcupyはrequirement.txtに書いていますが、それ以下のライブラリは省略されているので注意してください。また、opencvはこれより下のバージョンを入れるとエラーが出るみたいなのでご注意ください。

ダウンロード

GitHubのソースコードをダウンロードしたら好きなフォルダに配置してください。そして、READMEに書いてあるcaffemodelとprototxtをダウンロードしたらその直下に移動します。

また、ソースの中には「gen_epoch_500.npz」が入っていますが、中身が不十分なようなので本家からダウンロードして差し替えてください。ちゃんとREADMEにもダウンロードしろと書いてあるので注意して読んでください。

スクリプト修正

デフォルトのスクリプトを動かすとエラーは出ないのですがなぜか何も起こらないと思います。よくよく中身を見るとWebカメラを開いてそれの姿勢推定をしていて、カメラが無い場合はexitしてしまっているようです。demo.pyのmain関数(155行目)の一部を修正してください。frameをcap.readで取得しているところをコメントアウトしてimreadで引数で指定した画像を読み込むようにします。

def main(args):
    model = evaluation_util.load_model(vars(args))
    chainer.serializers.load_npz(args.lift_model, model)
    cap = cv.VideoCapture(args.input if args.input else 0)

    # hasFrame, frame = cap.read()
    # if not hasFrame:
    #     exit(0)
    frame = cv.imread(args.input)
    points = OpenPose(args).predict(args, frame)
    points = [vec for vec in points]
    points = [np.array(vec) for vec in points]
    BODY_PARTS, POSE_PAIRS = parts(args)
(以下省略)

上記のスクリプトをはdemo.pyの一部を抜粋したものです。

サンプルデモ動作

これで以下のスクリプトがエラー無く動けばOKです。

python bin/demo.py sample/image.png --lift_model sample/gen_epoch_500.npz --model2d pose_iter_440000.caffemodel --proto2d openpose_pose_coco.prototxt

Pycharmで動かす場合は引数の指定が必要なため「Run>Edit Configurations」を開いて左上の「+」ボタンから設定を追加してください。各項目には以下を記入します。

Script Path:
C:\{ 省略 }\3dpose_gan-master\bin\demo.py

Parameters:
./../sample/image.png --lift_model ./../sample/gen_epoch_500.npz --model2d ./../pose_iter_440000.caffemodel --proto2d ./../openpose_pose_coco.prototxt

設定し終えると次のようになります。Nameには「mainrun」と名付けましたが、ここは適当で大丈夫です。

実行時はその名前を選んでください。

実行がうまくいけば、bin/demo_outフォルダに結果の画像が保存されます。画像は25方向から見たときの骨格の画像と入力画像に骨格を重畳した画像が入っています。

トラブルシューティング

OSError: Failed to interpret file 'sample/gen_epoch_500.npz' as a pickle

gen_epoch_500.npzを公式からダウンロードして差し替えてください。

OpenCV Error: Assertion failed (output_slice.isContinuous() && output_slice.size == curr_output.size) in cv::dnn::experimental_dnn_v3::Net::Impl::fuseLayers,

opencv-pythonのバージョンがどうやら古いと出るらしいです。「3.4.1.15」をインストールしたところエラーが消えました。

結果画像

著作権フリーの画像を使いました。いくつか試したのですが、失敗するケースもそこそこ存在していて、全身写っていないと厳しいのではないかという印象を受けています。また、全身が写っていても周りに何かあるケースでは失敗しがちな感じがします。うまくいった2種類の画像を紹介します。

シンプルですがきちんとガッツボーズも見えています。

片足が隠れていますが問題なさそうでした。
ちなみに出力される画像はこれだけではなく骨格のみのバージョンを全周囲から撮影したものも含まれます。

最後に

ドワンゴの3D姿勢推定技術を使って写真から人物の骨格を抽出しました。デモの出力は画像だけみたいなので例えばDAZ StudioなどのCGソフトで読めるようなフォーマットに変換できたらいいなと思っています。

こういう機能は実は今年の頭にCLIP STUDIOに実装されています。このソフトは使ったことが無いのですがこういうのがフレキシブルに使えるようになったらいいなと思います。

スポンサードリンク

-ディープラーニング

Copyright© めめんと , 2019 All Rights Reserved Powered by AFFINGER5.