「posenet」には、人間の姿勢が検出できるPoseNet Modelがあります。このモデルには、イメージやビデオ内の1人の人間の姿勢を検出するバージョンと、複数の姿勢を検出するバージョンがあります。
posenetを使用するには、次のようにTensorFlow.jsとposenetを読み込みます。
<script src="https://unpkg.com/@tensorflow/tfjs"></script>
<script src="https://unpkg.com/@tensorflow-models/posenet"></script>
姿勢の情報として得られる値には、kyepointsという名前の配列が含まれています。この配列には、次のインデックスで、人間の各部位の情報が含まれます。
id | part
0 | nose
1 | leftEye
2 | rightEye
3 | leftEar
4 | rightEar
5 | leftShoulder
6 | rightShoulder
7 | leftElbow
8 | rightElbow
9 | leftWrist
10 | rightWrist
11 | leftHip
12 | rightHip
13 | leftKnee
14 | rightKnee
15 | leftAnkle
16 | rightAnkle
PoseNetモデルを読み込むには、次のようにします。
const net = await posenet.load(multiplier);
引数:
multiplier:オプションの乗数値。1.01, 1.0, 0.75,または0.50。デフォルトは1.01。値が大きいほど、モデルのレイヤーサイズも大きくなり、モデルの精度は増すがスピードを犠牲にする。 小さい値に設定すると、スピードは速くなるが、精度が犠牲になる。
PoseNetはデフォルトで、1.01乗数モデルを読み込む。これはパワフルなGPUを持つコンピュータ向け。0.75乗数モデルは中級、低級のGPUを持つコンピュータに、0.50はモバイルに推奨される。
1人の姿勢
1人の姿勢検出には、net.estimateSinglePose()が利用できます。
const pose = await net.estimateSinglePose(image, imageScaleFactor, flipHorizontal, outputStride);
引数:
image:ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement ネットワークに通す入力イメージ。
imageScaleFactor :0.2と1.0の間の数値。デフォルトは0.50。 ネットワークに通す前にどれだけイメージを縮小するか。 この値を小さく設定してイメージを縮小すると、ネットワークを通るスピードは速くなるが、精度が犠牲になる。
flipHorizontal:デフォルトはfalse。姿勢を左右反転すべき場合、デフォルトで左右反転するビデオ(たとえばWebカメラ)ではtrueに設定し、姿勢を適切な向きに直す。
outputStride:モデルにイメージを通すときに希望する出力用stride。32か16, 8でなくてはならない。 デフォルトは16。高い値ほどパフォーマンスが向上するが、精度が落ちる。その逆も真。
戻り値:
確率と、part idでインデックス化された配列を持つpose。
複数人の姿勢
複数人の姿勢検出には、 net.estimateMultiplePoses()が利用できます。また1人の姿勢検出の場合でも、このメソッドの方が適している場合もあります。
const poses = await net.estimateMultiplePoses(image, imageScaleFactor, flipHorizontal, outputStride, maxPoseDetections, scoreThreshold, nmsRadius);
引数:
maxPoseDetections(オプション):判定する姿勢の最大数。デフォルトは5。
scoreThreshold (オプション) :この値以上のルートスコアを持つ判定インスタンスを返す。デフォルトは0.5。
nmsRadius (オプション) :Non-maximum suppressionアルゴリズムによる部位間の距離。厳密に正である必要がある。 2つの部位は、互いにnmsRadiusピクセルよりも離れていない場合、抑制し合う。デフォルトは20。 「物体検出におけるNon-Maximum Suppressionのアルゴリズム」参照。
戻り値:
pose配列で解決するPromise