Este repositório fornece uma implementação do DreamBooth usando KerasCV e TensorFlow. A implementação é fortemente referida no exemplo diffusers
do Hugging Face.
DreamBooth é uma maneira de ensinar (ajustar) rapidamente o Stable Diffusion sobre novos conceitos visuais. Para obter mais detalhes, consulte este documento.
O código fornecido neste repositório é apenas para fins de pesquisa . Confira esta seção para saber mais sobre os possíveis casos de uso e limitações.
Ao carregar este modelo, você aceita a licença CreativeML Open RAIL-M em https://raw.githubusercontent.com/CompVis/stable-diffusion/main/LICENSE.
Se você está apenas procurando os recursos que acompanham este repositório, aqui estão os links:
Atualização 15/02/2023 : Obrigado a Soumik Rakshit; agora temos utilitários melhores para suportar Pesos e Vieses (veja #22).
Instale os pré-requisitos: pip install -r requirements.txt
.
Primeiro você precisa escolher uma classe à qual um identificador exclusivo seja anexado. Esta base de código do repositório foi testada usando sks
como identificador exclusivo e dog
como classe.
Em seguida, dois tipos de prompts são gerados:
(a) prompt de instância : f"uma foto de {self.unique_id} {self.class_category}" (b) prompt de classe : f"uma foto de {self.class_category}"
Imagens de instância
Obtenha algumas imagens (3 a 10) que representem o conceito com o qual o modelo será ajustado. Essas imagens seriam associadas ao instance_prompt
. Essas imagens são chamadas de instance_images
da base de código. Arquive essas imagens e hospede-as em algum lugar online para que o arquivo possa ser baixado usando a função tf.keras.utils.get_file()
internamente.
Imagens da aula
DreamBooth usa perda de preservação anterior para regularizar o treinamento. Para encurtar a história, a perda de preservação anterior ajuda o modelo a se adaptar lentamente ao novo conceito em consideração a partir de qualquer conhecimento prévio que possa ter sobre o conceito. Para usar a perda de preservação anterior, precisamos do prompt da classe conforme mostrado acima. O prompt da classe é usado para gerar um número predefinido de imagens que são usadas para calcular a perda final usada para o treinamento do DreamBooth.
De acordo com este recurso, 200 a 300 imagens geradas usando o prompt de classe funcionam bem na maioria dos casos.
Então, depois de decidir instance_prompt
e class_prompt
, use este Colab Notebook para gerar algumas imagens que seriam usadas para treinamento com a perda de preservação anterior. Em seguida, arquive as imagens geradas como um único arquivo e hospede-as online para que possam ser baixadas usando a função tf.keras.utils.get_file()
internamente. Na base de código, simplesmente nos referimos a essas imagens como class_images
.
É possível realizar o treinamento DreamBooth SEM utilizar uma perda de preservação prévia. Este repositório sempre o usa. Para que as pessoas possam testar facilmente essa base de código, hospedamos as imagens de instância e classe aqui.
Lançamento do treinamento! Existem vários hiperparâmetros com os quais você pode brincar. Consulte o script train_dreambooth.py
para saber mais sobre eles. Aqui está um comando que inicia o treinamento com precisão mista e outros valores padrão:
python train_dreambooth.py --mp
Você também pode ajustar o codificador de texto especificando a opção --train_text_encoder
.
Além disso, o script oferece suporte à integração com pesos e preconceitos ( wandb
). Se você especificar --log_wandb
,
wandb
usando o retorno de chamada WandbMetricsLogger
.wandb
como artefatos para controle de versão do modelo. Isso é feito usando o DreamBoothCheckpointCallback
que foi construído usando o retorno de chamada WandbModelCheckpoint
.wandb.Table
em seu painel wandb
. Isso é feito usando QualitativeValidationCallback
, que também registra as imagens geradas em um painel de mídia no painel do wandb
no final do treinamento.Aqui está um comando que inicia o treinamento e registra métricas de treinamento e imagens geradas em seu espaço de trabalho Pesos e preconceitos:
python train_dreambooth.py
--log_wandb
--validation_prompts
" a photo of sks dog with a cat "
" a photo of sks dog riding a bicycle "
" a photo of sks dog peeing "
" a photo of sks dog playing cricket "
" a photo of sks dog as an astronaut "
Aqui está um exemplo de execução wandb
onde você pode encontrar as imagens geradas, bem como os pontos de verificação do modelo.
Testamos nossa implementação em dois métodos diferentes: (a) ajustando apenas o modelo de difusão (o UNet), (b) ajustando o modelo de difusão junto com o codificador de texto. Os experimentos foram conduzidos em uma ampla gama de hiperparâmetros para learning rate
e training steps
durante o treinamento e para number of steps
e unconditional guidance scale
(ugs) durante a inferência. Mas apenas os resultados mais salientes (da nossa perspectiva) estão incluídos aqui. Se você está curioso para saber como diferentes hiperparâmetros afetam a qualidade da imagem gerada, encontre o link para os relatórios completos em cada seção.
Observe que nossos experimentos foram guiados por esta postagem do blog Hugging Face.
Aqui estão alguns resultados selecionados de vários experimentos que conduzimos. Nossos registros experimentais para esta configuração estão disponíveis aqui. Mais imagens de visualização (geradas com os pontos de verificação desses experimentos) estão disponíveis aqui.
Imagens | Passos | UGS | Contexto |
---|---|---|---|
50 | 30 | LR: 1e-6 Etapas de treinamento: 800 (pesos) | |
25 | 15 | LR: 1e-6 Etapas de treinamento: 1000 (pesos) | |
75 | 15 | LR: 3e-6 Etapas de treinamento: 1200 (pesos) |
Imagens | Passos | feios |
---|---|---|
75 | 15 | |
75 | 30 |
com taxa de aprendizagem = 9e-06, etapas máximas do trem = 200 (pesos | relatórios)
Imagens | Passos | feios |
---|---|---|
150 | 15 | |
75 | 30 |
com taxa de aprendizagem = 9e-06, etapas máximas de treinamento = 200 (conjuntos de dados | relatórios)
A biblioteca diffusers
fornece ferramentas de última geração para experimentar diferentes modelos de difusão, incluindo difusão estável. Inclui diferentes técnicas de otimização que podem ser aproveitadas para realizar inferência eficiente com diffusers
ao usar grandes pontos de verificação de difusão estável. Um recurso particularmente vantajoso diffusers
é o suporte a diferentes agendadores que podem ser configurados durante o tempo de execução e podem ser integrados em qualquer modelo de Difusão compatível.
Depois de obter os pontos de verificação ajustados do DreamBooth usando esta base de código, você pode exportá-los para um StableDiffusionPipeline
útil e usá-lo diretamente da biblioteca diffusers
.
Considere este repositório: chansung/dreambooth-dog. Você pode usar os pontos de verificação deste repositório em um StableDiffusionPipeline
após executar algumas pequenas etapas:
from diffusers import StableDiffusionPipeline
# checkpoint of the converted Stable Diffusion from KerasCV
model_ckpt = "sayakpaul/text-unet-dogs-kerascv_sd_diffusers_pipeline"
pipeline = StableDiffusionPipeline . from_pretrained ( model_ckpt )
pipeline . to ( "cuda" )
unique_id = "sks"
class_label = "dog"
prompt = f"A photo of { unique_id } { class_label } in a bucket"
image = pipeline ( prompt , num_inference_steps = 50 ). images [ 0 ]
Siga este guia para saber mais.
Convertemos o ponto de verificação ajustado para as imagens do cão em StableDiffusionPipeline compatível com difusores e executamos vários experimentos com diferentes configurações do agendador. Por exemplo, os seguintes parâmetros do DDIMScheduler
são testados em um conjunto diferente de guidance_scale
e num_inference_steps
.
num_inference_steps_list = [ 25 , 50 , 75 , 100 ]
guidance_scale_list = [ 7.5 , 15 , 30 ]
scheduler_configs = {
"DDIMScheduler" : {
"beta_value" : [
[ 0.000001 , 0.02 ],
[ 0.000005 , 0.02 ],
[ 0.00001 , 0.02 ],
[ 0.00005 , 0.02 ],
[ 0.0001 , 0.02 ],
[ 0.0005 , 0.02 ]
],
"beta_schedule" : [
"linear" ,
"scaled_linear" ,
"squaredcos_cap_v2"
],
"clip_sample" : [ True , False ],
"set_alpha_to_one" : [ True , False ],
"prediction_type" : [
"epsilon" ,
"sample" ,
"v_prediction"
]
}
}
Abaixo está a comparação entre diferentes valores dos parâmetros beta_schedule
enquanto outros são fixados em seus valores padrão. Dê uma olhada no relatório original que inclui os resultados de outros agendadores, como PNDMScheduler
e LMSDiscreteScheduler
.
Muitas vezes é observado que as configurações padrão garantem a geração de imagens de melhor qualidade. Por exemplo, os valores padrão de guidance_scale
e beta_schedule
são definidos como 7,5 e linear
. No entanto, quando guidance_scale
está definido como 7,5, scaled_linear
do beta_schedule
parece funcionar melhor. Ou, quando beta_schedule
está definido como linear
, guidance_scale
mais alta parece funcionar melhor.
Realizamos 4.800 experimentos que geraram 38.400 imagens no total. Esses experimentos são registrados em Pesos e Vieses. Se você estiver curioso, confira aqui, bem como o script que foi usado para executar os experimentos.
Além das dicas e truques compartilhados nesta postagem do blog, seguimos o seguinte ao preparar as instâncias para conduzir o treinamento DreamBooth em rostos humanos:
Obrigado a Abhishek Thakur por compartilhar essas dicas.