在电子中使用张量流.js的posenet

我正在尝试在电子应用程序中使用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,而不是使用它们来创建对象 ,这符合ImageData的定义。{data: bytes, width: width, height: height}


一切都在运行,但百分比的结果非常低:


{

  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,那就太好了,因为我已经为此工作了很长时间。


慕田峪9158850
浏览 111回答 2
2回答

慕田峪7331174

电子有两个独立的上下文;一个可以被视为服务器端上下文的上下文,称为主上下文和呈现器上下文,其中调用浏览器及其脚本。虽然这个问题不够精确,但它试图在电子的主要上下文中执行posenet,这可以进行比较,就好像有人试图在nodejs中运行此代码一样。主渲染器中的 posenetconst 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来自浏览器执行的脚本的posenetconst im = new Image()im.src = base64strconst 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}

MYYA

即使您复制了结构,也许PoseNet正在检查对象是否属于某个类,除非您实际创建ImageData对象然后设置字段,否则它不会是。这就是我对它为什么不喜欢它的猜测。您是否尝试过:let clamped = Uint8ClampedArray.from(someframeBuffer); let imageData = new ImageData(clamped, width, height);PoseNet似乎接受ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement 对象,可以传递给其预测函数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript