将 png 转换为张量 tensorflow.js
Converting png to Tensor tensorflow.js
我目前正在尝试弄清楚如何使用 tensorflow.js 将输入 png 转换为张量,以便我可以将其输入到我的模型中进行训练。目前我正在捕获图像,将其保存在本地,使用 fs.readFileSync 读取它,然后创建一个缓冲区。我有点迷路的地方是将缓冲区值从 0-244 标准化为 0-1,然后从该缓冲区创建一个张量以作为 X arg 馈入 model.fit 函数。我也不知道如何设置我的标签文件并将其正确转换为 Y arg 的缓冲区。 (https://js.tensorflow.org/api/0.11.2/#tf.Model.fit) 任何关于正确使用/配置图像到张量以使用 tensorflow.js 的见解将不胜感激。
回购在这里;
https://github.com/Durban-Designer/Fighter-Ai
在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();
app.js 中的图像捕获循环;
const ioHook = require("iohook");
const tf = require('@tensorflow/tfjs');
var screenCap = require('desktop-screenshot');
require('@tensorflow/tfjs-node');
const data = require('./src/data');
const virtKeys = require('./src/virtKeys');
const model = require('./src/model');
var dir = __dirname;
var paused = true;
var loopInterval,
image,
imageData,
result
ioHook.on('keyup', event => {
if (event.keycode === 88) {
if (paused) {
paused = false;
gameLoop();
} else {
paused = true;
}
}
});
ioHook.start();
function gameLoop () {
if (!paused) {
screenCap(dir + '\image.png', {width: 800, height: 600, quality: 60}, function (error, complete) {
if (error) {
console.log(error);
} else {
imageData = await data.getImage(dir + '\image.png')
console.log(imageData);
result = model.predict(imageData, {batchSize: 4});
console.log(result);
gameLoop();
}
})
}
}
我知道我在这里使用 model.predict,我想将实际图像获取到张量部分,然后找出标签和 model.fit() in train-tensor.js in the repo .我没有任何用于训练的实际工作代码,所以我没有将其包含在这个问题中,如果造成任何混淆,我们深表歉意。
再次感谢!
编辑最终工作代码
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 已经有一个方法:tf.fromPixels(), tf.browser.fromPixels()
.
您只需要将图像加载到可接受的类型中(ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement
)。
你的图像加载承诺 return 什么都没有,因为你的异步函数没有 return 任何东西,只是你的回调,要解决这个问题你需要自己创建和解决承诺:
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);
});
});
}
我目前正在尝试弄清楚如何使用 tensorflow.js 将输入 png 转换为张量,以便我可以将其输入到我的模型中进行训练。目前我正在捕获图像,将其保存在本地,使用 fs.readFileSync 读取它,然后创建一个缓冲区。我有点迷路的地方是将缓冲区值从 0-244 标准化为 0-1,然后从该缓冲区创建一个张量以作为 X arg 馈入 model.fit 函数。我也不知道如何设置我的标签文件并将其正确转换为 Y arg 的缓冲区。 (https://js.tensorflow.org/api/0.11.2/#tf.Model.fit) 任何关于正确使用/配置图像到张量以使用 tensorflow.js 的见解将不胜感激。
回购在这里; https://github.com/Durban-Designer/Fighter-Ai
在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();
app.js 中的图像捕获循环;
const ioHook = require("iohook");
const tf = require('@tensorflow/tfjs');
var screenCap = require('desktop-screenshot');
require('@tensorflow/tfjs-node');
const data = require('./src/data');
const virtKeys = require('./src/virtKeys');
const model = require('./src/model');
var dir = __dirname;
var paused = true;
var loopInterval,
image,
imageData,
result
ioHook.on('keyup', event => {
if (event.keycode === 88) {
if (paused) {
paused = false;
gameLoop();
} else {
paused = true;
}
}
});
ioHook.start();
function gameLoop () {
if (!paused) {
screenCap(dir + '\image.png', {width: 800, height: 600, quality: 60}, function (error, complete) {
if (error) {
console.log(error);
} else {
imageData = await data.getImage(dir + '\image.png')
console.log(imageData);
result = model.predict(imageData, {batchSize: 4});
console.log(result);
gameLoop();
}
})
}
}
我知道我在这里使用 model.predict,我想将实际图像获取到张量部分,然后找出标签和 model.fit() in train-tensor.js in the repo .我没有任何用于训练的实际工作代码,所以我没有将其包含在这个问题中,如果造成任何混淆,我们深表歉意。
再次感谢!
编辑最终工作代码
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 已经有一个方法:tf.fromPixels(), tf.browser.fromPixels()
.
您只需要将图像加载到可接受的类型中(ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement
)。
你的图像加载承诺 return 什么都没有,因为你的异步函数没有 return 任何东西,只是你的回调,要解决这个问题你需要自己创建和解决承诺:
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);
});
});
}