يوفر هذا المستودع تطبيقًا لـ DreamBooth باستخدام KerasCV وTensorFlow. تمت الإشارة إلى التنفيذ بشكل كبير من مثال diffusers
Hugging Face.
DreamBooth هي طريقة لتعليم (ضبط) Stable Diffusion بسرعة حول المفاهيم المرئية الجديدة. لمزيد من التفاصيل، راجع هذه الوثيقة.
الكود الموجود في هذا المستودع مخصص لأغراض البحث فقط . يرجى مراجعة هذا القسم لمعرفة المزيد حول حالات الاستخدام والقيود المحتملة.
بتحميل هذا النموذج، فإنك توافق على ترخيص CreativeML Open RAIL-M الموجود على https://raw.githubusercontent.com/CompVis/stable-diffusion/main/LICENSE.
إذا كنت تبحث فقط عن الموارد المصاحبة لهذا المستودع، فإليك الروابط:
تحديث 15/02/2023 : شكرًا لسوميك راكشيت؛ لدينا الآن أدوات مساعدة أفضل لدعم الأوزان والتحيزات (انظر رقم 22).
قم بتثبيت المتطلبات المسبقة: pip install -r requirements.txt
.
تحتاج أولاً إلى اختيار فئة يتم إلحاق معرف فريد بها. تم اختبار قاعدة بيانات المستودع هذه باستخدام sks
كمعرف فريد dog
كفئة.
ثم يتم إنشاء نوعين من المطالبات:
(أ) موجه المثيل : f"صورة لـ {self.unique_id} {self.class_category}" (ب) موجه الفئة : f"صورة لـ {self.class_category}"
صور المثيلات
احصل على بعض الصور (3 - 10) التي تمثل المفهوم الذي سيتم ضبط النموذج عليه. سيتم ربط هذه الصور بـ instance_prompt
. تتم الإشارة إلى هذه الصور باسم instance_images
من قاعدة التعليمات البرمجية. قم بأرشفة هذه الصور واستضافتها في مكان ما عبر الإنترنت بحيث يمكن تنزيل الأرشيف باستخدام وظيفة tf.keras.utils.get_file()
داخليًا.
صور الطبقة
يستخدم DreamBooth خسارة الحفظ المسبق لتنظيم التدريب. باختصار، تساعد خسارة الحفظ المسبق النموذج على التكيف ببطء مع المفهوم الجديد قيد النظر من أي معرفة مسبقة قد تكون لديه حول هذا المفهوم. لاستخدام فقدان الحفظ المسبق، نحتاج إلى موجه الفصل كما هو موضح أعلاه. يتم استخدام موجه الفصل لإنشاء عدد محدد مسبقًا من الصور التي يتم استخدامها لحساب الخسارة النهائية المستخدمة في تدريب DreamBooth.
وفقًا لهذا المورد، فإن 200 - 300 صورة تم إنشاؤها باستخدام موجه الفصل تعمل بشكل جيد في معظم الحالات.
لذا، بعد أن قررت instance_prompt
و class_prompt
، استخدم دفتر ملاحظات Colab هذا لإنشاء بعض الصور التي يمكن استخدامها للتدريب على فقدان الحفظ المسبق. ثم أرشفة الصور التي تم إنشاؤها كأرشيف واحد واستضفها عبر الإنترنت بحيث يمكن تنزيلها باستخدام وظيفة tf.keras.utils.get_file()
داخليًا. في قاعدة التعليمات البرمجية، نشير ببساطة إلى هذه الصور باسم class_images
.
من الممكن إجراء تدريب DreamBooth دون استخدام خسارة الحفظ المسبقة. يستخدمه هذا المستودع دائمًا. لكي يتمكن الأشخاص من اختبار قاعدة التعليمات البرمجية هذه بسهولة، قمنا باستضافة صور المثيل والفصل هنا.
إطلاق التدريب! هناك عدد من المعلمات الفائقة التي يمكنك اللعب بها. ارجع إلى البرنامج النصي train_dreambooth.py
لمعرفة المزيد عنها. إليك الأمر الذي يبدأ التدريب بدقة مختلطة وقيم افتراضية أخرى:
python train_dreambooth.py --mp
يمكنك أيضًا ضبط أداة ترميز النص عن طريق تحديد خيار --train_text_encoder
.
بالإضافة إلى ذلك، يدعم البرنامج النصي التكامل مع الأوزان والتحيزات ( wandb
). إذا قمت بتحديد --log_wandb
،
wandb
الخاصة بك باستخدام رد الاتصال WandbMetricsLogger
.wandb
الخاص بك كعناصر فنية لإصدار النموذج. ويتم ذلك باستخدام DreamBoothCheckpointCallback
الذي تم إنشاؤه باستخدام رد الاتصال WandbModelCheckpoint
.wandb.Table
في لوحة معلومات wandb
الخاصة بك. يتم ذلك باستخدام QualitativeValidationCallback
، والذي يقوم أيضًا بتسجيل الصور التي تم إنشاؤها في لوحة الوسائط على لوحة تحكم wandb
في نهاية التدريب.إليك الأمر الذي يقوم بتشغيل التدريب وتسجيل مقاييس التدريب والصور التي تم إنشاؤها في مساحة عمل الأوزان والتحيزات:
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 خطوات التدريب: 1000 (الأوزان) | |
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
الأعلى يعمل بشكل أفضل.
أجرينا 4800 تجربة أنتجت 38400 صورة في المجمل. يتم تسجيل تلك التجارب في الأوزان والتحيزات. إذا كنت مهتمًا بالفضول، فاطلع عليها هنا بالإضافة إلى البرنامج النصي الذي تم استخدامه لإجراء التجارب.
بالإضافة إلى النصائح والحيل التي تمت مشاركتها في منشور المدونة هذا، اتبعنا هذه الأشياء أثناء إعداد الحالات لإجراء تدريب DreamBooth على الوجوه البشرية:
شكرًا لأبهيشيك ثاكور على مشاركة هذه النصائح.