Моя собственная модель тензорного потока реакции (которую я преобразовал из keras с помощью tf js converter) дает одинаковый прогноз для каждого изображения. - PullRequest
0 голосов
/ 06 августа 2020

Итак, я обучил модель keras 3 классам для распознавания изображений. Затем я преобразовал эту модель, чтобы использовать ее в Tensorflow Js, что дало мне модель. json и файл веса. Я загрузил эту модель в собственное приложение React, следуя этому сообщению в блоге -> https://blog.tensorflow.org/2020/02/tensorflowjs-for-react-native-is-here.html

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

  // Function converts image to tensor
  const imageToTensorf = (rawImageData) => {
    console.log("Converting Image to tensor");
    const TO_UINT8ARRAY = true;
    const { width, height, data } = jpeg.decode(rawImageData, TO_UINT8ARRAY);
    console.log(`width of the image -> ${width} and ${height}`);

    const buffer = new Uint8Array(width * height * 3);
    let offset = 0;
    for (let i = 0; i < buffer.length; i += 3) {
      buffer[i] = data[offset];
      buffer[i + 1] = data[offset + 1];
      buffer[i + 2] = data[offset + 2];

      offset += 4;
    }

    const normed = [];
    for (let i = 0; i < buffer.length; i++) normed[i] = buffer[i] / 244.0; // Normalize

    return tf.tensor3d(normed, [height, width, 3]).expandDims();
  };

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

  //Main Function
  async function predictPose() {
    console.log("Processing Images");
    const image = require("./assets/img/t4.jpg");
    const imageAssetPath = Image.resolveAssetSource(image);
    const response = await fetch(imageAssetPath.uri, {}, { isBinary: true });
    const rawImageData = await response.arrayBuffer();
    const imageTensor = imageToTensorf(rawImageData);

    console.log(`Shape of image tensor -> ${imageTensor.shape}`);

    const model = await tf
      .loadLayersModel(bundleResourceIO(modelPath, modelWeights))
      .then((m) => {
        console.log("Model Loaded Sucessfully !! ");

        console.log("here shape of image tensor is ", imageTensor.shape);

        const pred = m.predict(imageTensor);

        console.log("prediction complete");
        console.log(pred);

        console.log("//////////////////");

        console.log(pred.dataSync());
      })
      .catch((err) => console.log(`Error !! ${err}`));

    // 0 0 1

    return model;
  }

Независимо от того, какое изображение я передаю, оно всегда дает один и тот же результат. Я убедился, что изменяю размер изображения до 224X224, прежде чем передать его и нормализовать. Ниже приведен мой журнал:

Tensorflow is ready . . .
Processing Images
Converting Image to tensor
width of the image -> 224 and 224
Shape of image tensor -> 1,224,224,3
Model Loaded Sucessfully !! 
here shape of image tensor is  Array [
  1,
  224,
  224,
  3,
]
prediction complete
Tensor {
  "dataId": Object {},
  "dtype": "float32",
  "id": 1865,
  "isDisposedInternal": false,
  "kept": false,
  "rankType": "2",
  "scopeId": 969,
  "shape": Array [
    1,
    3,
  ],
  "size": 3,
  "strides": Array [
    3,
  ],
}
////////////////// Result : - //
Float32Array [
  0,
  0,
  1,
]

Я тестировал те же изображения на моей оригинальной модели keras, и они дают точные прогнозы. Любая помощь приветствуется.

...