decodePng в тензорном потоке js выдает ошибку формы - PullRequest
1 голос
/ 08 февраля 2020

Я пытаюсь следовать учебнику и просто хочу загрузить изображение в TensorFlow JS.

import * as tf from '@tensorflow/tfjs-node';
import fs from 'fs';

(async () => {
  const desk = fs.readFileSync(__dirname + '/' + 'desk.png');
  const buf = Buffer.from(desk);
  const imageArray = new Uint8Array(buf);
  const pngDecodedTensor = tf.node.decodePng(imageArray);
})();

Когда я запускаю приведенный выше код, я вижу эту ошибку:

The shape of dict['image_tensor'] provided in model.execute(dict) must be [-1,-1,-1,3], but was [1,4032,3024,4]

Размер изображения 3024x4032 и 10,4 МБ

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Эта проблема связана с формой тензора при прогнозировании. Модель ожидает тензор с 3 каналами, в то время как время, переданное в качестве аргумента, имеет 4 канала.

Тензор может быть разрезан так, чтобы использовать только 3 из его 4 каналов.

pngDecodedTensor = tf.node.decodePng(imageArray).slice([0], [-1, -1, 3])
1 голос
/ 08 февраля 2020

Вы можете попробовать функцию fromPixels следующим образом:

const { Image } = require('canvas')

// From a buffer:
fs.readFile('images/squid.png', (err, squid) => {
  if (err) throw err
  const img = new Image()
  img.onload = () => ctx.drawImage(img, 0, 0)
  img.onerror = err => { throw err }
  img.src = squid
})

// From a local file path:
const img = new Image()
img.onload = () => ctx.drawImage(img, 0, 0)
img.onerror = err => { throw err }
img.src = 'images/squid.png'

// From a remote URL:
img.src = 'http://picsum.photos/200/300'
// ... as above

var imgAsTensor = tf.fromPixels(img);
// ... now use it as you wish.

Подробнее об этой функции можно узнать здесь:

...