BodyPix と PoseNet の歩き方

# BodyPix と PoseNet ってなに？
BodyPixは人体の24種類部位の領域分割（セグメンテーション)を行う TensorFlow.js 上で動作するオープンソースソフトです：
![BodyPix](https://1.bp.blogspot.com/-96qG-uqTaxQ/Xc7dxCaYZhI/AAAAAAAAA5U/LX-6HnwfTXghgUV1MVs6z3J3nkmil0XcACLcBGAsYHQ/s1600/bodypix2-twitter.gif)
領域分割に加えて姿勢推定(PoseNet)も同時に行うことができています。PoseNet を開発した Google のグループが開発していて、ソースコードも共通な部分があり、共通化が検討されているようですね：
[Add BodyPix ResNet model #280](https://github.com/tensorflow/tfjs-models/pull/280#issuecomment-539757779)

## 紹介記事
* [[Updated] BodyPix: Real-time Person Segmentation in the Browser with TensorFlow.js(Nov. 18, 2019)](https://blog.tensorflow.org/2019/11/updated-bodypix-2.html)
* [Introducing BodyPix: Real-time Person Segmentation in the Browser with TensorFlow.js(Feb 16, 2019)](https://medium.com/tensorflow/introducing-bodypix-real-time-person-segmentation-in-the-browser-with-tensorflow-js-f1948126c2a0)
* [BodyPix の概要: ブラウザと TensorFlow.js によるリアルタイム人セグメンテーション] (https://developers-jp.googleblog.com/2019/04/bodypix-tensorflowjs.html)(一つ上の記事の日本語訳)
* [撮影中の映像からリアルタイムで人物を抜き出してパーツごとに認識可能な「BodyPix」(Gigazine)](https://gigazine.net/news/20191119-bodypix-2-real-time-person-segmentation/)



# BodyPix と PoseNet を使うには？
## 手軽に試す
カメラのついたPC やスマホなどで試すことができます。:arrow_right:[ライブデモ](https://storage.googleapis.com/tfjs-models/demos/body-pix/index.html)

## 応用例(BodyPix, PoseNet)

* [Color Pop effect using BodyPix and Tensorflow.js](https://towardsdatascience.com/color-pop-effect-using-bodypix-and-tensorflow-js-a584ddc48a02)
![PopEffect](https://miro.medium.com/max/1400/1*Aka4tGMrafqHBsCQb_A3Dg.jpeg)
* [Pose Animator(PoseNet利用)](https://blog.tensorflow.org/2020/05/pose-animator-open-source-tool-to-bring-svg-characters-to-life.html) :arrow_right:[ライブデモ](https://pose-animator-demo.firebaseapp.com/camera.html)
![Pose Animator Picture](https://3.bp.blogspot.com/-oQH2DgTJeEg/Xs12y_vKkgI/AAAAAAAADHw/-6jUtjgK6DAYUGvHQOGULIOKOJpDhiDLwCLcBGAsYHQ/s1600/movementgif.gif)
[Youtube の解説(2020/12/15更新)：Scroobly: Motion capture for character animation - Made with TensorFlow.js](https://youtu.be/mq2jK5X9JNY)
* [Yoga AI](https://github.com/cris-maillo/yogAI)
[Youtubeの解説](https://youtu.be/mW6Z9TIqNUQ)
 ![84757963-bbeff880-afbc-11ea-9203-fe945a4cd09c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60968/eb331d66-20dc-2029-674a-5bd1d4fa5771.png)

* [任意のバーチャル背景を使えるページを作った](https://qiita.com/knok/items/b3eb87769151ac04efeb)
* [tensorflow.jsとWebRTCを組み合わせて、プライバシー保護のビデオチャットを作ってみた（前編）](https://qiita.com/massie_g/items/af3f8eb1e2bf5e807ba6),[（後編）](https://qiita.com/massie_g/items/6018861a7d2ca3f3b1de)
* [PoseNetを体感できる3D-Posenetの紹介](https://tkrel.com/11834) :arrow_right:[ライブデモ](https://mishig25.github.io/3d-posenet/) , [github](https://github.com/mishig25/3d-posenet)
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60968/a0f2b4aa-bff7-f66d-8fed-c6b1dd36ea3f.gif) 


# 仕組みを知るには？

## 参考文献
[1] [G. Papandreou, T. Zhu, L.-C. Chen, S. Gidaris, J. Tompson, and K. Murphy, “PersonLab: Person Pose Estimation and Instance Segmentation with a Bottom-Up, Part-Based, Geometric Embedding Model,” Lect. Notes Comput. Sci. (including Subser. Lect. Notes Artif. Intell. Lect. Notes Bioinformatics), vol. 11218 LNCS, pp. 282–299, Mar. 2018.](https://arxiv.org/abs/1803.08225)

[2] [G. Papandreou et al., “Towards accurate multi-person pose estimation in the wild,” in Proceedings - 30th IEEE Conference on Computer Vision and Pattern Recognition, CVPR 2017, 2017.](https://arxiv.org/abs/1701.01779)

## 参考文献解説
* Qiita記事：[論文まとめ：PersonLab: Person Pose Estimation and Instance Segmentation with a Bottom-Up, Part-Based, Geometric Embedding Model](https://qiita.com/masataka46/items/07c8138239dd5895ebcf)
* [コンピュータビジョンの最新論文調査 2D Human Pose Estimation 編](https://engineer.dena.com/posts/2019.11/cv-papers-19-2d-human-pose-estimation/)

![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116706%2F2e64e0eb-d472-7485-66bc-ac11acb180be.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=0ba8fcb214497584e363cd75cb2e85db)
出展：参考文献[1]の Fig. 1

ひとつの画像入力'Input image'に対して、畳み込みネットワーク(CNN)が同時に姿勢推定結果('Detected Human Poses')と領域分割結果('Instance segmentation')に必要なデータを出力します。領域分割タスクと姿勢推定タスクという別のタスクが共通のネットワークモジュールである CNN を用いて実現されていることが**このシステムの特徴**です。[マルチタスク学習](https://ai-kenkyujo.com/term/multitask-learning/)でしょうか？

(Pose Estimation Module)
CNN は、画像分類に用いられる MobileNet か ResNet の最後の分類層を得られる出力を５つのネットワークに渡します。ネットワーク (1) 'Heatmaps', (2)Short-range offsets', (3)'Mid-range' は姿勢推定のために用いられます。'Heatmaps' はそれぞれの部位(Keypoints)を推定し、'Short-range offsets' が画像内での部位位置の精度を高めるために使われ、'Mid-range offsets' は、部位間（例えば右上腕部）の場所を推定し、関節を繋げるために使われています。

(Instance Segmentation Module)
一方、(4)'Person segmentation mask' は人間部のピクセルマスクを推定します。それだけでは、複数人いた際に人を区別できないので、(5)'Long-range offsets' の推定結果と先ほど説明した 'Detected Human Poses' の推定結果を用いて、人ごとの領域分割を実現しています。

# 開発をするには？
* [GitHub上のソースコード](https://github.com/tensorflow/tfjs-models/tree/master/body-pix)(APIの叩き方の説明も記載されてます)
* [GitHub上の質問コーナー](https://github.com/tensorflow/tfjs/labels/bodyPix)
    * PoseNet の 転移学習、ファインチューニングについての可能性についての質問
        * https://github.com/tensorflow/tfjs/issues/1388
        * https://github.com/tensorflow/tfjs/issues/1388#issuecomment-520871523
           * > Unfortunately, the training script for PoseNet is not open-sourced. @tylerzhu-github for more details on that front.

以上から学習済モデルは公開されているが、学習するプログラムは公開されていないことがわかる。
https://github.com/tensorflow/tfjs/issues/1581#issuecomment-494636572
論文を参考にいくつか実装が提供されている：

* https://github.com/scnuhealthy/Tensorflow_PersonLab (Tensorflow ver. 1.80)
* https://github.com/octiapp/KerasPersonLab
* https://github.com/Naykira/personlab


## TensorFlow.js へのモデルの変換：
TensorFlow で学習されたモデル形式をTensorFlow.js で用いるには、 tensorflowjs_converter で変換しないといけません。

* https://techblog.exawizards.com/entry/2018/11/01/174122

最近のニュースによると、そのまま読めるようになったということですが、どうでしょうか？ @tensorflow/tfjs-node で使うもののようですが。。。


* [Run a TensorFlow SavedModel in Node.js directly without conversion (2020/01/14)](https://blog.tensorflow.org/2020/01/run-tensorflow-savedmodel-in-nodejs-directly-without-conversion.html?hl=ja)

> You can now bring a pre-trained TensorFlow model in SavedModel format, load it in Node.js through the @tensorflow/tfjs-node (or tfjs-node-gpu) package, and execute the model for inference without using tfjs-converter.



## BodyPix を Python で使う簡単な方法：
https://github.com/ajaichemmanam/simple_bodypix_python