#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