GPU無しで画像のみから人間のボーン推定が出来るtf-openposeを導入する

#概要

CVPR2017でOpenPoseというライブラリが公開されました。
これは、**画像のみから人間のモーションのボーン推定ができます。**

![image](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/media/dance.gif?raw=true)

GIF動画を見てもらえればわかりますが、このような動画(画像)のみから、人間のボーン位置が推定できます。昔、Kinectでわざわざデプスセンサを駆使して、こういうことをやっていた時代から考えると信じられませんね。
原理については以下の動画があるのでご覧ください。(クリックするとyoutubeに飛びます。)

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/pW6nZXeWlGM/0.jpg)](https://www.youtube.com/watch?v=pW6nZXeWlGM)

かなり面白そうなプロダクトなので、自分でも動かしてみたい！と思いました。
しかし、OpenPose自体、CPUのみの動作は対応していないらしく、まだこれから実装する予定のようです。

[CPU only code #150](https://github.com/CMU-Perceptual-Computing-Lab/openpose/issues/150)
["CPU ONLY" works? #200](https://github.com/CMU-Perceptual-Computing-Lab/openpose/issues/200)

ただソースコードレベルでは、CPUのみの実装があるらしく、先人の方も、CPU版をビルドしてみたそうですが、失敗していらっしゃいました。

[CPU版の OpenPoseのビルドに失敗した。](https://iwaki2009.blogspot.jp/2017/05/cpu-openpose.html)

そこで、いろいろと試行錯誤した結果、**"OpenPoseっぽいもの"をCPUのみで動作させることができました**ので、それをご紹介いたします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139643/1ebb6cf0-38ca-c386-ad1c-e165abb6be33.png)

実際の動作画面。先人に習って画像はぱくたそ( https://www.pakutaso.com )からもってきました。

#導入方法

答え自体は簡単でOpenPoseの公式は使っていないです。本家のOpenposeはCaffeeをベースに作られていますが、これは公式を元にTensorflowの方へ移植した実装となっています。リポジトリは以下のURLです。

https://github.com/ildoonet/tf-pose-estimation.git

**導入自体はすごく簡単です。**

```bash
$ git clone https://www.github.com/ildoonet/tf-openpose
$ cd tf-openpose
$ pip3 install -r requirements.txt
```

ただモデルのインストールが若干の癖があり、この方法がなかなかややこしかったです。
詳細は[このissue](https://github.com/ildoonet/tf-pose-estimation/issues/23)に書いてありますが、色々なモデルを学習させたりしているようなので、動くモデルというものがフィックスしていないような印象を受けています。
そこで、私が動作確認済みの方法をご紹介します。

```bash
$ mkdir -p ./models/trained/mobilenet_368x368/
$ cd ./models/trained/mobilenet_368x368/
$ wget https://www.dropbox.com/s/09xivpuboecge56/mobilenet_0.75_0.50_model-388003.zip
$ unzip mobilenet_0.75_0.50_model-388003.zip
$ mv model-388003.data-00000-of-00001 model-release.data-00000-of-00001
$ mv model-388003.index model-release.index
$ mv model-388003.meta model-release.meta
```

これで導入は完了です！
まず始めに、画像からのボーン推定を行います。

```bash
#ぱくたその画像をダウンロードします。
$ wget https://www.pakutaso.com/shared/img/thumb/150415022548_TP_V.jpg
#あとは実行するだけ！！
$ python3 inference.py --model=mobilenet --imgpath=./150415022548_TP_V.jpg 
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139643/1ebb6cf0-38ca-c386-ad1c-e165abb6be33.png)

tf-openposeにはwebcamでのリアルタイムで動くデモも付いています。

```bash
$ python3 realtime_webcam.py
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139643/215f9db2-9f3a-07f2-8825-9023b66aa88b.png)

フィギュアもある程度認識します。CPUで回して、FPSが1.2程度で結構リアルタイムというにはキツイですが、ボーン推定自体はうまくいってます！

#まとめ

前々からこのOpenPoseはすごくやりたい！と思っていました。しかし、GPUがないとつらいんだろうなぁ。とか、機械学習の導入周りはあんまりやってないし、苦労した挙句入らない・・・みたいな悲しい結果になりそうだと思っていました。
しかし、少しずつTensorFlowやCaffeeまわりを調べているうちに、**有名なモデルは別のDeepLearningのフレームワークへすぐ移植される**ということに気づきました。というわけで、OpenPoseのTensorFlow実装を調べて見て、これを導入してみました。
使わせてもらっている分際でなんともいないのですが、**本家より精度は悪い**気がします。しかし、ちょっとやってみる分には、十分に使える実装ですし、CPUだけで出来るのは手軽で非常に良いです。
みなさんも正月休みにOpenPoseいかがでしょうか？？

#参考

- [OpenPoseを動かしてみた。](https://qiita.com/nnn112358/items/a4490d85dac5827db53b)
- [OpenPoseをUbuntu16.04で動かす](https://qiita.com/neon-izm/items/8b7e6b5788e5f73cfb62)