Javascript 将png转换为Tensor tensorflow.js

Javascript 将png转换为Tensor tensorflow.js,javascript,node.js,png,buffer,tensorflow.js,Javascript,Node.js,Png,Buffer,Tensorflow.js,我目前正试图找出如何使用tensorflow.js将输入png转换为张量,以便将其输入到模型中进行训练。目前,我正在捕获图像,将其保存在本地,使用fs.readFileSync读取图像,然后创建一个缓冲区。我有点不知所措的地方是将缓冲区值从0-244标准化为0-1,然后从这个缓冲区创建一个张量,作为X arg输入model.fit函数。我也不知道如何设置标签文件并将其正确转换为Y参数的缓冲区。()对于如何正确使用/配置tensorflow.js中的张量图像,我们将不胜感激 回购协议在这里; 在

我目前正试图找出如何使用tensorflow.js将输入png转换为张量,以便将其输入到模型中进行训练。目前,我正在捕获图像,将其保存在本地,使用fs.readFileSync读取图像,然后创建一个缓冲区。我有点不知所措的地方是将缓冲区值从0-244标准化为0-1,然后从这个缓冲区创建一个张量,作为X arg输入model.fit函数。我也不知道如何设置标签文件并将其正确转换为Y参数的缓冲区。()对于如何正确使用/配置tensorflow.js中的张量图像,我们将不胜感激

回购协议在这里;

在data.js中加载本地图像的代码

const tf = require('@tensorflow/tfjs');
const assert = require('assert');
const IMAGE_HEADER_BYTES = 32;
const IMAGE_HEIGHT = 600;
const IMAGE_WIDTH = 800;
const IMAGE_FLAT_SIZE = IMAGE_HEIGHT * IMAGE_WIDTH;

function loadHeaderValues(buffer, headerLength) {
  const headerValues = [];
  for (let i = 0; i < headerLength / 4; i++) {
    headerValues[i] = buffer.readUInt32BE(i * 4);
  }
  return headerValues;
}

...
...
class Dataset {
 async loadLocalImage(filename) {
 const buffer = fs.readFileSync(filename);

 const headerBytes = IMAGE_HEADER_BYTES;
 const recordBytes = IMAGE_HEIGHT * IMAGE_WIDTH;

 const headerValues = loadHeaderValues(buffer, headerBytes);
 console.log(headerValues, buffer);
 assert.equal(headerValues[5], IMAGE_HEIGHT);
 assert.equal(headerValues[4], IMAGE_WIDTH);

 const images = [];
 let index = headerBytes;
 while (index < buffer.byteLength) {
  const array = new Float32Array(recordBytes);
  for (let i = 0; i < recordBytes; i++) {
    // Normalize the pixel values into the 0-1 interval, from
    // the original 0-255 interval.
    array[i] = buffer.readUInt8(index++) / 255;
  }
  images.push(array);
 }

 assert.equal(images.length, headerValues[1]);
 return images;
 }
}
module.exports = new Dataset();
我知道我在这里使用model.predict,我想让tensor部分的实际图像工作,然后在repo中找出train-tensor.js中的标签和model.fit()。我没有任何用于培训的实际工作代码,所以我没有将其包括在这个问题中,如果它造成任何混乱,请道歉

再次感谢你

编辑最终工作代码

const { Image, createCanvas } = require('canvas');
const canvas = createCanvas(800, 600);
const ctx = canvas.getContext('2d');

async function loadLocalImage (filename) {
  try {
    var img = new Image()
    img.onload = () => ctx.drawImage(img, 0, 0);
    img.onerror = err => { throw err };
    img.src = filename;
    image = tf.fromPixels(canvas);
    return image;
  } catch (err) {
    console.log(err);
  }
}
...
...
async getImage(filename) {
    try {
      this.image = await loadLocalImage(filename);
    } catch (error) {
      console.log('error loading image', error);
    }
    return this.image;
  }

tensorflowjs已具有用于此的方法:

您只需将图像加载到一个可接受的类型(
ImageData | HTMLImageElement | htmlcanvaseelement | HTMLVideoElement
)中即可

图像加载承诺不返回任何内容,因为异步函数不返回任何内容,只返回回调。要解决此问题,您需要自己创建并解析承诺:

const imageGet = require('get-image-data');
async fucntion loadLocalImage(filename) {
  return new Promise((res, rej) => {
    imageGet(filename, (err, info) => {
      if (err) {
        rej(err);
        return;
      }
      const image = tf.fromPixels(info.data)
      console.log(image, '127');
      res(image);
    });
  });
}

我试过了,但是我仍然从承诺中得到了一个未定义的结果,我将把函数编辑到上面,因为注释没有中断。您的回调返回的不是您的异步函数。非常感谢!在tfjs节点中呢?在tfjs节点中,事情要简单得多,
const-readImage=path=>{const-imageBuffer=fs.readFileSync(path);const-tfimage=tfnode.node.decodeImage(imageBuffer);//默认值#channel 4 return-tfimage;}
tf.fromPixels在1.0.0版本中不推荐使用:tf.browser.fromPixels()
const imageGet = require('get-image-data');
async fucntion loadLocalImage(filename) {
  return new Promise((res, rej) => {
    imageGet(filename, (err, info) => {
      if (err) {
        rej(err);
        return;
      }
      const image = tf.fromPixels(info.data)
      console.log(image, '127');
      res(image);
    });
  });
}