如何使用webworker.postMessage将y(常量y =等待tf.toPixels(image))传输到Webworker?

时间:2019-02-14 07:37:32

标签: web-worker tensorflow.js

我想使用网络工作者来处理一些任务。

主线程:     首先,我使用tf.loadFrozenModel()加载预训练模型。其次,我使用model.predict()预测图像(尺寸:512 * 512 * 4)。当我使用const data = await tf.toPixels(image)获取图像像素,这会花费很多时间,导致UI操作导致卡纸。所以我想用webworker来解决这个问题。

const y=tf.tidy(() => {
    ......
    var output=model.predict(
                {[INPUT_NODE_NAME]: imageConcat}, OUTPUT_NODE_NAME);
    ......
    return output
  })

    webworker.postMessage({headpackage:y});//y is the predicted image

在网络工作人员中:

    importScripts('https://cdn.jsdelivr.net/npm/setimmediate@1.0.5/setImmediate.min.js')
    importScripts('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.10.3')
    var dataMessage;
    self.addEventListener('message', function (e) {
    dataMessage = e.data;
    a();

    }, false);

    async function a() {

        const data = await tf.toPixels(dataMessage["headpackage"]);

       //Change the value of image data
        var image={
            data:new Uint8Array(data),
            width:512,
            height:512
        };
        tfoutputtexture.image=image;
        tfoutputtexture.flipY=true;
        tfoutputtexture.needsUpdate = true;



}

但是失败了。 enter image description here

1 个答案:

答案 0 :(得分:1)

您可以发送类型化数组,而不是将张量对象发送给Webworker。

从版本15开始,类型化数组的形状与使用tensor.array的张量相同。

webworker.postMessage({headpackage:await y.array()})

 // Webworker

  tf.toPixels(tf.tensor(dataMessage["headpackage"]));

如果您使用的版本低于15,则需要同时输入类型数组及其形状。

 webworker.postMessage({headpackage:y.dataSync(), shape: y.shape})

 // Webworker

  tf.toPixels(tf.tensor(dataMessage["headpackage"], dataMessage["shape"]));