フォームチェックにおいて、映像から座標をちゃんと取得するために、前回まではtensoleflow.jsを試していましたが、やっぱり少し精度が悪いのか、手ブレが激しいのか、で、ちゃんとしたBone座標が取得出来ず、約1年以上ぶりにオリジナルのOpenPoseを再度試してみました。
いろいろ変わっている
1年半前は、インストールするのに、Caffe、CUDA、CUDNNなど、何やらわからないものをゴリゴリとコマンドで打っていった記憶があるのですが、今のバージョン(2018年12月現在)ではShell化されているようで、割と楽にインストール出来ました。
ただ、GPUを積んだPC本体が無いので、今回も割と安い(と思う)「Microsoft Azure」のクラウドGPU環境を利用しました。
Azure Cloud
アカウントは持っていたので、https://portal.azure.com/ にログインし、左メニューからまず「リソースグループ」を作成します。
- リソースグループ名:適当に。
- サブスクリプション:私の場合は「従量課金」しかないので、致し方なし。
- リソースグループの場所:「米国東部」で。GPU環境はここにしかないもよう。
次に、「リソースの作成」
とりあえず「Ubuntu Server 18.04」を選択して次へ。
- サブスクリプションとリソースグループは、上記で作成したものを選択。
- 仮装マシン名:適当に。
- 地域:「米国東部」で。
- イメージ:ここで、「Ubuntu 16.04」を選択。
- サイズ:「サイズを変更します」をクリックして、「検索ウインドウ」に「NC6」を入力。表示される「NC6」をクリック。
- OSディスクは、「HDD」で。
- あとはデフォルト状態で、「作成」
数分で作成されます。
注意!
お金のある人はいいですが、やはり1時間100円、と高額です。
使わない時は、「停止」しましょう。ここ1週間、使っては「停止」を繰り返してますが、「停止中」は課金されないようです。たぶん。
「すべてのリソース」〜「仮想マシン」をクリックし「停止」。使う時は「開始」。停止は10分ほど掛かる場合があります。
OpenPoseインストール
SSHで接続し、とりあえず/home直下あたりにGit Cloneします。
$ git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git
こちらを参考にインストール。しかし以下の方法で何とかバイナリが動きました。
$ sudo ubuntu/install_cuda.sh
$ nvidia-smi
$ sudo ubuntu/install_cudnn.sh
$ sudo apt-get install libopencv-dev
$ sudo apt-get install libatlas-base-dev
$ bash ./ubuntu_deprecated/install_caffe_and_openpose_if_cuda8.sh
廃止予定のshですが、
bash ./ubuntu/install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh
ではエラーで先に進まなかったので・・。
作業フォルダの作成
画像や動画を置くフォルダ、Boneを書き出すフォルダ、KeyPointを書き出すフォルダを作成。パーミッションは777で。
$ cd ../
$ sudo mkdir work/
$ sudo mkdir input output keypoint
$ sudo chmod 777 input output keypoint
バイナリの実行
work/input フォルダに画像数枚を置いて、以下を実行。
$ cd ./openpose
$ ./build/examples/openpose/openpose.bin --image_dir ../work/input/ --write_images ../work/output/ --write_json ../work/keypoint --display 0
さすがに早い!数秒。
--display 0 としないと画面表示しようとしてエラーになるので忘れずに。
次は動画。1GPUなので、画面サイズや容量によって、1分〜4分掛かる場合があります。
$ ./build/examples/openpose/openpose.bin --video ../work/input/hoge.mp4 --disable_blending 1 --write_images ../work/output/ --write_video ../work/output/hoge.avi --write_json ../work/keypoint --display 0
動画は貼り付けられないのでご容赦を。
OpenPoseを触った方ならご存知と思いますが、上記パラメタにすると、Boneを付けた動画(.avi)、動画の1フレームごとにBOne画像とBone座標点のJsonデータ(x, y, 精度)を同時に書き出してくれます。なので、1フォルダ内が一気に1,000ファイル以上になることがあります。これがとても助かります。
--disable_blending 1 とすることで、Boneのみの動画を書き出します。
あとは・・
アングルが変わるとダメなので、あくまでも同じアングルと思える画像、動画を取得してBone化することが必要。
いろいろな倍率を想定して、JSONから各点の重要と思われる角度を三角関数で算出して、各選手の特徴量をデータ化〜SVMでAIモデル化しようと思っています。
POSE_BODY_25_BODY_PARTS {
{0, "Nose"},
{1, "Neck"},
{2, "RShoulder"},
{3, "RElbow"},
{4, "RWrist"},
{5, "LShoulder"},
{6, "LElbow"},
{7, "LWrist"},
{8, "MidHip"},
{9, "RHip"},
{10, "RKnee"},
{11, "RAnkle"},
{12, "LHip"},
{13, "LKnee"},
{14, "LAnkle"},
{15, "REye"},
{16, "LEye"},
{17, "REar"},
{18, "LEar"},
{19, "LBigToe"},
{20, "LSmallToe"},
{21, "LHeel"},
{22, "RBigToe"},
{23, "RSmallToe"},
{24, "RHeel"},
{25, "Background"}
};
あと、実験段階ではありますが、ライセンスに注意しないと。。
GPU版のTensoleFlowも試してみるかな。