أساسيات معالجة الصور بـ Web Worker
Web Worker سياق تنفيذ JavaScript منفصل يمكنه أداء حسابات ثقيلة دون جعل الخيط الرئيسي للمحرر ينجز كل العمل. في معالجة الصور بالمتصفح يعني ذلك أن إعداد النموذج والاستدلال يمكن أن يجريا في الخلفية.
النتيجة ليست «معالجة خلفية مجانية». الجهاز نفسه ما زال يحسب ويستخدم الذاكرة. الفائدة المعمارية هي الفصل: العملية الثقيلة أقل احتمالًا أن تعطل كل استجابة للواجهة.
يحتوي الموضوع الرئيسي على وظيفة واجهة المستخدم
تقوم صفحة المتصفح عادةً بتشغيل JavaScript على موضوع رئيسي. يقوم هذا الخيط أيضًا بتنسيق التخطيط والرسم والإدخال. إذا احتلتها عملية حسابية طويلة، فقد تشعر بأن النقرات قد تأخرت، ويمكن أن تتوقف الرسوم المتحركة، وقد يحذر المتصفح من أن الصفحة لا تستجيب.
يتمتع محرر الصور بالكثير من مسؤوليات الموضوع الرئيسي قبل أن يبدأ الاستدلال:
- تلقي تحديد ملف أو لصقه أو إسقاطه؛
- فك تشفير وعرض الصورة؛
- تحديث التقدم وحالات الخطأ؛
- رسم لوحة المعاينة؛
- التعامل مع حركة إضافة ومسح الفرشاة؛
- تحضير إجراءات التنزيل أو الحافظة.
إن وضع العمل العددي لنموذج التجزئة على نفس الخيط من شأنه أن يجعل تلك المهام تتنافس بشكل مباشر. العامل يخلق حدودا أكثر وضوحا.
الحدود القائمة على الرسالة
لا يتشارك المحرر والعامل في المتغيرات العادية. يتواصلون عن طريق إرسال الرسائل. يبدو التدفق المبسط كما يلي:
- يقوم المحرر بإنشاء عامل أو إعادة استخدامه.
- يطلب من العامل تهيئة وقت تشغيل الاستدلال والنموذج.
- يقوم بإعداد بيانات الصورة وإرسال طلب الاستدلال.
- يقوم العامل بتحويل البيانات إلى المدخلات المتوقعة للنموذج.
- يقوم العامل بتشغيل النموذج وينتج قيم القناع.
- يرسل القناع أو بيانات النتيجة مرة أخرى.
- يقوم المحرر بتركيب المعاينة وتمكين التحسين أو التصدير.
يجب أن تتضمن الرسائل سياقًا كافيًا لمطابقة الاستجابة للطلب الصحيح. وهذا مهم إذا اختار المستخدم صورة أخرى قبل انتهاء المهمة السابقة. يجب أن تتجنب الواجهة عرض نتيجة قديمة على مصدر جديد.
نسخ ونقل بيانات الصورة
إرسال رسالة نصية صغيرة رخيص. قد يكون إرسال الملايين من قيم البكسل مكلفًا إذا كان على المتصفح نسخ المخزن المؤقت بالكامل. يمكن لواجهات برمجة تطبيقات الويب نقل ملكية بعض المخازن المؤقتة الثنائية بدلاً من ذلك. يصبح المخزن المؤقت المنقول متاحًا للمتلقي دون الاحتفاظ بنسخة مكررة قابلة للاستخدام من جانب المرسل.
يأتي هذا التحسين مصحوبًا بقيود تصميمية: بعد النقل، لا يمكن للمرسل الاستمرار في استخدام نفس المخزن المؤقت كما لو كان لا يزال يمتلك البيانات. قد يحتفظ المحرر بتمثيل عرض منفصل، أو ينشئ مخزنًا مؤقتًا مخصصًا للاستدلال، أو يعيد بناء ما يحتاج إليه لاحقًا.
لا يستخدم كل تطبيق النقل في نفس الأماكن تمامًا. الدرس العام هو أن فصل الخيط لا يؤدي إلى اختفاء حركة البيانات. لا تزال أبعاد الصورة وحجم المخزن المؤقت وعدد التحويلات تؤثر على زمن الوصول والذاكرة.
ما يضعه Easy Background Remover في العامل
يستخدم Easy Background Remover عامل الويب مع وقت تشغيل استنتاج المتصفح للتجزئة على الجهاز. تنتج خطوة القطع الأوتوماتيكية الثقيلة قناعًا. يقوم المحرر بعد ذلك بعرض النتيجة المركبة ويدعم تحسين فرشاة اللوحة القماشية لوحدة المعالجة المركزية.
يمنح هذا الفصل حالات الفشل حدودًا أكثر فائدة. إذا لم يتمكن العامل من التهيئة أو تعطل أثناء الاستدلال، فيمكن للواجهة الإبلاغ عن خطأ متعلق بالعامل بدلاً من الاعتماد على علامة تبويب مجمدة بشكل دائم باعتبارها الإشارة الوحيدة.
كما أنه يبقي مطالبة المعالجة المحلية مفهومة. يعد إرسال وحدات البكسل من صفحة ملحقة إلى العامل الخاص بها بمثابة اتصال داخل بيئة المتصفح، وليس تحميلًا إلى واجهة برمجة التطبيقات (API) المقطوعة عن بُعد. قد تقوم الجلسة الأولى بتنزيل أصل النموذج القابل لإعادة الاستخدام بشكل منفصل؛ راجع لماذا يتم تشغيل تنزيلات النموذج لأول مرة.
لا يقوم العامل بإجراء العمليات الحسابية بشكل فوري
يعمل العمال على تحسين الاستجابة، وليس قدرة الجهاز الأولية. لا يزال النموذج يستهلك وحدة المعالجة المركزية (CPU) أو وحدة معالجة الرسومات (GPU) أو موارد وقت التشغيل الأخرى وفقًا لما يمكن أن يوفره المتصفح. قد يستغرق الإدخال الكبير وقتًا أطول ويتطلب ذاكرة أكبر من الإدخال الصغير.
تبقى عدة حدود:
- تهيئة النموذج لها تكلفة حقيقية؛
- تشغل مخازن البكسل المؤقتة الذاكرة على كلا الجانبين في حالة نسخها؛
- تغيير الحجم وتحويل التنسيق يستغرق وقتا طويلا؛
- قد تواجه الأجهزة ذات الذاكرة المنخفضة صعوبة في التعامل مع الصور الكبيرة؛
- يمكن لعدد أكبر من العمال زيادة الخلاف بدلاً من تقليله؛
- لا يزال من الممكن أن تتضمن تحديثات التصدير واللوحة القماشية الموضوع الرئيسي.
إن بدء خمسة عمال استدلال لخمس صور لا يكون أسرع بخمس مرات تلقائيًا. يتشارك العمال في نفس الآلة. يمكن أن تتنافس المهام الموازية على النطاق الترددي للذاكرة وموارد التنفيذ، في حين أن كل مثيل نموذجي قد يحمل تكلفة الذاكرة الخاصة به.
التقارير المرحلية تعاونية
يمكن للعامل إرسال رسائل الحالة، لكنه لا يعرف تلقائيًا نسبة التقدم التي ستشعر بأنها دقيقة. إن تنزيل النموذج، وتهيئة وقت التشغيل، وإعداد الإدخال، والاستدلال، وتحويل القناع، وعرض المعاينة هي مراحل منفصلة ذات توقيت مختلف.
تحتوي بعض المراحل على عدد بايت قابل للقياس. قد يؤدي تنفيذ نموذج واحد فقط إلى الكشف عن “البدء” و"الانتهاء". وبالتالي فإن النسبة المئوية السلسة التي تتقدم بشكل موحد يمكن أن تكون تجميلية وليست قياسًا دقيقًا.
تقوم واجهة مستخدم التقدم المفيدة بتسمية المرحلة عندما يكون ذلك ممكنًا: إعداد النموذج، أو معالجة الصورة، أو نتيجة البناء. كما أنه يتعامل مع الفشل والإلغاء بدلاً من ترك الدوار بدون أي تفسير.
الإلغاء هو أكثر من مجرد إخفاء الدوار
إذا أغلق المستخدم صورة أو بدأ من جديد، فيمكن للواجهة تجاهل الاستجابة النهائية للطلب القديم. قد يتطلب إيقاف الحساب الأساسي فورًا دعمًا إضافيًا من وقت التشغيل أو إنهاء العامل وإعادة إنشائه.
يعد إنهاء العامل أمرًا حاسمًا، ولكنه يتجاهل حالته المبدئية. قد تحتاج المهمة التالية إلى تحميل النموذج وتهيئته مرة أخرى. بالنسبة لعملية قصيرة، يمكن أن يكون وضع علامة على النتيجة قديمة أرخص من هدم كل شيء.
يعتمد الاختيار الصحيح على ضغط الذاكرة ومدة التشغيل وإمكانيات وقت التشغيل. من وجهة نظر المستخدم، القاعدة المهمة هي أن العمل القديم يجب ألا يحل محل التعديل الحالي.
يجب أن تتجاوز الأخطاء الحدود أيضًا
لا يصبح الاستثناء داخل العامل استثناءً عاديًا للخيط الرئيسي. يجب على العامل الإبلاغ عن الأخطاء القابلة للاستخدام، ويجب على المحرر الاستماع إلى حالات الفشل على مستوى العامل.
إن التعامل الجيد مع الأخطاء يميز على الأقل ما يلي:
- أصل النموذج غير متوفر؛
- فشلت تهيئة النموذج؛
- فشل فك تشفير الصورة أو إعداد الإدخال؛
- فشل الاستدلال؛
- توقف العامل بشكل غير متوقع؛
- النتيجة لم تعد تنتمي إلى الطلب الحالي.
يعد هذا أكثر قابلية للتنفيذ من عبارة “حدث خطأ ما” بشكل عام، خاصةً عندما يكون للإعداد الذي يتم تشغيله لأول مرة ومعالجة الصور العادية علاجات مختلفة.
لا يزال مخرجات العامل مجرد قناع أول
لا تعمل بنية الخيط على تحسين الحافة الغامضة في حد ذاتها. يمكن للعامل إرجاع قناع صالح تقنيًا لا يزال يفتقد الفراء أو المادة الشفافة أو الأشرطة الضيقة أو الظل المرغوب. هذه هي أسئلة التجزئة والنوايا.
تستأنف مهمة المحرر بعد الاستدلال: قم بقياس القناع في نظام الإحداثيات العامل، وقم بتركيب المعاينة، واسمح للمستخدم بتحسينها، وتصدير الحالة الحالية. دقة القناع مقابل حجم المعاينة يوضح سبب عدم الخلط بين أنظمة الإحداثيات هذه.
نموذج عقلي موجز
فكر في العامل باعتباره متخصصًا محليًا خلف نافذة الرسالة:
- المحرر يملك التفاعل؛
- يمتلك العامل مهمة الاستدلال الثقيل؛
- بيانات الصورة الثنائية تعبر حدودًا محددة؛
- يرجع العامل قناعًا، وليس حكمًا نهائيًا على كل حافة؛
- يظل المحرر مسؤولاً عن الحالة الحالية والمراجعة والتحسين والتصدير.
للحصول على عرض النموذج لوحدات البكسل نفسها، تابع مع ما يراه نموذج الفصل على الجهاز. للحصول على نظرة عامة عملية شاملة، راجع كيفية عمل إزالة الخلفية المحلية.