พื้นที่เก็บข้อมูลนี้จัดเตรียมการใช้งาน DreamBooth โดยใช้ KerasCV และ TensorFlow การใช้งานนี้อ้างอิงอย่างมากจากตัวอย่าง diffusers
ของ Hugging Face
DreamBooth เป็นวิธีการสอนอย่างรวดเร็ว (ปรับแต่ง) การกระจายความเสถียรเกี่ยวกับแนวคิดด้านภาพใหม่ สำหรับรายละเอียดเพิ่มเติม โปรดดูเอกสารนี้
รหัสที่ให้ไว้ในที่เก็บนี้มีไว้เพื่อการวิจัยเท่านั้น โปรดตรวจสอบส่วนนี้เพื่อทราบข้อมูลเพิ่มเติมเกี่ยวกับกรณีการใช้งานและข้อจำกัดที่อาจเกิดขึ้น
โดยการโหลดโมเดลนี้ แสดงว่าคุณยอมรับใบอนุญาต CreativeML Open RAIL-M ที่ https://raw.githubusercontent.com/CompVis/stable-diffusion/main/LICENSE
หากคุณกำลังมองหาแหล่งข้อมูลที่แนบมากับพื้นที่เก็บข้อมูลนี้ นี่คือลิงก์:
อัปเดต 15/02/2023 : ขอขอบคุณ 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
นอกจากนี้ สคริปต์ยังรองรับการทำงานร่วมกับ Weights and Biases ( wandb
) หากคุณระบุ --log_wandb
wandb
ของคุณโดยอัตโนมัติโดยใช้การโทรกลับ WandbMetricsLogger
wandb
ของคุณเพื่อเป็นอาร์ติแฟกต์สำหรับการกำหนดเวอร์ชันโมเดล ซึ่งทำได้โดยใช้ DreamBoothCheckpointCallback
ซึ่งสร้างขึ้นโดยใช้การโทรกลับ WandbModelCheckpoint
wandb.Table
ในแดชบอร์ด wandb
ของคุณ ซึ่งทำได้โดยใช้ QualitativeValidationCallback
ซึ่งจะบันทึกรูปภาพที่สร้างขึ้นลงในแผงสื่อบนแดชบอร์ด wandb
ของคุณเมื่อสิ้นสุดการฝึกอบรมต่อไปนี้เป็นคำสั่งที่เรียกใช้การฝึกอบรมและบันทึกหน่วยวัดการฝึกอบรม และสร้างรูปภาพลงในพื้นที่ทำงาน 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
ซึ่งคุณสามารถค้นหารูปภาพที่สร้างขึ้นรวมถึงจุดตรวจสอบโมเดลได้
เราได้ทดสอบการใช้งานของเราในสองวิธีที่แตกต่างกัน: (ก) การปรับแต่งแบบจำลองการแพร่กระจาย (UNet) เท่านั้น (ข) การปรับแต่งแบบจำลองการแพร่กระจายพร้อมกับตัวเข้ารหัสข้อความอย่างละเอียด การทดลองดำเนินการผ่านไฮเปอร์พารามิเตอร์ที่หลากหลายสำหรับ 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 ขั้นตอนการฝึก: 1,000 (น้ำหนัก) | |
75 | 15 | LR: 3e-6 ขั้นตอนการฝึก: 1200 (น้ำหนัก) |
รูปภาพ | ขั้นตอน | ugs |
---|---|---|
75 | 15 | |
75 | 30 |
ด้วยอัตราการเรียนรู้=9e-06 ขั้นตอนการฝึกสูงสุด=200 (น้ำหนัก | รายงาน)
รูปภาพ | ขั้นตอน | ugs |
---|---|---|
150 | 15 | |
75 | 30 |
ด้วยอัตราการเรียนรู้ = 9e-06 ขั้นตอนการฝึกสูงสุด = 200 (ชุดข้อมูล | รายงาน)
ไลบรารี diffusers
มอบเครื่องมือที่ล้ำสมัยสำหรับการทดลองกับแบบจำลองการแพร่กระจายที่แตกต่างกัน รวมถึงการกระจายที่เสถียร ประกอบด้วยเทคนิคการปรับให้เหมาะสมต่างๆ ที่สามารถนำไปใช้ในการอนุมานอย่างมีประสิทธิภาพด้วย 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 ]
ปฏิบัติตามคำแนะนำนี้เพื่อทราบข้อมูลเพิ่มเติม
เราได้แปลงจุดตรวจที่ปรับแต่งแล้วสำหรับภาพสุนัขให้เป็น StableDiffusionPipeline ที่เข้ากันได้กับ Diffusers และทำการทดลองต่างๆ ด้วยการตั้งค่าตัวกำหนดเวลาที่แตกต่างกัน ตัวอย่างเช่น พารามิเตอร์ต่อไปนี้ของ 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 แล้ว scaled_linear
ของ beta_schedule
ดูเหมือนว่าจะทำงานได้ดีขึ้น หรือเมื่อตั้งค่า beta_schedule
เป็น linear
ดูเหมือนว่า guidance_scale
ที่สูงกว่าจะทำงานได้ดีขึ้น
เราทำการทดลอง 4,800 ครั้ง ซึ่งสร้างภาพได้ทั้งหมด 38,400 ภาพ การทดลองเหล่านั้นถูกบันทึกไว้ใน Weights and Biases หากคุณสงสัย โปรดดูที่นี่ รวมถึงสคริปต์ที่ใช้ในการทำการทดสอบ
นอกเหนือจากเคล็ดลับและคำแนะนำที่แชร์ในโพสต์บนบล็อกนี้แล้ว เรายังปฏิบัติตามสิ่งเหล่านี้ในขณะที่เตรียมอินสแตนซ์สำหรับการฝึกอบรม DreamBooth บนใบหน้ามนุษย์:
ขอขอบคุณ Abhishek Thakur สำหรับการแบ่งปันเคล็ดลับเหล่านี้