TFJS: 0.15.1
TFJS-Node: 0.3.0
Node version: 11.6.0
NPM version: 6.7.0
I was trying to access the webcam and use the posenet model on it, but when I estimate a single pose, I got this error:
(node:12844) UnhandledPromiseRejectionWarning: Error: Shape does not match typed-array in bindData() (num_elements=648, array_length=0)
at NodeJSKernelBackend.getInputTensorIds (G:\NodeJS\node-posenet\node_modules\@tensorflow\tfjs-node\dist\nodejs_kernel_backend.js:146:38)
at NodeJSKernelBackend.executeSingleOutput (G:\NodeJS\node-posenet\node_modules\@tensorflow\tfjs-node\dist\nodejs_kernel_backend.js:186:73)
at NodeJSKernelBackend.conv2d (G:\NodeJS\node-posenet\node_modules\@tensorflow\tfjs-node\dist\nodejs_kernel_backend.js:650:21)
at environment_1.ENV.engine.runKernel.x (G:\NodeJS\node-posenet\node_modules\@tensorflow\tfjs-core\dist\ops\conv.js:85:86)
at G:\NodeJS\node-posenet\node_modules\@tensorflow\tfjs-core\dist\engine.js:129:26
at Engine.scopedRun (G:\NodeJS\node-posenet\node_modules\@tensorflow\tfjs-core\dist\engine.js:101:23)
at Engine.runKernel (G:\NodeJS\node-posenet\node_modules\@tensorflow\tfjs-core\dist\engine.js:127:14)
at conv2d_ (G:\NodeJS\node-posenet\node_modules\@tensorflow\tfjs-core\dist\ops\conv.js:85:40)
at Object.conv2d (G:\NodeJS\node-posenet\node_modules\@tensorflow\tfjs-core\dist\ops\operation.js:23:29)
at Tensor.conv2d (G:\NodeJS\node-posenet\node_modules\@tensorflow\tfjs-core\dist\tensor.js:808:26)
const tf = require('@tensorflow/tfjs');
tf.disableDeprecationWarnings();
require('@tensorflow/tfjs-node');
const NodeWebcam = require('node-webcam');
const Posenet = require('@tensorflow-models/posenet');
global.XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
const requestAnimationFrame = require('raf');
const { createCanvas, Image } = require('canvas');
const posenetConfiguration = {
imageScaleFactor: 0.6,
multiplier: 0.75,
outputStride: 16,
reversed: false,
};
const canvas = createCanvas(1920, 1080);
const ctx = canvas.getContext('2d');
let webcam = null;
let net = null;
const initWebcam = () => {
return new Promise((resolve) => {
webcam = NodeWebcam.create({
callbackReturn: 'base64',
});
console.log('Webcam resolved');
resolve();
});
};
const initModel = () => {
return new Promise((resolve, reject) => {
Posenet.load(posenetConfiguration.multiplier)
.then((posenet) => {
net = posenet;
console.log('Posenet resolved');
resolve();
})
.catch((err) => {
reject(err);
});
});
};
const getHand = (data) => {
return new Promise((resolve, reject) => {
net
.estimateSinglePose(data, posenetConfiguration.imageScaleFactor, posenetConfiguration.reversed, posenetConfiguration.outputStride)
.then((pose) => {
const handKeyPoints = pose.keypoints.filter((item) => {
return item.part === 'rightWrist' || item.part === 'leftWrist';
});
handKeyPoints.sort((a, b) => {
return a.score > b.score ? 1 : -1;
});
resolve(this.getPartLocation(handKeyPoints[0]));
})
.catch((err) => {
reject(err);
});
});
};
const loadImage = (base64) => {
return new Promise((resolve) => {
const image = new Image();
image.onload = () => {
ctx.drawImage(image, 0, 0, 1920, 1080);
resolve(image);
};
image.src = base64;
});
};
const render = () => {
webcam.capture('webcam', (err, data) => {
if (err) {
console.error(err);
return false;
}
loadImage(data).then((image) => {
// const tfImage = tf.browser.fromPixels(canvas);
getHand(canvas).then((hand) => {
console.log(hand.position);
requestAnimationFrame(render());
});
});
});
};
initWebcam()
.then(() => initModel())
.then(() => {
render();
})
.catch((err) => {
console.error(err);
});
Seems like I'm the only one...
This question is better asked on StackOverflow since it is not a bug or feature request. There is also a larger community that reads questions there.
Did you ever find a solution?
Sorry, I didn't try with newer versions, but I've not found a solution.
I have the answer:
For example you say you have 2, 3 input shape, but you provide first element 2, 3, but the second element 2, 2;
for example you should provide [[1,1,1], [1,1,1] ...] but you provide [[1,1,1], [1,1]]
I am getting the same error. Please was anyone able to figure this out?