Minhas breves aventuras com IA: dos “Magic Avatars” do Lensa, ao Stable Diffusion local
Published: 2022-12-05 02:48:42

Na última semana, um app chamado Lensa começou a bombar aqui no Brasil, criado pela Prisma Labs, que aparentemente cria apps de edição de fotos já há alguns anos.

De pessoas anônimas a famosos, todos entraram na onda do app, que promete criar avatares incríveis e criativos em cerca de 20 minutos, bastando apenas enviar selfies em poses variadas e pagar um valor. O fato de possibilitar o pagamento em reais, com certeza fez o app ganhar muito dinheiro nos últimos dias.

Eu mesmo fiquei instigado, fiz o pagamento de cerca de R$15 e testei: de 50 fotos, umas 7 ou 8 foram aproveitáveis, mas as ideias e composições realmente eram muito criativas. A grande maioria, no entanto, ou gerou outputs pouco aproveitáveis, ou tinha grandes defeitos nos rostos ou mãos, e algumas fotos ficaram até cortadas, impossibilitando o uso.

A título de exemplo, algumas das fotos legais que saíram:
![imagens boas geradas pelo Lensa](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yanfzuihgovcvnxpuplg.png)

E outras que simplesmente saíram cheias de defeitos:

![imagens ruins geradas pelo Lensa](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4fww0adqumnyyjhjz5ei.png) Reparem no olho torto e a mão com formato estranho, o nariz completamente estranho, entre outros fatores.

## As primeiras experiências
Sendo assim, como total leigo nesse assunto, já que meu universo sempre foi programação web, fiquei curioso de saber como o app estava gerando tudo isso, e se havia uma forma de chegar em resultados melhores. Fazendo uma breve pesquisa no Twitter, cheguei na [thread da Gi](https://twitter.com/sspacecoding/status/1598064385972633602) (aka @sspacecoding), comecei a mexer um pouco com o Google Colab sugerido na thread, mas ao mesmo tempo, fui buscar mais conteúdo no YouTube sobre o assunto.

Cheguei primeiro no [tutorial do Olivio Sarikas](https://www.youtube.com/watch?v=3cvP7yJotUM), sobre como instalar a WebUI do Stable Diffusion, e como utilizar o modelo do Stable Diffusion 1.5 nessa interface. Fiz todo o processo, rodei o programinha, e a primeira vista foi essa:

![UI do Stable Diffusion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a46afbj0zhxbxfgw3qj9.png)

De início, obviamente eu não entendi muita coisa de como funcionava, apenas que bastava jogar um prompt que ele geraria alguma coisa. Escrevi a simples frase:

> a cat in a basket

Cliquei em "Generate", e em questão de poucos segundos:

![UI do Stable Diffusion gerando um gato numa cesta](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/myb1ok93ggma5dl174i8.png)

Vi que o negócio era interessante, mas achei que daria pra tentar ir um pouco mais fundo:

![UI do Stable Diffusion gerando um gato numa cesta, com óculos escuros, com fundo de floresta](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6hi51tyyei9bosdljz2g.png)

> a cat using sunglasses in a basket, with a forest background

Uau! E com pessoas, aliás, famosos? Será que daria certo?

![UI do Stable Diffusion gerando uma imagem da Viola Davis como Pantera Negra](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vgenxla7wvqo7jqhyg9.png)

> viola davis as black panther, with wakanda as background

Aí sim, minha mente simplesmente explodiu! Sem nenhuma configuração adicional, sem mexer em nenhum parâmetro do formulário, simplesmente instalando e rodando o algoritmo, consegui gerar uma imagem perfeita de Viola Davis como Pantera Negra!

Dado meu total desconhecimento do assunto, comecei a testar combinações e colocar nomes de famosos do cinema, e também famosos da TV brasileira. Dos brasileiros, no entanto, simplesmente não dava certo, vinham rostos aleatórios. Tirei a conclusão de que esses rostos de famosos de fora provavelmente foram todos treinados e embutidos no modelo do Stable Diffusion, e não adiantaria colocar pessoas menos conhecidas.

## Os meus próprios "Magic Avatars"
Fiquei curioso, então, de como eu conseguiria adicionar meu próprio rosto nas gerações de imagens e finalmente chegar próximo do que o Lensa faz.

Fiz mais algumas pesquisas, e cheguei no [tutorial do James Cunliffe](https://www.youtube.com/watch?v=MT8HhBSMaWM), sobre como treinar modelos, com as suas fotos, pra utilizar no Stable Diffusion. Fiz todo o procedimento descrito, usando o Google Colab da descrição do vídeo, e aí sim, a coisa começou a ficar MUITO divertida!

Vale dizer que, apesar de eu ter subido de forma local e baixado o modelo pra utilizar na minha máquina, é possível fazer todo o processo (inclusive a geração de imagens) seguindo o tutorial, no Google Colab. Inclusive, para quem não possui placa de vídeo, é o caminho mais indicado, já que o processamento é pesado. No entanto, garanta que seu Google Drive esteja com bastante espaço livre, pois consome bastante espaço de disco.

Peguei a sugestão de prompt deixada pela Gi, na thread, e utilizei o nome do modelo que havia treinado (rikezenho):

> portrait of rikezenho intricate, elegant, highly detailed, digital painting, smooth, sharp focus, illustration, art by greg rutkowski

E o resultado:

![UI do Stable Diffusion gerando uma imagem estilizada minha](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gnsrsj5ej8k16bwxmo62.png)

A partir daí, foram horas e mais horas de exploração:
- Buscando e testando prompts criativos: para isso, o site [Lexica](https://lexica.art) é muito útil, pois dá pra buscar imagens criativas geradas por AI e quais foram os prompts utilizados;
- Brincando com os parâmetros do formulário: por exemplo, o número de "sampling steps", que tem uma variação ideal de acordo com o "sampling method" escolhido  -  para o padrão "Euler a", me pareceu que 40 steps é o valor ideal;
- Marcando e desmarcando as opções, e comparando os resultados: para rostos de famosos, por exemplo, a opção "Restore faces" criou resultados mais nítidos e corretos;
- Alterando o "batch count": pra gerar mais de uma versão daquele prompt de uma vez só  -  obviamente, o tempo pra gerar aumenta conforme o valor;
- Modificando o "CFG Scale": esse parâmetro guia o quanto o algoritmo precisa respeitar o que você pediu no seu prompt  -  por padrão é 7, que é normal, mas pode mudar para valores maiores caso queira mais estrito. Dá para deixar bem baixo, tipo 4, pra gerar resultados que não respeitam tanto o prompt, mas são mais criativos;
- Alterando o valor de "Seed" pra se aprofundar naquele resultado gerado anteriormente: por padrão, o valor vem como -1, o que significa que vai dar um número aleatório a cada tentativa, mas você pode jogar um número determinado pra sempre chegar em um mesmo resultado, podendo manipular os sampling steps e sampling method.

Depois de muita exploração, cheguei em resultados tão legais quanto os do app, e vou deixar os prompts utilizados nas descrições das imagens mais abaixo.

Seja criativo! Use como referência seus jogos, animes, séries e filmes favoritos, bem como estilos de artistas (aqui uma [lista de artistas suportados](https://decentralizedcreator.com/list-of-artists-supported-by-stable-diffusion/)), que dá para chegar em resultados muito bacanas.

![Imagem minha gerada pelo Stable Diffusion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/06to8kg8zhsgeitgefxb.png)
> Prompt: rikezenho in star wars style, with imperial armor, epic technologic background, fantastically detailed shining eyes modern anime style art cute vibrant detailed ears boy portrait shinkai makoto studio ghibli studio key hideaki anno sakimichan stanley artgerm lau rossdraws james jean marc simonetti elegant highly detailed digital painting artstation pixiv, unreal engine, epic composition, featured on artstation, pixiv, krenz cushart, laurie greasly, wlop, 4k | Sampling method: Euler a | Sampling steps: 20 | CFG Scale: 7

![Imagem minha gerada pelo Stable Diffusion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/675g34snrir0r7ui9q73.png)
> Prompt: rikezenho in fortnite style, with epic mountain background, fantastically detailed shining eyes modern anime style art cute vibrant detailed ears boy portrait shinkai makoto studio ghibli studio key hideaki anno sakimichan stanley artgerm lau rossdraws james jean marc simonetti elegant highly detailed digital painting artstation pixiv, unreal engine, epic composition, featured on artstation, pixiv, krenz cushart, laurie greasly, wlop, 4k | Sampling method: Euler a | Sampling steps: 20 | CFG Scale: 7


![Imagem minha gerada pelo Stable Diffusion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5fmgcmqfknyofp22v3bd.png)
> Prompt: rikezenho saint seiya fantastically detailed shining eyes modern anime style art cute vibrant detailed ears boy portrait shinkai makoto studio ghibli studio key hideaki anno sakimichan stanley artgerm lau rossdraws james jean marc simonetti elegant highly detailed digital painting artstation pixiv | Sampling method: Euler a | Sampling steps: 20 | CFG Scale: 7

![Imagem minha gerada pelo Stable Diffusion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k19sz2tof428z8vih4km.png)
> Prompt: portrait of rikezenho as a paladin, intricate, elegant, highly detailed, digital painting, smooth, sharp focus, illustration, art by greg rutkowski | Sampling method: Euler a | Sampling steps: 20 | CFG Scale: 7

## Descobertas no processo, e dicas
- Por mais que meu PC tenha boas configurações (32GB de RAM, GPU RTX 3060TI, AMD Ryzen 5 5700G), o tempo de geração de imagens é razoável, e há um grande uso da GPU pra isso. Mesmo com um bom PC, tive que subir a Web UI do Stable Diffusion utilizando o parâmetro de VRAM média, descrito [no repositório oficial](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Troubleshooting#low-vram-video-cards);
- O campo de "Negative prompt" é bastante útil pra falar o que você não quer que saia nos outputs. Por exemplo, notei que o algoritmo não lida bem com mãos, e às vezes o tipo corporal ou gênero pode sair muito diferente do seu, então é possível remover essas possibilidades com o "Negative prompt". Exemplos de termos: _cellphone_ (já aconteceu de sair um celular nas imagens finais, por conta das selfies que usei pra treinar o modelo), _fat_ (para mim gerou algumas imagens com o tipo corporal diferente), _old_, _hands_ (pra não gerar mãos à mostra);
- O algoritmo que já vem selecionado na UI é o "txt2img", mas você também pode utilizar o "img2img" pra ampliar imagens e utilizar o recurso de "inpainting" para modificar um espaço específico de uma imagem que você deseja. Por exemplo: em algumas imagens, eu adorei a composição, mas o rosto ficou estranho. Com o recurso de "inpainting", eu demarquei a área do rosto e gerei novas imagens modificando apenas a área marcada, assim, consegui corrigir o rosto da composição;
- Falando no "img2img", para gerar a imagem de capa do artigo com uma largura maior do que o tamanho gerado no "txt2img" (512x512px), eu usei o recurso de inpainting. Joguei a imagem no inpainting, setei o tamanho desejado para 1600x512px, marquei a opção "resize and fill" e fui tentando gerar algumas vezes até chegar num bom resultado:

![Imagem minha gerada pelo Stable Diffusion, ampliada pelo inpainting](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3xkkiw1kbvv0dif6lanq.png)

- Existe uma opção chamada "Checkpoint Merger", que você pode mergear o arquivo ckpt dos modelos. Fiz o teste com 2 modelos diferentes que gerei pro meu rosto e deu certo, parece que um complementou o outro. Porém, ao mergear modelos de rostos de pessoas diferentes, produziu resultados totalmente incorretos.

## Conclusão
O Stable Diffusion realmente é muito impressionante e é extremamente divertido (e viciante) mexer com ele, mas refleti sobre alguns pontos sobre o uso dele:
- O uso do algoritmo gera discussões sobre copyright, que provavelmente se estenderão pelos próximos anos, já que, com uma simples frase, é possível copiar de forma muito semelhante o estilo de artistas que nem sabem que estão sendo copiados. Tanto que, [na versão 2.0 do algoritmo, está um pouco mais difícil "copiar" estilos de artistas](https://www.theverge.com/2022/11/24/23476622/ai-image-generator-stable-diffusion-version-2-nsfw-artists-data-changes), provavelmente por conta de reinvindicações da categoria;
- A despeito das críticas, o app Lensa foi bastante "ligeiro", do ponto de vista de produto: pegou algo que a comunidade estava explorando de forma gratuita e nichada, explorou e chegou em prompts que funcionam de forma agradável para a maioria das pessoas, e gerou uma forma acessível para completos leigos poderem consumir, sem precisar se preocupar com poder de processamento, treino de modelos e etc. Além do fato de ser um app, e com possibilidade de pagamento em reais, o que com certeza foi um fator crucial pro app bombar aqui no Brasil;
- Eu não tinha muito conhecimento sobre IAs de geração de imagens, e mesmo assim, consegui chegar em resultados muito bacanas, então, acredito que o uso do Stable Diffusion sem essas abstrações criadas pelo app valha muito mais a pena. Basta ter um pouco mais de tempo e paciência. Poder manipular os prompts e os parâmetros gera uma infinidade de possibilidades.

Se testarem também, deixem seus comentários, ou [chama lá no Twitter](https://twitter.com/Rikezenho). Vamos compartilhar os prompts bacanas, que é a parte mais "difícil" do processo :)