在电子中使用来自 tensorflow.js 的 posenet

Use posenet from tensorflow.js in electron

我正在尝试在电子应用程序中使用 posenet MobileNetV1 网络。我希望能够从文件系统中读取图像(不管是 png 还是 jpg),并通过网络 运行 它。

到目前为止我做了什么:

我正在使用以下模块:

import * as posenet from '@tensorflow-models/posenet';
var imageToBase64 = require('image-to-base64');
var toUint8Array = require('base64-to-uint8array')

并初始化网络:

var net = posenet.load();

为了读取图像,我将其转换为 base64 而不是 Uint8Array,而不是我使用它们创建对象 {data: bytes, width: width, height: height},这符合 ImageData 的定义。

一切都是 运行ning 但百分比结果非常低:

{
  score: 0.002851587634615819,
  keypoints: [
    { score: 0.0007664567674510181, part: 'nose', position: [Object] },
    {
      score: 0.0010295170359313488,
      part: 'leftEye',
      position: [Object]
    },
    {
      score: 0.0006740405224263668,
      part: 'rightEye',
      position: [Object]
    },

请注意,将来我打算构建此应用程序,因此像 Canvas 这样的模块并不好,因为它构建得不好。

如果有人能给我一个工作的 poc,那就太好了,因为我已经为此工作了很长时间。

即使您复制了结构,也许 PoseNet 正在检查对象是否属于某个 class,除非您实际创建 ImageData 对象然后设置字段,否则它不会。这就是我对它不喜欢它的原因的猜测。

你试过了吗:

let clamped = Uint8ClampedArray.from(someframeBuffer);
let imageData = new ImageData(clamped, width, height);

PoseNet 似乎接受可以传递给其预测函数的 ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement 对象。

electron 有两个独立的上下文;一个可以被认为是称为主上下文的服务器端上下文和调用浏览器及其脚本的渲染器上下文。虽然问题不够精确,但它试图在 electron 的主要上下文中执行 posenet,这可以类比为试图 运行 nodejs 中的此代码

主渲染器中的 posenet

const data = Buffer.from(base64str, 'base64')
const t = tf.node.decodeImage(data)
const net = await posenet.load()
const poses = net.estimateMultiplePoses(t, {
      flipHorizontal: false,
      maxDetections: 2,
      scoreThreshold: 0.6,
      nmsRadius: 20})
  })
  // do whatever with the poses

来自浏览器执行的脚本的 posenet

const im = new Image()
im.src = base64str
const net = await posenet.load()
im.onload = async() => {
 const poses = await net.estimateMultiplePoses(im, {
      flipHorizontal: false,
      maxDetections: 2,
      scoreThreshold: 0.6,
      nmsRadius: 20})
  })
  // do whatever with the poses
}