在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上也可以以相同的方式实现。

tiger2.jpg
广告
将在 10 秒后关闭
bannerAds