كيف نعرف أن الخوارزمية تعمل؟
قبل تطوير خوارزمية ، عليك التفكير في كيفية تقييمنا لأدائها. لنفترض أننا كتبنا خوارزمية ، وهي تقول أن "هذه الصورة لها الألوان التالية" - هل سيكون قراره صحيحًا؟ وماذا يعني ذلك - "صحيح"؟
لحل هذه المشكلة ، اخترنا بعدين مهمين - التحديد الصحيح للون الأساسي والعدد الصحيح للألوان. قمنا بتعيين هذا على أنه المسافة CIEDE 2000 ( معادلة اختلاف اللون ) بين اللون الأمامي الذي تنبأت به الخوارزمية ولون المقدمة الحقيقي ، ونحسب أيضًا متوسط الخطأ المطلق في عدد الألوان. لقد قمنا بهذا الاختيار للأسباب التالية:
- من السهل حساب هذه المعلمات.
- مع زيادة عدد المقاييس ، سيكون من الصعب اختيار الخوارزمية "الأفضل".
- من خلال تقليل عدد المقاييس ، قد نفقد فرقًا مهمًا بين الخوارزميتين.
- على أي حال ، تحتوي معظم الملابس على لون أساسي أو لونين أساسيين ، وتعتمد العديد من عملياتنا على اللون الأساسي. لذلك ، يعد حساب اللون الأساسي بشكل صحيح أكثر أهمية من حساب اللون الثاني أو الثالث بشكل صحيح.
ماذا عن البيانات "الحقيقية"؟ قدم لنا فريق التجار لدينا ملصقات ، ولكن أدواتنا تسمح لهم باختيار الألوان الأكثر شيوعًا فقط ، مثل "الرمادي" أو "الأزرق" - لا يمكن تسميتها بقيمة محددة. تتضمن هذه التعريفات العامة عددًا غير قليل من الظلال المختلفة ، لذا لا يمكن استخدامها كألوان حقيقية. سيتعين علينا بناء مجموعة البيانات الخاصة بنا.
قد يفكر بعضكم بالفعل في خدمات مثل Mechanical Turk. لكننا لا نحتاج إلى ترميز عدد كبير جدًا من الصور ، لذلك قد يكون وصف هذه المهمة أصعب من مجرد إكمالها. بالإضافة إلى ذلك ، يساعدك إنشاء مجموعة بيانات على فهمها بشكل أفضل. لقد أخطأنا بسرعة في تطبيق HTML / Javascript واخترنا عشوائيًا 1000 صورة ، تم اختيارها لكل بكسل يمثل لونها الأساسي ، وحددنا عدد الألوان التي رأيناها في الصورة. بعد ذلك ، أصبح من السهل الحصول على رقمين يقيمان جودة الخوارزمية الخاصة بنا (المسافة إلى اللون الرئيسي CIEDE وعدد الألوان MAE).
أحيانًا نتحقق من البرامج يدويًا ، ونقوم بتشغيل كلا الخوارزميات على صورة واحدة وعرض قائمتين من الألوان. ثم قمنا بعد ذلك بتقييم 200 صورة يدويًا ، واختيار الألوان التي تم التعرف عليها على أنها "الأفضل". من المهم جدًا العمل بشكل وثيق مع البيانات بهذه الطريقة - ليس فقط للحصول على النتيجة ("عملت الخوارزمية ب بشكل أفضل من الخوارزمية أ في 70٪ من الحالات") ، ولكن أيضًا لفهم ما يحدث في كل حالة ("عادةً ما تختار الخوارزمية ب مجموعات كثيرة جدًا ، ولكن الخوارزمية أ يخطئ الألوان الفاتحة ").
سترة وألوان مختارة بواسطة خوارزميتين مختلفتين
خوارزمية استخراج اللون لدينا
قبل معالجة الصور ، نقوم بتحويلها إلى مساحة ألوان CIELAB (أو LAB فقط) بدلاً من RGB الأكثر شيوعًا. نتيجة لذلك ، لن تمثل الأرقام الثلاثة مقدار الأحمر والأخضر والأزرق. نقاط مساحة LAB (L * a * b * ستكون أكثر صحة ، لكننا سنكتب LAB للبساطة) تشير إلى ثلاثة محاور مختلفة. يشير L إلى السطوع من 0 أسود إلى أبيض 100. يشير A و B إلى اللون: يشير A إلى موقع في النطاق من -128 أخضر إلى 127 أحمر ، و B من -128 أزرق إلى 127 أصفر ، والميزة الرئيسية لهذه المساحة هي التوحيد المدرك. سيتم إدراك المسافة أو الاختلاف بين نقطتين في مساحة LAB ، بغض النظر عن موقعهما ، إذا كانت المسافة الإقليدية بينهما في الفضاء هي نفسها أيضًا.
بطبيعة الحال ، يواجه LAB مشاكل أخرى: على سبيل المثال ، نحن نعتبر الصور على شاشات الكمبيوتر التي تستخدم مساحة RGB الخاصة بالجهاز. أيضًا ، نطاق LAB أوسع من نطاق RGB ، أي أنه في LAB يمكنك التعبير عن الألوان التي لا يمكن التعبير عنها من خلال RGB. لذلك ، لا يمكن أن يكون التحويل من LAB إلى RGB ذو وجهين - تحويل نقطة في اتجاه واحد ثم في الاتجاه المعاكس ، يمكنك الحصول على قيمة مختلفة. من الناحية النظرية ، هذه العيوب موجودة ، ولكن في الممارسة العملية لا تزال الطريقة تعمل.
بتحويل الصورة إلى LAB ، سنحصل على مجموعة من البكسلات التي يمكن عرضها كنقاط (L ، A ، B ، X ، Y). تهتم بقية الخوارزمية بتجميع هذه النقاط ، حيث تستخدم مجموعات المرحلة الأولى جميع القياسات الخمسة ، بينما تحذف المرحلة الثانية قياسات X و Y.
التجمع في الفضاء
نبدأ بصورة بدون تجميع البكسل التي خضعت لتعديلات اللون الموضحة في المقالة السابقة ، مضغوطة إلى 320 × 200 وتحويلها إلى LAB.
أولاً ، دعنا نطبق خوارزمية Quickshift ، التي تجمع وحدات البكسل القريبة في "superpixels".
هذا يقلل بالفعل من صورتنا التي تبلغ 60.000 بكسل إلى بضع مئات من وحدات البكسل الفائقة ، مما يزيل التعقيد غير الضروري. يمكنك تبسيط الموقف أكثر من خلال دمج وحدات البكسل الفائقة القريبة معًا بمسافة لونية صغيرة بينهما. للقيام بذلك ، نرسم رسمًا بيانيًا تقريبيًا إقليميًا - رسم بياني يتم فيه توصيل العقد التي تشير إلى اثنين من وحدات البكسل الفائقة المختلفة بواسطة حافة إذا كانت وحدات البكسل الخاصة بها تتلامس.
– (Regional Adjacency Graph, RAG) . , , , , . , , , , . – , .
عُقد الرسم البياني هي وحدات البكسل الفائقة التي حسبناها ، والحواف هي المسافة بينها في مساحة اللون. سيكون للحافة التي تربط بين اثنين من وحدات البكسل الفائقة القريبة بألوان متشابهة وزنًا منخفضًا (خطوط داكنة) ، وستكون الحافة بين وحدات البكسل الفائقة ذات الألوان المختلفة وزنًا كبيرًا (خطوط ساطعة ، بالإضافة إلى عدم وجود خطوط - لم يتم رسمها إذا كان وزنها أكثر من 20). هناك العديد من الطرق للجمع بين وحدات البكسل الفائقة القريبة ، لكن الحد الأدنى البسيط البالغ 10 كان كافياً بالنسبة لنا.
في حالتنا ، تمكنا من تقليل 60.000 بكسل إلى 100 منطقة ، يحتوي كل منها على وحدات بكسل من نفس اللون. يعطي هذا مزايا حسابية: أولاً ، نحن نعلم أن الخلفية هي بكسل كبير كبير من اللون الأبيض تقريبًا ويمكن إزالته. نقوم بإزالة جميع وحدات البكسل الفائقة مع L> 99 ، وتتراوح A و B من -0.5 إلى 0.5. ثانيًا ، يمكننا تقليل عدد البكسل بشكل كبير في الخطوة التالية. لن نتمكن من تقليل عددها إلى 100 ، لأننا نحتاج إلى وزن المناطق بناءً على عدد وحدات البكسل التي تحتوي عليها. ولكن يمكننا بسهولة إزالة 90٪ من وحدات البكسل من كل مجموعة دون فقدان الكثير من التفاصيل وتقريبًا عدم تشويه المجموعة التالية.
التجمع دون استخدام مساحة
في هذه الخطوة ، لدينا عدة آلاف من البكسل بإحداثيات (L ، A ، B). هناك العديد من التقنيات التي يمكنها تجميع وحدات البكسل بشكل جيد. لقد اخترنا طريقة k-mean لأنها سريعة وسهلة الفهم ، ولبياناتنا 3 أبعاد فقط ، والمسافة الإقليدية في مساحة LAB منطقية.
لم نكن أذكياء جدًا وكان لدينا مجموعة مع K = 8. إذا كانت بعض المجموعات تحتوي على أقل من 3٪ من النقاط ، نحاول مرة أخرى ، هذه المرة مع K = 7 ، ثم 6 ، وهكذا. نتيجة لذلك ، لدينا قائمة من 1 إلى 8 مراكز تجميع وجزء صغير من عدد النقاط التي تنتمي إلى كل مركز. تم تسميتهم بواسطة خوارزمية Colornamer الموضحة في المقالة السابقة.
النتائج والمشاكل المتبقية
لقد حققنا متوسط مسافة 5.86 على مقياس CIEDE 2000 بين اللون المتوقع واللون "الحقيقي". من الصعب تفسير هذا المؤشر بشكل صحيح. على مقياس المسافة CIE76 البسيط ، متوسط المسافة لدينا هو 7.82. في هذا المقياس ، تمثل القيمة 2.3 اختلافًا دقيقًا. لذلك ، يمكننا القول أن نتائجنا ، التي تزيد قليلاً عن 3 ، تشير إلى اختلاف دقيق.
كما كان لدينا MAE 2.28 لون. لكن مرة أخرى ، هذا مقياس ثانوي. تعمل العديد من الخوارزميات الموضحة أدناه على تقليل هذا الخطأ ، ولكن على حساب زيادة مسافة اللون. من الأسهل بكثير تجاهل الألوان الزائفة للمركز الخامس أو السادس بدلاً من تجاهل اللون الأول الخطأ.
حتى الأشياء التي لها نفس اللون بوضوح ، مثل هذه السراويل القصيرة ، تحتوي على مناطق تبدو أكثر قتامة بسبب
الظلال ، ولا تزال مشكلة الظلال قائمة. لا يمكن وضع القماش بشكل متساوٍ تمامًا ، لذلك سيظل جزء من الصورة دائمًا في الظل ، وسيبدو مخادعًا بلون مختلف. أبسط الطرق مثل البحث عن ألوان مكررة من نفس الظل والسطوع المختلف لا تعمل ، لأن الانتقال من "بكسل بدون ظل" إلى "بكسل في الظل" لا يعمل دائمًا بنفس الطريقة. نأمل في المستقبل استخدام تقنيات أكثر تطوراً مثل DeshadowNet أو التعرف التلقائي على الظل .
ركزنا فقط على لون الملابس. المجوهرات والأحذية لها مشاكلها الخاصة: صورنا للمجوهرات صغيرة جدًا ، وغالبًا ما تُظهر صور الأحذية الدواخل. في المثال أعلاه ، نشير إلى وجود اللون العنابي والمغرة في الصورة ، على الرغم من أهمية أولهما فقط.
ماذا حاولنا أيضا
تبدو هذه الخوارزمية الأخيرة بسيطة جدًا ، لكن لم يكن من السهل التوصل إليها! في هذا القسم ، سأصف الخيارات التي جربناها وتعلمنا منها.
إزالة الخلفية
لقد جربنا خوارزميات إزالة الخلفية - على سبيل المثال ، الخوارزمية من Lyst . أظهر التقييم غير الرسمي أنهم لم يعملوا بدقة مثل إزالة الخلفية البيضاء. ومع ذلك ، نخطط لدراستها بشكل أعمق أثناء قيامنا بمعالجة الصور التي لم يعمل عليها استوديو الصور الخاص بنا.
تجزئة البكسل
اختارت بعض مكتبات استخراج الألوان حلاً بسيطًا لهذه المشكلة: قم بتجميع وحدات البكسل عن طريق تجزئتها في عدة حاويات واسعة بما يكفي ، ثم إرجاع القيم المتوسطة لحاويات LAB مع معظم وحدات البكسل. لقد جربنا مكتبة Colorgram.py ؛ على الرغم من بساطته ، إلا أنه يعمل بشكل جيد بشكل مدهش. بالإضافة إلى ذلك ، فهي تعمل بسرعة - لا تزيد عن ثانية لكل صورة ، بينما تقضي الخوارزمية لدينا عشرات الثواني لكل صورة. ومع ذلك ، كان لدى Colorgram.py مسافة متوسطة إلى اللون الأساسي أكبر من خوارزمية لدينا - ويرجع ذلك أساسًا إلى أن نتيجتها مأخوذة من متوسط المسافات إلى الحاويات الكبيرة. ومع ذلك ، فإننا نستخدمه أحيانًا للحالات التي تكون فيها السرعة أكثر أهمية من الدقة.
خوارزمية تقسيم سوبربيكسل أخرى
نستخدم خوارزمية Quickshift لتقسيم الصورة إلى وحدات بكسل فائقة ، ولكن هناك العديد من الخوارزميات الممكنة - على سبيل المثال ، SLIC و Watershed و Felzenszwalb. من الناحية العملية ، أظهر Quickshift أفضل النتائج بفضل عمله التفصيلي الدقيق. على سبيل المثال ، تواجه SLIC مشكلة في أشياء مثل الخطوط التي تشغل مساحة كبيرة في الصورة. فيما يلي النتائج الإرشادية لخوارزمية SLIC بإعدادات مختلفة: انضغاط
الصورة الأصلية
= 1
ضغط = 10
ضغط = 100
للعمل مع بياناتنا ، تتمتع Quickshift بميزة نظرية واحدة: فهي لا تتطلب اتصالًا مستمرًا من وحدات البكسل الفائقة. لاحظ الباحثون أن هذا يمكن أن يسبب مشاكل للخوارزميات ، ولكن في حالتنا هذه ميزة - غالبًا ما نصادف مناطق صغيرة بتفاصيل صغيرة نريد تقديمها لمجموعة واحدة.
قميص
Chequered هو تجميع Superpixel بواسطة Quickshift
بينما تبدو Superpixel Group بواسطة Quickshift فوضوية ، فهي في الواقع تجمع كل الخطوط الحمراء مع خطوط حمراء أخرى ، زرقاء مع زرقاء ، إلخ.
طرق مختلفة لحساب عدد المجموعات
عند استخدام طريقة k-mean ، يظهر السؤال الأكثر شيوعًا: كيف تصنع "k"؟ بمعنى ، إذا احتجنا إلى تجميع النقاط في عدد معين من المجموعات ، فكم عددًا يجب أن نفعله؟ تم تطوير العديد من الأساليب للإجابة على السؤال. أبسط طريقة هي "طريقة الكوع" ، ولكنها تتطلب معالجة يدوية للرسم البياني ، ونحن بحاجة إلى حل تلقائي. تقوم Gap Statistic بإضفاء الطابع الرسمي على هذه الطريقة ، وبها حصلنا على أفضل النتائج على مقياس "عدد الألوان" ، ولكن على حساب دقة اللون الأساسي. نظرًا لأن اللون الرئيسي هو الأهم ، فإننا لم نستخدمه في برنامج العمل ، لكننا نخطط لدراسة هذه المشكلة بشكل أكبر.
أخيرًا ، طريقة الصورة الظلية هي طريقة أخرى شائعة لاختيار k. يعطي نتائج أسوأ قليلاً من خوارزمية لدينا ، وله عيب خطير: يحتاج إلى مجموعتين على الأقل. لكن العديد من الملابس لها لون واحد فقط.
DBSCAN
أحد الحلول المحتملة لمسألة اختيار k هو استخدام خوارزمية لا تتطلب منك اختيار هذه المعلمة. أحد الأمثلة الشائعة هو DBSCAN ، الذي يبحث في البيانات عن مجموعات ذات كثافة متساوية تقريبًا.
بلوزة متعددة الألوان
جميع وحدات البكسل من صورتها في مساحة LAB. لا تشكل وحدات البكسل مجموعات سماوية وبنفسجية واضحة.
في كثير من الأحيان لا نحصل على مثل هذه المجموعات ، أو نرى شيئًا مثل المجموعات فقط بسبب خصائص الإدراك البشري. بالنسبة لنا ، يبرز "الخيار" الأزرق المخضر على البلوزة مقابل الخلفية الأرجواني ، ولكن إذا قمنا برسم جميع وحدات البكسل في إحداثيات RGB أو LAB ، فلن يشكلوا مجموعات. لكننا جربنا DBSCAN على أي حال بقيم إبسيلون مختلفة وحصلنا على نتائج سيئة بشكل متوقع.
محلول من Algolia
أحد المبادئ الجيدة للباحثين هو معرفة ما إذا كان أي شخص قد حل مشكلتك بالفعل. نشر ليو إركولانيلي من موقع Algolia وصفا مفصلا لحل هذه المشكلة منذ أكثر من ثلاث سنوات. بفضل كرمهم في توزيع المصادر ، تمكنا من تجربة حلهم بأنفسنا. ومع ذلك ، كانت النتائج أسوأ قليلاً من نتائجنا ، لذلك تركنا الخوارزمية. إنهم لا يحلون نفس المشكلة التي نحلها: لديهم صور لمنتجات على نماذج وعلى خلفية غير بيضاء ، لذلك فمن المنطقي أن نتائجهم تختلف عن نتائجنا.
تنسيق اللون
تكمل هذه الخوارزمية العملية الموضحة في مقالتنا السابقة. بعد استخراج مراكز المجموعة ، نستخدم Colornamer لتسميتها ثم استيراد تلك الألوان إلى أدواتنا الداخلية. يساعدنا هذا في تصور منتجاتنا بسهولة حسب اللون ؛ نأمل في دمج هذه البيانات في خوارزميات توصيات الشراء. هذه العملية ليست مثالية ، فهي تساعدنا في الحصول على بيانات أفضل عن آلاف منتجاتنا ، والتي بدورها تساهم في هدفنا الأساسي المتمثل في مساعدة الأشخاص في العثور على الأنماط التي يحبونها.
مقابلة حول ترجمة الجزء الأول