تخط المحتوى

استكشاف ملحق تنظيف الرسم السريع لكريتا

المنشور السابق | الجمعة، 20 ديسمبر 2024 | وقت القراءة: 11 دقيقة | المنشور التالي

ملحق التنظيف السريع للرسم مبدئي

مقدّمة

بدأنا هذا المشروع بقصد توفير دليل للمستخدمين مفيد في تحبير الرسومات المبدئية. إنه يستند على مقال بحثي لسيمو وسيرا نُشر في 2016 ، ويستخدم الشبكات العصبية (والتي يشار إليها الآن بشكل شائع باسم الذكاء الاصطناعي ببساطة) للعمل. طُور الدليل بالشراكة مع إنتل ولا يزال مبدئياً، ولكن يمكنك استخدامه ورؤية النتائج.

في القسم أدناه، هناك بعض الأمثلة الواقعية لحالات الاستخدام والنتائج من الملحق. تتباين النتائج، ولكن يمكن استخدامه لاستخراج الرسومات المبدئية الخافتة بالقلم الرصاص من الصور، وتنظيف الخطوط، والتحبير على طريقة الكتب المصورة (الكوميك بوك).

فيما يتعلق بالنموذج المستخدم في الدليل، دربناه نحن. جميع البيانات في مجموعة البيانات هي تبرعات من أشخاص أرسلوا صورهم إلينا بأنفسهم ووافقوا على حالة الاستخدام المحددة هذه. ل نستخدم أي بيانات أخرى. علاوة على ذلك، عندما تستخدم الملحق، يعالج محلياً على حاسوبك، ولا يتطلب أي اتصال بالإنترنت، ولا يتصل بأي خادم، ولا يتطلب أي حساب أيضاً. حالياً يعمل فقط على ويندوز ولينوكس، ولكن سنعمل على إتاحته على ماك أو إس كذلك.

حالات الاستخدام

يَعمل على تقريب الخطوط إلى خط واحد ويصنع خطوطاً سوداء قوية، لكن النتيجة النهائية قد تكون ضبابية أو غير متساوية. في كثير من الحالات، يعمل بشكل أفضل من مجرد استخدام مرشح المستويات (مثلًا في استخراج الرسم المبدئي بالقلم الرصاص). قد تكون فكرة جيدة أن تستخدم مرشح المستويات بعد استخدام الملحق لتقليل الضبابية. وبما أن الملحق يعمل بشكل أفضل مع قماش أبيض وخطوط رمادية-سوداء، ففي حالة الرسومات المبدئية بالقلم الرصاص التي صُورت أو خطوط الرسم المبدئي الخفيفة جداً، قد يكون من الجيد استخدام المستويات أيضاً قبل استخدام الملحق.

استخراج رسم مبدئي بالقلم الرصاص صُور

هذه هي نتيجة الإجراء القياسي لاستخدام مرشح المستويات على رسم مبدئي لاستخراج الخطوط (والذي ينتج عنه أن جزءاً من الصورة يحصل على الظل):

sketch_girl_original_procedure_comparison_small

sketch_girl_original_procedure_comparison_small1843×1209 165 ك.ب

الرسم المبدئي رسمته Tiar (رابط تشكيلة الفنانين لكريتا)

هذا هو الإجراء باستخدام الملحق مع SketchyModel (المستويات → الملحق → المستويات):

sketch_girl_new_procedure_comparison_small

sketch_girl_new_procedure_comparison_small1843×2419 267 ك.ب

مقارنة (للخطوط السوداء):

sketch_girl_procedures_comparison_small

sketch_girl_procedures_comparison_small1920×1260 215 ك.ب

نتيجة أخرى محتملة هي التوقف عند الملحق دون إجبار الخطوط السوداء باستخدام المستويات، مما ينتج عنه مظهر أجمل، يشبه القلم الرصاص أكثر مع إبقاء الجزء السفلي من الصفحة فارغاً:

sketch_girl_after_plugin_small

sketch_girl_after_plugin_small1536×2016 161 ك.ب

تحبير يشبه الكتاب المصور


صورة رجل صنعها BeARToys

هنا في الصور أعلاه يمكنك رؤية التحبير على طريقة الكتاب المصور. يمكن تعزيز النتيجة، والتي هي ضبابية قليلاً مقارنة بالأصلية، باستخدام مرشح التوضيح. رسم التنين مبدئياً بواسطة David Revoy (CC-BY 4.0).

تنظيف الخطوط

أمثلة للرسومات المبدئية التي صنعتها ونتيجة الملحق، توضح نقاط قوة وضعف الملحق. صنعت جميع الصور أدناه باستخدام SketchyModel.

flower_001

flower_0011209×739 46.5 ك.ب

flower_001_detail

flower_001_detail681×456 22.1 ك.ب

portrait_man_portrait_2_comparison_2_small

portrait_man_portrait_2_comparison_2_small1305×505 139 ك.ب

portrait_man_portrait_2_detail

portrait_man_portrait_2_detail646×1023 26.6 ك.ب

جميع الصور أعلاه رسمتها Tiar (رابط تشكيلة الفنانين لكريتا)

في الصور أدناه، على قشور السمكة، يمكنك أن ترى كيف يميّز النموذج الخطوط الأخف ويعزز الخطوط الأقوى، مما يجعل القشور أكثر وضوحاً. نظرياً يمكنك فعل ذلك باستخدام مرشح المستويات، ولكن عملياً ستكون النتائج أسوأ، لأن النموذج يأخذ في الاعتبار القوة المحلية للخط.


fish_square_sketchy_comparison_small1920×968 156 ك.ب

صورة السمكة صنعتها Christine Garner (رابط حافظة الأعمال)

كيف تستخدمه في كريتا

لاستخدام ملحق التنظيف السريع للرسم مبدئي في كريتا، افعل ما يلي:

  1. حضّر كريتا:
    1. على ويندوز:
      1. إما في حزمة واحدة: نزّل كريتا 5.3.0-prealpha وملحق التنظيف السريع للرسم مبدئي مدمج بالفعل: https://download.kde.org/unstable/krita/5.3.0-prealpha-fast-sketch/krita-x64-5.3.0-prealpha-cdac9c31.zip
      2. أو بشكل منفصل:
        1. نزّل النسخة المحمولة من كريتا 5.2.6 (أو إصدار مماثل - ينبغي أن يظل يعمل)
        2. نزّل ملحق التنظيف السريع للرسم مبدئي بشكل منفصل من هنا: https://download.kde.org/stable/krita/FastSketchPlugin-1.0.2/FastSketchPlugin1.0.2.zip
        3. فك ضغط الملف داخل مجلد krita-5.2.6/ (مع المحافظة على هيكل المجلد).
        4. بعد ذلك، اذهب إلى الإعدادات ← اضبط كريتا ← مدير إضافات بيثون، مكن إضافة تنظيف الرسم السريع، وأعد تشغيل كريتا.
    2. على لينوكس:
      1. نزّل صورة التطبيق (appimage): https://download.kde.org/unstable/krita/5.3.0-prealpha-fast-sketch/krita-5.3.0-prealpha-cdac9c31c9-x86_64.AppImage
  2. (اختياري) ثبّت دليل NPU إن كان لديك NPU على جهازك (عملياً، ضروري فقط على لينوكس، إذا كان لديك وحدة معالجة مركزية حديثة جداً من إنتل): اضبط NPU Intel® مع OpenVINO™ — دليل OpenVINO™ (ملاحظة: لا يزال بإمكانك تشغيل الملحق على وحدة المعالجة المركزية أو وحدة معالجة الرسوميات، لا يتطلب NPU)
  3. شغّل الملحق:
    1. افتح أو انشئ قماشاً أبيض بضربات رمادية-بيضاء (لاحظ أن الملحق سيأخذ الإسقاط الحالي للقماش، وليس الطبقة الحالية).
    2. اذهب إلى أدوات → التنظيف السريع للرسم مبدئي
    3. حدد النموذج. الخيارات المتقدمة س تحدد آلياً لك.
    4. انتظر حتى ينتهي من المعالجة (س يغلق الحوار آلياً حينها).
    5. اِطلع على أنه أنشأ طبقة جديدة بالنتيجة.

نصيحة للمعالجة

حالياً، من الأفضل استخدام SketchyModel.xml فقط، في معظم الحالات يعمل بشكل أفضل بكثير من SmoothModel.xml.

تحتاج للتأكد من أن الخلفية ساطعة جداً، وأن الخطوط التي تريد إبقاءها في النتيجة مظلمة نسبياً (إما رمادية داكنة نوعاً ما أو سوداء؛ الرمادي الفاتح قد ينتج عنه تفويت العديد من الخطوط). قد تكون فكرة جيدة استخدام مرشح مثل المستويات مسبقاً.

بعد المعالجة، قد ترغب في تعزيز النتائج إما بمرشح المستويات أو مرشح التوضيح، اعتماداً على نتائجك.

التقنية والعلم وراء ذلك

متطلبات فريدة

المتطلب الفريد الأول كان أنه يجب أن يعمل على أقمشة بجميع الأحجام. هذا يعني أنه ل يمكن للشبكة أن تحتوي على أي طبقات خطية متصلة بكثافة/بالكامل أو بكثافة وهي شائعة جداً في معظم الشبكات العصبية لمعالجة الصور (والتي تتطلب مدخلاً بحجم محدد وس تنتج نتائج مختلفة لنفس البكسل اعتماداً على موقعه)، بل يجب أن تحتوي فقط على التواءات أو تجميع أو طبقات مشابهة تنتج نفس النتائج لكل بكسل من القماش، بغض النظر عن الموقع. لحسن الحظ، ورقة سيمو وسيرا البحثية التي نُشرت في 2016 وصفت شبكة كهذه تماماً.

تحدٍ آخر كان أنه ل يمكننا حقاً استخدام النموذج الذي أنشأوه، لأنه ل يتوافق مع رخصة كريتا، ول يمكننا حتى استخدام نوع النموذج المحدد الذي وصفوه، لأن أحد ملفات النموذج تلك س يكون كبيراً تقريباً مثل كريتا، وس يستغرق التدريب وقتاً طويلاً جداً. احتجنا لشيء يعمل بنفس الجودة إن ل يكن أفضل، ولكنه صغير بما يكفي لإضافته إلى كريتا دون مضاعفة حجمه. (نظرياً، يمكننا أن نفعل مثل بعض الشركات الأخرى ونجعل المعالجة تحدث على نوع من الخوادم، لكن هذا ل يكن ما أردناه. وحتى لو حل بعضاً من مشاكلنا، س يقدّم الكثير من تحدياته الرئيسية. أردنا أيضاً أن يتمكن مستخدمونا من استخدامه محلياً دون الاعتماد على خوادمنا والإنترنت). علاوة على ذلك، كان يجب أن يكون النموذج سريعاً بشكل معقول ومتواضعاً أيضاً فيما يتعلق باستهلاك ذاكرة الوصول العشوائي/ذاكرة الفيديو.

علاوة على ذلك، ل يكن لدينا أي مجموعة بيانات يمكننا استخدامها. استخدم سيمو وسيرا مجموعة بيانات، حيث رُسمت الصور المتوقعة جميعها باستخدام عرض خط وثفافية ثابتين، مما يعني أن نتائج التدريب اكتسبت تلك الخصائص أيضاً. أردنا شيئاً يبدو أكثر رسماً باليد، بعرض خط متباين أو نهايات شبه شفافة للخطوط، لذلك كان يجب أن تحتوي مجموعة بياناتنا على هذه الأنواع من الصور. وبما أننا ل نكن على دراية بأي مجموعات بيانات تتطابق مع متطلباتنا بخصوص الترخيص وعملية جمع البيانات، طلبنا المساعدة من مجتمعنا الخاص، هنا يمكنك قراءة موضوع فنانو كريتا حول هذا الأمر: https://krita-artists.org/t/call-for-donation-of-artworks-for-the-fast-line-art-project/96401 .

يمكن العثور على الرابط لمجموعة بياناتنا الكاملة أدناه في قسم مجموعة البيانات.

معمارية النموذج

جميع الطبقات الرئيسية إما التوائية أو التوائية معكوسة (في نهاية النموذج). بعد كل طبقة (معكوسة) التوائية باستثناء الأخيرة هناك طبقة تنشيط ReLu، وبعد الالتواء الأخير هناك طبقة تنشيط sigmoid.

حزم بيثون المستخدَمة: Pillow، Numpy، PyTorch و Openvino

Numpy هي مكتبة قياسية لجميع أنواع الصفائف وعمليات الصفائف المتقدمة واستخدمنا Pillow لقراءة الصور وتحويلها إلى صفائف numpy والعودة. للتدريب، استخدمنا PyTorch، بينما في ملحق كريتا استخدمنا Openvino للاستدلال (المعالجة عبر الشبكة).

استخدام NPU للاستدلال


يوضح هذا الجدول نتيجة benchmark_app، وهو دليل ي وفّر مع حزمة بيثون openvino من إنتل. يختبر النموذج بشكل منفصل على بيانات عشوائية. كما يمكنك أن ترى، كان NPU أسرع بمرات من وحدة المعالجة المركزية على نفس الحاسوب.

من ناحية أخرى، أضاف إدخال NPU تحدياً: النماذج الوحيدة التي يمكن تشغيلها على NPU هي النماذج الثابتة، مما يعني أن حجم المدخل معروف في وقت حفظ النموذج إلى ملف. لحل هذه المشكلة، يقطع الملحق أولاً القماش إلى أجزاء أصغر بحجم محدد (والذي يعتمد على ملف النموذج)، ثم يشرع في معالجة جميعها وأخيراً يربط النتائج معاً. لتجنب التشوهات على المناطق المجاورة للربط، تقطع جميع الأجزاء بهامش بسيط ويقص الهامش لاحقاً.

كيف تدرب نموذجك الخاص

لتدريب نموذجك الخاص، س تحتاج لبعض المهارات التقنية، أزواج من الصور (المدخل والمخرج المتوقع) وحاسوب قوي. قد تحتاج أيضاً لمساحة كبيرة جداً على محرك الأقراص الثابت لديك، على الرغم من أنه يمكنك ببساطة إزالة النماذج الأقدم غير الضرورية إذا بدأت تواجه مشاكل بسبب نقص المساحة.

الدليل والإعداد

س تحتاج لتثبيت بيثون 3 والحزم التالية: Pillow، openvino، numpy، torch. لتكميم النموذج س تحتاج أيضاً ل nncf و sklearn. إن فاتني شيء، س يشتكي، لذا فقط ثبّت تلك الحزم التي يذكرها أيضاً.

إذا كنت تستخدم ويندوز، فمن المحتمل أن لديك دليل NPU ووحدة معالجة رسوميات مخصصة. على لينوكس، قد تحتاج لتثبيت دليل NPU قبل أن تتمكن من استخدامه: https://docs.openvino.ai/2024/get-started/configurations/configurations-intel-npu.html .

علاوة على ذلك، إذا كنت ترغب في استخدام iGPU للتدريب (والذي قد يظل أسرع بكثير مما هو عليه في وحدة المعالجة المركزية)، فمن المحتمل أنك س تحتاج لاستخدام شيء مثل IPEX الذي يسمح ل PyTorch باستخدام جهاز "XPU"، وهو ببساطة iGPU الخاص بك. ل يختبر أو يوص به لأنني شخصياً ل أتمكن من استخدامه لأن إصدار بيثون الخاص بي كان أعلى مما تتوقعه التعليمات، ولكن التعليمات هنا: https://pytorch-extension.intel.com/installation?platform=gpu&version=v2.5.10%2Bxpu .
فحص السلامة للتثبيت هو كما يلي:
python3 -c "import torch; import intel_extension_for_pytorch as ipex; print(f'Packages versions:'); print(f'Torch version: {torch.__version__}'); print(f'IPEX version: {ipex.__version__}'); print(f'Devices:'); print(f'Torch XPU device count: {torch.xpu.device_count()}'); [print(f'[Device {i}]: {torch.xpu.get_device_properties(i)}') for i in range(torch.xpu.device_count())];"
يجب أن يظهر أكثر من 0 جهاز ببعض الخصائص الأساسية.

إذا اِستطعت جعل جهاز XPU يعمل على حاسوبك، فسيظل عليك تحرير نصوص التدريب البرمجية لِتكون قادرة على اِستخدامه: https://intel.github.io/intel-extension-for-pytorch/xpu/latest/tutorials/getting_started.html (على الأرجح ستحتاج فقط لإضافة هذا السطر:
import intel_extension_for_pytorch as ipex
إلى النص البرمجي في الأعلى، مباشرة أسفل “import torch”، واِستخدم “xpu” ك اِسم الجهاز عند اِستدعاء النص البرمجي، و يجب أن يعمل. ولكن كما قلت، النصوص البرمجية لَمْ تُختبر لذلك.

مجموعة البيانات

س تحتاج لبعض الصور لتكون قادراً على تدريب نموذجك. يجب أن تكون الصور في أزواج، يجب أن يحتوي كل زوج على رسم مبدئي (مدخل) وصورة فن خطي (مخرج متوقع). كلما كانت جودة مجموعة البيانات أفضل، كانت النتائج أفضل.

قبل التدريب، من الأفضل أن تزيد البيانات: هذا يعني أن الصور ت دار وت كبّر أو ت صغّر وت عكس. حالياً، النص البرمجي لزيادة البيانات ينفذ أيضاً عكساً بافتراض أن التدريب على صور معكوسة س يجلب النتائج بشكل أسرع (باعتبار أن الأسود يعني صفراً يعني ل توجد إشارة، ونريد أن يكون ذلك هو الخلفية، حتى تتعلّم النماذج الخطوط، ول تتعلم الخلفية حول الخطوط).

كيفية استخدام النص البرمجي لزيادة البيانات شرح أدناه في التعليمات المفصلة لجزء التدريب.

هنا مجموعة البيانات التي استخدمناها (يرجى قراءة الترخيص بعناية إذا كنت تريد استخدامه): https://files.kde.org/krita/extras/FastSketchCleanupPluginKritaDataset.zip

اختيار النموذج والمعاملات الأخرى

للحصول على نتائج سريعة، استخدم tooSmallConv؛ إذا كان لديك المزيد من الوقت والموارد، قد تكون typicalDeep فكرة أفضل. إذا كان لديك وصول إلى حاسوب بوحدة معالجة رسوميات قوية، يمكنك تجربة original أو originalSmaller، والتي تمثل الوصف الأصلي للنموذج من مقال SIGGRAPH لسيمو-سييرا 2016، ونسخة أصغر منه.

استخدم adadelta كأداة للتحسين.

يمكنك استخدام إما blackWhite أو mse كدالة خسارة؛ mse كلاسيكية، ولكن blackWhite قد تؤدي لنتائج أسرع لأنها تخفض الخطأ النسبي على المناطق البيضاء بالكامل أو السوداء بالكامل (بناءً على صورة المخرج المتوقع).

التدريب

  1. انسخ المستودع على https://invent.kde.org/tymond/fast-line-art (عند 33869b6)
    git clone https://invent.kde.org/tymond/fast-line-art.git

  2. بعدها، حضّر المجلد:

    • أنشئ مجلداً جديداً للتدريب.
    • في المجلد، شغّل:
      python3 [مجلد المستودع]/spawnExperiment.py --path [مسار المجلد الجديد، إما نسبي أو مطلق] --note "[ملاحظتك الشخصية حول التجربة]"
  3. حضّر البيانات:

    • إذا كان لديك مجموعة بيانات مزيدة حالية، ضعها كلها في data/training/ و data/verify/، مع الأخذ في الاعتبار أن الصور المقترنة في المجلدات الفرعية ink/ و sketch/ يجب أن تحمل نفس الأسماء تماماً (على سبيل المثال، إذا كان لديك sketch.png و ink.png كبيانات، تحتاج لوضع واحدة في sketch/ باسم picture.png والأخرى في ink/ باسم picture.png ل تقترن).
    • إذا ل تكن لديك مجموعة بيانات مزيدة حالية:
      1. ضع جميع بياناتك الخام في data/raw/، مع الأخذ في الاعتبار أن الصور المقترنة يجب أن تحمل نفس الأسماء تماماً مع إضافة بادئة إما ink_ أو sketch_ (على سبيل المثال، إذا كان لديك picture_1.png هي صورة الرسم مبدئي و picture_2.png هي صورة التحبير، تحتاج لتسميتهما sketch_picture.png و ink_picture.png على التوالي.)
      2. شغّل نص مهيئ البيانات:
        python3 [مجلد المستودع]/dataPreparer.py -t taskfile.yml
        هذا يزيد البيانات في المجلد الخام ليكون التدريب أكثر نجاحاً.
  4. عدل ملف taskfile.yml كما تريد. الأجزاء الأكثر أهمية التي تريد تغييرها هي:

    • نوع النموذج - اسم رمزي لنوع النموذج، استخدم tinyTinier، tooSmallConv، typicalDeep أو tinyNarrowerShallow
    • المُحسِّن - نوع المُحسِّن، استخدم adadelta أو sgd
    • معدل التعلم - معدل التعلم ل sgd إذا اِستخدِم
    • دالة الخسارة - اسم رمزي لدالة الخسارة، استخدم mse لمتوسط الخطأ التربيعي أو blackWhite لدالة خسارة مخصصة تعتمد على mse، لكنها أصغر قليلاً للوحدات البكسلية حيث تكون قيمة بكسل الصورة الهدف قريبة من 0.5
  5. شغّل شيفرة التدريب:
    python3 [مجلد المستودع]/train.py -t taskfile.yml -d "cpu"

    على لينكس، لو أردت تشغيلها في الخلفية، أضف “&” في النهاية. لو شُغِّلَت في المقدمة، يمكن إيقاف التدريب مؤقتاً بالضغط على ctrl+C، ولو شُغِّلَت في الخلفية، اعثر على معرّف العملية (باستخدام إما أمر “jobs -l” أو أمر “ps aux | grep train.py”، الرقم الأول يكون معرّف العملية) واقتلها باستخدام أمر “kill [معرّف العملية]”. نتائجك تبقى في المجلد، ويكون باستطاعتك استئناف التدريب باستخدام الأمر ذاته.

  6. حوّل النموذج إلى نموذج openvino:
    python3 [مجلد المستودع]/modelConverter.py -s [حجم الإدخال، 256 مُقترَح] -t [اسم نموذج الإدخال، من pytorch] -o [اسم نموذج openvino، يجب أن ينتهي ب .xml]

  7. ضع ملفات النموذج ذات الامتدادين .xml و .bin في مجلد موارد كريتا (داخل المجلد الفرعي pykrita/fast_sketch_cleanup) إلى جانب النماذج الأخرى لاستخدامها في الملحق.