Объект теряет свой тип после перехода к функции в предварительно загруженном скрипте

#javascript #typescript #vue.js #electron #tensorflow.js

#javascript #typescript #vue.js #электрон #tensorflow.js

Вопрос:

У меня есть небольшое настольное приложение, которое отображает видеопоток с камеры, делает снимок и передает его в нейронную сеть.

Когда я беру изображение, его тип Tensor , как и ожидалось, но после передачи его в функцию, отвечающую за классификацию, он теряет свой тип и становится простым объектом.

Структура выглядит следующим образом:

CameraSource <- Vue.js компонент, отвечающий за отображение видеопотока внутри <video> элемента и вызов функции

ImageRecognizer <- обычный класс, который использует @tensorflow/tfjs-node и предварительно загружается в окно

Теперь код выглядит следующим образом :

Источник камеры.vue

 async test() {
      let vid: HTMLVideoElement = this.$refs.camera_preview as HTMLVideoElement;
      const img = tf.browser.fromPixels(vid);
      console.log(img); <- here it's a Tensor
      await window.api.test(img);
    }
 

image_recognition.ts изображение распознавания

 public async checkForObject(image: tf.Tensor): Promise<tf.Tensor<tf.Rank> | tf.Tensor<tf.Rank>[]> {
        console.log(image); <- here it lose's it's Tensor type, and becomes an object
        let reshaped = image.reshape([-1,720,1280,1]); <- this won't work, since image is not a Tensor
        return this.model.predict(image);
   }
 

предварительная нагрузка.ts

 const imageRecognizer = new ImageRecognition(720, 1280, 3);

contextBridge.exposeInMainWorld("api", {
    test: (image: tf.Tensor): Promise<tf.Tensor<tf.Rank> | tf.Tensor<tf.Rank>[]> => {
        return imageRecognizer.checkForObject(image)
    }
});
 

объявление типа

 declare global {
    interface Window {
        api: {
            test: (image: tf.Tensor) => Promise<tf.Tensor<tf.Rank> | tf.Tensor<tf.Rank>[]>
        }
    }
}
 

Происходит ли это потому, что я пытаюсь передать объект в «серверную часть» приложения electron? Есть ли какой-нибудь способ предотвратить это?

Тензор теряет свой тип

Ответ №1:

Хорошо, я должен был более внимательно прочитать документацию.

ContextBridge копирует значения, поэтому может обрабатывать только некоторые типы. Для использования сложных типов, например Tensor3D , рекомендуется сериализовать и десериализовать значения соответственно.

Здесь все сказано: Документация Electron contextBridge