Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在electron中使用tensorflow.js中的posenet_Javascript_Electron_Tensorflow.js_Pose Estimation - Fatal编程技术网

Javascript 在electron中使用tensorflow.js中的posenet

Javascript 在electron中使用tensorflow.js中的posenet,javascript,electron,tensorflow.js,pose-estimation,Javascript,Electron,Tensorflow.js,Pose Estimation,我正在尝试在电子应用程序中使用posenet MOBILENTEV1网络。我希望能够从文件系统中读取图像(不管它是png还是jpg),并通过网络运行它 到目前为止,我做了什么: 我正在使用以下模块: import * as posenet from '@tensorflow-models/posenet'; var imageToBase64 = require('image-to-base64'); var toUint8Array = require('base64-to-uint8arra

我正在尝试在电子应用程序中使用posenet MOBILENTEV1网络。我希望能够从文件系统中读取图像(不管它是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的定义相符

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

{
  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也可能正在检查对象是否属于某个类,除非您实际创建ImageData对象,然后设置字段。这就是为什么它不喜欢它的原因

您是否尝试过:

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

PoseNet似乎接受可以传递到其预测函数的ImageData | HTMLImageElement | HTMLCAVEASElement | HTMLVideoElement对象;可以被视为服务器端上下文(称为主上下文)和渲染器上下文(在其中调用浏览器及其脚本)的上下文。虽然这个问题还不够精确,但它试图在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
}

ReferenceError:ImageData未定义
,我不知道如何在electron中使用这些元素,我能做的最接近的事情就是复制ImageData结构。如果我以我的格式传递一个
Uint8ClampedArray
,我得到的是
错误:传递到tf.browser的像素。fromPixels()必须是HTMLVideoElement,HTMLImageElement、HTMLCanvasElement、浏览器中的ImageData或OffscreenCanvas、webworker中的ImageData或{data:uint32数组,宽度:数字,高度:数字},但was对象
,这也很奇怪(我尝试过uint32数组,它也给出了相同的错误)…是的,所以它似乎必须是这些受支持的类类型之一的实例才能工作。使用OffscreenCanvas或Canvas有什么问题?我对电子不太熟悉。当你想从开发人员转到生产人员时,这只是一个禁忌。我只是想知道为什么——我不熟悉电子环境中的建筑?在Electron中的画布实现是坏的还是什么?这家伙似乎在使用补丁:谢谢,我会尝试一下,在base64中,我是否应该删除前23个字符(
data:image/jpeg;base64,
)?这仍然不能解决低百分比的问题,你能分享一下吗?tfjs和tfjs节点版本,您正在加载什么图像(.png?.jpg?),您使用什么库创建了缓冲区?我很抱歉,如果这是恼人的,我只是想让它工作,我不知道是什么部分没有失败…缓冲区是一个本机对象在nodejs。tf.node是
@tensorflow/tfjs node
包的一部分。我不明白。您所说的不固定低百分比是什么意思?您需要删除我删除的前23个字符,但它并没有解决它,当您在electron的服务器端上下文中使用posenet时,有点不对劲,所以解决方案是将实现移动到渲染上下文。抱歉…请参阅我编辑的答案,解码后的图像应用于预测的主上下文中