Кажется, вы перезаписывали свой холст после того, как нарисовали точки. Вот код, который работает для меня при написании вашей функции get_faceme sh:
async function get_facemesh()
{
// load HTML canvas
var canvas = document.getElementById("facemesh");
var draw = canvas.getContext("2d");
// get video stream
const stream = document.getElementById("movie");
// load facemesh model
const model = await facemesh.load(maxFaces=1);
// process input stream frame by frame
while(1)
{
// detect faces
const faces = await model.estimateFaces(stream);
if(faces.length > 0)
{
// Reset frame
draw.fillStyle = "black";
draw.fillRect(0, 0, canvas.width, canvas.height);
// loop through faces array to capture multiple faces
var mesh = faces[0].scaledMesh;
/* highlight facial landmark points on canvas board */
draw.fillStyle = "#00FF00";
for (var i = 0; i < mesh.length; i++) {
draw.fillRect(mesh[i][0], mesh[i][1], 2, 2);
}
}
else
{
console.log(`no faces detected..`);
}
// loop to process the next frame
await tf.nextFrame();
}
}
Обратите внимание, что вы почти никогда не должны использовать while (1), вместо этого загляните в requestAnimationFrame (), который является способом создания циклов анимации. while (1) наверняка вызовет проблемы с производительностью, поскольку это бесконечное l oop и не ждет, пока браузер что-то сделает, поэтому просто не делайте этого. Я оставлю это вам в качестве упражнения по очистке кода.