[C++] معالجة الصور: تحسين الخوارزمية للتعرف على "كوكا كولا"


Answers

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

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

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

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

(لقد مر بضعة أعوام على أيام معالجة الصور الخاصة بي ، لذا احتفظت بهذا الاقتراح على مستوى عالٍ ومفهوم. أعتقد أنه قد يقترب قليلاً من كيفية عمل العين البشرية - أو على الأقل كيف يفعل عقلي!)

Question

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

بعض القيود على المشروع:

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

لذا يمكن أن ينتهي الأمر بأمور صعبة مثل هذه (والتي في هذه الحالة كانت خوارزمي فشلت تمامًا):

لقد فعلت هذا المشروع منذ فترة ، وكان لدي الكثير من المرح ، وكان لدي تنفيذ لائق. فيما يلي بعض التفاصيل حول التنفيذ الخاص بي:

اللغة : حرر في C ++ باستخدام مكتبة OpenCV .

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

  1. تغيير نطاق اللون من RGB إلى HSV والترشيح على أساس اللون الأحمر ، التشبع فوق عتبة معينة لتجنب الألوان الشبيهة بالبرتقالي ، وتصفية القيمة المنخفضة لتجنب الألوان الداكنة. كانت النتيجة النهائية هي صورة بالأبيض والأسود ثنائية ، حيث تمثل كل البكسلات البيضاء وحدات البكسل التي تطابق هذا الحد. من الواضح أنه لا يزال هناك الكثير من الفضلات في الصورة ، ولكن هذا يقلل من عدد الأبعاد التي يجب عليك العمل بها.
  2. تصفية للضوضاء باستخدام التصفية المتوسطة (مع أخذ قيمة البكسل المتوسطة لكل الجيران واستبدال البيكسل بهذه القيمة) لتقليل الضوضاء.
  3. استخدام مرشح اكتشاف الحافة Canny Edge للحصول على معالم جميع العناصر بعد خطوتين سابقتين.

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

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

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

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

النتائج : الآن ، بينما كان هذا النهج يعمل في الحالات الأساسية ، كان يعاني من نقص حاد في بعض المجالات:

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

هل يمكنك مساعدتي في تحسين خوارزمي المحدد ، باستخدام ميزات OpenCV حصريًا ، لحل المشكلات الأربعة المحددة المذكورة؟

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




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




أنا متأخرة بضع سنوات في الإجابة على هذا السؤال. مع أحدث ما وصلت إليه شبكات CNN في السنوات الخمس الأخيرة ، لم أكن لأستخدم OpenCV للقيام بهذه المهمة الآن! ( أعلم أنك تريد على وجه التحديد ميزات OpenCv في السؤال ) أشعر بأن خوارزميات الكشف عن الكائنات مثل Fast-RCNNs و YOLO و SSD إلخ سوف تعالج هذه المشكلة بهامش كبير مقارنة بميزات OpenCV. إذا كنت سأتصدى لهذه المشكلة الآن (بعد 6 سنوات !!) سأستخدم بالتأكيد أسرع RCNN .




The first things I would look for are color - like RED , when doing Red eye detection in an image - there is a certain color range to detect , some characteristics about it considering the surrounding area and such as distance apart from the other eye if it is indeed visible in the image.

1: First characteristic is color and Red is very dominant. After detecting the Coca Cola Red there are several items of interest 1A: How big is this red area (is it of sufficient quantity to make a determination of a true can or not - 10 pixels is probably not enough), 1B: Does it contain the color of the Label - "Coca-Cola" or wave. 1B1: Is there enough to consider a high probability that it is a label.

Item 1 is kind of a short cut - pre-process if that doe snot exist in the image - move on.

So if that is the case I can then utilize that segment of my image and start looking more zoom out of the area in question a little bit - basically look at the surrounding region / edges...

2: Given the above image area ID'd in 1 - verify the surrounding points [edges] of the item in question. A: Is there what appears to be a can top or bottom - silver? B: A bottle might appear transparent , but so might a glass table - so is there a glass table/shelf or a transparent area - if so there are multiple possible out comes. A Bottle MIGHT have a red cap, it might not, but it should have either the shape of the bottle top / thread screws, or a cap. C: Even if this fails A and B it still can be a can - partial.. This is more complex when it is partial because a partial bottle / partial can might look the same , so some more processing of measurement of the Red region edge to edge.. small bottle might be similar in size ..

3: بعد التحليل المذكور أعلاه ، عند النظر إلى الحروف وشعار الموجة - لأنني أستطيع توجيه بحثي عن بعض الأحرف في الكلمات كما قد لا يكون لديك كل النص بسبب عدم وجود كل يمكن أن تحاذي الموجة في بعض النقاط إلى النص (المسافة الحكيمة) حتى أتمكن من البحث عن هذا الاحتمال ومعرفة أي الحروف يجب أن تكون موجودة في تلك النقطة من الموجة على مسافة x.




If you are interested in it being realtime, then what you need is to add in a pre-processing filter to determine what gets scanned with the heavy-duty stuff. A good fast, very real time, pre-processing filter that will allow you to scan things that are more likely to be a coca-cola can than not before moving onto more iffy things is something like this: search the image for the biggest patches of color that are a certain tolerance away from the sqrt(pow(red,2) + pow(blue,2) + pow(green,2)) of your coca-cola can. Start with a very strict color tolerance, and work your way down to more lenient color tolerances. Then, when your robot runs out of an allotted time to process the current frame, it uses the currently found bottles for your purposes. Please note that you will have to tweak the RGB colors in the sqrt(pow(red,2) + pow(blue,2) + pow(green,2)) to get them just right.

Also, this is gona seem really dumb, but did you make sure to turn on -oFast compiler optimizations when you compiled your C code?




تبحث في الشكل

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

النظر في الضوء

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

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




لست على دراية بـ OpenCV ولكن بالنظر إلى المشكلة منطقيًا ، أعتقد أنك يمكن أن تفرق بين الزجاجة ويمكنها بتغيير الصورة التي تبحث عنها مثل Coca Cola. يجب أن تدمج حتى الجزء العلوي من العلبة كما في حالة يمكن أن يكون هناك بطانة فضية في أعلى الكولا كولا وفي حالة زجاجة لن يكون هناك مثل هذه البطانة الفضية.

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




أليس من الصعب حتى على البشر التمييز بين الزجاجة والعلبة في الصورة الثانية (بشرط إخفاء المنطقة الشفافة للزجاجة)؟

هم تقريبا نفس باستثناء منطقة صغيرة جدا (وهذا هو ، العرض في الجزء العلوي من العلبة هو صغير قليلا في حين أن غلاف الزجاجة هو نفس العرض في جميع أنحاء ، ولكن حق تغيير طفيف؟).

أول ما تبادر إلى ذهني هو التحقق من الجزء العلوي من الزجاجة الحمراء. لكنها لا تزال مشكلة ، إذا لم يكن هناك قمة للزجاجة ، أو إذا كانت مخفية جزئيا (كما ذكر أعلاه).

الشيء الثاني الذي فكرت به كان حول شفافية الزجاجة. OpenCV لديه بعض الأعمال على إيجاد كائنات شفافة في صورة ما. تحقق من الروابط أدناه.

نظرة خاصة على هذا لمعرفة مدى دقة الكشف عن الزجاج:

انظر نتائج الغرز:

ويقولون إن تنفيذ الورقة "A Geodesic Active Contour Framework for Finding Glass" by K. McHenry and J. Ponce, CVPR 2006. . (قم بتنزيل الورق) .

قد يكون من المفيد في حالتك قليلا ، ولكن المشكلة تنشأ مرة أخرى إذا تم ملء الزجاجة.

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

الآن يمكنك إزالة المنطقة الصفراء ، أي تسمية الزجاجة وتشغيل الخوارزمية الخاصة بك للعثور على العلبة.

على أي حال ، يحتوي هذا الحل أيضًا على مشكلات مختلفة مثل الحلول الأخرى.

  1. تعمل فقط إذا كانت زجاجة فارغة. في هذه الحالة ، سيكون عليك البحث عن المنطقة الحمراء بين اللونين الأسود (إذا كان سائل Coca Cola أسود).
  2. مشكلة أخرى إذا تم تغطية جزء شفاف.

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




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

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




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

سوف أقترح التعلم العميق ، مع التعلم العميق يصبح هذا مشكلة تافهة.

يمكنك إعادة إنشاء نموذج v3 الاستهلالي على Tensorflow:

كيفية إعادة تدريب طبقة التأسيس النهائية لفئات جديدة .

في هذه الحالة ، سوف تقوم بتدريب شبكة عصبية تلافيفية لتصنيف الجسم كما يمكن للكوكا كولا أو لا.




كبديل لكل هذه الحلول الرائعة ، يمكنك تدريب المصنف الخاص بك وجعل تطبيقك قويًا للأخطاء. على سبيل المثال ، يمكنك استخدام Haar Training ، حيث توفر عددًا كبيرًا من الصور الإيجابية والسلبية لهدفك.

قد يكون من المفيد استخراج العلب فقط ويمكن دمجها مع الكشف عن الكائنات الشفافة.




هناك مجموعة من واصفات الألوان المستخدمة للتعرف على الكائنات ، وتقارن الورقة أدناه بالكثير منها. فهي قوية بشكل خاص عند دمجها مع SIFT أو SURF. SURF أو SIFT وحدها ليست مفيدة جدا في صورة كوكاكولا يمكن لأنهم لا يعرفون الكثير من نقاط الاهتمام ، تحتاج إلى معلومات اللون للمساعدة. أنا استخدم BIC (الحدود الداخلية / Pixel Classics الداخلي) مع SURF في مشروع وعمل عظيم للتعرف على الأشياء.

واصفات اللون لاسترجاع صورة الويب: دراسة مقارنة