Creé una aplicación para ejecutar un modelo tfjs simple en una cámara en vivo en el navegador. El problema es que mata por completo el rendimiento de la página web. La frecuencia de actualización es de alrededor de 1-2 fps y todo el navegador está retrasado (otras pestañas, películas de YouTube, incluso la interfaz gráfica de usuario del sistema). Lo que es extraño, después de la ejecución lenta del primer modelo (el modelo se compila para que sea comprensible), el tiempo de ejecución del modelo está en el rango de 1.5-4ms (medido como en el script a continuación). Así que no debería ser un problema para el navegador.
if (navigator.mediaDevices.getUserMedia) { navigator.mediaDevices.getUserMedia({ video: true }) .then(function (stream) { video!.srcObject = stream; }) .catch(function (_) { console.log("Something went wrong!"); }); } let model = await tf.loadGraphModel('model/model.json') let video = document.querySelector("#videoElement") as HTMLVideoElement; async function do_inference() { let startTime = performance.now(); const image = tf.expandDims(tf.browser.fromPixels(video)); const image_fl32 = tf.cast(image, 'float32'); let final_pred = tf.tidy(() => { return model.predict(image_fl32) as tf.Tensor4D; }); image.dispose(); image_fl32.dispose(); final_pred.dispose(); let total = performance.now() - startTime; console.log(total); if (running) { requestAnimationFrame(do_inference); } }Notas adicionales:
webgl , cambiarlo a wasm da como resultado un tiempo de ejecución mucho mayor (alrededor de 150-200 ms), pero el video es fluido. En la producción me gustaría usar un modelo aún más grande, por lo que no puedo aceptar tal tiempo de ejecución.tensorflow.keras.Model usando el método Model.save y luego usando tensorflowjs_converter@3.9 con --output_format=tfjs_graph_model¿Estoy haciendo algo mal? ¿Hay alguna manera de hacer que el video sea fluido?