基于TensorFlow.js的Model之PoseNet解析

基于TensorFlow.js的Model之PoseNet解析

Github地址:https://github.com/tensorflow/tfjs-models/tree/master/posenet
Move Mirror:https://experiments.withgoogle.com/move-mirror
Demo:https://storage.googleapis.com/tfjs-models/demos/posenet/camera.html

一、PoseNet 介绍

PoseNet是一个基于TensorFlow.js的ML Model,可以在浏览器中进行实时人体姿态估算(pose estimation )。PoseNet既可估算单个姿势,也可估算多个姿势。

姿势估算分两个阶段进行:
1、输入RGB图像并通过卷积神经网络解析。
2、使用单姿势或多姿势解码算法,输出解码后的姿势(decode poses)、姿势置信度得分(pose confidence scores)、关键点位置(keypoint positions)和关键点置信度得分(keypoint confidence scores)。

关键词:
关键点(keypoint):在估算人体姿势的时候,PoseNet为人体选择了17个关键点,分别如下图所示。


keypoint.png

关键点位置(keypoint positions):关键点的x和y的坐标值。

二、使用PoseNet

1、导入PoseNet库

$ npm install @tensorflow-models/posenet

2、加载PoseNet Model

const net = await posenet.load(multiplier);

其中,multiplier是所有卷积运算的深度(通道数)的浮点乘数,可选取值为: 1.01、1.0、0.75、0.50。
multiplier的值越大,Model的精确度越高,解析速度越慢。
默认情况下,multiplier的值为0.75。 建议0.75用于具有中端/低端GPUS的计算机。 对于具有强大GPUS的计算机,建议multiplier为1.0。 移动设备建议使用0.50架构的型号。

3、单人姿势估算算法

单个姿态估算更简单快速,但要求用例图像中只有一人。 如果图像中有多个人,那么来自两个人的关键点可能被估计为同一个单一姿势的一部分。例如,第一个人的左臂和第2个人的右膝可能会混淆。

const net = await posenet.load();
const pose = await net.estimateSinglePose(image, imageScaleFactor, flipHorizontal, outputStride);

参数解析:
image:输入的图像(格式:ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)
imageScaleFactor:取值0.2~1.0,默认为0.50。图像的缩放值。值越低,图像越小,传输速度越快。
flipHorizontal :默认为false。 当需要姿势水平翻转时,取值为true。
outputStride:取值32、16、8,默认为16。通过模型输入图像时输出的所需跨度。 取值越大,输出越快,准确度越低。

返回值:返回pose,结构中包括:姿势的置信度分数和一个关键点数组,数组中包括每个关键点的名称、置信度分数和位置。

{
  "score": 0.32371445304906,
  "keypoints": [
    {
      "position": {
        "y": 76.291801452637,
        "x": 253.36747741699
      },
      "part": "nose",
      "score": 0.99539834260941
    },
    {
      "position": {
        "y": 71.10383605957,
        "x": 253.54365539551
      },
      "part": "leftEye",
      "score": 0.98781454563141
    },
    {
      "position": {
        "y": 71.839515686035,
        "x": 246.00454711914
      },
      "part": "rightEye",
      "score": 0.99528175592422
    },
    {
      "position": {
        "y": 72.848854064941,
        "x": 263.08151245117
      },
      "part": "leftEar",
      "score": 0.84029853343964
    },
    {
      "position": {
        "y": 79.956565856934,
        "x": 234.26812744141
      },
      "part": "rightEar",
      "score": 0.92544466257095
    },
    {
      "position": {
        "y": 98.34538269043,
        "x": 399.64068603516
      },
      "part": "leftShoulder",
      "score": 0.99559044837952
    },
    {
      "position": {
        "y": 95.082359313965,
        "x": 458.21868896484
      },
      "part": "rightShoulder",
      "score": 0.99583911895752
    },
    {
      "position": {
        "y": 94.626205444336,
        "x": 163.94561767578
      },
      "part": "leftElbow",
      "score": 0.9518963098526
    },
    {
      "position": {
        "y": 150.2349395752,
        "x": 245.06030273438
      },
      "part": "rightElbow",
      "score": 0.98052614927292
    },
    {
      "position": {
        "y": 113.9603729248,
        "x": 393.19735717773
      },
      "part": "leftWrist",
      "score": 0.94009721279144
    },
    {
      "position": {
        "y": 186.47859191895,
        "x": 257.98034667969
      },
      "part": "rightWrist",
      "score": 0.98029226064682
    },
    {
      "position": {
        "y": 208.5266418457,
        "x": 284.46710205078
      },
      "part": "leftHip",
      "score": 0.97870296239853
    },
    {
      "position": {
        "y": 209.9910736084,
        "x": 243.31219482422
      },
      "part": "rightHip",
      "score": 0.97424703836441
    },
    {
      "position": {
        "y": 281.61965942383,
        "x": 310.93188476562
      },
      "part": "leftKnee",
      "score": 0.98368924856186
    },
    {
      "position": {
        "y": 282.80120849609,
        "x": 203.81164550781
      },
      "part": "rightKnee",
      "score": 0.96947449445724
    },
    {
      "position": {
        "y": 360.62716674805,
        "x": 292.21047973633
      },
      "part": "leftAnkle",
      "score": 0.8883239030838
    },
    {
      "position": {
        "y": 347.41177368164,
        "x": 203.88229370117
      },
      "part": "rightAnkle",
      "score": 0.8255187869072
    }
  ]
}

3、多人姿势估算算法

多人姿势估算可以解码图像中的多个姿势,它比单个姿势算法更复杂且稍慢。

const net = await posenet.load();
const poses = await net.estimateMultiplePoses(image, imageScaleFactor, flipHorizontal, outputStride, maxPoseDetections, scoreThreshold, nmsRadius);

参数解析:
image:输入的图像(格式:ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)
imageScaleFactor:取值0.2~1.0,默认为0.50。图像的缩放值。值越低,图像越小,传输速度越快。
flipHorizontal :默认为false。 当需要姿势水平翻转时,取值为true。
outputStride:取值32、16、8,默认为16。通过模型输入图像时输出的所需跨度。 取值越大,输出越快,准确度越低。
(以上参数同单人姿势估算)
maxPoseDetections(可选):默认为5,要检测的最大姿势数。
scoreThreshold(可选):默认为0.5,仅返回置信度大于或等于此值的实例。
nmsRadius(可选):默认为20。非极大值抑制,以像素为单位,这个值控制返回人物之间的最小距离。该值的增加或者减少是过滤不太精确的姿态的一种方式,但只是在调整姿态置信度值不够好的情况下。

返回值:
多人姿势估算的返回值为多个单人姿势估算返回值的组成的数组。

你可能感兴趣的:(基于TensorFlow.js的Model之PoseNet解析)