이 저장소는 KerasCV 및 TensorFlow를 사용하여 DreamBooth 구현을 제공합니다. 구현은 Hugging Face의 diffusers
예제에서 많이 참조되었습니다.
DreamBooth는 새로운 시각적 개념에 대해 Stable Diffusion을 빠르게 교육(미세 조정)하는 방법입니다. 자세한 내용은 이 문서를 참조하세요.
이 저장소에 제공된 코드는 연구 목적으로만 사용됩니다 . 잠재적인 사용 사례와 제한 사항에 대해 자세히 알아보려면 이 섹션을 확인하세요.
이 모델을 로드하면 https://raw.githubusercontent.com/CompVis/stable-diffusion/main/LICENSE에서 CreativeML Open RAIL-M 라이선스에 동의하게 됩니다.
이 저장소와 함께 제공되는 리소스를 찾고 있다면 다음 링크를 참조하세요.
2023년 2월 15일 업데이트 : Soumik Rakshit에게 감사드립니다. 이제 가중치와 편향을 지원하는 더 나은 유틸리티가 있습니다(#22 참조).
필수 구성 요소를 설치합니다: pip install -r requirements.txt
.
먼저 고유 식별자가 추가되는 클래스를 선택해야 합니다. 이 저장소 코드베이스는 sks
고유 식별자로 사용하고 dog
클래스로 사용하여 테스트되었습니다.
그런 다음 두 가지 유형의 프롬프트가 생성됩니다.
(a) 인스턴스 프롬프트 : f"{self.unique_id}의 사진 {self.class_category}" (b) 클래스 프롬프트 : f"{self.class_category}의 사진"
인스턴스 이미지
모델이 미세 조정될 컨셉을 나타내는 몇 개의 이미지(3 - 10)를 가져옵니다. 이러한 이미지는 instance_prompt
와 연결됩니다. 코드베이스에서는 이러한 이미지를 instance_images
라고 합니다. 이러한 이미지를 아카이브하고 내부적으로 tf.keras.utils.get_file()
함수를 사용하여 아카이브를 다운로드할 수 있도록 온라인 어딘가에 호스팅하세요.
수업 이미지
DreamBooth는 사전 보존 손실을 사용하여 훈련을 정규화합니다. 간단히 말해서, 사전 보존 손실은 모델이 개념에 대해 가지고 있을 수 있는 모든 사전 지식을 바탕으로 고려 중인 새로운 개념에 천천히 적응하는 데 도움이 됩니다. 사전 보존 손실을 사용하려면 위와 같은 클래스 프롬프트가 필요합니다. 클래스 프롬프트는 DreamBooth 훈련에 사용되는 최종 손실을 계산하는 데 사용되는 미리 정의된 수의 이미지를 생성하는 데 사용됩니다.
이 리소스에 따르면 수업 프롬프트를 사용하여 생성된 이미지 200~300개는 대부분의 경우에 적합합니다.
따라서 instance_prompt
및 class_prompt
결정한 후 이 Colab Notebook을 사용하여 사전 보존 손실이 있는 학습에 사용할 일부 이미지를 생성하세요. 그런 다음 생성된 이미지를 단일 아카이브로 보관하고 내부적으로 tf.keras.utils.get_file()
함수를 사용하여 다운로드할 수 있도록 온라인으로 호스팅합니다. 코드베이스에서는 이러한 이미지를 간단히 class_images
라고 합니다.
사전 보존 손실을 사용하지 않고 DreamBooth 훈련을 수행하는 것이 가능합니다. 이 저장소는 항상 이를 사용합니다. 사람들이 이 코드베이스를 쉽게 테스트할 수 있도록 여기에 인스턴스 및 클래스 이미지를 호스팅했습니다.
훈련 시작! 가지고 놀 수 있는 하이퍼파라미터가 많이 있습니다. 이에 대한 자세한 내용은 train_dreambooth.py
스크립트를 참조하세요. 다음은 혼합 정밀도 및 기타 기본값을 사용하여 훈련을 시작하는 명령입니다.
python train_dreambooth.py --mp
--train_text_encoder
옵션을 지정하여 텍스트 인코더를 미세 조정할 수도 있습니다.
또한 이 스크립트는 가중치 및 편향( wandb
)과의 통합을 지원합니다. --log_wandb
지정하면
WandbMetricsLogger
콜백을 사용하여 훈련 지표를 wandb
대시보드에 자동으로 기록합니다.wandb
프로젝트에 업로드합니다. 이는 WandbModelCheckpoint
콜백을 사용하여 구축된 DreamBoothCheckpointCallback
사용하여 수행됩니다.wandb
대시보드의 wandb.Table
에 기록합니다. 이는 훈련이 끝날 때 생성된 이미지를 wandb
대시보드의 미디어 패널에 기록하는 QualitativeValidationCallback
을 사용하여 수행됩니다.다음은 훈련을 시작하고 훈련 지표와 생성된 이미지를 Weights & Biases 작업 공간에 기록하는 명령입니다.
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 "
다음은 생성된 이미지와 모델 체크포인트를 찾을 수 있는 wandb
실행의 예입니다.
우리는 (a) 확산 모델(UNet)만 미세 조정하고, (b) 텍스트 인코더와 함께 확산 모델을 미세 조정하는 두 가지 방법으로 구현을 테스트했습니다. 실험은 학습 중 learning rate
및 training steps
와 추론 중 number of steps
및 unconditional guidance scale
(ugs)에 대한 광범위한 하이퍼파라미터에 대해 수행되었습니다. 그러나 여기에는 (우리의 관점에서) 가장 두드러진 결과만 포함되어 있습니다. 다양한 하이퍼파라미터가 생성된 이미지 품질에 어떤 영향을 미치는지 궁금하다면 각 섹션에서 전체 보고서에 대한 링크를 찾아보세요.
우리의 실험은 Hugging Face의 이 블로그 게시물을 참고하세요.
다음은 우리가 수행한 다양한 실험에서 선택된 몇 가지 결과입니다. 이 설정에 대한 실험 로그는 여기에서 확인할 수 있습니다. 더 많은 시각화 이미지(이러한 실험의 체크포인트로 생성됨)는 여기에서 확인할 수 있습니다.
이미지 | 단계 | UGS | 환경 |
---|---|---|---|
50 | 30 | LR: 1e-6 훈련 단계: 800(가중치) | |
25 | 15 | LR: 1e-6 훈련 단계: 1000(가중치) | |
75 | 15 | LR: 3e-6 훈련 단계: 1200(가중치) |
이미지 | 단계 | ugs |
---|---|---|
75 | 15 | |
75 | 30 |
학습률=9e-06, 최대 학습 단계=200(가중치 | 보고서)
이미지 | 단계 | ugs |
---|---|---|
150 | 15 | |
75 | 30 |
학습률=9e-06, 최대 학습 단계=200(데이터 세트 | 보고서)
diffusers
라이브러리는 Stable Diffusion을 포함한 다양한 Diffusion 모델을 실험하기 위한 최첨단 도구를 제공합니다. 여기에는 대규모 Stable Diffusion 체크포인트를 사용할 때 diffusers
로 효율적인 추론을 수행하는 데 활용할 수 있는 다양한 최적화 기술이 포함되어 있습니다. diffusers
특히 유리한 기능 중 하나는 런타임 중에 구성할 수 있고 호환 가능한 모든 확산 모델에 통합할 수 있는 다양한 스케줄러를 지원한다는 것입니다.
이 코드베이스를 사용하여 DreamBooth 미세 조정된 체크포인트를 얻은 후에는 실제로 이를 편리한 StableDiffusionPipeline
으로 내보내고 diffusers
라이브러리에서 직접 사용할 수 있습니다.
이 저장소를 고려해보세요: chansung/dreambooth-dog. 몇 가지 작은 단계를 실행한 후 StableDiffusionPipeline
에서 이 저장소의 체크포인트를 사용할 수 있습니다.
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 ]
자세한 내용을 알아보려면 이 가이드를 따르세요.
개 이미지에 대해 미세 조정된 체크포인트를 Diffusers 호환 StableDiffusionPipeline으로 변환하고 다양한 스케줄러 설정으로 다양한 실험을 실행했습니다. 예를 들어, DDIMScheduler
의 다음 매개변수는 다른 guidance_scale
및 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"
]
}
}
다음은 beta_schedule
매개변수의 다양한 값과 기본값으로 고정된 매개변수 간의 비교입니다. PNDMScheduler
및 LMSDiscreteScheduler
와 같은 다른 스케줄러의 결과가 포함된 원본 보고서를 살펴보세요.
기본 설정이 더 나은 품질의 이미지 생성을 보장하는 경우가 종종 있습니다. 예를 들어, guidance_scale
및 beta_schedule
의 기본값은 7.5 및 linear
으로 설정됩니다. 다만, guidance_scale
7.5로 설정하면 beta_schedule
의 scaled_linear
더 잘 동작하는 것 같습니다. 또는 beta_schedule
linear
으로 설정된 경우, guidance_scale
높을수록 더 잘 작동하는 것 같습니다.
우리는 4,800번의 실험을 실행하여 총 38,400개의 이미지를 생성했습니다. 이러한 실험은 가중치 및 편향에 기록됩니다. 궁금하신 경우 여기에서 해당 내용과 실험을 실행하는 데 사용된 스크립트를 확인하세요.
이 블로그 게시물에서 공유한 팁과 요령 외에도 인간의 얼굴에 대한 DreamBooth 교육을 수행하기 위한 인스턴스를 준비하는 동안 다음 사항을 따랐습니다.
이러한 팁을 공유해 주신 Abhishek Thakur에게 감사드립니다.