Despliegue de Servicios de Cartoonización de Retratos con DCT-Net y Docker

Requisitos del Sistema y Preparación del Entorno

Para implementar el modelo DCT-Net orientado a la cartoonización de rertatos mediante contenedores, se requiere un entorno que cumpla con las siguientes especificaciones:

  • Sistema Operativo: Distribuciones Linux modernas (Ubuntu 20.04/22.04, CentOS 7/8) o Windows con WSL2 habilitado.
  • Almacenamiento: Mínimo 10 GB de espacio libre en disco para alojar la imagen del contenedor y los pesos del modelo.
  • Red: Acceso a internet durante la primera ejecución para la descarga de dependencias o pesos adicionales si no están empaquetados en la imagen base.

Despliegue del Contenedor Docker

El proceso de despliegue se simplifica mediante el uso de imágenes preconfiguradas. Asumiendo que se dispone del archivo de imagen dct-net-image.tar, se procede a la carga y ejecución:

# Importar la imagen al demonio de Docker
docker load --input dct-net-image.tar

# Instanciar el contenedor con políticas de reinicio y mapeo de puertos
docker run --detach \
  --name svc-dct-cartoon \
  --publish 8888:8080 \
  --restart on-failure \
  dct-net-cartoon:v1

Parámetros de configuración:

  • --detach: Ejecuta el proceso en segundo plano.
  • --publish 8888:8080: Enlaza el puerto 8080 interno del contenedor al puerto 8888 del host.
  • --restart on-failure: Garantiza la alta disponibilidad reiniciando el servicio solo si termina con un código de error.

Una vez inicializado el modelo (lo cual puede tomar unos minutos en la primera ejecución debido a la carga en memoria), el servicio estará disponible en http://<IP_DEL_HOST>:8888.

Arquitectura del Servicio

La imagen encapsula una arquitectura de tres capas para procesar las solicitudes de imagen:

  1. Núcleo de Inferencia (DCT-Net): Red neuronal convolucional que realiza la traducción de dominio de imagen real a estilo cartoon, preservando la estructura facial y los rasgos biométricos.
  2. Capa de Transporte (Flask/FastAPI): Servidor web ligero que expone los endpoints HTTP y sirve la interfaz de usuario estática.
  3. Pipeline de Pre/Post-procesamiento: Normaliza las dimensiones de entrada, ajusta los espacios de color y aplica filtros de suavizado a la salida para optimizar la calidad visual.

Operación mediante Interfaz Web

La interfaz gráfica accesible desde el navegador permite la interacción directa con el modelo. Para obtener resultados óptimos al cargar los archivos, se recomienda seguir estas directrices de entrada:

  • Resolución: Imágenes con un ancho entre 800 y 1200 píxeles. El sistema redimensionará automáticamente archivos más grandes, lo que podría degradar detalles finos.
  • Composición: Rostros frontales con iluminación uniforme. Las oclusiones severas o ángulos extremos reducen la precisión de la detección de puntos faciales.
  • Fondo: Entornos simples o desenfocados para evitar que el modelo confunda los bordes del cabello con elementos del fondo.

El tiempo de inferencia varía entre 3 y 5 segundos por solicitud en hardware estándar, tras el calentamiento inicial del modelo (cold start).

Integración Programática mediante API REST

Para flujos de trabajo automatizados o integración con aplicaciones de terceros, el servicio expone un endpoint HTTP. A continuación, se presenta un script en Python utilizando la biblioteca requests y pathlib para gestionar la carga y descarga de archivos:

import requests
from pathlib import Path

API_ENDPOINT = "http://localhost:8888/process"
INPUT_FILE = Path("portrait_sample.jpg")
OUTPUT_FILE = Path("cartoon_result.png")

def transform_image(source_path: Path, dest_path: Path) -> None:
    """Envía una imagen al servicio DCT-Net y guarda el resultado."""
    if not source_path.exists():
        raise FileNotFoundError(f"El archivo {source_path} no existe.")

    with open(source_path, "rb") as image_buffer:
        # Estructura del payload multipart/form-data
        multipart_form = {
            "file": (source_path.name, image_buffer, "image/jpeg")
        }
        
        response = requests.post(API_ENDPOINT, files=multipart_form, timeout=30)
        response.raise_for_status()

    # Persistencia del binario de respuesta
    dest_path.write_bytes(response.content)
    print(f"Éxito: Imagen transformada guardada en {dest_path}")

if __name__ == "__main__":
    try:
        transform_image(INPUT_FILE, OUTPUT_FILE)
    except requests.exceptions.RequestException as e:
        print(f"Fallo en la comunicación con la API: {e}")

Resolución de Problemas y Mantenimiento

Durante la operación del contenedor, pueden presentarse las siguientes incidencias técnicas:

  • Latencia en la primera solicitud: El contenedor mantiene el modelo en memoria RAM. La primera petición tras el arranque del contenedor experrimentará una demora adicional debido a la inicialización de los tensores en el dispositivo de cómputo.
  • Contanedor en estado de reinicio continuo: Verificar los logs mediante docker logs svc-dct-cartoon. Generalmente se debe a falta de memoria RAM (OOM) o puertos en conflicto.
  • Procedimiento de Actualización: Para aplicar una nueva versión de la imagen, se debe detener y purgar la instancia anterior:
docker stop svc-dct-cartoon && docker rm svc-dct-cartoon
docker load --input dct-net-image-v2.tar
docker run --detach --name svc-dct-cartoon --publish 8888:8080 --restart on-failure dct-net-cartoon:v2

Etiquetas: DCT-Net Docker computer-vision Flask rest-api

Publicado el 6-19 18:53