Как запустить модель сегментации UNet в Javascript с помощью tensorflow JS?

#javascript #image-segmentation #tensorflow.js

Вопрос:

У меня была неустановленная модель, которую я обучал с помощью Python. Я сохранил полную модель как Model.h5 файл.

Согласно документации tensorflow JS — Как импортировать модель keras, я преобразовал модель с помощью tensorflowjs_converter инструмента. Теперь у меня есть Model.json куча файлов-осколков.

Мой вопрос в том, как мне использовать эту модель в файле Javascript для выполнения сегментации изображения?

Мне удалось загрузить модель и распечатать сводку модели в консоли, вот код, который я использовал для этого:

 async function app() {
    
   model = await tf.loadLayersModel(MODEL_JSON_PATH);
   model.summary();
}
 

Это краткое описание модели из консоли браузера:

 Layer (type)                    Output shape         Param #     Receives inputs                   
==================================================================================================
input_1 (InputLayer)            [null,1024,1024,3]   0                                            
conv1_pad (ZeroPadding2D)       [null,1026,1026,3]   0           input_1[0][0]                    
conv1 (Conv2D)                  [null,512,512,32]    864         conv1_pad[0][0]                  
.... <Many more layers here> ....
Total params: 6315522
Trainable params: 6298882
Non-trainable params: 16640
 

Таким образом, модель, похоже, загружена идеально.

Теперь предположим, что у меня есть изображение на моей веб-странице в img теге. Как мне передать это изображение моей модели и получить результат? Я видел tf.browser.fromPixels , но не знаю, как действовать дальше.

Любая помощь / указатели на такие примеры будут полезны.

Ответ №1:

ХТХ:

 const img = document.getElementById(elementID);
const tensor = tf.browser.fromPixels(img); // creates tensor from image element
const model = await tf.loadLayersModel(MODEL_JSON_PATH); // load your model
const res = model.predict(tensor); // or model.execute(tensor) // run model
tf.dispose(tensor); // dispose input tensor
const data = await res.arraySync(); // download results from tensor into standard array
tf.dispose(res); // dispose results tensor
console.log(data);
 

обновленный

Ошибка при проверке : ожидалось, что input_1 будет иметь форму [null,1024,1024,3], но получил массив с формой [512,512,3]

 const resized = tf.resizeBilinear(tensor, [1024, 1024]);
const expanded = tf.expandDims(resized, 0);
...
 

Комментарии:

1. Я знаю, что опоздал, но когда я использую это, я получаю ошибку : Error when checking : expected input_1 to have shape [null,1024,1024,3] but got array with shape [512,512,3]. Есть идеи, как это решить?

2. Я отредактировал ответ, чтобы включить это…