top of page

Generare Immagini con Intelligenza Artificiale IA Utilizzando Python


Immagina di poter descrivere qualsiasi immagine e lasciare che un computer la crei per te.


Ciò che sembrava futuristico solo pochi anni fa è diventato realtà grazie ai progressi nelle reti neurali e nei modelli di diffusione latente (LDM). DALL·E di OpenAI ha fatto scalpore attraverso l'incredibile arte generativa e le immagini realistiche che le persone creano con esso.



Generare Immagini con Intelligenza Artificiale IA Utilizzando Python
Generare Immagini con Intelligenza Artificiale IA Utilizzando Python


Ora OpenAI consente l'accesso a DALL·E attraverso la loro API, il che significa che è possibile incorporare la sua funzionalità nelle proprie applicazioni Python.


In questo tutorial, scoprirai:

  • Come iniziare a utilizzare la libreria Python di OpenAI

  • Esplorare le chiamate API relative alla generazione di immagini

  • Creare immagini da prompt di testo

  • Generare variazioni dell'immagine generata

  • Convertire le risposte JSON Base64 in file immagine PNG


Per seguire questo tutorial con facilità, è consigliabile avere una certa esperienza con Python, JSON e le operazioni sui file. Tuttavia, non preoccuparti se sei alle prime armi, poiché troverai collegamenti pertinenti durante il testo per approfondire questi argomenti.


Se non hai mai sperimentato l'interfaccia utente web di DALL·E prima d'ora, ti consiglio di provarla prima di tornare qui per imparare come utilizzarla in modo programmato con Python.


IntelligenzaArtificialeItalia.net è entusiasta di portarti alla scoperta di queste incredibili potenzialità, offrendoti un viaggio nel mondo dell'intelligenza artificiale applicata alla creazione di immagini.


Se sei un appassionato di tecnologia e creatività, continueremo insieme a esplorare le possibilità offerte da questa fusione tra arte e intelligenza artificiale. Continua a leggere per saperne di più su come puoi iniziare a creare immagini straordinarie con il potere di Python e dell'IA.



Generare Immagini con Intelligenza Artificiale Utilizzando Python

DALL–E è sviluppato da OpenAI ed è basato su una versione modificata del modello GPT-3 che consente al modello di IA di generare immagini da input testuali o immagini. DALL–E è allenato su 3,5 miliardi di parametri, il che gli consente di eseguire una vasta gamma di compiti sulle immagini in modo fluido.


DALL–E ha molteplici casi d'uso, come la creazione di contenuti per i social media, la creazione di loghi, l'editing di immagini, la generazione di pubblicità, e molti altri, rendendolo uno strumento prezioso nell'attuale panorama tecnologico.



Generare Immagini con OpenAI in Python

In questa sezione, esploreremo passo dopo passo come utilizzare l'API di DALL–E in Python per generare ed editare immagini.


Passo 1: Accedi al tuo account OpenAI dopo averne creato uno.


Passo 2: Come mostrato nella figura sottostante, dopo il login, seleziona "Personale" dal menu in alto a destra e successivamente seleziona "Visualizza chiavi API".



Passo 3: Dopo aver completato il passo 2, viene visualizzata una pagina contenente le chiavi API, e il pulsante "Crea nuova chiave segreta" è visibile. Una chiave segreta viene generata cliccando su di esso; copiala e salvala altrove, poiché sarà necessaria nei passaggi successivi.



Iniziamo a programmare, ma prima il setup.


Installare la Libreria OpenAI per Python

Conferma di eseguire Python versione 3.7.1 o superiore, crea e attiva un ambiente virtuale e installa la libreria OpenAI per Python:


Windows

PS> python --version Python 3.11.0 
PS> python -m venv venv 
PS> .\venv\Scripts\activate 
(venv) PS> python -m pip install openai

Linux + macOS

$ python --version Python 3.11.0 
$ python -m venv venv 
$ source venv/bin/activate 
(venv) $ python -m pip install openai

Il pacchetto openai ti fornisce accesso completo all'API di OpenAI. In questo tutorial, ci concentreremo sulla classe Image, che puoi utilizzare per interagire con DALL·E per creare ed editare immagini da prompt di testo.



Salva la Tua Chiave API

Un modo rapido per salvare la tua chiave API e renderla disponibile per gli script Python è salvarla come variabile d'ambiente. Seleziona il tuo sistema operativo per imparare come farlo:


Windows

(venv) PS> $ENV:OPENAI_API_KEY = "<la-tua-chiave-qui>"

Linux + macOS

(venv) $ export OPENAI_API_KEY="<la-tua-chiave-qui>"


Con questo comando, rendi la chiave API accessibile sotto la variabile d'ambiente OPENAI_API_KEY nella tua sessione terminale corrente. Ricorda che la perderai se chiudi il terminale.


Puoi nominare la tua variabile come preferisci, ma se usi OPENAI_API_KEY, che è il nome suggerito dalla documentazione di OpenAI, potrai utilizzare gli esempi di codice forniti senza bisogno di ulteriori configurazioni.


Configurazione perfetta completata. Ora, prima di iniziare a generare immagini, controlliamo il prezzo per ogni generazione utilizzando OpenAI.


Comprensione dei Costi per generare immagini

OpenAI assegna l'utilizzo dell'API attraverso chiavi uniche, assicurati di mantenere la tua chiave API privata solo per te. L'azienda calcola il costo delle richieste all'API Images su base per immagine, che dipende dalla risoluzione dell'immagine di output:

Risoluzione

Prezzo per immagine

256×256

$0.016

512×512

$0.018

1024×1024

$0.020

Se ti sei registrato di recente con l'API di OpenAI, beneficerai della prova gratuita che ti consente di utilizzare $5 di crediti gratuiti nei primi tre mesi. Ciò ti consente di generare molte immagini se sei qui per esplorare!


Tuttavia, tieni presente che è un budget di prova gratuito unico per tutti i servizi dell'API OpenAI, quindi potresti non volerlo spendere tutto per creare immagini straordinarie.


Nota anche che non puoi utilizzare i crediti dall'interfaccia web di DALL·E per le chiamate API. I servizi API di OpenAI stanno cambiando rapidamente. Verifica la loro pagina web per informazioni aggiornate su prezzi e offerte.


Con i costi e la logistica risolti, e la tua chiave API memorizzata in sicurezza, sei ora pronto a creare alcune immagini da prompt di testo.

Genera un'Immagine da un Testo con DALL·E di OpenAI

Inizia confermando di essere pronto per procedere utilizzando la libreria openai attraverso la sua interfaccia a riga di comando:


(venv) $ openai api image.create -p "un computer vaporwave"


Questo comando invierà una richiesta all'API Immagini di OpenAI e creerà un'immagine dal prompt di testo "un computer vaporwave". In risposta, riceverai una risposta JSON che contiene un URL che punta alla tua appena creata immagine:


{ "created": 1668073562, "data": [ { "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org ⮑ -QANMxYn3BsMeuAbRT8X3iiu3/user-xSuQTJ0IIVj3dHM4DPymXTg4/img-5GqtVx ⮑ L86Retwi282RbE8HzA.png?st=2022-11-10T08%3A46%3A02Z&se=2022-11-10T1 ⮑ 0%3A46%3A02Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&sk ⮑ oid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e- ⮑ a814-9c849652bcb3&skt=2022-11-09T14%3A20%3A19Z&ske=2022-11-10T14%3 ⮑ A20%3A19Z&sks=b&skv=2021-08-06&sig=yorbHuIy/qHhWvGPmJrZ8apJptorzpI ⮑ 0/62VH2lmhcg%3D" } ] }

Clicca il tuo URL o copialo e incollalo nel tuo browser per visualizzare l'immagine. Ecco l'immagine che DALL·E ha ideato per la mia richiesta:



Un computer degli anni '90 con una pianta che ne cresce fuori, in stile vaporwave. 'un computer vaporwave'


La tua immagine avrà un aspetto diverso. Questo perché il modello di diffusione crea ognuna di queste immagini solo quando invii la richiesta.


Nota: L'URL con la tua immagine generata è valido solo per un'ora, assicurati di salvare l'immagine sul tuo computer se ti piace e desideri conservarla.



L'API segue anche la stessa politica dei contenuti dell'interfaccia web. Se invii prompt di testo in conflitto con la politica dei contenuti, non riceverai un risultato e potresti essere bloccato dopo ripetute violazioni.


Ora che hai confermato che tutto è configurato correttamente e hai avuto un'anteprima di ciò che puoi fare con l'API Immagini di OpenAI, imparerai successivamente come integrarla in uno script Python.


Creare un'Immagine da un Testo con python

È fantastico poter creare un'immagine dall'interfaccia della riga di comando (CLI), ma sarebbe ancora meglio incorporare questa funzionalità nelle tue applicazioni Python. Ci sono molte cose interessanti che potresti costruire!


Nota: L'API Images è attualmente in versione beta pubblica. Ciò significa che l'API evolverà ancora, potrebbe subire cambiamenti significativi e potrebbe quindi non essere l'ideale per la creazione di applicazioni in produzione. Attualmente, impone anche un limite di dieci immagini al minuto e venticinque immagini ogni cinque minuti.


Apri il tuo editor di codice preferito e scrivi uno script che utilizzerai per creare un'immagine da un prompt di testo, proprio come hai fatto usando la riga di comando:


# create.py


import os
import openai

PROMPT = "Un computer ecologico degli anni '90 in stile vaporwave"

openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.Image.create(
    prompt=PROMPT,
    n=1,
    size="256x256",
)

print(response["data"][0]["url"])

Come prima, questo codice invia una richiesta autenticata all'API che genera un'immagine singola basata sul testo in PROMPT. Nota che questo codice aggiunge alcune modifiche che ti aiuteranno a implementare più funzionalità nello script:

  • Alla riga 7, definisci il prompt di testo come una costante. Per risultati più specifici, hai aggiunto più testo per descrivere meglio l'immagine che desideri ottenere. Inoltre, mettendo questo testo in una costante all'inizio dello script, puoi rapidamente rifattorizzare il tuo codice per raccogliere il testo dall'input dell'utente, poiché il suo valore è più facile da trovare e modificare.

  • Alla riga 9, ottieni la tua chiave API dalla variabile d'ambiente in cui l'hai salvata in precedenza. Poiché hai chiamato la variabile d'ambiente OPENAI_API_KEY, nemmeno questa riga di codice è necessaria. La libreria openai accede automaticamente al valore della chiave API dal tuo ambiente fintanto che hai seguito il nome suggerito. Con questa riga di codice, potresti anche caricarla da una variabile d'ambiente con un nome diverso.

  • Alla riga 11, crei un'istanza di openai.Image e chiami .create() su di essa. Le linee successive contengono alcuni dei parametri che puoi passare al metodo.

  • Alla riga 12, passi il valore di PROMPT al parametro opportunamente chiamato prompt. Con questo, fornisci a DALL·E il testo che utilizzerà per creare l'immagine. Nota che hai passato un prompt di testo anche quando hai chiamato l'API dall'interfaccia della riga di comando.

  • Alla riga 13, è un parametro che non hai mai usato prima. Passa l'intero 1 al parametro n. Questo parametro ti permette di definire quante nuove immagini desideri creare con il prompt. Il valore di n deve essere compreso tra uno e dieci e di default è 1.

  • Alla riga 14, ti mostra un altro parametro nuovo che non hai usato quando hai chiamato l'API dalla tua CLI. Con size, puoi definire le dimensioni dell'immagine che DALL·E dovrebbe generare. L'argomento deve essere una stringa, "256x256", "512x512", o "1024x1024". Ogni stringa rappresenta le dimensioni in pixel dell'immagine che riceverai. Di default, è impostato sulla dimensione massima possibile, 1024x1024.


Infine, vuoi anche ottenere l'URL in modo da poter guardare l'immagine generata online. Per fare ciò, scorri la risposta JSON fino alla chiave "url" alla riga 17 e stampa il suo valore nel tuo terminale.


Quando esegui questo script, otterrai un output simile a prima, ma ora non vedrai l'intera risposta JSON, solo l'URL:


(venv) $ python create.py 
https://oaidalleapiprodscus.blob.core.windows.net/private/org-QANMxYn3BsMe ⮑ uAbRT8X3iiu3/user-xSuQTJ0IIVj3dHM4DPymXTg4/img-4AMS4wJJLFsu6ClQmGDppAeV ⮑ .png?st=2022-11-10T12%3A22%3A46Z&se=2022-11-10T14%3A22%3A46Z&sp=r&sv=20 ⮑ 21-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6- ⮑ 684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-11-10T ⮑ 10%3A55%3A29Z&ske=2022-11-11T10%3A55%3A29Z&sks=b&skv=2021-08-06&sig=xJW ⮑ imMiA1/nGmFMYKUTsJq7G1u4xSL652r/MrzTH0Nk%3D

Clicca sul link o incollalo nel tuo browser per visualizzare l'immagine generata. La tua immagine sarà di nuovo diversa, ma dovresti vedere un'immagine che assomiglia al prompt che hai usato in PROMPT:



Potresti notare che questa immagine è molto più piccola rispetto a quella che hai creato con la chiamata CLI. Questo perché hai chiesto all'API un'immagine di 256x256 pixel tramite il parametro size. Le dimensioni più piccole sono meno costose, quindi hai appena risparmiato qualche soldo!


Salvare i Dati dell'Immagine in un File

Mentre è fantastico creare immagini da testo usando Python, DALL·E e l'API di OpenAI, le risposte sono attualmente piuttosto fugaci. Se desideri continuare a lavorare con l'immagine generata all'interno del tuo script Python, è probabilmente meglio evitare l'URL e accedere direttamente ai dati dell'immagine:


# create.py

import os

import openai

PROMPT = "An eco-friendly computer from the 90s in the style of vaporwave"

openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.Image.create(
    prompt=PROMPT,
    n=1,
    size="256x256",
    response_format="b64_json",
)

print(response["data"][0]["b64_json"][:50])


L'API ti consente di cambiare il formato della risposta da un URL ai dati dell'immagine codificati in Base64. Alla riga 15, imposti il valore di response_format su "b64_json". Il valore predefinito di questo parametro è "url", motivo per cui hai ricevuto gli URL nelle risposte JSON fino a questo punto.


Anche se la risposta JSON che ottieni dopo aver apportato questa modifica sembra simile a prima, la chiave del dizionario per accedere ai dati dell'immagine è ora "b64_json" invece di "url". Hai applicato questa modifica nella chiamata a print() alla riga 18 e limitato l'output ai primi cinquanta caratteri.


Se esegui lo script con queste impostazioni, otterrai i dati effettivi dell'immagine generata. Ma non eseguire ancora lo script, perché i dati dell'immagine verranno persi immediatamente dopo l'esecuzione dello script, e non vedrai mai l'immagine!

Per evitare di perdere l'immagine perfetta che è sfuggita, puoi memorizzare le risposte JSON in un file anziché stamparle sul terminale:


# create.py

import json
import os
from pathlib import Path

import openai

PROMPT = "An eco-friendly computer from the 90s in the style of vaporwave"
DATA_DIR = Path.cwd() / "responses"

DATA_DIR.mkdir(exist_ok=True)

openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.Image.create(
    prompt=PROMPT,
    n=1,
    size="256x256",
    response_format="b64_json",
)

file_name = DATA_DIR / f"{PROMPT[:5]}-{response['created']}.json"

with open(file_name, mode="w", encoding="utf-8") as file:
    json.dump(response, file)


Con alcune linee di codice aggiuntive, hai aggiunto la gestione dei file al tuo script Python utilizzando pathlib e json:

  • Le righe 10 e 12 definiscono e creano una directory dei dati chiamata "responses/" che conterrà le risposte dell'API come file JSON.

  • La riga 23 definisce una variabile per il percorso del file in cui desideri salvare i dati. Utilizzi l'inizio del prompt e il timestamp dalla risposta JSON per creare un nome univoco del file.

  • Le righe 25 e 26 creano un nuovo file JSON nella directory dei dati e scrivono la risposta dell'API come JSON in quel file.


Con queste aggiunte, ora puoi eseguire il tuo script, generare immagini, e i dati dell'immagine rimarranno in un file dedicato nella tua directory dei dati.


Hai eseguito lo script e ispezionato il file JSON generato? Sembra un po' incomprensibile, vero? Allora, dov'è quell'immagine bellissima che sai con certezza essere la migliore immagine mai creata da DALL·E?


È proprio lì, solo che attualmente è rappresentata come bits codificati in Base64, il che non offre un'ottima esperienza visiva se sei umano. Nella prossima sezione, imparerai come puoi convertire i dati dell'immagine codificati in Base64 in un file PNG che puoi guardare.


Decodifica di una Risposta JSON in Base64

Hai appena salvato un'immagine PNG come una stringa codificata in Base64 in un file JSON.


Questo è ottimo perché significa che la tua immagine non si perderà nell'etere di Internet dopo un'ora, come accade se continui a generare URL con le tue chiamate API.


Tuttavia, ora non puoi guardare la tua immagine, a meno che tu non impari come decodificare i dati.


Fortunatamente, ciò non richiede molto codice in Python, quindi vai avanti e crea un nuovo file di script per eseguire questa conversione:


# convert.py

import json
from base64 import b64decode
from pathlib import Path

DATA_DIR = Path.cwd() / "responses"
JSON_FILE = DATA_DIR / "An ec-1667994848.json"
IMAGE_DIR = Path.cwd() / "images" / JSON_FILE.stem

IMAGE_DIR.mkdir(parents=True, exist_ok=True)

with open(JSON_FILE, mode="r", encoding="utf-8") as file:
    response = json.load(file)

for index, image_dict in enumerate(response["data"]):
    image_data = b64decode(image_dict["b64_json"])
    image_file = IMAGE_DIR / f"{JSON_FILE.stem}-{index}.png"
    with open(image_file, mode="wb") as png:
        png.write(image_data)

Lo script convert.py leggerà un file JSON con il nome del file che hai definito in JSON_FILE. Ricorda che dovrai adattare il valore di JSON_FILE per corrispondere al nome del tuo file JSON, che sarà diverso.


Lo script recupera quindi la stringa codificata in Base64 dai dati JSON, la decodifica e salva i dati dell'immagine risultante come file PNG in una directory. Python creerà anche quella directory per te, se necessario.


Nota che questo script funzionerà anche se stai ottenendo più di un'immagine alla volta. Il ciclo for decodificherà ogni immagine e la salverà come un nuovo file.

Nota: Puoi generare file JSON con dati codificati in Base64 di più immagini eseguendo create.py dopo aver passato un valore superiore a 1 al parametro n.


La maggior parte del codice in questo script riguarda la lettura e la scrittura di file dalle cartelle corrette. La vera star del codice è b64decode(). Importi la funzione alla riga 4 e la metti al lavoro alla riga 17. Decodifica la stringa codificata in Base64 in modo che tu possa salvare i dati dell'immagine effettivi come file PNG. Il tuo computer sarà quindi in grado di riconoscerlo come un'immagine PNG e saprà come mostrarla.


Dopo aver eseguito lo script, puoi entrare nella nuova struttura delle cartelle e aprire il file PNG per vedere finalmente l'immagine ideale che hai aspettato così a lungo:



È tutto ciò che hai mai sperato? Se sì, allora rallegrati! Tuttavia, se l'immagine che hai ottenuto assomiglia vagamente a ciò che stai cercando ma non del tutto, allora puoi effettuare un'altra chiamata all'API dove passi la tua immagine come input e crei un paio di variazioni di essa. Adesso vediamo come creare Variazioni dell Immagine.

Creare Variazioni di un'Immagine usando Python e l'IA

Se possiedi un'immagine, che sia generata da una macchina o meno, simile a ciò che stai cercando ma non soddisfa completamente i tuoi criteri, puoi creare variazioni di essa utilizzando il modello di diffusione latente di DALL·E di OpenAI.


Basandoti sul codice che hai scritto in precedenza in questo tutorial, puoi creare un nuovo file che chiamerai vary.py:

# vary.py

import json
import os
from base64 import b64decode
from pathlib import Path

import openai

DATA_DIR = Path.cwd() / "responses"
SOURCE_FILE = DATA_DIR / "An ec-1667994848.json"

openai.api_key = os.getenv("OPENAI_API_KEY")

with open(SOURCE_FILE, mode="r", encoding="utf-8") as json_file:
    saved_response = json.load(json_file)
    image_data = b64decode(saved_response["data"][0]["b64_json"])

response = openai.Image.create_variation(
    image=image_data,
    n=3,
    size="256x256",
    response_format="b64_json",
)

new_file_name = f"vary-{SOURCE_FILE.stem[:5]}-{response['created']}.json"

with open(DATA_DIR / new_file_name, mode="w", encoding="utf-8") as file:
    json.dump(response, file)


In questo script, invii i dati dell'immagine codificati in Base64 dalla precedente risposta JSON all'API delle Immagini e richiedi tre variazioni dell'immagine. Salvi i dati dell'immagine di tutte e tre le immagini in un nuovo file JSON nella tua directory dei dati.

  • La riga 11 definisce una costante che c