Ir al contenido principal

Tutorial de Qwen Image 2512: Crea un estudio de carteles con Gradio

Aprende a crear una aplicación Gradio Poster Studio con Qwen-Image-2512 que genera creatividades para comercio electrónico con una tipografía impactante, un diseño limpio y escenas de productos fotorrealistas.
Actualizado 14 ene 2026  · 7 min leer

Qwen-Image-2512 es un potente modelo de código abierto de texto a imagen que destaca especialmente en la creación de imágenes realistas y composiciones con gran cantidad de texto. En este tutorial, lo utilizaremos para crear un Poster Studio, un aplicación de Gradio en la que introduces detalles del producto como el nombre, la oferta, el precio, la llamada a la acción y las ventajas, eliges la relación de aspecto de la plataforma y generas una imagen promocional con un solo clic.

Dado que Qwen-Image-2512 es un modelo grande, también nos centraremos en el aspecto práctico de su funcionamiento fluido. Aprenderás a cargarlo de forma estable en un A100 utilizando los ajustes de precisión adecuados, a evitar los modos de fallo más comunes y a adaptarte a cualquier flujo de trabajo mediante iteraciones a resoluciones más pequeñas, la reducción de pasos o la exploración de un modelo cuantificado para un hardware más ajustado.

¿Qué es Qwen-Image-2512?

Qwen-Image-2512 es una actualización del modelo básico de conversión de texto a imagen Qwen, junto con una mejora cualitativa con respecto a la versión anterior de Qwen-Image. En realidad, Qwen-Image es un modelo de difusión MMDiT de 20B, diseñado para una fuerte adherencia a las indicaciones y la representación de texto en imágenes.

También está respaldado por una evaluación a gran escala basada en preferencias con más de 10 000 rondas a ciegas en AI Arena, donde el modelo destacó como el modelo de código abierto más potente, al tiempo que se mantuvo competitivo con los sistemas cerrados.

image2.png

Las tres mejoras que suelen ser más importantes en los flujos de trabajo reales son:

  • Retratos humanos más realistas: Los rostros parecen menos «artificiales», con rasgos faciales más definidos, detalles de la piel más naturales y un mayor realismo en general.
  • Texturas naturales más ricas: Las escenas con mucha textura, como paisajes, agua, pelaje y materiales, se renderizan con mayor detalle y una microtextura más convincente.
  • Tipografía y diseño más sólidos: La representación del texto es más precisa y las composiciones se asemejan más a las páginas, lo que resulta especialmente útil para carteles, diapositivas, banners e infografías.

Qwen Image 2512 Proyecto de ejemplo: Crea un estudio de carteles

En esta sección, crearemos una sencilla aplicación Gradio que:

  • Recopila el nombre del producto, la descripción, la oferta, el precio, la llamada a la acción y las ventajas.
  • Deja que el usuario elija una plataforma preestablecida, como una publicación/historia de Instagram, un banner, un póster o diapositivas.
  • Proporciona un panel para steps, true_cfg_scale, seed y un opcional negative prompt.
  • Por último, genera una imagen de póster utilizando QwenImagePipeline.

image4.png

Construyámoslo paso a paso.

Paso 1: Requisitos previos

En primer lugar, instala la última versión de Difusores de GitHub (tarjeta de modelo de Qwen recomienda esto para la compatibilidad con el pipeline) junto con las dependencias principales: lo recomienda para la compatibilidad con el canal) junto con las dependencias principales:

!pip -q install --upgrade pip
!pip -q install git+https://github.com/huggingface/diffusers
!pip -q install transformers accelerate safetensors gradio pillow psutil

A continuación, realiza una comprobación rápida para confirmar que CUDA está disponible e identificar la GPU:

import torch, diffusers
print("diffusers:", diffusers.__version__)
print("CUDA available:", torch.cuda.is_available())
!nvidia-smi

Si CUDA available: True y ves tu GPU en nvidia-smi, ya estás listo para cargar el modelo.

Nota: « QwenImagePipeline » no es un bloque único al estilo UNet. En Diffusers, se trata de una pila completa que comprende un codificador de texto Qwen2.5-VL-7B-Instruct, el transformador de difusión MMDiT y un codificador automático variacional(VAE) para la decodificación. El codificador de texto 7B es una de las principales razones por las que la RAM/VRAM puede dispararse durante la carga y la generación de modelos, especialmente en GPU más pequeñas. 

He ejecutado este tutorial en Google Colab con una A100, que maneja cómodamente una resolución de imagen de 1328×1328 en ~50 pasos. En las GPU de clase T4/16 GB, normalmente es necesario reducir la escala (a una resolución de imagen de aproximadamente 768 × 768 y menos pasos) o utilizar variantes cuantificadas a través de tiempos de ejecución alternativos (como GGUF/ComfyUI).

Paso 2: Importaciones y utilidades básicas

Antes de cargar el modelo, vale la pena configurar un pequeño arnés de tiempo de ejecución que mantenga Colab predecible. Qwen-Image-2512 es pesado, y las cargas de trabajo de generación de imágenes pueden consumir silenciosamente tanto la RAM del sistema como la memoria de la GPU. 

import os, gc, random, psutil, torch
from diffusers import QwenImagePipeline
import gradio as gr
os.environ["HF_HOME"] = "/content/hf"
os.makedirs("/content/hf", exist_ok=True)
def mem(tag=""):
    ram = psutil.virtual_memory().used / 1e9
    v_alloc = torch.cuda.memory_allocated()/1e9 if torch.cuda.is_available() else 0
    v_res   = torch.cuda.memory_reserved()/1e9 if torch.cuda.is_available() else 0
    print(f"[{tag}] RAM={ram:.1f}GB | VRAM alloc={v_alloc:.1f}GB reserved={v_res:.1f}GB")
def cleanup(tag="cleanup"):
    gc.collect()
    if torch.cuda.is_available():
        torch.cuda.empty_cache()
    mem(tag)
assert torch.cuda.is_available(), "GPU runtime required"
print("GPU:", torch.cuda.get_device_name(0))
torch.backends.cuda.matmul.allow_tf32 = True
torch.set_float32_matmul_precision("high")
cleanup("startup")

Una vez instaladas las dependencias, configuramos las importaciones, el almacenamiento en caché, la supervisión de la memoria y un par de indicadores de rendimiento de la GPU. Así es como se ve en el código:

  • QwenImagePipeline: Esta es la clase principal del proceso que usaremos más adelante para cargar y ejecutar Qwen-Image-2512 para la generación de imágenes.
  • gradio: Esta biblioteca impulsa la sencilla interfaz de usuario web para que podamos generar pósteres dentro de Colab.
  • HF_HOME=/content/hf: Utilizamos esto para fijar la caché de Hugging Face en una carpeta conocida, de modo que las descargas y los pesos de los modelos se almacenen de forma coherente en todas las ejecuciones.
  • mem() función: La función mem() realiza un seguimiento de la RAM del sistema y la VRAM de la GPU asignadas frente a las reservadas. 
  • cleanup() función: Es una pequeña utilidad de reinicio para borrar las referencias de Python y liberar la memoria caché de la GPU, lo que resulta muy útil cuando se iteran la resolución y los pasos.
  • Comprobaciones de la GPU: Si CUDA no está disponible, fracasamos rápidamente, por lo que habilitamos TF32 y establecemos la precisión de matmul en «alta» para acelerar las multiplicaciones de matrices en GPU Ampere como la A100.

Esta configuración aún no genera imágenes, pero hace que los siguientes pasos (carga e inferencia) sean mucho más estables y fáciles de depurar.

Paso 3: Cargar Qwen-Imagen-2512 

Ahora que el tiempo de ejecución está configurado, es hora de cargar el modelo en un canal de Diffusers. En un A100, lo ideal es ejecutar la mayoría de los pesos en BF16 para obtener un mejor rendimiento, pero mantener la decodificación VAE en FP32 para evitar los NaN que pueden aparecer como imágenes completamente negras.

DTYPE = torch.bfloat16 
pipe = QwenImagePipeline.from_pretrained(
    "Qwen/Qwen-Image-2512",
    torch_dtype=DTYPE,
    low_cpu_mem_usage=True,
    use_safetensors=True,
).to("cuda")
if hasattr(pipe, "vae") and pipe.vae is not None:
    pipe.vae.to(dtype=torch.float32)
cleanup("after pipe load")

Esto es lo que intentamos conseguir con el código anterior:

  • En las GPU Ampere/Hopper (A100/H100), BF16 suele ser la mejor opción predeterminada, ya que es más rápido y eficiente en cuanto a memoria que FP32, a la vez que más estable numéricamente que FP16 para modelos grandes.
  • A continuación, cargamos el pipeline completo Qwen-Image-2512 de Hugging Face y conectamos los componentes del modelo en una única interfaz invocable. Para ello, utilizamos algunos argumentos clave:
    • torch_dtype=DTYPE: Esto carga la mayoría de los pesos en BF16 para reducir la VRAM y acelerar la inferencia.
    • low_cpu_mem_usage=True: Reduce la duplicación del lado de la CPU durante la carga (importante para puntos de control grandes).
    • use_safetensors=True: Esto garantiza que el cargador utilice el formato safetensors, más seguro y rápido, cuando esté disponible.
  • Por último, la red neuronal convolucional ( pipe.vae.to(torch.float32) ) convierte las salidas del espacio latente en píxeles. Si ese paso de decodificación encuentra valores NaN/Inf con menor precisión, la imagen final puede quedar completamente negra. Por lo tanto, obligamos al VAE a FP32 seguido de una llamada a « cleanup() » para confirmar la huella de RAM/VRAM tras la carga.

A continuación, definiremos los ajustes preestablecidos de relación de aspecto de la plataforma y conectaremos el proceso a una interfaz de usuario Gradio mínima para la generación interactiva de pósteres.

Paso 4: Preajustes y función de generación de imágenes

Ahora construimos el motor de la demostración, es decir, una pequeña capa que convierte las entradas de la interfaz de usuario en una indicación bien estructurada, elige una resolución de salida basada en los ajustes preestablecidos de la plataforma y llama al canal de imágenes Qwen para generar una imagen. 

ASPECT_PRESETS = {
    "Instagram Post (1:1) — 1328×1328": (1328, 1328),
    "Instagram Story (9:16) — 928×1664": (928, 1664),
    "YouTube / Banner (16:9) — 1664×928": (1664, 928),
    "Poster (3:4) — 1104×1472": (1104, 1472),
    "Slides (4:3) — 1472×1104": (1472, 1104),
    "Fast Draft (1:1) — 768×768": (768, 768),
}
DEFAULT_NEG = " " 
def build_prompt(product_name, product_desc, offer, price, cta, benefits, tone, style_keywords, language):
    return f"""
Create a high-converting e-commerce promotional poster in {language}. Clean grid layout, strong hierarchy.
- Product name: "{product_name}"
- Product description: "{product_desc}"
- Offer headline (exact): "{offer}"
- Price (exact): "{price}"
- CTA button text (exact): "{cta}"
- Benefits (use these exact phrases, no typos):
{benefits}
- Tone: {tone}
- Style keywords: {style_keywords}
- Text must be legible and correctly spelled.
- Do not add extra words, fake prices, or random letters.
- Align typography to a neat grid with consistent margins.
""".strip()
@torch.inference_mode()
def generate_image(product_name, product_desc, offer, price, cta, benefits, tone, style_keywords,
                   language, preset, negative_prompt, steps, true_cfg_scale, seed, show_seed):
    w, h = ASPECT_PRESETS[preset]
    prompt = build_prompt(product_name, product_desc, offer, price, cta, benefits, tone, style_keywords, language)
    if seed is None or int(seed) < 0:
        seed = random.randint(0, 2**31 - 1)
    seed = int(seed)
    gen = torch.Generator(device="cuda").manual_seed(seed)
    img = pipe(
        prompt=prompt,
        negative_prompt=negative_prompt,
        width=int(w),
        height=int(h),
        num_inference_steps=int(steps),
        true_cfg_scale=float(true_cfg_scale),
        generator=gen,
    ).images[0].convert("RGB")
    return (seed if show_seed else None), img

El mapa preestablecido y las dos funciones anteriores constituyen el motor central de nuestro Poster Studio.

  • El diccionario ASPECT_PRESETS define diferentes tamaños de lienzo para cada plataforma (por ejemplo, 1:1 para publicaciones de Instagram, 9:16 para Stories, 16:9 para banners). Los usuarios solo tienen que elegir un ajuste preestablecido y nosotros lo traducimos al lenguaje de programación correcto ( width × height ) para su generación.
  • La función « build_prompt() » convierte datos básicos sobre el producto, como el nombre, la oferta, el precio, la llamada a la acción y las ventajas, en un resumen visual. Tiene en cuenta las reglas de diseño y texto, por lo que el modelo obtiene restricciones coherentes en todo momento y no se desvía hacia copias aleatorias.
  • La función generate_image() es la capa de ejecución. Lee el ajuste preestablecido elegido para obtener width/height y llama al canal Qwen-Image con los siguientes ajustes seleccionados: steps, true_cfg_scale y negative_prompt. Por último, devuelve el póster generado (y, opcionalmente, la semilla). steps a el tiempo que dura el proceso de difusión (cuantos más pasos, más lento pero normalmente más limpio es el resultado), mientras que true_cfg_scale a la intensidad con la que el modelo sigue la indicación (un valor más alto significa una mayor adherencia, pero si es demasiado alto puede introducir artefactos).

A continuación, integraremos la función generate_image() en una interfaz Gradio para que los usuarios puedan generar pósteres sin tener que lidiar con la ingeniería de comandos sin procesar.

Paso 5: Interfaz de usuario de Gradio

Por último, envolvemos el motor de generación de pósteres en una interfaz Gradio. La aplicación permite al usuario introducir los detalles del producto, seleccionar una relación de aspecto de la plataforma y pulsar Generar. 

with gr.Blocks(title="Qwen Poster Studio (Simple)") as demo:
    gr.Markdown("## Qwen Poster Studio — Qwen-Image-2512")
    with gr.Row():
        with gr.Column(scale=1):
            product_name = gr.Textbox(value="RÅSKOG Utility Cart", label="Product name")
            product_desc = gr.Textbox(value="Compact rolling cart for small spaces. Durable metal frame.", lines=2, label="Product description")
            offer = gr.Textbox(value="NEW YEAR SALE — 20% OFF", label="Offer headline")
            price = gr.Textbox(value="$29.99", label="Price")
            cta = gr.Textbox(value="Shop now", label="CTA button text")
            benefits = gr.Textbox(value="- Compact\n- Easy to move\n- Fits small spaces", lines=4, label="Benefits")
            tone = gr.Dropdown(["Premium", "Minimal", "Bold", "Playful", "Tech"], value="Premium", label="Tone")
            style_keywords = gr.Textbox(value="modern Scandinavian minimal, clean grid, soft warm lighting, premium product photography", label="Style keywords")
            language = gr.Dropdown(["English", "中文"], value="English", label="Language")
            preset = gr.Dropdown(list(ASPECT_PRESETS.keys()), value="Instagram Post (1:1) — 1328×1328", label="Platform preset")
            with gr.Accordion("Advanced (optional)", open=False):
                negative_prompt = gr.Textbox(value=DEFAULT_NEG, label="Negative prompt", lines=2)
                steps = gr.Slider(10, 80, value=50, step=1, label="Steps")
                true_cfg_scale = gr.Slider(1.0, 10.0, value=4.0, step=0.1, label="true_cfg_scale")
                seed = gr.Number(value=-1, precision=0, label="Seed (-1 = random)")
                show_seed = gr.Checkbox(value=False, label="Show seed in output")
            btn = gr.Button("Generate", variant="primary")
        with gr.Column(scale=1):
            used_seed_out = gr.Number(label="Used seed (optional)", precision=0)
            image_out = gr.Image(label="Generated poster")
    btn.click(
        fn=generate_image,
        inputs=[product_name, product_desc, offer, price, cta, benefits, tone, style_keywords,
                language, preset, negative_prompt, steps, true_cfg_scale, seed, show_seed],
        outputs=[used_seed_out, image_out]
    )
demo.launch(share=True, debug=True)

Así es como creamos la aplicación Gradio:

  • La columna izquierda define todos los controles interactivos para el resumen del póster. Los usuarios rellenan los campos del producto, luego eligen un tono, añaden palabras clave de estilo, seleccionan un idioma y eligen una configuración predeterminada de la plataforma. El ajuste preestablecido es importante porque se asigna directamente al width × height final utilizando ASPECT_PRESETS.
  • Los controles «Avanzados» incluyen parámetros clave como « steps » (Iteraciones de eliminación de ruido) y « true_cfg_scale » (Sensibilidad a la entrada), que controlan, respectivamente, el número de iteraciones de eliminación de ruido que ejecuta el modelo y la intensidad con la que el modelo sigue la indicación. La semilla controla la reproducibilidad, y show_seed muestra opcionalmente la semilla final.
  • Mientras que la columna derecha contiene la imagen del póster generada y, opcionalmente, la semilla utilizada para esa generación.
  • Por último, la llamada btn.click() conecta todo. Gradio toma todos los widgets de entrada en orden, los pasa a generate_image() y envía los valores devueltos a los widgets de salida. Por último, demo.launch(share=True, debug=True) inicia el servidor Gradio, nos proporciona un enlace público compartible para las demostraciones e imprime registros de depuración en el cuaderno para ayudar a diagnosticar problemas.

Aquí tienes un vídeo que muestra nuestra aplicación Qwen Image 2512 final en acción:

Conclusión

Qwen-Image-2512 es aplicable tanto para generar imágenes fotorrealistas como para diseños fiables con gran cantidad de texto. En este tutorial, hemos creado un Poster Studio integral basado en Diffusers. Cargamos el modelo en un A100, añadimos ajustes preestablecidos de relación de aspecto de la plataforma y lo envolvimos todo en una interfaz de usuario Gradio que convierte las simples entradas de productos en creatividades de comercio electrónico pulidas.

Si utilizas GPU más pequeñas, se aplica el mismo flujo de trabajo, solo tienes que iterar a una resolución de 768×768, reducir los pasos y tener en cuenta los tiempos de ejecución cuantificados cuando necesites escalar.

Preguntas frecuentes sobre Qwen-Image-2512

¿Puedo ejecutar Qwen-Image-2512 en una GPU de consumo (como una RTX 4090)?

Sí, pero probablemente no puedas ejecutar el modelo completo con su precisión original. La versión completa de BF16 requiere alrededor de 48 GB+ de VRAM, lo que la pone fuera del alcance de las tarjetas estándar para consumidores (incluso la RTX 4090 de 24 GB). Sin embargo, puedes ejecutarlo en tarjetas de 24 GB utilizando cuantificación FP8 o formatos GGUF (de forma similar a como se ejecuta Llama 3 localmente). Para tarjetas de 16 GB, es casi seguro que tendrás que utilizar variantes GGUF de 4 bits (Q4_K_M) para que el modelo quepa en la memoria sin que se bloquee.

¿Qwen-Image-2512 es de uso comercial gratuito?

Sí. A diferencia de algunos competidores que utilizan licencias comunitarias restrictivas «solo para investigación» o «no comerciales», Qwen-Image-2512 se publicó bajo la licencia Apache 2.0. Por lo general, esto te permite utilizar el modelo para aplicaciones comerciales, integrarlo en productos y crear servicios (como este Poster Studio) sin pagar derechos de autor, siempre y cuando cumplas con los términos de la licencia.

¿En qué se diferencia de FLUX.2?

Son competidores con diferentes puntos fuertes.

  • FLUX.2 (y FLUX.1 Pro) se considera generalmente el rey del fotorrealismo y la estética. Si necesitas «vibraciones», estilo artístico o resolución nativa de 4 MP para fotografía, FLUX.2 suele ser superior.
  • Qwen-Imagen-2512 gana en la representación de texto y el seguimiento de instrucciones. Debido a que utiliza un codificador de texto con 7 mil millones de parámetros, sigue diseños de indicaciones complejos («coloca el texto X aquí, crea el botón Y allí») con mucha más precisión que FLUX. También es mejor en textos bilingües (chino/inglés) y en la generación de imágenes similares a documentos (carteles, gráficos, facturas).

¿Necesitas difusores de la fuente?

Sí, para Qwen-Image-2512, la propia tarjeta del modelo indica que se instalen difusores de GitHub para obtener la compatibilidad con el último canal.

¿Es «guidance_scale» el control adecuado?

Por ahora, no para Qwen-Image. En la integración actual de Diffusers, guidance_scale es esencialmente un marcador de posición, por lo que no nos proporcionará una orientación sin clasificador. Por lo tanto, utilizamos true_cfg_scale junto con un espacio en blanco ( negative_prompt, incluso un solo espacio « ») para controlar la orientación. Un mayor nivel de « true_cfg_scale » aumenta la adherencia inmediata, pero elevarlo demasiado puede introducir artefactos.

¿Cuál es el tamaño del modelo Qwen-Image-2512 FAQs?

Según el repositorio HF, el tamaño de Qwen-Image-2512 es de aproximadamente 57,7 GB, lo que resulta bastante grande para la inferencia local.

¿Por qué es tan alto el uso de memoria?

El uso de memoria es elevado porque el canal incluye un codificador de texto de gran tamaño (Qwen2.5-VL-7B Instruct) junto con el transformador de difusión y el codificador automático variacional (VAE).


Aashi Dutt's photo
Author
Aashi Dutt
LinkedIn
Twitter

Soy experta Google Developers en ML (Gen AI), triple experta en Kaggle y embajadora de Women Techmakers, con más de tres años de experiencia en el sector tecnológico. Cofundé una startup de salud en 2020 y actualmente curso un máster en informática en Georgia Tech, con especialización en aprendizaje automático.

Temas

Los mejores cursos de DataCamp

Curso

Modelos multimodales con Hugging Face

4 h
1.3K
Combina texto, imágenes, audio y vídeo con los últimos modelos de IA de Hugging Face y genera nuevas imágenes y vídeos.
Ver detallesRight Arrow
Iniciar curso
Ver másRight Arrow
Relacionado
An AI juggles tasks

blog

Cinco proyectos que puedes crear con modelos de IA generativa (con ejemplos)

Aprende a utilizar modelos de IA generativa para crear un editor de imágenes, un chatbot similar a ChatGPT con pocos recursos y una aplicación clasificadora de aprobación de préstamos y a automatizar interacciones PDF y un asistente de voz con GPT.
Abid Ali Awan's photo

Abid Ali Awan

10 min

Tutorial

RAG Con Llama 3.1 8B, Ollama y Langchain: Tutorial

Aprende a crear una aplicación RAG con Llama 3.1 8B utilizando Ollama y Langchain, configurando el entorno, procesando documentos, creando incrustaciones e integrando un recuperador.
Ryan Ong's photo

Ryan Ong

Tutorial

Cómo utilizar Midjourney Guía completa para la creación de obras de arte generadas por IA

Descubre el poder de Midjourney, una herramienta de IA generativa para crear asombrosas obras de arte. Aprende cómo empezar, escribe prompts eficaces y optimiza su uso con nuestra guía paso a paso.
Kurtis Pykes 's photo

Kurtis Pykes

Tutorial

Descomposición QR para el aprendizaje automático

Conoce la descomposición QR, la técnica de factorización de matrices que descompone la matriz A en el producto de una matriz ortogonal Q y una matriz triangular superior R. Practica el proceso de Gram-Schmidt en programación R.
Josef Waples's photo

Josef Waples

Tutorial

Tutorial de Power BI para principiantes

Aprende los fundamentos de Power BI y a crear un informe básico con este tutorial paso a paso.
DataCamp Team's photo

DataCamp Team

Tutorial

Tutorial sobre cómo crear aplicaciones LLM con LangChain

Explore el potencial sin explotar de los grandes modelos lingüísticos con LangChain, un marco Python de código abierto para crear aplicaciones avanzadas de IA.
Moez Ali's photo

Moez Ali

Ver másVer más