Преобразование png в Tensor tenorflow.js - PullRequest
0 голосов
/ 09 ноября 2018

В настоящее время я пытаюсь выяснить, как преобразовать входной png в тензор с tenorflow.js, чтобы я мог передать его в свою модель для обучения.В настоящее время я записываю изображение, сохраняю его локально, читаю его с помощью fs.readFileSync, а затем создаю буфер.Там, где я немного потерян, происходит нормализация значений буфера от 0-244 до 0-1, затем создается тензор из этого буфера для подачи в функцию model.fit в качестве X arg.Я также не знаю, как настроить файл меток и правильно преобразовать его в буфер для Y arg.(https://js.tensorflow.org/api/0.11.2/#tf.Model.fit) Любое понимание правильного использования / конфигурации изображений в тензорах для использования tenorflow.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.fit () в train-tenor.js в репозитории. У меня нет действительного рабочего кода для обучения, поэтому я не включил его в этот вопрос, извините, если это вызвалолюбая путаница.

Еще раз спасибо!

Редактировать окончательный рабочий код

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;
  }

1 Ответ

0 голосов
/ 09 ноября 2018

tenorflowjs уже имеет метод для этого: tf.fromPixels(), tf.browser.fromPixels().

Вам просто нужно загрузить изображение в один из принятых типов (ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement).

Загрузка вашего изображения Promise ничего не возвращает, потому что ваша асинхронная функция ничего не возвращает, только ваш обратный вызов, чтобы исправить это, вам нужно создать и разрешить обещание самостоятельно:

const imageGet = require('get-image-data');
async 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);
    });
  }
...