Gerando imagens a partir de texto com Stable Diffusion
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.