Tensorflow.js:将图像调整为特定的字节大小

时间:2019-12-06 09:56:33

标签: image tensorflow.js

为了进行预测,我需要一张[null,7,7,256]形状的图像。

  

const image = tf.reshape(tf.fromPixels(loadedImage).resizeBilinear([?,?]),[null,7,7,256]);

但是我不知道如何将图像调整为正好7 * 7 * 256大。

  

错误:大小(37632)必须与形状,7、7、256的乘积匹配

编辑:预测的代码为:

tf.loadModel(tf.io.browserFiles([uploadJSONInput.files[0], uploadWeightsInput.files[0]])).then(model => {
        console.log("model loaded");
        return model;

    }).then(pretrainedModel => {
        return loadImage2('http://localhost/myimg.jpeg', (src) => {
            const loadedImage = document.createElement("img");
            loadedImage.src = src;
            loadedImage.width = "275"
            loadedImage.height = "183"
            console.log("image loaded");

            const image = tf.fromPixels(loadedImage)

            resized = tf.image.resizeBilinear(image, [7, 7])
            const padded = resized.pad([[0, 0], [0, 0], [126, 127]])

            const pretrainedModelPrediction = pretrainedModel.predict(padded);
            const modelPrediction = model.predict(pretrainedModelPrediction);
            const prediction = modelPrediction.as1D().argMax().dataSync()[0];
            console.log(prediction);
        });

    })

错误:

  

错误:检查时出错:预期flatten_Flatten1_input具有4个维,但数组的形状为[7,7,256]

2 个答案:

答案 0 :(得分:1)

ResizeBilinear将调整图像的高度和宽度的大小,这意味着它不会影响作为图像形状的最后一个维度的通道数。

如果您的图片的最后一个频道为256,则可以使用以下图片

tf.fromPixels(loadedImage).resizeBilinear([7,7])

重定张量只有在两个大小都匹配时才有效。 const image = tf.ones([183,275,3]) 调整大小= tf.image.resizeBilinear(图像,[7,7]) console.log(resize.pad([[0,0],[0,0],[126,127]])。shape);

图像的形状通常为[h,w,3]。

resize = tf.fromPixels(loadedImage).resizeBilinear([7,7]) // [7, 7, 3]

然后使用tf.pad作为最后一个尺寸

const image = tf.ones([183, 275, 3 ])
resized = tf.image.resizeBilinear(image, [7, 7])
console.log(resized.pad([[0, 0], [0, 0], [126, 127]]).shape);// [7,7,256]

// reshape the tensor to be a 4d
resized.reshape([1,7,7,256])

答案 1 :(得分:0)

如何使用Uint8Array

const canvas: any = document.getElementById('canvas')
const context = canvas.getContext('2d')
const imageData: ImageData = context.getImageData(0, 0, canvas.width, canvas.height)
const uint8array = new Uint8Array(imageData.data.buffer)
const rgbaTens3d = tf.tensor3d(uint8array, [canvas.height, canvas.width, 4])
const rgbTens3d= tf.slice3d(rgbaTens3d, [0, 0, 0], [-1, -1, 3]) // strip alpha channel
const smallImg = tf.image.resizeBilinear(rgbTens3d, [192, 192]); // 192,192 is dictated by my model