- Tentei um projeto para treinar, ao longo de algumas horas, meu próprio modelo de imagem de IA e criar fotos que parecessem ter sido tiradas de verdade
- Ex.: gerar uma foto minha fantasiado de "Superman"
- Motivos para tentar: parecia divertido, seria legal para brincar com as crianças e permitiria aprender mais sobre modelos personalizados/IA mais avançada
- Há 12~18 meses, esse trabalho era bastante complexo, mas agora ficou muito simples
- Em menos de 2 horas, criei o modelo e obtive as imagens que queria; o ponto principal foi identificar rapidamente as ferramentas certas
Escolha do padrão de modelo/treinamento
- Elementos necessários
- modelo base (base model)
- técnica de treinamento/fine-tuning
- conjunto de dados de treinamento (algumas fotos suas etc.)
- Muitos sistemas de IA recomendam Stable Diffusion, mas escolhi o modelo Flux porque disseram que ele entrega desempenho melhor, e foi o modelo usado por Pieter Levels
- Não é exatamente o modelo SOTA mais recente, mas é bom o suficiente
- Como técnica de treinamento, usei LoRA(Low-Rank Adaptation)
- Em vez de retreinar o modelo inteiro, ele treina apenas a parte ligada a uma "palavra mágica" específica
- Ex.: ensinar ao modelo uma palavra incomum como "czue" para que, ao usá-la no prompt, ele reflita as características daquele conjunto de dados
Criação do conjunto de treinamento
- É preciso preparar várias fotos da pessoa a ser aprendida (cerca de 10~15 imagens)
- Quanto mais variedade de expressão facial, fundo, iluminação e ângulo, melhor
- O ideal é que haja apenas uma pessoa por foto
- Durante o treinamento, é necessária uma descrição em texto, e ela deve incluir a palavra mágica
- Ex.: "a photo of czue on the beach, wearing a blue shirt"
- Mas as ferramentas mais recentes geram legendas de imagem automaticamente, então não é preciso escrever essas descrições manualmente
Treinamento do modelo
- No começo, pensei em treinar localmente, mas foi difícil por falta de GPU e RAM
- Também dava para rodar o código diretamente em um servidor cloud com GPU, mas no fim usei Replicate
- É um serviço de aluguel de GPU no qual você pode usar receitas prontas imediatamente
- Neste caso, usei a receita ostris/flux-dev-lora-trainer
- Depois de criar uma conta no Replicate, é preciso configurar as informações de cobrança
- Principais parâmetros
- input_images: fotos de treinamento (zip)
- trigger_word: palavra mágica, ex.: "czue"
- hf_repo_id, hf_token: repositório/token do Hugging Face
- autocaption_prefix: texto colocado no início das legendas geradas automaticamente (ex.: "A photo of czue,")
Armazenamento do modelo no Hugging Face
- Hugging Face é uma plataforma para armazenar e compartilhar modelos
- O Replicate também salva o modelo treinado em algum lugar, mas enviar para o Hugging Face facilita a integração com outras ferramentas
- Depois de criar a conta e o modelo, basta passar o
hf_repo_id- O token de acesso pode ser emitido em settings/tokens
- Quando o treinamento termina, um arquivo grande chamado "lora.safetensors" (cerca de 180MB) é enviado ao Hugging Face
Geração de imagens com o modelo
- Depois que o treinamento termina, vem o processo de inferência, em que você insere texto no modelo para criar imagens
- Dá para testar localmente, mas novamente usei o Replicate
- Em lucataco/flux-dev-lora, basta configurar o campo hf_lora
- ID de repositório público do Hugging Face ou link do modelo treinado enviado ao Replicate
- Em lucataco/flux-dev-lora, basta configurar o campo hf_lora
- Ex.: ao inserir "a photo of czue surfing", você obtém uma imagem sua surfando, como no exemplo
Execução do modelo de forma programática
- Se quiser testar vários prompts e salvar os resultados automaticamente, usar chamadas de API é mais prático
- Escrevi o script Python abaixo como exemplo (o código completo está no Github)
# /// script # requires-python = ">=3.12" # dependencies = [ # "replicate", # ] # /// import argparse import os import re import replicate import uuid DEFAULT_MODEL = "czue/me-v1" DEFAULT_COUNT = 1 def get_input(prompt, model=DEFAULT_MODEL, count=DEFAULT_COUNT): return { "prompt": prompt, "hf_lora": model, "num_outputs": count } def main(): parser = argparse.ArgumentParser() parser.add_argument("prompt", help="Prompt for the photo") parser.add_argument("--model", default=DEFAULT_MODEL, help="Model to use (default: %(default)s)") parser.add_argument("--count", default=DEFAULT_COUNT, help="Number of photos to generate (default: %(default)s)", type=int) args = parser.parse_args() input = get_input(args.prompt, args.model, args.count) output = replicate.run( "lucataco/flux-dev-lora:091495765fa5ef2725a175a57b276ec30dc9d39c22d30410f2ede68a3eab66b3", input=input ) output_dir = "output" os.makedirs(output_dir, exist_ok=True) prompt_slug = "-".join(args.prompt.split(" ")[-3:]) prompt_slug = re.sub(r'[^a-zA-Z0-9\-]', '', prompt_slug).lower() for index, item in enumerate(output): file_id = uuid.uuid4().hex[:5] output_path = os.path.join(output_dir, f"{prompt_slug}-{file_id}.webp") with open(output_path, "wb") as file: file.write(item.read()) print(f"Saved photo {output_path}") if __name__ == "__main__": main() - Exemplo de uso
uv run main.py "a photo of czue, a 40 year old man, writing a blog post" \ --model="czue/me-v1" \ --count=4
Resultado
- O desempenho do modelo é inconsistente
- Às vezes ele capta muito bem as características da pessoa, mas em outras gera alguém diferente
- Se você explicitar idade, gênero etc. no prompt, a precisão melhora um pouco
- Por exemplo, "a photo of czue, a 40 year old man, writing a blog post" gera imagens relativamente consistentes
- Já "a photo of czue writing a blog post" produziu resultados muito mais variados
- Ao colocar outra pessoa junto, surgem problemas como mistura de rostos
- Quando tentei criar uma foto com Barack Obama, algumas partes do meu rosto apareceram nele, e vice-versa
- Ainda assim, foi divertido e útil o bastante para tentar várias coisas com as crianças
Custo
- Não é grátis, mas também não é tão caro
- Treinei 3 modelos no total, somando o meu e o das crianças, e cada um custou cerca de ~$2.50
- A geração de imagens custa cerca de $0.03 por imagem, então mesmo 30 imagens saem por volta de $1
- Gastei menos de $10 no experimento inteiro e fiquei satisfeito por ter sido mais barato do que imaginava
- Se você tem interesse em treinar modelos de IA e gerar imagens, vale a pena tentar, porque é bem mais fácil do que parece
5 comentários
Tentei fazer por diversão e realmente é muito fácil.
(https://www.youtube.com/watch?v=sNpQ9ULDMoo)
Fiquei um tempão rindo enquanto criava várias coisas...
No fim das contas, antes de morrer, não vamos querer fazer upload para a rede de um modelo treinado para ser como nós e então morrer? Como um instinto de sobrevivência... embora isso não seja o "eu".
Ao ver essa tecnologia, lembrei de um romance e quis indicá-lo. É o conto "Chronos", incluído na coletânea de contos Bisutbangul Pong, da escritora Yiyuri. A história trata de uma IA que armazena e aprende os dados de uma pessoa, ou seja, da própria pessoa. Como o gato daquele comentário. Uma mãe com demência passa a usá-la antes que os sintomas piorem. E então os filhos entram em conflito. Ao mesmo tempo em que se sentem consolados, também sentem culpa. Se você se interessou por essa tecnologia e também pela história daquele gato, vale a pena ler.
Um comentário no Hacker News chama a atenção
Há também um comentário informativo
"Qualquer tecnologia suficientemente avançada é indistinguível da magia - Arthur C. Clarke"
Até apenas 2 anos atrás, isso parecia algo que só veríamos em filmes de ficção científica, e agora estamos realmente testemunhando em tempo real o momento em que a magia se torna realidade 😳