42 pontos por xguru 2025-02-03 | 5 comentários | Compartilhar no WhatsApp
  • 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
  • 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
  • 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

 
cladio 2025-02-04

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...

 
botplaysdice 2025-02-04

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".

 
sollscherr 2025-02-03

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.

 
xguru 2025-02-03

Um comentário no Hacker News chama a atenção

  • Fiz isso pelo meu gato falecido que eu amava. Gostei do resultado, mas em certo momento de repente senti um arrepio com o que eu estava fazendo
    • Parece que isso vai virar um grande negócio. Eu provavelmente mandei centenas de milhares de e-mails, mensagens de texto, chats etc.; é perfeitamente viável treinar o corpus de comunicação de uma pessoa querida para poder conversar com 'ela' depois que partir deste mundo
    • Depois que meu pai faleceu, fiz isso com a voz dele e configurei a função de conversar com um assistente com suporte a LLM para que respondesse com a voz e o jeito dele. Foi um período de luto e de enfrentamento muito estranho, e no fim acabei achando muito esquisito o que eu estava fazendo
    • Isso é parecido com o episódio "Be Right Back" de Black Mirror

Há também um comentário informativo

  • No caso do Flux, o codificador de texto tem muito mais recursos, e dá para escrever prompts com frases bem mais significativas e abrangentes
    • Portanto, aquelas expressões curtas separadas por vírgulas que eram comuns no Stable Diffusion podem ser reduzidas
  • Também é preciso fazer o mesmo com as imagens de treinamento. É bom colocar legendas em tudo que você não quer que o modelo memorize como sendo 'você' (o que está fazendo, a roupa que está vestindo, as pessoas que estão com você, acessórios etc.)
 
humblebee 2025-02-03

"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 😳