Programa
Hace unas semanas, ChatGPT se hizo viral con su nuevo modelo de generación de imágenes. Este modelo es con diferencia el mejor que he visto. Su capacidad para editar imágenes es lo que la distingue. Es increíblemente preciso y facilita enormemente dar vida a la imaginación. Otros modelos también pueden hacerlo, pero no con el mismo grado de precisión.
Generar imágenes en su interfaz es fácil, ya que sólo tenemos que proporcionar una indicación de texto. Sin embargo, como programador, estaba deseando que llegara a la API para poder interactuar con ella mediante programación. Por fin ha llegado ese día, y escribo este blog para enseñarte a utilizarlo con Python.
Si sólo te interesa aprender a utilizarlo dentro de la interfaz del chat, anteriormente escribí esta Guía de generación de imágenes GPT-4o con ocho ejemplos prácticos.
Desarrollar aplicaciones de IA
Configuración de la API GPT-Imagen-1
El nuevo modelo de imagen GPT está protegido, lo que significa que se requieren verificaciones adicionales para poder utilizarlo. En esta sección describimos cómo configurar la API. Si ya tienes una clave API, puedes saltarte el primer paso.
Paso 1: Generar una clave API
El primer paso es generar una clave API. Podemos crear una iniciando sesión en su plataforma y navegando hasta la página Página de claves API. A continuación, hacemos clic en el botón "Crear nueva clave secreta".
Una vez generada la clave, crea un archivo llamado .env
y cópialo con el siguiente formato:
OPENAI_API_KEY=<paste_your_api_key_here>
Paso 2: Verificar nuestra organización
Una gran diferencia con los demás modelos de OpenAI es que, al utilizar la API de imágenes GPT, debemos verificar nuestra organización. El motivo es que GPT-Image-1 puede generar imágenes realistas y detalladas, lo que suscita preocupación por un posible uso indebido, como la creación de deepfakes o contenido inapropiado. Al verificar las organizaciones, OpenAI puede controlar mejor el uso y hacer cumplir sus políticas de seguridad.
Puedes verificar tu organización aunque no tengas una empresa. Sin embargo, ten en cuenta que este proceso requiere proporcionar tu documento de identidad oficial y completar la verificación facial.
Para realizar la verificación, navega a la pestaña pestaña general de la plataforma de la API OpenAI y haz clic en el botón de la sección "Verificaciones".
El proceso lo realiza un tercero y consiste en:
- Cargar una imagen de un documento de identificación.
- Utiliza la cámara de tu dispositivo móvil para verificar que tu identidad coincide con el documento facilitado.
El proceso tarda sólo un par de minutos en completarse, y luego unos 15 minutos en procesarse.
Configuración de Python
Para este tutorial, instalaremos los siguientes paquetes de Python:
openai
: El paquete oficial de OpenAI que nos permite interactuar con su API.dotenv
: Un paquete Python que facilita la carga segura de la clave API desde el archivo.env
que creamos anteriormente.
Podemos instalarlos utilizando el comando
pip install openai dotenv
Generar nuestra primera imagen con GPT-Image-1
Veamos cómo podemos generar una imagen con gpt-image-1
. Empieza creando un nuevo archivo Python, por ejemplo, generate_image.py
, en la misma carpeta que el archivo .env.
A continuación, importa los paquetes necesarios:
# Import the packages
from openai import OpenAI
from dotenv import load_dotenv
import os
import base64
import time
Ten en cuenta que os
y base64
son paquetes integrados de Python y no es necesario instalarlos.
A continuación, cargamos la clave API e inicializamos el cliente OpenAI:
# Load the API key
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
# Initialize the OpenAI client
client = OpenAI(api_key=api_key)
A continuación, pedimos al usuario que introduzca un texto mediante la función integrada input()
y enviamos una solicitud de generación de imagen a la API:
# Ask the user to input a prompt in the terminal
print("What do you want to generate?")
prompt = input("> ")
print("Generating image...")
# Send the prompt to the API
img = client.images.generate(
model="gpt-image-1",
prompt=prompt,
background="auto",
n=1,
quality="high",
size="1024x1024",
output_format="png",
moderation="auto",
)
Por último, guardamos la imagen generada en un archivo:
# Save the image into a file
image_bytes = base64.b64decode(img.data[0].b64_json)
with open(f"output_{int(time.time())}.png", "wb") as f:
f.write(image_bytes)
Puedes encontrar el guión completo aquí. Para ejecutar este script, utiliza el comando
python generate_image.py
Aquí tienes un ejemplo con el resultado:
GPT-Imagen 1-parámetros
En esta sección, describimos los parámetros más relevantes del modelo gpt-image-1
:
prompt
: La instrucción textual que describe qué imagen queremos que genere el modelo.background
: El tipo de fondo de la imagen. Debe ser uno de los siguientes:"transparent"
,"opaque"
, o"auto"
. El valor por defecto es"auto"
, en el que el modelo decidirá en función del contenido cuál es el mejor tipo de fondo. Ten en cuenta que las imágenes JPEG no admiten fondos transparentes.n
: El número de imágenes a generar. Debe ser un número del 1 al 10.quality
: La calidad de la imagen generada. Debe ser uno de los siguientes:"high"
,"medium"
, o"low"
, siendo por defecto"high"
.size
: El tamaño de la imagen en píxeles. Debe ser uno de los siguientes:"1024x1024"
(cuadrado),"1536x1024"
(apaisado),"1024x1536"
(retrato).output_format
: El formato de la imagen. Debe ser uno de los siguientes:"png"
,"jpeg"
, o"webp"
. El valor por defecto es"png"
.moderation
: El nivel de moderación del contenido. Debe ser"low"
para un filtro menos restrictivo o"auto"
, que es el valor por defecto.
Hemos cubierto los parámetros más importantes disponibles para el modelo gpt-image-1
. Para más detalles y una lista completa de parámetros, consulta la documentación oficial de la API.
Efectos del parámetro de calidad
Aquí tienes una comparación de imágenes generadas utilizando el mismo indicador con diferentes calidades:
Vemos que el primer gato (con la calidad más baja) tiene algunos artefactos alrededor de los ojos, y que la imagen se vuelve significativamente más realista a medida que aumenta la calidad.
Aquí tienes otro ejemplo con una salida estilo dibujos animados:
En este caso, también observamos que cuanto mayor es la calidad, más pulida es la imagen. En mi opinión, sin embargo, esto es menos relevante para los contenidos que no pretenden ser realistas.
Recuerda que cuanto mayor sea la calidad, mayor será el coste y el tiempo de cálculo, así que es buena idea encontrar un buen equilibrio, dependiendo del caso de uso. Te recomendaría probar los parámetros de bajo a alto para ver el valor mínimo que da resultados aceptables para cada caso de uso.
Parámetro de fondo
En mis experimentos, comprobé que el modelo ignoraba mayoritariamente este parámetro. Aquí tienes ejemplos paralelos en los que he variado los parámetros de background
y las instrucciones de transparencia del aviso:
En el primer ejemplo, se ignoró el parámetro de transparencia. En la segunda, añadí las instrucciones de transparencia en el aviso, y funcionó un poco mejor. En la última, pedí un fondo opaco, pero especifiqué que quería una pegatina en el aviso y obtuve un fondo transparente.
Sigo recomendando utilizar el parámetro para que coincida con lo que quieres, pero asegúrate de especificar también el resultado deseado en la consulta para reforzarlo.
Editar imágenes con GPT-Imagen-1
Como mencioné en la introducción, la parte más emocionante de GPT-Imagen-1 es su capacidad para editar imágenes. Empecemos por aprender a pedirle que edite una imagen y luego exploremos algunos casos de uso.
Para editar imágenes, se puede reutilizar la mayor parte del código. Lo único que cambia es que en lugar de utilizar la función client.images.generate()
, utilizamos la función client.images.edit()
.
He aquí un ejemplo:
img = client.images.edit(
model="gpt-image-1",
image=[
open("my-image.jpg", "rb"),
],
prompt=prompt,
n=1,
quality="high",
size="1024x1536",
)
El nuevo parámetro es image
. Es una lista de imágenes de entrada que se utilizarán en la edición. En este caso, sólo proporcionamos una imagen llamada my-image.jpg
situada en la misma carpeta que el script.
Aquí tienes un ejemplo del uso de GPT Imagen 1 para editar una de mis fotos:
Ten en cuenta que, como la imagen original tiene una proporción vertical, he utilizado el tamaño vertical 1024x1536
. Sin embargo, no es la misma proporción que la imagen original. Incluso en el modo de edición, el modelo sólo puede producir imágenes en los tres tamaños especificados anteriormente.
Puedes encontrar el guión de edición completo aquí.
Utilizar máscaras
El modo Edición proporciona un parámetro mask
que podemos utilizar para especificar las áreas en las que se debe editar la imagen. La máscara debe ser una imagen PNG de 4 MB como máximo y tener el mismo tamaño que la imagen. Las zonas con un 100% de transparencia corresponden a las zonas que GPT Imagen 1 puede editar.
Proporcionamos la máscara del mismo modo que la imagen, salvo que en este caso no es una lista:
img = client.images.edit(
model="gpt-image-1",
image=[
open(sys.argv[1], "rb"),
],
# We provide the mask like this
mask=open("mask.png", "rb"),
prompt=prompt,
n=1,
quality="high",
size="1536x1024",
)
Sin embargo, cuando experimenté con él, no funcionó muy bien, y he visto informes en Internet de personas con problemas similares.
He aquí un ejemplo:
También he intentado utilizarlo para añadir elementos en lugares específicos, y no funcionó de forma consistente. Al igual que con el parámetro background
para la generación de imágenes, he descubierto que describir lo que quiero en el prompt funciona mejor.
Utilizar varias imágenes
El modelo puede procesar y combinar varias imágenes a la vez. En el ejemplo siguiente, lo utilizamos para crear un cartel publicitario que combina las imágenes de estas tres bebidas individuales:
Proporcionamos las tres imágenes en forma de lista en el parámetro image
, como sigue:
prompt = """
Create a vibrant and eye-catching marketing poster to
promote the cold drinks offerings at our coffee shop.
"""
img = client.images.edit(
model="gpt-image-1",
# We can provide multiple images at once
image=[
open("latte.png", "rb"),
open("americano.png", "rb"),
open("icetea.png", "rb"),
],
prompt=prompt,
size="1536x1024",
)
He aquí el resultado:
GPT-Imagen-1 Precios
La generación de imágenes se cobra en función de:
- El número de tokens de la petición de texto.
- El número de fichas en las imágenes de entrada.
- El número de fichas en la imagen de salida.
A veces es difícil hacerse una idea de lo que representan estos costes, porque no sabemos de cuántas fichas consta una imagen.
Como se conocen las dimensiones de las imágenes de salida, sabemos cuántas fichas se necesitan para cada una, por lo que podemos dar valores precisos para el precio de las fichas de la imagen de salida (que es la parte más cara):
El precio depende de la calidad de la imagen y del tamaño. Para más detalles, consulta la Página de precios de la Imagen GPT 1.
Cuando generamos una imagen, la API devuelve el número de tokens que ha utilizado, de modo que podemos combinarlo con la información anterior para saber exactamente cuánto cuesta.
Podemos mostrar la cantidad de fichas utilizadas imprimiendo el campo usage
del resultado:
img = client.images.generate(
model="gpt-image-1",
prompt=prompt,
background="transparent",
n=1,
quality="medium",
size="1024x1024",
moderation="auto",
output_format="png",
)
# Add this to see the usage
print("Prompt tokens:", img.usage.input_tokens_details.text_tokens)
print("Input images tokens:", img.usage.input_tokens_details.image_tokens)
print("Output image tokens:", img.usage.output_tokens)
Salida:
Prompt tokens: 8
Input images tokens: 0
Output image tokens: 272
Conclusión
A pesar de algunas deficiencias de la API, como que el enmascaramiento y la transparencia no son lo bastante fiables, el modelo puede ejecutar con gran precisión las instrucciones proporcionadas en el prompt.
Creo que este modelo abre muchas posibilidades para construir a su alrededor. En este tutorial, aprendimos lo básico para utilizarlo. Aquí tienes algunas ideas que quizá quieras explorar para aprovechar lo que has aprendido aquí:
- Racionalizar la conversión de fotos de comida hechas con el teléfono en bellas fotografías de comida para que los restaurantes las utilicen en sus menús.
- A partir de la foto de un amigo o de un selfie, crea un paquete de pegatinas que exprese varias emociones para utilizarlo en aplicaciones de chat.
- Crea una herramienta que, dadas las descripciones de escenas individuales, cree un cómic a partir de esas escenas.