Inpaint immagini con Stable Diffusion utilizzando Amazon SageMaker JumpStart

Inpaint immagini con Stable Diffusion utilizzando Amazon SageMaker JumpStart

Nel novembre 2022, noi ha annunciato con cui i clienti AWS possono generare immagini dal testo Diffusione stabile modelli che utilizzano JumpStart di Amazon SageMaker. Oggi, siamo lieti di presentare una nuova funzionalità che consente agli utenti di dipingere le immagini con i modelli Stable Diffusion. Inpainting si riferisce al processo di sostituzione di una parte di un'immagine con un'altra immagine basata su un suggerimento testuale. Fornendo l'immagine originale, un'immagine maschera che delinea la porzione da sostituire e un prompt testuale, il modello Stable Diffusion può produrre una nuova immagine che sostituisce l'area mascherata con l'oggetto, il soggetto o l'ambiente descritto nel prompt testuale.

È possibile utilizzare l'inpainting per ripristinare immagini degradate o creare nuove immagini con soggetti o stili nuovi in ​​determinate sezioni. Nell'ambito della progettazione architettonica, l'inpainting a diffusione stabile può essere applicato per riparare aree incomplete o danneggiate di progetti di edifici, fornendo informazioni precise alle squadre di costruzione. Nel caso dell'imaging MRI clinico, la testa del paziente deve essere trattenuta, il che può portare a risultati scadenti a causa dell'artefatto di ritaglio che causa la perdita di dati o una ridotta accuratezza diagnostica. L'image inpainting può aiutare efficacemente a mitigare questi risultati non ottimali.

In questo post, presentiamo una guida completa sulla distribuzione e l'esecuzione dell'inferenza utilizzando il modello di inpainting Stable Diffusion in due metodi: tramite l'interfaccia utente (UI) di JumpStart in Amazon Sage Maker Studio, e a livello di codice API JumpStart disponibile in SDK Python di SageMaker.

Panoramica della soluzione

Le seguenti immagini sono esempi di inpainting. Le immagini originali sono a sinistra, l'immagine della maschera è al centro e l'immagine dipinta generata dal modello è a destra. Per il primo esempio, al modello sono state fornite l'immagine originale, un'immagine maschera e il prompt testuale "un gatto bianco, occhi azzurri, con indosso un maglione, sdraiato nel parco", nonché il prompt negativo "piedi mal disegnati". " Per il secondo esempio, la richiesta testuale era "Una modella femminile mostra con grazia un abito lungo casual caratterizzato da una miscela di tonalità rosa e blu"

Colora le immagini con Stable Diffusion utilizzando Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

L'esecuzione di modelli di grandi dimensioni come Stable Diffusion richiede script di inferenza personalizzati. Devi eseguire test end-to-end per assicurarti che lo script, il modello e l'istanza desiderata funzionino insieme in modo efficiente. JumpStart semplifica questo processo fornendo script pronti all'uso che sono stati ampiamente testati. Puoi accedere a questi script con un clic tramite l'interfaccia utente di Studio o con pochissime righe di codice tramite il API JumpStart.

Le sezioni seguenti ti guidano attraverso la distribuzione del modello e l'esecuzione dell'inferenza utilizzando l'interfaccia utente di Studio o le API JumpStart.

Si noti che utilizzando questo modello, si accetta il Licenza CreativeML Open RAIL++-M.

Accedi a JumpStart tramite l'interfaccia utente di Studio

In questa sezione viene illustrata la distribuzione dei modelli JumpStart utilizzando l'interfaccia utente di Studio. Il video di accompagnamento mostra l'individuazione del modello di inpainting Stable Diffusion pre-addestrato su JumpStart e la sua distribuzione. La pagina del modello offre dettagli essenziali sul modello e sul suo utilizzo. Per eseguire l'inferenza, utilizziamo il tipo di istanza ml.p3.2xlarge, che offre l'accelerazione GPU richiesta per l'inferenza a bassa latenza a un prezzo accessibile. Dopo aver configurato l'istanza di hosting SageMaker, scegli Schierare. L'endpoint sarà operativo e pronto a gestire le richieste di inferenza entro circa 10 minuti.

JumpStart fornisce un notebook di esempio che può aiutare ad accelerare il tempo necessario per eseguire l'inferenza sull'endpoint appena creato. Per accedere al taccuino in Studio, scegli Apri taccuino nel Usa Endpoint da Studio sezione della pagina dell'endpoint del modello.

Usa JumpStart a livello di codice con SageMaker SDK

L'utilizzo dell'interfaccia utente JumpStart consente di distribuire un modello pre-addestrato in modo interattivo con pochi clic. In alternativa, puoi utilizzare i modelli JumpStart in modo programmatico utilizzando le API integrate in SageMaker Python SDK.

In questa sezione, scegliamo un modello pre-addestrato appropriato in JumpStart, distribuiamo questo modello a un endpoint SageMaker ed eseguiamo l'inferenza sull'endpoint distribuito, il tutto utilizzando SageMaker Python SDK. Gli esempi seguenti contengono frammenti di codice. Per accedere al codice completo con tutti i passaggi inclusi in questa dimostrazione, fare riferimento al Introduzione all'editing di immagini JumpStart – Stable Diffusion Inpainting esempio taccuino.

Distribuire il modello pre-addestrato

SageMaker utilizza i container Docker per varie attività di build e runtime. JumpStart utilizza il Contenitori di deep learning di SageMaker (DLC) che sono specifici del framework. Per prima cosa recuperiamo eventuali pacchetti aggiuntivi, nonché gli script per gestire l'addestramento e l'inferenza per l'attività selezionata. Quindi gli artefatti del modello pre-addestrati vengono recuperati separatamente con model_uris, che fornisce flessibilità alla piattaforma. Ciò consente di utilizzare più modelli pre-addestrati con un singolo script di inferenza. Il codice seguente illustra questo processo:

model_id, model_version = "model-inpainting-stabilityai-stable-diffusion-2-inpainting-fp16", "*"
# Retrieve the inference docker container uri
deploy_image_uri = image_uris.retrieve( region=None, framework=None, # automatically inferred from model_id image_scope="inference", model_id=model_id, model_version=model_version, instance_type=inference_instance_type,
)
# Retrieve the inference script uri
deploy_source_uri = script_uris.retrieve(model_id=model_id, model_version=model_version, script_scope="inference") base_model_uri = model_uris.retrieve(model_id=model_id, model_version=model_version, model_scope="inference")

Successivamente, forniamo tali risorse a a Modello SageMaker istanza e distribuire un endpoint:

# Create the SageMaker model instance
# Create the SageMaker model instance
model = Model( image_uri=deploy_image_uri, source_dir=deploy_source_uri, model_data=base_model_uri, entry_point="inference.py", # entry point file in source_dir and present in deploy_source_uri role=aws_role, predictor_cls=Predictor, name=endpoint_name,
) # deploy the Model - note that we need to pass the Predictor class when we deploy the model through the Model class,
# in order to run inference through the SageMaker API
base_model_predictor = model.deploy( initial_instance_count=1, instance_type=inference_instance_type, predictor_cls=Predictor, endpoint_name=endpoint_name,
)

Dopo che il modello è stato implementato, possiamo ottenere previsioni in tempo reale da esso!

Ingresso

L'input è l'immagine di base, un'immagine maschera e il prompt che descrive il soggetto, l'oggetto o l'ambiente da sostituire nella parte mascherata. La creazione dell'immagine della maschera perfetta per gli effetti in-painting implica diverse best practice. Inizia con un prompt specifico e non esitare a sperimentare varie impostazioni di diffusione stabile per ottenere i risultati desiderati. Utilizza un'immagine maschera che assomigli da vicino all'immagine che intendi dipingere. Questo approccio aiuta l'algoritmo di inpainting a completare le sezioni mancanti dell'immagine, ottenendo un aspetto più naturale. Le immagini di alta qualità generalmente producono risultati migliori, quindi assicurati che le immagini di base e maschera siano di buona qualità e si assomiglino tra loro. Inoltre, opta per un'immagine della maschera ampia e uniforme per preservare i dettagli e ridurre al minimo gli artefatti.

L'endpoint accetta l'immagine di base e la maschera come valori RGB non elaborati o un'immagine con codifica Base64. Il gestore di inferenza decodifica l'immagine in base a content_type:

  • Nel content_type = “application/json”, il payload di input deve essere un dizionario JSON con i valori RGB non elaborati, il prompt di testo e altri parametri facoltativi
  • Nel content_type = “application/json;jpeg”, il payload di input deve essere un dizionario JSON con l'immagine con codifica Base64, un prompt testuale e altri parametri facoltativi

Uscita

L'endpoint può generare due tipi di output: un'immagine RGB con codifica Base64 o un dizionario JSON delle immagini generate. È possibile specificare quale formato di output si desidera impostando il file accept intestazione a "application/json" or "application/json;jpeg" per un'immagine JPEG o base64, rispettivamente.

  • Nel accept = “application/json”, l'endpoint restituisce un dizionario JSON con valori RGB per l'immagine
  • Nel accept = “application/json;jpeg”, l'endpoint restituisce un dizionario JSON con l'immagine JPEG come byte codificati con la codifica base64.b64

Tieni presente che l'invio o la ricezione del payload con i valori RGB non elaborati può raggiungere i limiti predefiniti per il payload di input e la dimensione della risposta. Pertanto, si consiglia di utilizzare l'immagine con codifica base64 per impostazione content_type = “application/json;jpeg” e accetta = "application/json;jpeg".

Il codice seguente è un esempio di richiesta di inferenza:

content_type = "application/json;jpeg" with open(input_img_file_name, "rb") as f: input_img_image_bytes = f.read()
with open(input_img_mask_file_name, "rb") as f: input_img_mask_image_bytes = f.read() encoded_input_image = base64.b64encode(bytearray(input_img_image_bytes)).decode()
encoded_mask = base64.b64encode(bytearray(input_img_mask_image_bytes)).decode() payload = { "prompt": "a white cat, blue eyes, wearing a sweater, lying in park", "image": encoded_input_image, "mask_image": encoded_mask, "num_inference_steps": 50, "guidance_scale": 7.5, "seed": 0, "negative_prompt": "poorly drawn feet",
} accept = "application/json;jpeg" def query(model_predictor, payload, content_type, accept): """Query the model predictor.""" query_response = model_predictor.predict( payload, { "ContentType": content_type, "Accept": accept, }, ) return query_response query_response = query(model_predictor, json.dumps(payload).encode("utf-8"), content_type, accept)
generated_images = parse_response(query_response)

Parametri supportati

I modelli di Stable Diffusion inpainting supportano molti parametri per la generazione di immagini:

  • Immagine – L'immagine originale.
  • mask – Un'immagine in cui la parte oscurata rimane invariata durante la generazione dell'immagine e la parte bianca viene sostituita.
  • pronto – Un prompt per guidare la generazione dell'immagine. Può essere una stringa o un elenco di stringhe.
  • num_inference_steps (facoltativo) – Il numero di fasi di riduzione del rumore durante la generazione dell'immagine. Più passaggi portano a un'immagine di qualità superiore. Se specificato, deve essere un numero intero positivo. Tieni presente che più passaggi di inferenza porteranno a un tempo di risposta più lungo.
  • guidance_scale (facoltativo) – Una scala di guida più alta produce un'immagine più strettamente correlata al prompt, a scapito della qualità dell'immagine. Se specificato, deve essere un float. guidance_scale<=1 viene ignorato.
  • negative_prompt (facoltativo) – Questo guida la generazione dell'immagine rispetto a questo prompt. Se specificato, deve essere una stringa o un elenco di stringhe e utilizzato con guidance_scale. Se guidance_scale è disabilitato, anche questo è disabilitato. Inoltre, se il prompt è un elenco di stringhe, allora il file negative_prompt deve essere anche un elenco di stringhe.
  • seme (facoltativo) – Questo corregge lo stato randomizzato per la riproducibilità. Se specificato, deve essere un numero intero. Ogni volta che usi lo stesso prompt con lo stesso seme, l'immagine risultante sarà sempre la stessa.
  • batch_size (facoltativo) – Il numero di immagini da generare in un singolo passaggio in avanti. Se si utilizza un'istanza più piccola o si generano molte immagini, ridurre batch_size essere un numero piccolo (1–2). Il numero di immagini = numero di prompt*num_images_per_prompt.

Limitazioni e pregiudizi

Anche se Stable Diffusion ha prestazioni impressionanti nell'inpainting, soffre di numerose limitazioni e pregiudizi. Questi includono ma non sono limitati a:

  • Il modello potrebbe non generare facce o arti accurati perché i dati di addestramento non includono immagini sufficienti con queste caratteristiche.
  • Il modello è stato addestrato sul Insieme di dati LAION-5B, che ha contenuti per adulti e potrebbe non essere adatto all'uso del prodotto senza ulteriori considerazioni.
  • Il modello potrebbe non funzionare bene con lingue diverse dall'inglese perché il modello è stato addestrato su testo in lingua inglese.
  • Il modello non può generare un buon testo all'interno delle immagini.
  • L'inpainting di diffusione stabile in genere funziona meglio con immagini con risoluzioni inferiori, ad esempio 256 × 256 o 512 × 512 pixel. Quando si lavora con immagini ad alta risoluzione (768×768 o superiore), il metodo potrebbe avere difficoltà a mantenere il livello desiderato di qualità e dettaglio.
  • Sebbene l'uso di un seme possa aiutare a controllare la riproducibilità, l'inpainting di Stable Diffusion può ancora produrre risultati diversi con lievi alterazioni dell'input o dei parametri. Ciò potrebbe rendere difficile la messa a punto dell'output per requisiti specifici.
  • Il metodo potrebbe avere difficoltà a generare trame e motivi intricati, specialmente quando si estendono su ampie aree all'interno dell'immagine o sono essenziali per mantenere la coerenza e la qualità complessive della regione dipinta.

Per ulteriori informazioni su limitazioni e pregiudizi, fare riferimento al Scheda modello Stable Diffusion Inpainting.

Soluzione di inpainting con maschera generata tramite un prompt

CLIPSeq è una tecnica avanzata di deep learning che utilizza la potenza dei modelli CLIP (Contrastive Language-Image Pretraining) preaddestrati per generare maschere dalle immagini di input. Questo approccio fornisce un modo efficiente per creare maschere per attività come segmentazione di immagini, inpainting e manipolazione. CLIPSeq utilizza CLIP per generare una descrizione testuale dell'immagine di input. La descrizione del testo viene quindi utilizzata per generare una maschera che identifica i pixel nell'immagine che sono rilevanti per la descrizione del testo. La maschera può quindi essere utilizzata per isolare le parti rilevanti dell'immagine per un'ulteriore elaborazione.

CLIPSeq presenta numerosi vantaggi rispetto ad altri metodi per la generazione di maschere da immagini di input. Innanzitutto, è un metodo più efficiente, perché non richiede che l'immagine venga elaborata da un algoritmo di segmentazione dell'immagine separato. In secondo luogo, è più accurato, perché può generare maschere più allineate con la descrizione testuale dell'immagine. Terzo, è più versatile, perché puoi usarlo per generare maschere da un'ampia varietà di immagini.

Tuttavia, CLIPSeq presenta anche alcuni svantaggi. In primo luogo, la tecnica può avere limitazioni in termini di argomento, perché si basa su modelli CLIP preaddestrati che potrebbero non comprendere domini o aree di competenza specifici. In secondo luogo, può essere un metodo sensibile, perché è suscettibile di errori nella descrizione testuale dell'immagine.

Per ulteriori informazioni, fare riferimento a Stile di moda virtuale con intelligenza artificiale generativa utilizzando Amazon SageMaker.

ripulire

Dopo aver eseguito il notebook, assicurati di eliminare tutte le risorse create nel processo per assicurarti che la fatturazione venga interrotta. Il codice per ripulire l'endpoint è disponibile nel file associate taccuino.

Conclusione

In questo post, abbiamo mostrato come distribuire un modello di inpainting di diffusione stabile pre-addestrato utilizzando JumpStart. Abbiamo mostrato frammenti di codice in questo post: il codice completo con tutti i passaggi di questa demo è disponibile in Introduzione a JumpStart – Migliora la qualità dell'immagine guidata dal prompt esempio taccuino. Prova tu stesso la soluzione e inviaci i tuoi commenti.

Per saperne di più sul modello e su come funziona, consulta le seguenti risorse:

Per saperne di più su JumpStart, dai un'occhiata ai seguenti post:


Informazioni sugli autori

Colora le immagini con Stable Diffusion utilizzando Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.Dott. Vivek Madan è uno scienziato applicato con il team Amazon SageMaker JumpStart. Ha conseguito il dottorato di ricerca presso l'Università dell'Illinois a Urbana-Champaign ed è stato ricercatore post-dottorato presso la Georgia Tech. È un ricercatore attivo nell'apprendimento automatico e nella progettazione di algoritmi e ha pubblicato articoli in conferenze EMNLP, ICLR, COLT, FOCS e SODA.

Colora le immagini con Stable Diffusion utilizzando Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.Alfred Shen è Senior AI/ML Specialist presso AWS. Ha lavorato nella Silicon Valley, ricoprendo posizioni tecniche e manageriali in diversi settori tra cui sanità, finanza e high-tech. È un ricercatore dedicato all'AI/ML applicato, che si concentra su CV, PNL e multimodalità. Il suo lavoro è stato presentato in pubblicazioni come EMNLP, ICLR e Public Health.

Timestamp:

Di più da Apprendimento automatico di AWS