القيادة على الرصيف المستقل مع OpenCV و Tensorflow

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

كانت الدورة التدريبية الأقدم والأكثر شهرة شهادة عبر الإنترنت من Udacity .

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

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

هناك العديد من التطبيقات التي قام بها طلاب Udacity بشكل رئيسي:


أكثر إثارة للاهتمام هو التطبيق في المشاريع الحقيقية. على سبيل المثال ، يتم التحكم في Donkey Car بواسطة شبكة عصبية مدربة خصيصًا.

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

إذن ما هو الرصيف من منظور الكمبيوتر؟

بعض المساحة في الصورة مختلفة في اللون عن المناطق الأخرى.

لقد حدث أنه في الحدائق التي يسهل علي الوصول إليها ، تحول الرصيف إلى أن يكون أكثر الكائنات رمادية في الصورة.

(يشير اللون الرمادي إلى الحد الأدنى للفرق بين قيم RGB). هذه الخاصية رمادية وستكون مفتاح التعرف على الرصيف.

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

دبابة في الحديقة

تتمثل بعض الطرق الأكثر وضوحًا في المعايرة المسبقة - وضع الروبوت بحيث يشغل الطريق معظم الشاشة و

  • أخذ متوسط ​​السطوع (بتنسيق HSV)
  • أو قطعة RGB متوسط ​​، مضمونة لتكون مصنوعة من الطريق (وفي هذه الحالة ستكون الزاوية اليسرى السفلى).

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


والخطوة التالية هي تحويل البقعة اللاصقة إلى عمل - انتقل مباشرة أو انعطف يمينًا أو يسارًا.

نحن نسير مباشرة إذا كانت الحافة اليمنى مرئية وكانت الزاوية أقل من 45 درجة من الجانب الرأسي.

نستدير لليسار إذا كانت الحافة اليمنى مرئية وكانت الزاوية تنحرف عن أسفل العمودي.
انعطف يمينًا إذا لم نشاهد الحافة اليمنى.

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

هذا هو المكان الذي تأتي فيه الشبكات العصبية للإنقاذ.

يتم غسل الصور الأصلية وتقليصها واقتصاصها ، ونختار التعرف على الرصيف الرمادي والحصول على أقنعة سوداء وبيضاء 64 × 64.

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

إن جمع البيانات وإعدادها مهمة شاقة ، فقد استغرق الأمر شهرين.

فيما يلي نماذج من الأقنعة:

إلى اليسار:


إلى اليمين:


مستقيم:


للعمل مع شبكة عصبية ، اعتدت Keras + Tensorflow.

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

model = Sequential() activation = "relu" model.add(Conv2D(20, 5, padding="same", input_shape=input_shape)) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Conv2D(50, 5, padding="same")) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Flatten()) model.add(Dense(500)) model.add(Activation(activation)) model.add(Dense(cls_n)) opt = SGD(lr=0.01) model.add(Activation("softmax")) model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) 

بعد تدريب الإصدار الأول من الشبكة ، واجهت عدم توافق مع Raspberry Pi. قبل ذلك ، استخدمت Tensorflow الإصدار 1.1 ، وذلك باستخدام الشامانية التي جمعها شخص ذكي جدا .

لسوء الحظ ، هذا الإصدار قديم ولم يتمكن من قراءة النماذج من Keras.

ومع ذلك ، فقد دخل مؤخرًا أشخاص من Google في النهاية وجمعوا TF في ظل Raspberry Pi ، على الرغم من الإصدار الجديد من Raspbian - Stretch. كان الإمتداد جيدًا للجميع ، لكن منذ عام لم يكن لدي OpenCV ، لذلك ذهبت الدبابة إلى جيسي.

الآن ، تحت ضغط التغيير ، اضطررت إلى التبديل إلى Stretch. نهض Tensorflow دون مشكلة (على الرغم من أن الأمر استغرق عدة ساعات). OpenCV لمدة عام أيضًا لم يقف ساكنا وقد تم بالفعل إصدار الإصدار 4.0. تمكنت من جمعها تحت Stretch ، بحيث لم تكن هناك عقبات أمام الهجرة.

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

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

مع البرامج الثابتة المحدثة ، يخترق الخزان الحديقة.

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


يمكنك الآن المشي معه في الصباح واكتشاف الكلاب القادمة.

المراجع

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


All Articles