← Proyectos

AI Upscaler & Background Remover

Extensión de Chrome que amplía imágenes ×2 o ×4 con Real-ESRGAN y elimina fondos con U²-Net, una a una o por lotes con descarga en ZIP, todo en el equipo del usuario con ONNX Runtime Web (WebGPU o WebAssembly). Sin servidores, sin subidas y gratis.

Una foto ampliada ×4 con el comparador antes/después
Un lote de fotos de producto sin fondo, listo para descargar en ZIPLa misma zona ampliada de forma clásica y con Real-ESRGANUn fondo eliminado, con el sujeto sobre transparenciaLa extensión en modo oscuro
modelos de IA en local
2
modelos de IA en local
imágenes subidas
0
imágenes subidas
tests (Vitest)
118
tests (Vitest)
idiomas
3
idiomas

Qué hace

  • Ampliar imágenes ×2 o ×4. Con Real-ESRGAN, que reconstruye pelo, bordes y texturas en vez de difuminar.
  • Quitar fondos. Con U²-Net: el sujeto queda sobre un PNG transparente, a la resolución original.
  • Lotes. Soltar cientos de imágenes, procesarlas en cola con los mismos ajustes y descargarlo todo en un ZIP. Si una falla, el resto sigue.
  • Comparador antes/después. Una línea que se arrastra sobre el resultado para ver la diferencia en la misma zona.
  • Desde cualquier web. Clic derecho sobre una imagen y «Mejorar imagen con IA», o pegarla con Ctrl+V.
  • Salida a medida. PNG, WebP o JPEG con control de calidad, descarga con el nombre original o copia directa al portapapeles.
  • Progreso real. Mosaicos procesados, tiempo estimado (también en el título de la pestaña) y cancelación inmediata.
  • Español, inglés y chino, con modo oscuro.

Cómo está hecho

La IA corre en el equipo del usuario

Los dos modelos van empaquetados dentro de la extensión y los ejecuta ONNX Runtime Web: con WebGPU si hay GPU disponible y con WebAssembly si no. No hay backend, ni API, ni una sola petición con la imagen.

Mosaicos con margen

La imagen se amplía en mosaicos de 112 px con 8 px de contexto por cada lado, que luego se descarta al recomponer. Así cabe en memoria una foto grande y no aparecen costuras entre mosaicos.

La interfaz nunca se congela

Cada modelo tiene su propio Web Worker. La imagen se transfiere sin copiarse, y cada petición lleva un identificador para descartar respuestas viejas y poder cancelar entre mosaico y mosaico.

Problemas que resolví

  • Un modelo que no cargaba en el navegador. U²-Net usa capas MaxPool con ceil_mode=1, que ONNX Runtime Web no soporta. Un script las parchea a ceil_mode=0, y como la entrada es siempre de 320 × 320 el resultado es idéntico.
  • Workers que Chrome mataba en desarrollo. Vite sirve los workers desde localhost, y Chrome cierra las páginas de extensión que crean workers de otro origen. El build de desarrollo compila copias dentro de la propia extensión.
  • Un ×2 que prometía ser más rápido. El ×2 se obtiene reduciendo el resultado de ×4, así que tarda más, no menos. Corregí la interfaz para que diga lo que es cierto: archivo más pequeño.
  • Lotes que podían tumbar la pestaña. Antes de cada imagen se estima el peor caso de su resultado y, si el lote pasaría de 1,5 GB, esa imagen se marca en rojo con un aviso y la cola sigue con las demás, en vez de agotar la memoria.
  • Imágenes que agotaban la memoria. Ahora se rechazan antes de procesarlas las que pasan de 32 megapíxeles, con un mensaje claro en vez de un fallo silencioso.

Stack

WXTVue 3TypeScriptONNX Runtime WebWebGPUWebAssemblyWeb WorkersReal-ESRGANU²-NetJSZipTailwind CSSVitestTesting LibraryGitHub Actions

Artículos