Cursus
Il y a quelques semaines, ChatGPT est devenu viral avec son nouveau modèle de génération d'images. Ce modèle est de loin le meilleur que j'ai vu. C'est sa capacité à éditer des images qui le distingue. Il est incroyablement précis et permet de donner facilement vie à l'imagination. D'autres modèles peuvent également le faire, mais pas avec le même degré de précision.
La génération d'images dans leur interface est facile, puisqu'il suffit de fournir une invite textuelle. Cependant, en tant que programmeur, j'avais hâte qu'elle soit intégrée à l'API afin de pouvoir interagir avec elle de manière programmatique. Ce jour est enfin arrivé, et j'écris ce blog pour vous apprendre à l'utiliser avec Python.
Si vous souhaitez uniquement apprendre à l'utiliser dans l'interface de chat, j'ai précédemment écrit ce Guide de génération d'images GPT-4o avec huit exemples pratiques.
Développer des applications d'IA
Configuration de l'API GPT-Image-1
Le nouveau modèle d'image GPT est protégé, ce qui signifie que des vérifications supplémentaires sont nécessaires pour pouvoir l'utiliser. Dans cette section, nous décrivons comment configurer l'API. Si vous disposez déjà d'une clé API, vous pouvez sauter la première étape.
Étape 1 : Générer une clé API
La première étape consiste à générer une clé API. Nous pouvons en créer une en nous connectant à leur plateforme et en naviguant vers la page clés API. Ensuite, nous cliquons sur le bouton "Créer une nouvelle clé secrète".
Une fois la clé générée, créez un fichier nommé .env et copiez-le avec le format suivant :
OPENAI_API_KEY=<paste_your_api_key_here>
Étape 2 : Vérification de notre organisation
Une grande différence avec les autres modèles OpenAI est que l'utilisation de l'API de l'image GPT exige que nous vérifiions notre organisation. La raison en est que GPT-Image-1 peut générer des images réalistes et détaillées, ce qui soulève des inquiétudes quant à une éventuelle utilisation abusive, comme la création de deepfakes ou de contenus inappropriés. En vérifiant les organisations, OpenAI peut mieux contrôler l'utilisation et appliquer ses politiques de sécurité.
Vous pouvez vérifier votre organisation même si vous n'avez pas d'entreprise. Notez toutefois que cette procédure nécessite de fournir votre carte d'identité gouvernementale et de procéder à une vérification faciale.
Pour effectuer la vérification, accédez à l'onglet onglet général de la plateforme OpenAI API et cliquez sur le bouton situé sous la section "Vérifications".
Le processus est effectué par une tierce partie et consiste à :
- Téléchargement d'une image d'un document d'identification.
- Utilisez l'appareil photo de votre appareil mobile pour vérifier que votre identité correspond au document fourni.
La procédure ne prend que quelques minutes, puis environ 15 minutes pour le traitement.
Configuration de Python
Pour ce tutoriel, nous allons installer les paquets Python suivants :
openai: Le paquetage officiel d'OpenAI qui nous permet d'interagir avec leur API.dotenv: Un paquetage Python qui facilite le chargement en toute sécurité de la clé API à partir du fichier.envque nous avons créé ci-dessus.
Nous pouvons les installer à l'aide de la commande :
pip install openai dotenv
Génération de notre première image avec GPT-Image-1
Voyons comment nous pouvons générer une image avec gpt-image-1. Commencez par créer un nouveau fichier Python, par exemple generate_image.py, dans le même dossier que le fichier .env.
Ensuite, importez les paquets nécessaires :
# Import the packages
from openai import OpenAI
from dotenv import load_dotenv
import os
import base64
import time
Notez que os et base64 sont des paquets Python intégrés et n'ont pas besoin d'être installés.
Ensuite, nous chargeons la clé API et initialisons le client OpenAI :
# Load the API key
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
# Initialize the OpenAI client
client = OpenAI(api_key=api_key)
Ensuite, nous demandons à l'utilisateur de saisir un texte à l'aide de la fonction intégrée input() et nous envoyons une demande de génération d'image à l'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",
)
Enfin, nous enregistrons l'image générée dans un fichier :
# 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)
Le texte complet est disponible ici. Pour exécuter ce script, utilisez la commande :
python generate_image.py
Voici un exemple avec le résultat :

GPT-Image 1-paramètres
Dans cette section, nous décrivons les paramètres les plus importants du modèle gpt-image-1:
prompt: Instruction textuelle décrivant l'image que nous voulons que le modèle génère.background: Le type d'arrière-plan de l'image. Il doit s'agir de l'une des adresses suivantes :"transparent","opaque", ou"auto". La valeur par défaut est"auto", c'est-à-dire que le modèle décide du meilleur type d'arrière-plan en fonction du contenu. Notez que les images JPEG ne supportent pas les arrière-plans transparents.n: Le nombre d'images à générer. Doit être un nombre de 1 à 10.quality: La qualité de l'image générée. Il doit être l'un des suivants :"high","medium", ou"low", la valeur par défaut étant"high".size: La taille de l'image en pixels. Il doit s'agir de l'un des formats suivants :"1024x1024"(carré),"1536x1024"(paysage),"1024x1536"(portrait).output_format: Le format de l'image. Il doit s'agir de l'une des adresses suivantes :"png","jpeg", ou"webp". La valeur par défaut est"png".moderation: Le niveau de modération du contenu. Doit être soit"low"pour un filtre moins restrictif, soit"auto", qui est la valeur par défaut.
Nous avons couvert les paramètres les plus importants disponibles pour le modèle gpt-image-1. Pour plus de détails et une liste complète de paramètres, consultez la documentation officielle de l'API.
Effets du paramètre de qualité
Voici une comparaison côte à côte d'images générées à partir de la même invite avec des qualités différentes :

Nous constatons que le premier chat (avec la qualité la plus faible) présente quelques artefacts autour des yeux, et que l'image devient nettement plus réaliste au fur et à mesure que la qualité augmente.
Voici un autre exemple avec une sortie de type dessin animé :

Dans ce cas, on remarque également que plus la qualité est élevée, plus l'image est soignée. À mon avis, cela est moins pertinent pour les contenus qui ne sont pas censés être réalistes.
N'oubliez pas que plus la qualité est élevée, plus le coût et le temps de calcul le sont également, et qu'il est donc judicieux de trouver un bon compromis, en fonction du cas d'utilisation. Je vous recommande d'essayer les paramètres de bas en haut pour déterminer la valeur minimale qui donne des résultats acceptables pour chaque cas d'utilisation.
Paramètres de base
Dans mes expériences, j'ai constaté que le modèle ignorait le plus souvent ce paramètre. Voici des exemples côte à côte dans lesquels j'ai modifié les paramètres de background et les instructions de transparence dans l'invite :

Dans le premier exemple, le paramètre de transparence a été ignoré. Dans la seconde, j'ai ajouté les instructions de transparence dans l'invite, et cela a fonctionné un peu mieux. Dans la dernière, j'ai demandé un fond opaque mais j'ai précisé que je voulais un autocollant dans l'invite et j'ai obtenu un fond transparent.
Je recommande toujours d'utiliser le paramètre en fonction de ce que vous souhaitez, mais veillez à spécifier également le résultat souhaité dans l'invite pour le renforcer.
Édition d'images avec GPT-Image-1
Comme je l'ai mentionné dans l'introduction, la partie la plus intéressante de GPT-Image-1 est sa capacité à éditer des images. Commençons par apprendre à lui demander de modifier une image, puis explorons quelques cas d'utilisation.
Pour éditer des images, la plupart du code peut être réutilisé. La seule chose qui change est qu'au lieu d'utiliser la fonction client.images.generate(), nous utilisons la fonction client.images.edit().
En voici un exemple :
img = client.images.edit(
model="gpt-image-1",
image=[
open("my-image.jpg", "rb"),
],
prompt=prompt,
n=1,
quality="high",
size="1024x1536",
)
Le nouveau paramètre est image. Il s'agit d'une liste d'images d'entrée à utiliser dans le montage. Dans ce cas, nous ne fournissons qu'une image nommée my-image.jpg située dans le même dossier que le script.
Voici un exemple d'utilisation de GPT Image 1 pour modifier une de mes photos :

Notez qu'étant donné que l'image originale a un rapport portrait, j'ai utilisé la taille portrait 1024x1536. Cependant, il ne s'agit pas du même ratio que l'image originale. Même en mode édition, le modèle ne peut produire que des images dans les trois tailles spécifiées ci-dessus.
Le script complet de l'édition est disponible ici.
Utilisation de masques
Le mode édition fournit un paramètre mask que nous pouvons utiliser pour spécifier les zones où l'image doit être éditée. Le masque doit être une image PNG d'au plus 4 Mo et avoir la même taille que l'image. Les zones avec une transparence de 100 % correspondent aux zones que GPT Image 1 est autorisé à modifier.
Nous fournissons le masque de la même manière que l'image, sauf qu'il ne s'agit pas d'une liste dans ce cas :
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",
)
Cependant, lorsque je l'ai expérimenté, cela n'a pas très bien fonctionné, et j'ai vu des rapports en ligne de personnes ayant des problèmes similaires.
En voici un exemple :

J'ai également essayé de l'utiliser pour ajouter des éléments à des endroits spécifiques, mais cela n'a pas fonctionné de manière cohérente. Tout comme le paramètre background pour la génération d'images, j'ai découvert que la description de ce que je veux dans l'invite est la plus efficace.
Utilisation de plusieurs images
Le modèle peut traiter et combiner plusieurs images à la fois. Dans l'exemple ci-dessous, nous l'utilisons pour créer une affiche marketing combinant les images de ces trois boissons individuelles :

Nous fournissons les trois images sous forme de liste dans le paramètre image, comme suit :
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",
)
Voici le résultat :

GPT-Image-1 Tarification
La production d'images est facturée sur la base de :
- Le nombre de tokens dans l'invite de texte.
- Le nombre de tokens dans les images d'entrée.
- Le nombre de jetons dans l'image de sortie.

Il est parfois difficile de se faire une idée de ce que ces coûts représentent, car nous ne savons pas combien de jetons une image contient.
Les dimensions des images de sortie étant connues, nous savons combien de jetons sont nécessaires pour chacune d'entre elles, ce qui nous permet de donner des valeurs précises pour le prix des jetons de l'image de sortie (qui est l'élément le plus coûteux) :

Ce prix dépend de la qualité de l'image et de la taille. Pour plus de détails, consultez la page Page de tarification de l'image GPT 1.
Lorsque nous générons une image, l'API renvoie le nombre de jetons utilisés, ce qui nous permet de le combiner avec les informations ci-dessus pour connaître le coût exact de l'image.
Nous pouvons afficher le nombre de jetons utilisés en imprimant le champ usage du résultat :
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)
Sortie :
Prompt tokens: 8
Input images tokens: 0
Output image tokens: 272
Conclusion
Malgré quelques lacunes de l'API, comme le masquage et la transparence qui ne sont pas suffisamment fiables, le modèle peut exécuter avec une grande précision les instructions fournies dans l'invite.
Je pense que ce modèle ouvre de nombreuses possibilités de construction autour de lui. Dans ce tutoriel, nous avons appris les bases de son utilisation. Voici quelques idées que vous pourriez explorer pour compléter ce que vous avez appris ici :
- Rationaliser la conversion des photos de nourriture prises par téléphone en de superbes photos de nourriture destinées à être utilisées par les restaurants dans leurs menus.
- À partir de la photo d'un ami ou d'un selfie, créez un pack d'autocollants exprimant plusieurs émotions à utiliser dans les applications de chat.
- Créez un outil qui, à partir des descriptions de scènes individuelles, crée une bande dessinée à partir de ces scènes.
