Gerando imagens a partir de texto com Stable Diffusion

Odilio Noronha
RapaduraTech
Published in
3 min readDec 1, 2022

Stable Diffusion é uma técnica de deep learning que converte texto para imagem lançado em 2022. Ele é usado principalmente para gerar imagens detalhadas condicionadas a descrições de texto, embora também possa ser aplicado a outras tarefas, como pintura interna, pintura externa e geração de imagem para -traduções de imagens guiadas por um texto

Stable Diffusion tem problemas com degradação e imprecisões em determinados cenários. Uma vez que o modelo foi treinado em um conjunto de dados que consiste em imagens com resolução de 512 × 512, a qualidade das imagens geradas diminui visivelmente quando as especificações do usuário se desviam de sua resolução “esperada” de 512 × 512. Outro desafio é gerar membros humanos devido à baixa qualidade dos dados dos membros no banco de dados. O modelo é insuficientemente treinado para entender os membros e rostos humanos devido à falta de recursos representativos no banco de dados, e solicitar que o modelo gere imagens desse tipo pode confundir o modelo, no entanto para muitos casos já temos resultados bastante impressionantes.

Vamos criar alguns modelos

Neste post, queremos mostrar como usar o Stable Diffusion com a biblioteca Diffusers, explicar como o modelo funciona e, finalmente, mergulhar um pouco mais fundo em como os difusores permitem personalizar o pipeline de geração de imagens.

Antes de usar o modelo, você precisa aceitar a licença do modelo para baixar e usar os pesos.

A licença foi projetada para mitigar os possíveis efeitos nocivos de um sistema de aprendizado de máquina tão poderoso. Solicitamos aos usuários que leiam a licença completa e cuidadosamente.

Testando o projeto

Primeiramente precisamos ter o python instalado em seu ambiente e o pip, seu mais popular gerenciador de pacotes.

Vamos utilizar o diffusers para nosso teste, o git dele é huggingface/diffusers: 🤗 Diffusers: State-of-the-art diffusion models for image and audio generation in PyTorch (github.com)

Diffusers fornece modelos de difusão pré-treinados em várias modalidades, como visão e áudio, e serve como uma caixa de ferramentas modular para inferência e treinamento de modelos de difusão.

Instalando o diffusers

pip install diffusers==0.9.0 transformers scipy ftfy

Vamos usar este modelo,
https://huggingface.co/CompVis/stable-diffusion-v1-4, voce precisa ser registrado Hugging Face Hub e ter um token de acesso

TOKEN="/your/huggingface/hub/token"

Depois dessa configuração única, podemos prosseguir com o desenvolvimento usando Stable Diffusion .

import torch
from diffusers import StableDiffusionPipeline

# get your token at https://huggingface.co/settings/tokens
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=TOKEN)

Mas nós também podemos usar um modelo local sem a necessidade de autenticação

git lfs install
git clone https://huggingface.co/runwayml/stable-diffusion-v1-5

Agora vc pode rodar sem a necessidade de autenticação

pipe = StableDiffusionPipeline.from_pretrained("./stable-diffusion-v1-5")
pipe = pipe.to("cuda")

prompt = "Foto de uma cidade a noite "
image = pipe(prompt).images[0]
image.save("cidade_noite.png")

A lib de stable difusion também nos permite usar uma imagem como base, assim temos image to image, para isso usamos o StableDiffusionImg2ImgPipeline.

Segue exemplo retirado do git deles:

import requests
import torch
from PIL import Image
from io import BytesIO

from diffusers import StableDiffusionImg2ImgPipeline

# load the pipeline
device = "cuda"
model_id_or_path = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
model_id_or_path,
revision="fp16",
torch_dtype=torch.float16,
)
# or download via git clone https://huggingface.co/runwayml/stable-diffusion-v1-5
# and pass `model_id_or_path="./stable-diffusion-v1-5"`.
pipe = pipe.to(device)

# let's download an initial image
url = "https://raw.githubusercontent.com/CompVis/stable-diffusion/main/assets/stable-samples/img2img/sketch-mountains-input.jpg"

response = requests.get(url)
init_image = Image.open(BytesIO(response.content)).convert("RGB")
init_image = init_image.resize((768, 512))

prompt = "A fantasy landscape, trending on artstation"

images = pipe(prompt=prompt, init_image=init_image, strength=0.75, guidance_scale=7.5).images

images[0].save("fantasy_landscape.png")

O Stable Diffusion é um incrivel, algo impensável a alguns anos, estamos tendo a rara oportunidade de experimentar uma tecnologia revolucionária, ainda em seu inicio. Há toda uma comunidade de entusiastas que assim como eu e você, estão fascinados pelo novo mundo de possibilidades que essa tecnologia abre, fiquemos de olho nos próximos capítulos.

--

--