Genera pubblicità creativa utilizzando l’IA generativa implementata su Amazon SageMaker

Genera pubblicità creativa con IA generativa su Amazon SageMaker

La pubblicità creativa ha il potenziale per essere rivoluzionata dall’IA generativa (GenAI). Ora è possibile creare una vasta varietà di immagini innovative, come scatti di prodotti, riallenando un modello GenAI e fornendo alcuni input al modello, come prompt testuali (frasi che descrivono la scena e gli oggetti da produrre dal modello). Questa tecnica ha mostrato risultati promettenti a partire dal 2022 con l’esplosione di una nuova classe di modelli fondamentali (FMs) chiamati modelli di diffusione latente come Stable Diffusion, Midjourney e Dall-E-2. Tuttavia, per utilizzare questi modelli in produzione, il processo di generazione richiede un costante perfezionamento per generare output coerenti. Spesso ciò significa creare un gran numero di immagini campione del prodotto e una preparazione intelligente dei prompt, il che rende il compito difficile su larga scala.

In questo post, esploreremo come questa tecnologia trasformativa possa essere sfruttata per generare annunci accattivanti e innovativi su larga scala, soprattutto quando si tratta di grandi cataloghi di immagini. Utilizzando il potere di GenAI, in particolare attraverso la tecnica dell’inpainting, possiamo creare in modo fluido sfondi di immagini, ottenendo contenuti visivamente sorprendenti e coinvolgenti e riducendo artefatti indesiderati nelle immagini (chiamati allucinazioni del modello). Approfondiremo anche l’implementazione pratica di questa tecnica utilizzando gli endpoint di Amazon SageMaker, che consentono un’efficace distribuzione dei modelli GenAI che guidano questo processo creativo.

Utilizziamo l’inpainting come tecnica chiave all’interno della generazione di immagini basata su GenAI perché offre una soluzione potente per sostituire elementi mancanti nelle immagini. Tuttavia, ciò presenta certe sfide. Ad esempio, il controllo preciso sulla posizionamento degli oggetti all’interno dell’immagine può essere limitato, portando a potenziali problemi come artefatti nell’immagine, oggetti fluttuanti o confini non sfumati, come mostrato negli esempi di immagini seguenti.

  

Per superare ciò, proponiamo in questo post di trovare un equilibrio tra libertà creativa e produzione efficiente generando una moltitudine di immagini realistiche con una supervisione minima. Per scalare la soluzione proposta per la produzione e semplificare la distribuzione dei modelli AI nell’ambiente AWS, la dimostriamo utilizzando gli endpoint di SageMaker.

In particolare, proponiamo di suddividere il processo di inpainting come un insieme di livelli, ognuno con un diverso insieme di prompt. Il processo può essere riassunto nei seguenti passaggi:

  1. Innanzitutto, richiediamo un’immagine di una scena generale (ad esempio, “parco con alberi sullo sfondo”) e posizioniamo casualmente l’oggetto su quello sfondo.
  2. Successivamente, aggiungiamo un livello nella sezione centrale inferiore dell’oggetto richiedendo dove si trova l’oggetto (ad esempio, “picnic sull’erba o su un tavolo di legno”).
  3. Infine, aggiungiamo un livello simile al livello di sfondo nella sezione centrale superiore dell’oggetto utilizzando lo stesso prompt del livello di sfondo.

Il vantaggio di questo processo è il miglioramento del realismo dell’oggetto perché viene percepito con una migliore scalatura e posizionamento rispetto all’ambiente di sfondo che corrisponde alle aspettative umane. La seguente figura mostra i passaggi della soluzione proposta.

Panoramica della soluzione

Per completare i compiti, viene considerato il seguente flusso dei dati:

  1. I modelli Segment Anything Model (SAM) e Stable Diffusion Inpainting sono ospitati negli endpoint di SageMaker.
  2. Viene utilizzato un prompt di sfondo per creare un’immagine di sfondo generata utilizzando il modello Stable Diffusion.
  3. Un’immagine di prodotto di base viene passata attraverso SAM per generare una maschera. L’inverso della maschera viene chiamato anti-maschera.
  4. L’immagine di sfondo generata, la maschera, insieme ai prompt del primo piano e ai prompt negativi vengono utilizzati come input per il modello Stable Diffusion Inpainting per generare un’immagine di sfondo intermedia generata.
  5. Allo stesso modo, l’immagine di sfondo generata, l’anti-maschera, insieme ai prompt del primo piano e ai prompt negativi vengono utilizzati come input per il modello Stable Diffusion Inpainting per generare un’immagine di primo piano intermedia generata.
  6. L’output finale dell’immagine di prodotto generata viene ottenuto combinando l’immagine di primo piano intermedia generata e l’immagine di sfondo intermedia generata.

Prerequisiti

Abbiamo sviluppato un modello di AWS CloudFormation che creerà i notebook di SageMaker utilizzati per distribuire gli endpoint e eseguire l’inferenza.

Avrai bisogno di un account AWS con ruoli di AWS Identity and Access Management (IAM) che fornisca accesso ai seguenti servizi:

  • AWS CloudFormation
  • SageMaker
    • Anche se gli endpoint di SageMaker forniscono istanze per eseguire modelli di machine learning, per eseguire carichi di lavoro pesanti come i modelli di intelligenza artificiale generativa, utilizziamo gli endpoint di SageMaker abilitati per le GPU. Consulta i prezzi di Amazon SageMaker per ulteriori informazioni sui prezzi.
    • Utilizziamo l’istanza abilitata NVIDIA A10G ml.g5.2xlarge per ospitare i modelli.
  • Amazon Simple Storage Service (Amazon S3)

Per maggiori dettagli, consulta il repository GitHub e il modello di CloudFormation.

Maschera l’area di interesse del prodotto

In generale, dobbiamo fornire un’immagine dell’oggetto che vogliamo posizionare e una maschera che delinea il contorno dell’oggetto. Ciò può essere fatto utilizzando strumenti come Amazon SageMaker Ground Truth. In alternativa, possiamo segmentare automaticamente l’oggetto utilizzando strumenti di intelligenza artificiale come i modelli Segment Anything (SAM), assumendo che l’oggetto sia al centro dell’immagine.

Utilizza SAM per generare una maschera

Con SAM, una tecnica avanzata di intelligenza artificiale generativa, possiamo generare senza sforzo maschere di alta qualità per vari oggetti all’interno delle immagini. SAM utilizza modelli di deep learning addestrati su ampi set di dati per identificare e segmentare con precisione gli oggetti di interesse, fornendo confini precisi e maschere a livello di pixel. Questa tecnologia rivoluziona i flussi di lavoro di elaborazione delle immagini automatizzando il compito laborioso e dispendioso in termini di tempo di creare manualmente le maschere. Con SAM, le aziende e gli individui possono generare rapidamente maschere per il riconoscimento degli oggetti, la modifica delle immagini, compiti di computer vision e altro ancora, aprendo un mondo di possibilità per l’analisi e la manipolazione visiva.

Ospita il modello SAM su un endpoint di SageMaker

Utilizziamo il notebook 1_HostGenAIModels.ipynb per creare gli endpoint di SageMaker e ospitare il modello SAM.

Utilizziamo il codice di inferenza in inference_sam.py e lo confezioniamo in un file code.tar.gz, che utilizziamo per creare l’endpoint di SageMaker. Il codice scarica il modello SAM, lo ospita su un endpoint e fornisce un punto di ingresso per eseguire l’inferenza e generare l’output:

SAM_ENDPOINT_NAME = 'sam-pytorch-' + str(datetime.utcnow().strftime('%Y-%m-%d-%H-%M-%S-%f'))
prefix_sam = "SAM/demo-custom-endpoint"
model_data_sam = s3.S3Uploader.upload("code.tar.gz", f's3://{bucket}/{prefix_sam}')
model_sam = PyTorchModel(entry_point='inference_sam.py',
                         model_data=model_data_sam,
                         framework_version='1.12',
                         py_version='py38',  
                         role=role,
                         env={'TS_MAX_RESPONSE_SIZE':'2000000000', 'SAGEMAKER_MODEL_SERVER_TIMEOUT' : '300'},
                         sagemaker_session=sess,      
                         name='model-'+SAM_ENDPOINT_NAME)
predictor_sam = model_sam.deploy(initial_instance_count=1,
                                 instance_type=INSTANCE_TYPE,
                                 deserializers=JSONDeserializer(),
                                 endpoint_name=SAM_ENDPOINT_NAME)

Invoca il modello SAM e genera una maschera

Il seguente codice fa parte del notebook 2_GenerateInPaintingImages.ipynb, che viene utilizzato per eseguire gli endpoint e generare i risultati:

raw_image = Image.open("images/speaker.png").convert("RGB")
predictor_sam = PyTorchPredictor(endpoint_name=SAM_ENDPOINT_NAME,
                                 deserializer=JSONDeserializer())
output_array = predictor_sam.predict(raw_image, initial_args={'Accept': 'application/json'})
mask_image = Image.fromarray(np.array(output_array).astype(np.uint8))
# salva l'immagine della maschera utilizzando PIL Image
mask_image.save('images/speaker_mask.png')

La figura seguente mostra la maschera risultante ottenuta dall’immagine del prodotto.

Utilizzare l’inpainting per creare un’immagine generata

Combina la potenza dell’inpainting con la maschera generata da SAM e l’input dell’utente per creare immagini generative notevoli. L’inpainting utilizza tecniche avanzate di intelligenza artificiale generativa per riempire intelligentemente le regioni mancanti o mascherate di un’immagine, mescolandole in modo uniforme con il contenuto circostante. Con la maschera generata da SAM come guida e l’input creativo dell’utente come input, gli algoritmi di inpainting possono generare contenuti visivamente coerenti e contestualmente appropriati, risultando in immagini sorprendenti e personalizzate. Questa fusione di tecnologie apre infinite possibilità creative, consentendo agli utenti di trasformare le loro visioni in narrazioni visive vivide e coinvolgenti.

Ospita un modello di inpainting a diffusione stabile su un endpoint di SageMaker

Allo stesso modo della sezione 2.1, utilizziamo il notebook 1_HostGenAIModels.ipynb per creare gli endpoint di SageMaker e ospitare il modello di inpainting a diffusione stabile.

Utilizziamo il codice di inferenza in inference_inpainting.py e lo confezioniamo in un file code.tar.gz, che utilizziamo per creare l’endpoint di SageMaker. Il codice scarica il modello di inpainting a diffusione stabile, lo ospita su un endpoint e fornisce un punto di ingresso per eseguire l’inferenza e generare l’output:

INPAINTING_ENDPOINT_NAME = 'inpainting-pytorch-' + str(datetime.utcnow().strftime('%Y-%m-%d-%H-%M-%S-%f'))
prefix_inpainting = "InPainting/demo-custom-endpoint"
model_data_inpainting = s3.S3Uploader.upload("code.tar.gz", f"s3://{bucket}/{prefix_inpainting}")

model_inpainting = PyTorchModel(entry_point='inference_inpainting.py',
                                model_data=model_data_inpainting,       
                                framework_version='1.12',
                                py_version='py38',
                                role=role,
                                env={'TS_MAX_RESPONSE_SIZE':'2000000000', 'SAGEMAKER_MODEL_SERVER_TIMEOUT' : '300'},
                                sagemaker_session=sess,
                                name='model-'+INPAINTING_ENDPOINT_NAME)

predictor_inpainting = model_inpainting.deploy(initial_instance_count=1,
                                               instance_type=INSTANCE_TYPE,
                                               serializer=JSONSerializer(),
                                               deserializers=JSONDeserializer(),
                                               endpoint_name=INPAINTING_ENDPOINT_NAME,
                                               volume_size=128)

Invoca il modello di inpainting a diffusione stabile e genera una nuova immagine

Allo stesso modo del passaggio per invocare il modello SAM, il notebook 2_GenerateInPaintingImages.ipynb viene utilizzato per eseguire l’inferenza sugli endpoint e generare i risultati:

raw_image = Image.open("images/speaker.png").convert("RGB")
mask_image = Image.open('images/speaker_mask.png').convert('RGB')
prompt_fr = "table and chair with books"
prompt_bg = "window and couch, table"
negative_prompt = "longbody, lowres, bad anatomy, bad hands, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, letters"

inputs = {}
inputs["image"] = np.array(raw_image)
inputs["mask"] = np.array(mask_image)
inputs["prompt_fr"] = prompt_fr
inputs["prompt_bg"] = prompt_bg
inputs["negative_prompt"] = negative_prompt

predictor_inpainting = PyTorchPredictor(endpoint_name=INPAINTING_ENDPOINT_NAME,
                                        serializer=JSONSerializer(),
                                        deserializer=JSONDeserializer())

output_array = predictor_inpainting.predict(inputs, initial_args={'Accept': 'application/json'})
gai_image = Image.fromarray(np.array(output_array[0]).astype(np.uint8))
gai_background = Image.fromarray(np.array(output_array[1]).astype(np.uint8))
gai_mask = Image.fromarray(np.array(output_array[2]).astype(np.uint8))
post_image = Image.fromarray(np.array(output_array[3]).astype(np.uint8))

# salva l'immagine generata utilizzando PIL Image
post_image.save('images/speaker_generated.png')

La seguente figura mostra la maschera raffinata, lo sfondo generato, l’immagine del prodotto generata e l’immagine postprocessata.

L’immagine del prodotto generata utilizza i seguenti suggerimenti:

  • Generazione dello sfondo – “sedia, divano, finestra, interno”
  • Inpainting – “oltre i libri”

Pulizia

In questo post, utilizziamo due endpoint SageMaker abilitati per GPU, che contribuiscono alla maggior parte dei costi. Questi endpoint dovrebbero essere spenti per evitare costi aggiuntivi quando non vengono utilizzati. Abbiamo fornito un notebook, 3_CleanUp.ipynb, che può aiutare nella pulizia degli endpoint. Utilizziamo anche un notebook SageMaker per ospitare i modelli ed eseguire inferenze. Pertanto, è buona pratica interrompere l’istanza del notebook se non viene utilizzata.

Conclusioni

I modelli di intelligenza artificiale generativi sono generalmente modelli di machine learning su larga scala che richiedono risorse specifiche per essere eseguiti in modo efficiente. In questo post, abbiamo dimostrato, utilizzando un caso d’uso pubblicitario, come gli endpoint di SageMaker offrano un ambiente scalabile e gestito per ospitare modelli di intelligenza artificiale generativi come il modello Stable Diffusion di base per la generazione di immagini da testo. Abbiamo dimostrato come due modelli possono essere ospitati ed eseguiti secondo necessità, e più modelli possono anche essere ospitati da un singolo endpoint. Questo elimina le complessità legate al provisioning dell’infrastruttura, alla scalabilità e al monitoraggio, consentendo alle organizzazioni di concentrarsi esclusivamente sul dispiegamento dei propri modelli e sulla fornitura di previsioni per risolvere le sfide aziendali. Con gli endpoint di SageMaker, le organizzazioni possono distribuire ed gestire in modo efficiente più modelli all’interno di un’infrastruttura unificata, ottenendo un utilizzo ottimale delle risorse e riducendo gli oneri operativi.

Il codice dettagliato è disponibile su GitHub. Il codice dimostra l’utilizzo di AWS CloudFormation e AWS Cloud Development Kit (AWS CDK) per automatizzare il processo di creazione di notebook SageMaker e altre risorse necessarie.