Raspberry Pi Neural Network Counting Bee

تم النشر في 17 مايو 2018

بعد تركيب الخلية مباشرة ، فكرت: "أتساءل كيف أحسب عدد النحل القادم والمغادر؟"

أظهرت دراسة صغيرة: حتى الآن يبدو أن لا أحد قد توصل إلى نظام جيد غير جراحي لحل هذه المشكلة. ولكن قد يكون من المفيد الحصول على مثل هذه المعلومات للتحقق من صحة الخلية.

أولاً ، تحتاج إلى جمع عينات البيانات. Raspberry Pi ، وكاميرا Pi القياسية والألواح الشمسية: هذا الجهاز البسيط يكفي لتسجيل إطار واحد كل 10 ثوانٍ وحفظ 5000+ صورة يوميًا (من الساعة 6 صباحًا حتى 9 مساءً).



فيما يلي مثال للصورة ... كم عدد النحل التي يمكنك عدها؟



ما هو السؤال بالضبط؟


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

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

v1: شبكة تلافيفية كاملة "أكل النحل / لا" على جزء


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

v2: صورة RGB ← صورة نقطية بالأبيض والأسود


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


إدخال RGB (جزء) ومخرج قناة واحدة (جزء)

بمناسبة


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

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

نموذج


هندسة الشبكة هي معيار U-net.

  • شبكة تلافيفية كاملة مدربة على أجزاء ذات دقة نصف ، ولكنها تعمل على صور ذات دقة كاملة ؛
  • الترميز هو سلسلة من أربع لفات 3 × 3 بزيادات 2
  • فك التشفير - سلسلة من التغييرات في الحجم في أقرب الجيران + طي 3 × 3 بزيادات 1 + تخطي الاتصال من أجهزة التشفير ؛
  • طبقة الالتفاف النهائية 1 × 1 مع الخطوة 1 مع تنشيط وظيفة السيني (أي الخيار الثنائي "النحل هو / ليس" لكل بكسل).

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

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

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



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

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


المدخلات والمخرجات الخام ونقط مركزية العنقودية

تعميم بضعة أيام


في يوم واحد


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


تلقى ثلاث عينات في اليوم الأول

لعدة أيام


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

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


عينات تم الحصول عليها في ثلاثة أيام

مثال للتنبؤ


تُظهر الصورة مثالاً للتنبؤ. من المثير للاهتمام أن نلاحظ أن هناك الكثير من النحل أكثر من أي صورة قمت بتسميتها يدويًا. هذا تأكيد عظيم على أن النهج التلافيفي الكامل مع التعلم على الأجزاء الصغيرة يعمل حقًا.



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


من اليسار إلى اليمين: كثافة عالية حول المدخل ؛ النحل بأحجام مختلفة النحل بسرعة عالية!

حيل وضع العلامات


تدريب شبه محكم


تشير إمكانية الحصول على عدد كبير من الصور على الفور إلى فكرة استخدام التدريب شبه المتحكم فيه.

نهج بسيط للغاية:

  1. تصوير 10000 صورة.
  2. وسم 100 صورة model_1 تدريب model_1 .
  3. باستخدام model_1 لتمييز 9900 صورة متبقية.
  4. model_2 على 10000 صورة "مسماة".

نتيجة لذلك ، يظهر model_2 نتيجة أفضل من model_1 .

هنا مثال. لاحظ أن model_1 يظهر بعض الإيجابيات الكاذبة (الوسط الأيسر ونصل العشب) والمحفزات السلبية الكاذبة (النحل حول مدخل الخلية).


الموديل الأيسر ، النموذج الأيمن_2

وضع العلامات من خلال إصلاح نموذج سيئ


مثل هذه البيانات هي أيضًا مثال رائع على كيفية إصلاح نموذج سيئ أسرع من وضع العلامات من البداية ...

  1. نحتفل 10 صور وتدريب النموذج.
  2. نستخدم النموذج لترميز الـ 100 صورة التالية.
  3. نستخدم أداة وضع العلامات لتصحيح العلامات على هذه الصور المائة.
  4. إعادة تثقيف النموذج في 110 صورة.
  5. نكرر ...

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

العد


إمكانية الكشف عن النحل يعني أنه يمكننا عدها! وللمتعة ، ارسم رسومات ممتعة تظهر عدد النحل خلال النهار. أحب الطريقة التي يعملون بها طوال اليوم والعودة إلى المنزل حوالي الساعة 4 مساءً. :)



إخراج التوت بي


كان إطلاق النموذج على Pi جزءًا مهمًا من هذا المشروع.

مباشرة على الحديد بي


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

يعمل على وحدة الحوسبة Movidius


لقد كنت مهتمًا جدًا بفرصة إطلاق نموذج على Pi باستخدام Movidus Neural Compute Stick . هذه أداة مذهلة.

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

الطراز v3: صورة RGB ← عد النحل
قادني هذا إلى الإصدار الثالث من النموذج: هل يمكننا الانتقال مباشرةً من إدخال RGB لإحصاء النحل؟ بهذه الطريقة سوف نتجنب أي مشاكل في العمليات غير المدعومة على Movidus Neural Compute Stick ، ​​على الرغم من أنه من غير المحتمل أن تكون النتيجة جيدة كما هو الحال في نموذج centroid v2.

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

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

العدد الفعلي والمتوقع للنحل في بعض عينات الاختبار
الحقيقي40191615131211108764
V2 (centroid) التنبؤية3919161313141188764
توقعات v3 (حساب بسيط)33.115.312.312.513.310،49.38.76.37.15.94.2

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

ما هي الخطوة التالية؟


كما هو الحال دائمًا ، بقيت مجموعة من الأشياء الصغيرة ...

  • الإطلاق على عصا الحساب العصبي (NCS) ؛ الآن نحن في انتظار بعض العمل من جانبهم ...
  • انقل كل شيء إلى كاميرا JeVois المدمجة . لقد تعاملت معها قليلًا ، ولكن قبل كل شيء أردت إطلاق نموذج على NCS. أريد تتبع النحل بمعدل 120 إطارًا في الثانية !!!
  • تتبع النحل بين إطارات / كاميرات متعددة لتصور التدفق البصري.
  • استكشف بمزيد من التفصيل فوائد النهج شبه المتحكم فيه وقم بتدريب نموذج أكبر لتسمية البيانات لنموذج أصغر.
  • استكشاف ميزات NCS ؛ ماذا تفعل مع وضع المعلمات المفرطة؟
  • تابع تطوير نسخة صغيرة من FarmBot لإجراء بعض التجارب الجينية مع شتلات CNC (أي شيء مختلف تمامًا).

كود


يتم نشر جميع التعليمات البرمجية على Github .

Source: https://habr.com/ru/post/ar413799/


All Articles