Итак, я обучил модель 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, и они дают точные прогнозы. Любая помощь приветствуется.