Как на самом деле распознать число, используя уже обученную модель?

#tensorflow.js

#tensorflow.js

Вопрос:

Я просмотрел руководство tensorflowjs по распознаванию рукописных цифр для узла, и в итоге у меня есть папка с двумя файлами: model.json, weights.bin. Теперь я хочу использовать эту модель для распознавания числа на изображении.

 const tf = require('@tensorflow/tfjs-node');
const path = require('path');
const jimp = require('jimp');

async function loadModel() {
  const model = await tf.loadLayersModel(`file://${path.resolve('./model/model.json')}`); // load model
  jimp.read('img0.png').then(img => { // load image with white background and black handwritten number
    img.resize(28, 28).greyscale().invert(); // resize the image and make background black and the number itself white
    console.log(img.bitmap.data.length);
    const buffer = img.bitmap.data.reduce((acc, curr, idx) => { // removing gba bytes so we have only value of r, which is a number in range 0-255
      if (idx % 4 === 0) {
        acc.push(curr);
      }
      return acc;
    }, []);
    console.log(buffer.length); // now we have 28x28 bytes
    const imageShape = [buffer.length, 28, 28, 1]; // I have no idea
    const image = new Float32Array(tf.util.sizeFromShape(imageShape)); // what
    image.set(buffer); // I'm 
    const prediction = model.execute(tf.tensor4d(image, imageShape)); // doing 
    console.log(prediction); // here
  });
}
loadModel();
  

Итак, у меня есть буфер из 784 байт, который соответствует 784 значениям пикселей изображения, и я хочу получить предсказание в виде одного числа, но я не знаю, как это сделать.

ОБНОВЛЕНИЕ: я использовал predict вместо execute , а затем вызвал print() , и это дало мне результат!

Ответ №1:

Чтобы использовать вашу модель для вывода, тензор должен иметь форму [28,28,1] для одного изображения. Но поскольку модель predict принимает пакеты изображений, тензор для передачи его вашей функции predict должен иметь форму [b, 28,28,1], где b — количество изображений, количество которых должно быть предсказано. Также рассмотрите возможность использования predict вместо execute .

Вот изменение:

 const image = new Float32Array(28*28*1);
image.set(buffer); 
const prediction = model.predict(tf.tensor4d(image, [1, 28, 28, 1]))
  

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

1. теперь он сообщает об ошибке: не удается найти символьные значения для выходных имен: [null]. Я предполагаю, что мне нужно передать эти символьные тензоры в качестве второго параметра execute в виде массива строк или просто одной строки, но какие значения я должен использовать? Я попробовал «точность», но это не помогло получить результаты.

2. да, но мне это не очень помогло, так как к тому времени я уже разобрался