在NodeJS中,对位于服务器上的图像进行Posenet处理
以TensorflowJS Posenet推定瀏覽器顯示圖像或網頁攝像頭中人體的姿勢。為什麼要將在瀏覽器中執行的內容轉移到NodeJS上運行呢?原因是為了減輕客戶端處理負擔,並且能夠較容易地與PHP、MySQL等WEB環境進行連動。
首先,我使用Mac,尝试使用NodeJS对存放在特定文件夹中的图像进行姿势估计。
必需的库和组件
不好意思,我会简略解释一下。
节点画布
安装用于运行 node-canvas 的库。
$ brew install pkg-config cairo pango libpng jpeg giflib
安装 node-canvas
$ npm install --save canvas botkit
TensorFlowJS在NodeJS中。
使用 npm 进行安装。
$ npm install --save rollup
$ npm install --save @tensorflow/tfjs@^1.1.0
$ npm install --save @tensorflow-models/posenet
$ npm install --save @tensorflow/tfjs-node
GPUの場合
$ npm install --save @tensorflow/tfjs-node-gpu
请注意。
使用tfjs-node而不是tfjs。
//const tf = require('@tensorflow/tfjs');
const tf = require('@tensorflow/tfjs-node');
将图像投影到Canvas上,然后转换为张量,并执行estimateSinglePose()函数。
虽然NodeJS在批处理中运行时没有DOM,但可以使用”node-canvas”库像操作DOM一样处理Canvas标签。
var imageScaleFactor = 0.5;
var outputStride = 16;
var flipHorizontal = false;
// モデルのロード
var net = await posenet.load(0.75);
const img = new Image();
img.src = './hoge.jpg';
const canvas = createCanvas(img.width, img.height);
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
// Tensor型に変換
const input = tf.browser.fromPixels(canvas);
// 姿勢JSON取得
const pose = await net.estimateSinglePose(input, imageScaleFactor, flipHorizontal, outputStride);
console.log(pose);
结果
{
score: 0.8253553825266221,
keypoints: [
{ score: 0.9589502215385437, part: 'nose', position: [Object] },
{ score: 0.6782095432281494, part: 'leftEye', position: [Object] },
{ score: 0.9743408560752869, part: 'rightEye', position: [Object] },
{ score: 0.3834344744682312, part: 'leftEar', position: [Object] },
{ score: 0.9573087692260742, part: 'rightEar', position: [Object] },
{
score: 0.9608330726623535,
part: 'leftShoulder',
position: [Object]
},
{
score: 0.970580518245697,
part: 'rightShoulder',
position: [Object]
},
{
score: 0.5824703574180603,
part: 'leftElbow',
position: [Object]
},
{
score: 0.8478972911834717,
part: 'rightElbow',
position: [Object]
},
{
score: 0.4102041721343994,
part: 'leftWrist',
position: [Object]
},
{
score: 0.43626463413238525,
part: 'rightWrist',
position: [Object]
},
{ score: 0.9976338148117065, part: 'leftHip', position: [Object] },
{ score: 0.9926899671554565, part: 'rightHip', position: [Object] },
{ score: 0.9901325702667236, part: 'leftKnee', position: [Object] },
{
score: 0.9896235466003418,
part: 'rightKnee',
position: [Object]
},
{
score: 0.9450682401657104,
part: 'leftAnkle',
position: [Object]
},
{
score: 0.9553994536399841,
part: 'rightAnkle',
position: [Object]
}
]
}
最后,根据这个坐标,将关键点绘制在画布上,并使用fs.writeFile()将画布输出就可以了。
多张上传到服务器的图片将能够添加姿势估计线。
使用FFmpeg将MP4慢动作视频按照每秒一帧进行剪切并处理40张图像,大约需要三分钟。这一过程确实需要GPU才能应对吗?
通过这样生成带有关键点和骨骼的图像,我们可以进一步使用ffmpeg创建带有关键点和骨骼的动画。还可以将其写入JSON文件,或者使用canvas生成只包含关键点和骨骼的动画。使用服务器上的TensorFlow和Posenet,可能可以实现与Openpose相媲美的功能。虽然处理速度可能不太快。。
我认为在CentOS和Ubuntu上也可以以相同的方式实现。
