يحتوي هذا المستودع على التنفيذ الرسمي للورقة "InsertDiffusion: الهوية مع الحفاظ على تصور الكائنات من خلال بنية انتشار خالية من التدريب".
يدعم التنفيذ وضعين تشغيل مختلفين:
بالإضافة إلى ذلك، يوفر التطبيق خيار تلوين الصور الموجودة مسبقًا أو التي تم إنشاؤها. عند عدم استخدام الصور الملونة بالفعل، يؤدي ذلك إلى تحسين الواقعية بشكل كبير.
علاوة على ذلك، يمكن إنشاء بيئة جديدة من البداية (وضع استبدال الخلفية) أو يمكن استخدام صورة موجودة مسبقًا وتكييفها.
جميع الميزات متاحة من main.py
CLI ويمكن أيضًا دمجها في مشاريعك الخاصة. لاستخدام واجهة سطر الأوامر (CLI) أو الكود، يلزم وجود بيئة بها شعلة ووسادة وباندا ومحولات وموزعات.
لإدراج صورة في خلفية تم إنشاؤها حديثًا، قم بتنفيذ ما يلي:
python main.py --image " <path to your image> " --background_prompt " <your prompt> "
لذلك على سبيل المثال:
python main.py --image " ./test_images/bikes/166.png " --background_prompt " a bicycle centered in frame in munich, 8k, red gemini, 50mm, f2.8, cinematic "
بدلاً من تقديم مطالبة مباشرة، يمكنك استخدام ميزات المطالبة التلقائية من خلال توفير المعلومات الضرورية. بالنسبة للدراجات، يتعين عليك توفير الموقع المطلوب وفهرس الدراجة والمسار إلى ورقة البيانات. بالنسبة للسيارات، سيتعين عليك توفير الموقع الجديد المطلوب والشركة المصنعة للسيارة ونوع السيارة. بالنسبة للمنتجات، لا يلزم سوى الموقع الجديد ونوع المنتج.
لمزيد من الخيارات والإدراج في خلفية معينة، راجع وثائق CLI الكاملة أدناه.
بدلًا من استخدام سطر الأوامر، يمكنك دمج الإجراء في التعليمات البرمجية الخاصة بك باستخدام وظيفة python هذه (تأكد مرة أخرى من تثبيت جميع التبعيات ونسخ وحدة utils إلى مشروعك):
from utils import get_mask_from_image , sd_inpainting , sd_img2img , paste_image
def insert_diffusion ( image : Image , mask_threshold : int , prompt : str , negative_prompt : str , img2img_model : str , inpainting_model : str , img2img_strength : float , inpainting_steps : int , inpainting_guidance : float , img2img_guidance : float , background_image : Image = None , composition_strength : float = 1 ) -> Image :
mask = get_mask_from_image ( image , mask_threshold )
if background_image is not None :
image = paste_image ( image , background_image )
inpainted = sd_inpainting ( inpainting_model , image , mask , prompt , negative_prompt , inpainting_guidance , inpainting_steps , inpainting_strength = composition_strength )
result = sd_img2img ( img2img_model , inpainted , prompt , negative_prompt , img2img_strength , img2img_guidance )
return result
لقد قمنا بتنفيذ طريقة إضافية لإنشاء صور Biked من السحب النقطية ثم إدراجها في الخلفية. ومع ذلك، فإن هذه الطريقة لا تعمل بشكل جيد، وبالتالي فهي ليست محورية في بحثنا . تم تنفيذ الجيل من السحب النقطية بواسطة Ioan-Daniel Craciun ويعتمد على DDPM/DDIM الذي تم تنفيذه وتدريبه بواسطة Jiajae Fan .
لإنشاء صور من السحب النقطية، قم بإزالة وسيطة --image
من استدعاء CLI الخاص بك. في وضع النقطة، يتعين عليك توفير مسار ورقة البيانات عبر --datasheet_path
. وبالتالي، يصبح أمر CLI الأدنى:
python main.py --point --datasheet_path " <path to datasheet> " --background_prompt " <your prompt> "
يمكنك أيضًا استخدام المطالبة التلقائية في وضع النقطة.
لدمج إنشاء الدراجات من السحب النقطية في مشروعك، انسخ مجلد utils واستخدم الوظيفة التالية:
from utils import get_mask_and_background
from utils import inpaint as bike_inpainting
def bike_diffusion ( parameter_csv_path : str , device : torch . device , ckpt_id : str = '29000' , mask_dilation : int = 5 , mask_fill_holes : bool = True , bike_idx : int = 0 , wheel_design_type : int = 0 , width : int = 256 , height : int = 256 ):
assert wheel_design_type == 0 or wheel_design_type == 1
mask , background = get_mask_and_background ( parameter_csv_path , bike_idx , wheel_design_type , width , height )
bike_img = bike_inpainting ( background , mask , device , 50 , ckpt_id , mask_dilation , mask_fill_holes )
return bike_img . convert ( 'RGB' )
الصورة التي يتم إرجاعها بواسطة هذه الوظيفة جاهزة للاستخدام للتلوين أو الإدراج.
إذا كنت تستخدم صورة غير ملونة، أضف --colorize
إلى أحد استدعاءات CLI السابقة. بالإضافة إلى ذلك، تحتاج إلى توفير مطالبة تلوين عبر --colorization_prompt
أو استخدام المطالبة التلقائية من خلال توفير لون عبر --color
.
مثال على استدعاء CLI يمكن أن يكون:
python main.py --image " ./test_images/bike_outline/168.png " --colorize --datasheet_path " ./csv/df_parameters_final.csv " --place " beach at sunset " --color " purple " --bike_idx 5 "
بدلًا من ذلك، لدمج التلوين في مشروعك، انسخ وحدة utils واستخدم:
from utils import sd_colorization
def colorization ( image : Image , colorization_model : str , upscaling_model : str , colorization_prompt : str , colorization_negative_prompt : str , fill_holes : bool , dilation : int , strength : float , prompt_guidance : float ):
colorized = sd_colorization ( colorization_model , upscaling_model , image , colorization_prompt , negative_prompt = colorization_negative_prompt , fill_holes = fill_holes , dilation_iterations = dilation , colorization_strength = strength , prompt_guidance = prompt_guidance )
return colorized
ملحوظة : لا يزال CLI قيد الإنشاء وقد يخضع للتغيير.
ملاحظة : حيث تمثل القيم الافتراضية القابلة للتطبيق المعلمات المحددة في تجاربنا. ولكن قد تكون القيم المختلفة هي الأمثل اعتمادًا على حالة الاستخدام المحددة.
دعوى | يكتب | وصف |
---|---|---|
--صورة | خيط | المسار إلى الصورة للبدء منها، يستبعد بعضها البعض مع --points |
--نقاط | عند استخدام النقاط، تعمل الخوارزمية في وضع السحابة النقطية وتقوم بإنشاء مخطط تفصيلي للدراجة من سحابة النقطة أولاً، بشكل حصري مع --image | |
--mask_threshold | كثافة العمليات | للرسم، عتبة لتمييز الخلفية البيضاء من المقدمة الملونة |
--background_prompt | خيط | المطالبة لتوليد الخلفية |
--negative_prompt | خيط | موجه سلبي لتوليد الخلفية |
--background_image | خيط | سلسلة إلى صورة خلفية لاستخدامها كنقطة بداية، تكون ذات صلة فقط إذا تم ضبط قوة التركيب على قيمة أصغر من 1 |
--composition_strength | يطفو | يحدد مقدار تغيير صورة خلفية نقطة البداية، ويستخدم فقط --background_image، النطاق 0-1 |
--auto_bike_prompt | إذا تم إنشاء المطالبات المحددة تلقائيًا باستخدام قالب الدراجات، يتطلب تعيين --place، --datasheet_path، و-bike_idx | |
--auto_car_prompt | إذا تم تعيين المطالبات سيتم إنشاؤها تلقائيًا باستخدام قالب السيارات، ويتطلب تعيين --place و--car_manufacturer و--car_type | |
--auto_product | إذا تم إنشاء المطالبات المحددة تلقائيًا باستخدام قالب المنتجات، يتطلب تعيين --place، و-product_type | |
--مكان | خيط | وصف الموقع الذي سيتم إدراج الكائن فيه، يُستخدم فقط في حالة استخدام أحد قوالب المطالبة التلقائية |
--لون | خيط | في حالة استخدام المطالبة التلقائية، ما هو لون الدراجة؟ |
--datasheet_path | خيط | إذا كنت تستخدم المطالبة التلقائية للدراجات، فانتقل إلى ورقة البيانات للبحث عن نوع الدراجة |
--bike_idx | كثافة العمليات | في حالة استخدام المطالبة التلقائية للدراجات، قم بالفهرسة في ورقة البيانات للبحث عن نوع الدراجة |
--car_manufacturer | خيط | في حالة استخدام المطالبة التلقائية للسيارات، الشركة المصنعة للسيارة، على سبيل المثال BMW |
--car_type | خيط | في حالة استخدام المطالبة التلقائية للسيارات، نوع السيارة، على سبيل المثال SUV أو X5 |
--product_type | خيط | إذا كنت تستخدم المطالبة التلقائية للمنتجات، فاكتب نوع المنتج، على سبيل المثال، المصباح |
--inpainting_model | خيط | النموذج الذي سيتم استخدامه لإنشاء الخلفية (معرف Huggingface) |
--img2img_model | خيط | النموذج الذي سيتم استخدامه لخطوة إعادة الانتشار (معرف الوجه المعانق) |
--img2img_strength | يطفو | كم من الصورة الأصلية للضوضاء في إعادة الانتشار |
--inpainting_steps | كثافة العمليات | كم عدد خطوات الانتشار التي يجب القيام بها من أجل الطلاء الداخلي |
--inpainting_guidance | يطفو | ما هو مقدار التوجيه الخالي من المصنف الذي يجب تطبيقه في الرسم الداخلي |
--img2img_guidance | يطفو | ما مقدار التوجيه الخالي من المصنف الذي يجب تطبيقه في إعادة الانتشار |
--output_folder | خيط | المسار إلى المجلد الذي يجب حفظ الصور الناتجة فيه |
--التلوين | سواء لتلوين الصورة قبل inpainting | |
--colorization_model | خيط | النموذج الذي يجب استخدامه للتلوين (معرف الوجه المعانق) |
--upscaling_model | خيط | النموذج الذي يجب استخدامه للترقية، وهو ضروري للتلوين (معرف الوجه المعانق) |
--colorization_prompt | خيط | المطالبة بالتلوين، ليس من الضروري توفير datasheet_path واللون |
--colorization_negative_prompt | خيط | موجه سلبي للتلوين |
--do_not_fill_holes | تبديل ملء الثقب لقناع التلوين، وهو مناسب فقط عند التلوين | |
--تمدد | كثافة العمليات | مقدار تمديد القناع للتلوين، وهو مناسب فقط عند التلوين |
--colorization_strength | يطفو | مقدار الانتشار المطلوب تطبيقه للتلوين، يكون ذا صلة فقط عند التلوين |
--colorization_prompt_guidance | يطفو | مقدار الإرشادات الخالية من المصنفات التي يجب تطبيقها أثناء التلوين، والتي تكون ذات صلة فقط عند التلوين |
--حجم | يطفو | مقدار خفض أو رفع مستوى الدراجة، تؤدي القيم الأعلى إلى شغل الدراجة مساحة أكبر في الإطار، الافتراضي هو 1. |
--fraction_down | يطفو | الموضع y النسبي للدراجة (وسط) الدراجة، القيم الأعلى تضع الدراجة بالقرب من الحافة السفلية للصورة، الافتراضي هو 0.5 (مركز) |
--fraction_right | يطفو | موضع x النسبي للدراجة (وسط) الدراجة، القيم الأعلى تضع الدراجة بالقرب من الحافة اليمنى للصورة، الافتراضي هو 0.5 (مركز) |
--ckpt_id | خيط | معرف نقطة التفتيش المراد استخدامها لإنشاء مخططات الدراجة من السحب النقطية، وهو ذو صلة فقط بوضع النقطة |
--bike_mask_dilation | كثافة العمليات | مقدار تمديد الأقنعة المتولدة من السحب النقطية، مناسب فقط في وضع النقطة |
--do_not_fill_bike_holes | ما إذا كان سيتم تطبيق ملء الثقب على أقنعة الدراجة، فهو ذو صلة فقط بوضع النقطة | |
--wheel_design | كثافة العمليات | أي تصميم للعجلة سيتم استخدامه لإنشاء الخطوط العريضة للدراجة، حاليًا يتم تنفيذ 0 و1 فقط، وهو ذو صلة فقط بوضع النقطة |
يوفر البرنامج النصي الإضافي interactive.py
تطبيقًا لإنشاء الصور بشكل تفاعلي بطريقة Human-in-the-Loop. وهذا يعني أنه في كل خطوة يتم إنشاء خمسة خيارات بالتوازي ويطلب من المستخدم اختيار الخيار الأفضل. وبعد ذلك، يتم استخدام الصورة المختارة فقط للخطوة التالية.
لا يقبل البرنامج النصي أي وسيطات CLI إضافية وسيُطلب من المستخدم اتخاذ جميع القرارات.
للتشغيل في الوضع التفاعلي، قم بتنفيذ:
python interactive.py
يمكن العثور على رمز التقييم المستخدم أو ورقتنا ضمن ./evaluation
. لاحظ أنه تم حساب المقاييس الكمية باستخدام أمر CLI التالي:
python evaluate.py --exp_name " <experiment name> " --gen_file_path " <path to generated images> " --ref_file_path " <path to reference files> " --masks_path " <only used for composition, path to masks> "
تم حساب مقاييس التقييم البشري والإحصائيات الاستنتاجية باستخدام دفتر الملاحظات المقدم.
إذا وجدت عملنا مفيدًا وترغب في استخدامه لبحثك أو مشروعك، فيرجى الاستشهاد بالمقالة على النحو التالي:
@misc { 2407.10592 ,
Author = { Phillip Mueller and Jannik Wiese and Ioan Craciun and Lars Mikelsons } ,
Title = { InsertDiffusion: Identity Preserving Visualization of Objects through a Training-Free Diffusion Architecture } ,
Year = { 2024 } ,
Eprint = { arXiv:2407.10592 } ,
}