我正在使用Google的mobilenet神经元网络对图像进行分类。我正在使用angular 6 + tensorflowJS构建我的图像分类器应用。
我正在尝试遵循tfjs-converter library readme提供的步骤,并且想到了以下代码:
import * as tf from '@tensorflow/tfjs';
import { FrozenModel } from '@tensorflow/tfjs';
export class NeuronalNetwork {
private MODEL_PATH: string = 'http://localhost:4200/assets/model/tensorflowjs_model.pb';
private WEIGHTS_PATH: string = 'http://localhost:4200/assets/model/weights_manifest.json';
constructor(){}
async loadModel() {
const localModel: FrozenModel = (await tf.loadFrozenModel(this.MODEL_PATH, this.WEIGHTS_PATH));
let image: any = document.getElementById('cat');
let pixels = tf.fromPixels(image, 1);
let result = localModel.predict(pixels);
}
async predict(){
let image: any = document.getElementById('cat');
debugger;
this.model.execute({input: tf.fromPixels(image)});
}
}
图片HTML元素:
<img id="cat" src="http://localhost:4200/assets/images/cat.jpg"/>
当我尝试执行localModel.predict(pixels)
函数时,出现以下错误:
未捕获(承诺):错误:model.execute(dict)中提供的dict ['images']的形状必须为[-1,224,224,3],但为[400,600,1]
我是Tensorflow和TensorflowJS技术的新手。有人知道我在做什么错吗?
答案 0 :(得分:0)
该错误表明模型中定义的形状与传递给模型的输入的形状不匹配。要解决此问题,您必须重塑输入内容。
但是,由于没有整数k,例如k*224*224*3
等于400*600*1
,因此无法使用输入的tf.reshape。可以考虑使用tf.slice对输入图像进行切片,以便仅保留图像的必要形状。
const a = tf.randomNormal([400, 600, 3])
// a has shape [400, 600, 3]
// a cannot be reshaped into [224, 224, 3]
// a can be sliced into [224, 224, 3]
const b = a.slice([0, 0, 0], [224, 224, 3])
答案 1 :(得分:0)
遇到相同的问题,然后在Github中找到解决方案:Input appears to be wrong shape
const img = document.getElementById('myimg');
const tfImg = tf.fromPixels(img);
const smalImg = tf.image.resizeBilinear(tfImg, [368, 432]);
const resized = tf.cast(smalImg, 'float32');
const t4d = tf.tensor4d(Array.from(resized.dataSync()),[1,368,432,3])
答案 2 :(得分:0)
这个错误可能是因为模型需要一批图像而不是只有一个图像。要修复它,可以使用 expandDims
插入额外的维度。
let result = localModel.predict(tf.fromPixels(image).expandDims(0));
答案 3 :(得分:0)
在使用 MobileNet 预测图像之前,您需要以特定方式对图像进行预处理。 以下是使用 TensorFlow.js 的方法:
startup.m
现在你可以预测预处理后的图像(张量):
let image: any = document.getElementById('cat');
// resize the input image to (224, 224)
let tensor = tf.browser.fromPixels(image).resizeNearestNeighbor([224, 224]).toFloat();
// feature scale tensor image to range [-1, 1]
let offset = tf.scalar(127.5);
tensor = tensor.sub(offset).div(offset).expandDims();
您可以看到更多相关代码here。