Estoy trabajando en una extensión de Chrome que toma imágenes de un sitio web e intenta predecir los objetos en esas imágenes. Estoy usando el modelo MobileNet preentrenado de tensorflow.js para hacer predicciones.
Como parte de mi configuración inicial, pude pasar mensajes entre mi script de contenido y el script de fondo usando mensajes de puerto. Sin embargo, una vez que importo el modelo de MobileNet en mi script de fondo, el fondo deja de responder e incluso console.logs() no aparece en las herramientas de desarrollo.
Manifiesto.json
... "host_permissions": ["https://www.dawn.com/"], "permissions": ["storage", "tabs"], "options_page": "options.html", "background": { "service_worker": "background.js" }, "content_scripts": [ { "matches": ["https://www.dawn.com/"], "js": ["contentScript.js"] } ] ...
Fondo.js
const mobilenet = require("@tensorflow-models/mobilenet"); async function genPrediction(img) { const model = await mobilenet.load(); const predictions = await model.classify(img); return predictions; } chrome.runtime.onConnect.addListener(function (port) { port.onMessage.addListener(function (msg) { console.log("msg: ", msg); if (msg.type === "get_model_prediction") { genPrediction(msg.img).then((response) => { port.postMessage({ response }); }); } }); });
contentScript.js
var chromeRuntimePort = chrome.runtime.connect(); chromeRuntimePort.onDisconnect.addListener(() => { console.log("runtime is disconnected"); chromeRuntimePort = undefined; }); // when using the port, always check if valid/connected function postToPort(msg) { if (chromeRuntimePort) { chromeRuntimePort.postMessage(msg); } else { console.log("runtime is not defined"); } } let images = document.images; postToPort({msg: "get_ml_predictions", images: images});
El modelo de MobileNet tiene 254 KB en el disco, pero depende de la biblioteca tensorflow, que tiene 60 MB en el disco, y mi extensión empaquetada en modo de desarrollo es de 12,5 MB. ¿Podría ser que la biblioteca importada sea demasiado grande para requerirla en el script de fondo? ¿Existen prácticas recomendadas para solicitar módulos en secuencias de comandos en segundo plano que debería seguir? ¡Cualquier ayuda será muy apreciada!
Nota: estoy usando webpack para empaquetar mi extensión.