async function init() {
console.log("VERSION 6");
// const canvas = document.createElement("CANVAS");
const canvas = document.getElementById("output");
canvas.width = 224;
canvas.height = 224;
async function loadModel() {
console.log("MODEL LOAD");
document.getElementById("messages").innerHTML += "<br>Loading model";
const model = await tf.loadModel(path_to_models + 'tfjs_model/model.json');
document.getElementById("messages").innerHTML += "<br>Model loaded<br>";
model.predict(tf.zeros([1, 224, 224, 3])).dispose();
return model;
}
const model = await loadModel();
async function loadVideo() {
console.log("VIDEO LOAD");
let constraints = window.constraints = {
audio: false,
video: true
};
if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
constraints = {video: {facingMode: {exact: 'environment'}}}
}
try {
const stream = await navigator.mediaDevices.getUserMedia(constraints);
const video = document.querySelector('video');
video.srcObject = stream;
return new Promise((resolve) => {
video.onloadedmetadata = () => {
resolve(video);
};
});
} catch (e) {
console.log('navigator.getUserMedia error: ', e);
}
}
const video = await loadVideo();
var isPredicting = true;
function showResult(result, duration, interval) {
const index = argMax(result);
document.getElementById("messages").innerHTML = "<br>PR:" + labels[index];
document.getElementById("messages").innerHTML += "<br>CO:" + result[index];
document.getElementById("messages").innerHTML += "<br>running model: " + duration + " ms";
document.getElementById("messages").innerHTML += "<br>draw interval: " + interval + " ms";
}
let lastDraw = performance.now();
async function processFrame() {
while(isPredicting) {
const now = performance.now();
const interval = now - lastDraw;
lastDraw = now;
const start = performance.now();
// -------- INFERENCE ---------
const prediction = tf.tidy(() => {
console.log("INFERENCE");
// document.getElementById("messages").innerHTML += "<br>Running model";
const pixels = tf.fromPixels(video);
canvas.getContext('2d').drawImage(video, 0, 0, 224, 224)
const batchedImage = pixels.expandDims(0);
try {
return tf.tidy(() =>
model.predict(batchedImage.toFloat().div(tf.scalar(127)).sub(tf.scalar(1))));
}
catch (runModelError) {
document.getElementById("messages").innerHTML += "<br>" + runModelError;
}
});
prediction.data()
.then((result) => {
const duration = performance.now() - start;
showResult(result, duration, interval);
})
prediction.dispose();
// ----------------------------
await tf.nextFrame();
}
//const result = [0];
}
console.log("VIDEO START");
video.play();
processFrame();
}