ManzGPU

Elimina fondo de imágenes

Hype-Generator 3000™: It's a game-changer

Aprende a eliminar el fondo de cualquier fotografía en local con IA, generando máscaras usando vision.cpp.

1. Introducción

Si ya conoces llama.cpp como motor de inferencia para texto o stable-diffusion.cpp para generar imágenes, vision.cpp es su equivalente para visión por computador, es decir, ejecutar modelos de visión 100% en local para realizar ciertas acciones sobre imágenes. El repositorio oficial es Acly/vision.cpp y su filosofía es idéntica a la de llama.cpp: cargar modelo de IA, consumiendo lo mínimo posible de memoria. En esta guía nos centraremos en su caso de uso más práctico: eliminar el fondo de una fotografía de forma automática.

Ejemplo BiRefNet eliminando fondo

Para ello usaremos el modelo BiRefNet (Bilateral Reference Network), especializado en segmentación automática: separar con precisión el sujeto del fondo, incluso con pelo, bordes finos o transparencias, generando una máscara que luego se puede aplicar a la imagen original para obtener un PNG con fondo transparente.

Foto original vision-cli Máscara PNG sin fondo

La herramienta vision.cpp incluye soporte de otros modelos muy útiles que veremos a lo largo de esta guía: segmentación por prompt, estimación de profundidad, inpainting o super-resolución. De este último tienes una guía mucho más detallada en Reescalando imágenes (Upscaler).

2. Instalación

Al igual que llama.cpp, con vision.cpp necesitamos comunicarnos con la GPU a través de un backend si queremos que la operación sea lo más rápida posible. Alternativamente, podemos usar la CPU: será más lento, pero no necesitaremos tener una buena GPU.

BackendRendimientoNvidiaAMDIntelObservaciones
Vulkan 🟩🟩🟩🟩⬛ Recomendado. Multiplataforma y acelerado.
CPU/RAM 🟨🟨⬛⬛⬛ No usa GPU. Funciona en cualquier PC.

La forma más rápida es descargar un release ya compilado desde la página de releases de vision.cpp. Encontrarás varios assets: elige el correspondiente a tu sistema operativo y descomprime el archivo en una carpeta, por ejemplo C:\vision.cpp o ~/vision.cpp en el caso de Linux. Dentro tendrás la carpeta bin/ con vision-cli, el ejecutable que usaremos.

3. Descarga de modelos

Para eliminar el fondo necesitamos un modelo BiRefNet en formato GGUF. Estos modelos oficiales los puedes encontrar en HuggingFace Acly/BiRefNet-GGUF:

FicheroTamañoResoluciónUso recomendado
BiRefNet-lite-F16.gguf 88.6 MB 1024x1024 (fija) Modelo ligero y muy rápido. Calidad aceptable.
BiRefNet-F16.gguf 440 MB 1024x1024 (fija) Modelo grande. Más lento, pero mejor calidad.
BiRefNet-dynamic-F16.gguf 440 MB dinámica Igual al anterior, pero acepta cualquier resolución.

Para eliminar fondo descarga al menos BiRefNet-dynamic-F16.gguf (el modelo más versátil). Si tienes un equipo con poca RAM o tarjeta gráfica poco potente, descarga BiRefNet-lite-F16.gguf.

Estos ficheros deben colocarse en una carpeta llamada models/. A continuación tienes una tabla con la lista completa de modelos que se pueden utilizar con vision.cpp:

FicheroTamañoComando a usar
Uno de los anteriores 89-440 MB Segmentación automática: vision-cli birefnet
MobileSAM-F16.gguf 26.9 MB Segmentación personalizada: vision-cli sam
Depth-Anything-V2-Small-F16.gguf 50.6 MB vision-cli depthany (Modelo pequeño)
Depth-Anything-V2-Base-F16.gguf 197 MB vision-cli depthany (Modelo base)
Depth-Anything-V2-Large-F16.gguf 673 MB vision-cli depthany (Modelo grande)
MIGAN-512-places2-F16.gguf 14.8 MB vision-cli migan (Modelo para inpainting).
RealESRGAN-x4plus_anime-6B-F16.gguf 8.95 MB vision-cli esrgan (Modelo para reescalar con IA)

Cada modalidad tiene su modelo GGUF en HuggingFace bajo el usuario Acly.

4. Eliminar el fondo

La sintaxis mínima de vision-cli para eliminar el fondo de una imagen (usando BiRefNet) es:

vision-cli birefnet -m models/BiRefNet-lite-F16.gguf \
  -i foto.jpg \
  -o mask.png \
  --composite final.png

Parámetros esenciales:

  • El primer parámetro debe ser birefnet, sam, depthany, migan o esrgan.
  • -m / --model: ruta al modelo GGUF
  • -i / --input: imagen de entrada
  • -o / --output: máscara en escala de grises generada
  • --composite: genera la imagen combinada (original + máscara)

Esto genera dos ficheros:

  • mask.png: máscara en blanco y negro, indicada con -o (blanco = sujeto, negro = fondo)
  • composite.png: imagen original con máscara aplicada y fondo transparente, con --composite

Observa que el modelo lite, al ser más pequeño, pierde algunos detalles que el modelo grande sí conserva. Por ejemplo, el modelo lite eliminó la mochila y partes del cuello, mientras que el grande las respetó.

5. Eliminación personalizada

Hasta ahora hemos visto como usar BiRefNet (segmentación automática) donde se detecta y recorta el sujeto principal de forma automática, pero tenemos otra modalidad denominada MobileSAM (Segment Anything Model) que permite hacer segmentación personalizada, indicándole un prompt con las coordenadas del elemento que quieres recortar. Es ideal cuando en la foto hay varias personas u objetos y solo quieres uno, o cuando BiRefNet recorta de forma incorrecta.

El modelo que usaremos en esta modalidad es MobileSAM-F16.gguf (26.9 MB), que ya vimos en la tabla del apartado 3. Colócalo en models/ junto al resto y ejecuta el comando así:

vision-cli sam -m models/MobileSAM-F16.gguf \
  -i original.jpg \
  -p 1600 60 2300 1050 \
  -o mask.png \
  --composite out.png

Los parámetros específicos de sam son muy similares a los que vimos en el punto anterior, salvo que utilizamos el parámetro -p o --prompt para indicar coordenadas. Lo podemos hacer de dos formas:

  • Indicando un punto: x y → por ejemplo -p 300 200 selecciona el objeto implicado en ese píxel:
vision-cli sam -m models/MobileSAM-F16.gguf \
  -i input.jpg \
  -p 500 300 \
  -o mask.png \
  --composite out.png
  • Indicando una caja x1 y1 x2 y2 → por ejemplo -p 420 120 650 430 indica un rectángulo que encierra de forma aproximada el objeto (esquina superior izquierda x1,y1 y esquina inferior derecha x2,y2). Es más preciso que el punto:
vision-cli.exe sam -m models/MobileSAM-F16.gguf \
  -i nendoroid.jpg \
  -p 1600 60 2300 1050 \
  -o sam-nendoroid-out.png \
  --composite sam-result.png

Por otro lado, como se puede ver en la penúltima imagen, podemos utilizar el siguiente comando para resaltar la parte seleccionada:

magick nendoroid.jpg \
  \( sam-result.png -fill indigo -colorize 60 \) \
  -composite sam-final.png

El fichero nendoroid.jpg es la imagen original, sam-result.png es la selección a resaltar que se coloreará de -fill indigo con un porcentaje -colorize 60 de color opaco / transparencia. Finalmente, -composite indica el nombre del fichero final.

6. Estimación de profundidad

Depth Anything V2 estima la profundidad de cada píxel: genera un mapa en escala de grises donde los tonos más claros indican lo que está más cerca de la cámara y los más oscuros lo que está más lejos. Es muy útil para efectos de desenfoque de fondo (bokeh), niebla, o como entrada para generación 3D.

Para ello vision.cpp usa la familia Depth-Anything-V2:

ModeloTamañoUso recomendado
Depth-Anything-V2-Small-F16.gguf 50.6 MB Muy rápido, ideal para pruebas o GPUs modestas.
Depth-Anything-V2-Base-F16.gguf 197 MB Equilibrio entre calidad y velocidad.
Depth-Anything-V2-Large-F16.gguf 673 MB Máxima calidad, recomendado para imágenes grandes.

La forma de utilizar estos modelos sería la siguiente:

vision-cli depthany -m models/Depth-Anything-V2-Large-F16.gguf \
  -i foto.jpg \
  -o depth.png

El fichero depth.png generado será un mapa de profundidad en escala de grises, donde el blanco equivale a cerca, y el negro a lejos. En este caso, no se necesita --composite, ya que la salida es directamente el mapa de profundidad.

7. Otros

Esta herramienta también tiene modalidades MI-GAN (Missing Image GAN) o ESRGAN (Enhanced Super-Resolution GAN). Estas modalidades sirven para hacer inpainting (reconstruir pequeñas zonas de la imagen coherentes con su entorno) o reescalado por super-resolución (inventar detalles para multiplicar x4 la resolución de una imagen).

Sin embargo, para estos detalles te recomiendo una guía dedicada como Reescalar imágenes (Upscaler) o inpainting img2img con sd.cpp, donde se explica en profundidad para conseguir mejores resultados de los que obtendrías con esta herramienta.

8. Alternativas

Otras herramientas para eliminar fondo que puedes valorar:

HerramientaTipoNotas
REMBG CLI Basado en BiRefNet/U²-Net, requiere Python/PyTorch.
ComfyUI Node-GUI Integrado en flujos de generación de imagen.
GIMP + plugin GUI Útil si ya editas manualmente con GIMP.
Servicios cloud (remove.bg, ...) Web Rápido pero sube imagen a servidores externos.
bg.addy.ie Web Recomendado, usa WASM y no sube la imagen a servidores.

Con vision.cpp ya tienes un flujo local, privado y gratuito. Combínalo con StableDiffusion.cpp para generar fondos nuevos o con Upscaler si necesitas aumentar la resolución del sujeto recortado antes de componer.

Si optas por utilizar REMBG, ten en cuenta que su última versión, REMBG 2.0, no permite su uso comercial. Versiones anteriores, como la 1.4, sí lo permiten.