Caricaturización de retratos con DCT-Net: despliegue y generación simplificados

Introducción a DCT-Net para caricaturizar rostros

DCT-Net es un modelo de inteligencia artificial especializado en convertir fotografías de personas en imágenes de estilo caricaturesco. Esta herramienta automatiza la transformación, manteniendo detalles clave del rostro original y ofreciendo resultados visualmente atractivos.

La implementación está encapsulada en un contenedor Docker, eliminando la necesidad de configurar entornos complejos o conocimientos previos en aprendizaje profundo. Esto permite su uso inmediato tras la instalación, ideal para crear avatares personalizados o aplicar efectos visuales.

Características principales:

  • Conversión con un clic: Carga una imagen y obtén el resultado en pocos segundos.
  • Alta calidad de salida: Las caricaturas generadas preservan nitidez y naturalidad en los detalles.
  • Facilidad de uso: Interfaz intuitiva accesible para cualquier usuario.
  • Compatibilidad con formatos comunes: Soporta archivos JPG, PNG, entre otros.

Requisitos del sistema y preparación del entorno

Antes de proceder, verifica que tu sistema cumpla con los siguientes requisitos:

  • Sistema operativo: Windows 10/11, macOS 10.15+ o Linux Ubuntu 18.04+
  • Memoria RAM: Mínimo 8 GB (16 GB recomendado para imágenes grandes)
  • Espacio en disco: 5 GB disponibles
  • Conexión a internet: Necesaria para descargar la imagen del contenedor

Instalación de Docker

DCT-Net se ejecuta mediante Docker. Sigue los pasos según tu sistema operativo.

En Windows

  1. Descarga Docker Desktop desde el sitio oficial de Docker.
  2. Ejecuta el instalador y sigue las instrucciones en pantalla.
  3. Reinicia el equipo después de la instalación.
  4. Abre Docker Desktop y espera a que el servicio se inicialice.

En macOS

  1. Descarga Docker Desktop para Mac desde el sitio oficial.
  2. Arrastra el ícono de Docker a la carpeta de Aplicaciones.
  3. Inicia Docker desde Aplicaciones y completa la configuración inicial.
  4. Verifica la instalación ejecutando docker --version en la terminal.

En Linux (Ubuntu)

Abre la terminal y ejecuta los siguientes comandos para instalar Docker:

# Actualizar repositorios
sudo apt update

# Instalar dependencias necesarias
sudo apt install apt-transport-https ca-certificates curl software-properties-common

# Agregar la clave GPG oficial de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# Añadir el repositorio de Docker
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# Instalar Docker Engine
sudo apt update
sudo apt install docker-ce

# Agregar el usuario actual al grupo docker para evitar usar sudo
sudo usermod -aG docker $USER

# Aplicar los cambios de grupo sin reiniciar
newgrp docker

Para confirmar que Docker está instalado, ejecuta docker --version en la terminal.

Despliegue del servicio DCT-Net

Obtención y ejecución de la imagen del contenedor

Con Docker instalado, descarga e inicia el contenedor de DCT-Net usando comandos en la terminal:

# Descargar la imagen de DCT-Net (si no está localmente)
docker pull nombre-imagen-dctnet

# Ejecutar el contenedor en segundo plano
docker run -d -p 8080:8080 --name servicio-caricaturas nombre-imagen-dctnet

Explicación de parámetros:

  • -d: Ejecuta el contenedor en segundo plano.
  • -p 8080:8080: Mapea el puerto 8080 del contenedor al puerto local 8080.
  • --name servicio-caricaturas: Asigna un nombre identificable al contenedor.
  • nombre-imagen-dctnet: Sustitúyelo por el nombre real de la imagen descargada.

Después de unos segundos, el servicio arrancará. Busca en la salida de la terminal un mensaje como:

Iniciando servicio de caricaturización DCT-Net...
* Aplicación Flask en ejecución
* Modo depuración: desactivado
* Escuchando en todas las interfaces (0.0.0.0)
* Disponible en http://127.0.0.1:8080

Verificación del servicio

Abre un navegador web y navega a http://localhost:8080. Si ves una interfaz web para subir imágenes, el servicio funciona correctamente.

En caso de problemas de acceso:

  • Comprueba que Docker esté ejecutándose (busca su ícono en la bandeja del sistema).
  • Si el puerto 8080 está ocupado, cambia el mapeo a otro puerto, por ejemplo 8081: modifica el comando a docker run -d -p 8081:8080 --name servicio-caricaturas nombre-imagen-dctnet y accede vía http://localhost:8081.
  • Desactiva temporalmente el firewall si bloquea las conexiones.

Generación de caricaturas mediante la interfaz web

Subida y conversión de imágenes

  1. Accede a la interfaz en http://localhost:8080.
  2. Haz clic en el botón para seleccionar un archivo y elige una fotografía de rostro.
    • Preferiblemente usa imágenes frontales, bien iluminadas y con formato JPG o PNG.
    • El tamaño recomendado es inferior a 5 MB para un procesamiento óptimo.
  3. Pulsa el botón de conversión y espera entre 3 y 10 segundos, dependiendo del rendimiento del sistema.

Nota: La primera ejecución puede ser más lenta debido a la carga inicial del modelo. Las conversiones posteriores serán más rápidas.

Visualización y guardado de resultados

Tras la conversión, la página mostrará dos paneles:

  • Izquierda: Imagen original cargada.
  • Derecha: Caricatura generada.

Para guardar la caricatura, haz clic derecho sobre ella y selecciona "Guardar imagen como...".

Si los resultados no son satisfactorios, prueba con fotos más claras, frontales y sin sombras excesivas.

Automatización mediante API para procesamiento por lotes

Llamada básica a la API

El servicio expone un endpoint REST en http://localhost:8080/api/cartoonize para solicitudes POST. Ejemplo en Python:

import requests

endpoint_url = "http://localhost:8080/api/cartoonize"
archivo_imagen = "foto_usuario.jpg"

with open(archivo_imagen, 'rb') as manejador_archivo:
    payload = {'imagen': manejador_archivo}
    respuesta = requests.post(endpoint_url, files=payload)

if respuesta.status_code == 200:
    datos = respuesta.json()
    print("Conversión exitosa.")
    print(f"Tiempo de procesamiento: {datos['duracion_procesamiento']}s")
    print(f"URL imagen original: http://localhost:8080{datos['enlace_original']}")
    print(f"URL caricatura: http://localhost:8080{datos['enlace_resultado']}")
else:
    print(f"Error: {respuesta.json()['mensaje']}")

Script para procesamiento masivo de imágenes

Para convertir múltiples imágenes de un directorio, utiliza el siguiente script adaptado:

import os
import requests
from pathlib import Path

def caricaturizar_carpeta(ruta_entrada, ruta_salida):
    """Procesa todas las imágenes soportadas en una carpeta."""
    os.makedirs(ruta_salida, exist_ok=True)
    extensiones_permitidas = {'.jpg', '.jpeg', '.png', '.bmp'}
    
    for nombre_archivo in os.listdir(ruta_entrada):
        ruta_completa = os.path.join(ruta_entrada, nombre_archivo)
        if not os.path.isfile(ruta_completa):
            continue
        if Path(ruta_completa).suffix.lower() not in extensiones_permitidas:
            continue
        
        print(f"Procesando: {nombre_archivo}")
        try:
            with open(ruta_completa, 'rb') as archivo:
                respuesta = requests.post('http://localhost:8080/api/cartoonize', files={'imagen': archivo})
            
            if respuesta.status_code == 200:
                datos = respuesta.json()
                url_resultado = f"http://localhost:8080{datos['enlace_resultado']}"
                contenido_imagen = requests.get(url_resultado).content
                nombre_salida = f"caricatura_{nombre_archivo}"
                ruta_guardado = os.path.join(ruta_salida, nombre_salida)
                with open(ruta_guardado, 'wb') as salida:
                    salida.write(contenido_imagen)
                print(f"Guardado: {nombre_salida}")
            else:
                print(f"Fallo en {nombre_archivo}: {respuesta.json().get('mensaje', 'Error desconocido')}")
        except Exception as e:
            print(f"Excepción procesando {nombre_archivo}: {str(e)}")

# Ejemplo de uso
caricaturizar_carpeta("./mis_fotos", "./resultados_caricaturas")

Solución de problemas comunes

Errores durante la instalación o inicio

  • Docker no inicia: Reinstala Docker Desktop o reinicia el servicio Docker.
  • Puerto en uso: Cambia el mapeo de puerto en el comando de ejecución del contenedor (ej: a 8081).
  • Memoria insuficiente: En la configuración de Docker, asigna al menos 4 GB de RAM al contenedor.

Problemas durante el uso

  • Subida de imagen sin respuesta: Verifica que el formato sea compatible (JPG, PNG, BMP) y que el tamaño no exceda 10 MB.
  • Calidad de caricatura deficiente: Utiliza fotos con iluminación uniforme, rostro centrado y buena resolución.
  • Bajo rendimiento: La primera operación es lenta por carga del modelo; cierra aplicaciones que consuman CPU para acelerar procesos posteriores.

Optimizaciones de rendimiento

  • Incrementa los núcleos de CPU asignados a Docker en su configuración.
  • Reduce la resolución de las imágenes antes de procesarlas.
  • En procesamiento por lotes, introduce pausas entre solicitudes para evitar sobrecarga.
  • Usa un disco SSD para acelerar el acceso a archivos si manejas grandes volúmenes.

Etiquetas: DCT-Net Docker Python API REST procesamiento de imágenes

Publicado el 6-1 00:38