基于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 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。非极大值抑制,以像素为单位,这个值控制返回人物之间的最小距离。该值的增加或者减少是过滤不太精确的姿态的一种方式,但只是在调整姿态置信度值不够好的情况下。
返回值:
多人姿势估算的返回值为多个单人姿势估算返回值的组成的数组。