Как передать y (const y = await tf.toPixels (изображение)) веб-работнику с помощью webworker.postMessage? - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу использовать веб-рабочий для решения некоторых задач.

Основной поток: во-первых, я использую tf.loadFrozenModel () для загрузки модели предварительного обучения. Во-вторых, я использую model.predict () дляпредсказание изображения (размер: 512 * 512 * 4). Когда я использую const data = await tf.toPixels(image), чтобы получить пиксели изображения, это занимает много времени, в результате чего операция пользовательского интерфейса вызывает замятие.Поэтому я хочу использовать 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

В webworker:

    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 голосов
/ 14 февраля 2019

Вместо отправки тензорного объекта веб-работнику, вы можете отправить типизированный массив.

Начиная с версии 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"]));
...