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

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

يدخل دفق الفيديو من كاميرا الويب الموجهة إلى النافذة مدخل الناقل:

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

نحتاج إلى مسح هذه الصورة بطريقة ما والحصول على قائمة بالأماكن التي يجب إيقافها:

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

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

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

وبالتالي ، إذا تمكنا من التعرف على السيارات ومعرفة أي منها لا يتحرك بين الإطارات ، يمكننا تخمين أماكن وقوف السيارات. بهذه البساطة - انتقل إلى التعرف على الجهاز!
التعرف على السيارات
يعتبر التعرف على السيارات على إطار فيديو مهمة التعرف على الكائنات الكلاسيكية. هناك العديد من أساليب التعلم الآلي التي يمكننا استخدامها للاعتراف بها. فيما يلي بعضها بالترتيب من "المدرسة القديمة" إلى "المدرسة الجديدة":
- يمكنك تدريب الكاشف بناءً على HOG (رسم بياني للتدرجات الموجهة ، رسوم بيانية للتدرجات الاتجاهية) والسير عبر الصورة بأكملها للعثور على جميع السيارات. هذا النهج القديم ، الذي لا يستخدم التعلم العميق ، يعمل بسرعة نسبية ، لكنه لا يتعامل بشكل جيد مع الآلات الموجودة بطرق مختلفة.
- يمكنك تدريب الكاشف الذي يستند إلى CNN (شبكة العصبية التلافيفية ، وهي شبكة عصبية تلافيفية) والسير عبر الصورة بأكملها حتى نعثر على جميع الآلات. يعمل هذا النهج تمامًا ، ولكن ليس بنفس الكفاءة ، حيث نحتاج إلى مسح الصورة عدة مرات باستخدام CNN للعثور على جميع الآلات. وعلى الرغم من أنه يمكننا العثور على آلات موجودة بطرق مختلفة ، إلا أننا نحتاج إلى بيانات تدريب أكثر من كاشف HOG.
- يمكنك استخدام نهج جديد بالتعلم العميق مثل Mask R-CNN أو Faster R-CNN أو YOLO ، والذي يجمع بين دقة CNN ومجموعة من الحيل التقنية التي تزيد من سرعة التعرف بشكل كبير. ستعمل هذه النماذج بسرعة نسبية (على وحدة معالجة الرسومات) إذا كان لدينا الكثير من البيانات لتدريب النموذج.
في الحالة العامة ، نحتاج إلى أبسط الحلول ، والتي ستعمل كما ينبغي وتتطلب أقل قدر من بيانات التدريب. هذا ليس مطلوبًا ليكون الخوارزمية الأحدث والأسرع. ومع ذلك ، على وجه التحديد في حالتنا ، يعد Mask R-CNN خيارًا معقولًا ، على الرغم من أنه جديد وسريع تمامًا.
تم تصميم بنية قناع R-CNN بحيث يتعرف على الكائنات في الصورة بأكملها ، وينفق الموارد بفعالية ، ولا يستخدم نهج النافذة المنزلقة. بمعنى آخر ، إنه يعمل بسرعة كبيرة. بفضل وحدة معالجة الرسومات (GPU) الحديثة ، سنكون قادرين على التعرف على الكائنات في الفيديو بدقة عالية بسرعة عدة إطارات في الثانية. لمشروعنا هذا ينبغي أن يكون كافيا.
بالإضافة إلى ذلك ، يوفر Mask R-CNN الكثير من المعلومات حول كل كائن معروف. ترجع معظم خوارزميات التعرف فقط مربع إحاطة لكل كائن. ومع ذلك ، لن يمنحنا قناع R-CNN موقع كل كائن فحسب ، بل يمنحنا أيضًا مخططًا (قناع):

لتدريب Mask R-CNN ، نحتاج إلى الكثير من صور الكائنات التي نريد التعرف عليها. يمكن أن نذهب للخارج ، والتقاط صور للسيارات ووضع علامات عليها في الصور ، الأمر الذي يتطلب عدة أيام من العمل. لحسن الحظ ، تعد السيارات أحد الأشياء التي غالباً ما يرغب الناس في التعرف عليها ، لذلك توجد بالفعل عدة مجموعات بيانات عامة بها صور للسيارات.
أحدها هو
مجموعة بيانات SOCO الشائعة (اختصار لـ Common Objects In Context) ، والتي تحتوي على صور مشروحة بأقنعة الكائنات. تحتوي مجموعة البيانات هذه على أكثر من 12000 صورة مع آلات تحمل علامات بالفعل. فيما يلي صورة مثال من مجموعة البيانات:

هذه البيانات ممتازة لتدريب نموذج يعتمد على Mask R-CNN.
لكن امسك الخيول ، فهناك أخبار أفضل! لسنا أول من أراد تدريب طرازه باستخدام مجموعة بيانات COCO - لقد فعل الكثير من الناس هذا بالفعل أمامنا وشاركوا نتائجهم. لذلك ، بدلاً من تدريب نموذجنا ، يمكننا اتخاذ نموذج جاهز يمكنه التعرف على السيارات بالفعل.
لمشروعنا ، سوف نستخدم
نموذج مفتوح المصدر من Matterport.إذا قدمنا صورة من الكاميرا إلى مدخلات هذا النموذج ، فهذا هو ما حصلنا عليه بالفعل "خارج الصندوق":

لم يتعرف النموذج على السيارات فحسب ، بل أيضًا على الأشياء مثل إشارات المرور والأشخاص. من المضحك أنها تعرفت على الشجرة باعتبارها نباتًا منزليًا.
لكل كائن معروف ، يعرض نموذج Mask R-CNN 4 أشياء:
- نوع الكائن المكتشف (عدد صحيح). يمكن أن يتعرف نموذج COCO المُدرَّب مسبقًا على 80 كائنًا مختلفًا مثل السيارات والشاحنات. قائمة كاملة منهم يمكن العثور عليها هنا.
- درجة الثقة في نتائج الاعتراف. كلما زاد الرقم ، كلما كان النموذج أقوى واثقًا في التعرف على الكائن.
- مربع إحاطة لكائن في شكل إحداثيات XY للبكسل في الصورة.
- "قناع" يُظهر البيكسلات الموجودة داخل المربع المحيط جزءًا من الكائن. باستخدام بيانات القناع ، يمكنك العثور على الخطوط العريضة للكائن.
يوجد أدناه رمز Python لاكتشاف المربع المحيط للآلات التي تستخدم طرازي Mask R-CNN و OpenCV المدربين مسبقًا:
import numpy as np import cv2 import mrcnn.config import mrcnn.utils from mrcnn.model import MaskRCNN from pathlib import Path
بعد تشغيل هذا البرنامج النصي ، ستظهر على الشاشة صورة بها إطار حول كل جهاز تم اكتشافه:

أيضًا ، سيتم عرض إحداثيات كل جهاز في وحدة التحكم:
Cars found in frame of video: Car: [492 871 551 961] Car: [450 819 509 913] Car: [411 774 470 856]
لذلك تعلمنا التعرف على السيارات في الصورة.
نحن ندرك أماكن وقوف السيارات الفارغة
نحن نعرف إحداثيات بكسل كل آلة. من خلال النظر إلى عدة إطارات متتالية ، يمكننا بسهولة تحديد أي من السيارات لم تتحرك ، ونفترض أن هناك أماكن لوقوف السيارات. ولكن كيف نفهم أن السيارة تركت موقف السيارات؟
المشكلة هي أن إطارات الآلات تتداخل جزئيًا مع بعضها البعض:

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

لذلك يمكننا أن نفهم كيف يتقاطع الإطار المحيط للسيارة مع إطار مساحة انتظار السيارات. هذا سيجعل من السهل تحديد ما إذا كانت مواقف السيارات مجانية. إذا كانت قيمة IoU منخفضة ، مثل 0.15 ، فإن السيارة تحتل جزءًا صغيرًا من مساحة وقوف السيارات. وإذا كانت مرتفعة ، مثل 0.6 ، فهذا يعني أن السيارة تشغل معظم المساحة ولا يمكنك الوقوف هناك.
نظرًا لاستخدام IoU في كثير من الأحيان في رؤية الكمبيوتر ، فمن المحتمل جدًا أن تقوم المكتبات المقابلة بتنفيذ هذا التدبير. في مكتبتنا Mask R-CNN ، يتم تطبيقه كدالة mrcnn.utils.compute_overlaps ().
إذا كانت لدينا قائمة بالمربعات المُحاطة لمواقف السيارات ، فيمكنك إضافة التحقق من وجود السيارات في هذا الإطار عن طريق إضافة سطر كامل أو اثنين من التعليمات البرمجية:
يجب أن تبدو النتيجة مثل هذا:
[ [1. 0.07040032 0. 0.] [0.07040032 1. 0.07673165 0.] [0. 0. 0.02332112 0.] ]
في هذه المجموعة ثنائية الأبعاد ، يعكس كل صف إطارًا واحدًا من مساحة وقوف السيارات. ويشير كل عمود إلى مدى قوة تقاطع كل مكان مع أحد الأجهزة المكتشفة. نتيجة 1.0 تعني أن السيارة بأكملها مشغولة تمامًا ، وتشير القيمة المنخفضة مثل 0.02 إلى أن السيارة قد صعدت إلى مكانها قليلاً ، ولكن لا يزال بإمكانك الوقوف عليها.
للعثور على أماكن غير مأهولة ، تحتاج فقط إلى التحقق من كل صف في هذه المجموعة. إذا كانت جميع الأرقام قريبة من الصفر ، فمن المرجح أن المكان مجاني!
ومع ذلك ، ضع في اعتبارك أن التعرف على الكائنات لا يعمل دائمًا بشكل مثالي مع الفيديو في الوقت الفعلي. على الرغم من أن النموذج المستند إلى Mask R-CNN دقيق تمامًا ، إلا أنه من وقت لآخر قد يفقد سيارة أو سيارتين في إطار واحد من الفيديو. لذلك ، قبل التأكيد على أن المكان مجاني ، تحتاج إلى التأكد من بقائه كذلك للإطارات التالية 5-10 التالية من الفيديو. وبهذه الطريقة ، يمكننا تجنب المواقف عندما يقوم النظام بتمييز مكان فارغ عن طريق الخطأ بسبب وجود خلل في إطار واحد من الفيديو. بمجرد التأكد من بقاء المكان مجانيًا لعدة إطارات ، يمكنك إرسال رسالة!
إرسال الرسائل القصيرة
الجزء الأخير من الناقل لدينا هو إرسال إشعارات الرسائل القصيرة عندما تظهر مساحة مجانية لوقوف السيارات.
من السهل جدًا إرسال رسالة من Python إذا كنت تستخدم Twilio. Twilio هو واجهة برمجة تطبيقات شائعة تتيح لك إرسال رسائل نصية قصيرة من أي لغة برمجة تقريبًا مع بضعة أسطر من التعليمات البرمجية. بالطبع ، إذا كنت تفضل خدمة مختلفة ، فيمكنك استخدامها. لا علاقة لي بـ Twilio ، إنه مجرد أول ما يتبادر إلى الذهن.
لاستخدام Twilio ، قم بالتسجيل للحصول على
حساب تجريبي ، وقم بإنشاء رقم هاتف Twilio ، واحصل على معلومات مصادقة حسابك. ثم تثبيت مكتبة العميل:
$ pip3 install twilio
بعد ذلك ، استخدم الكود التالي لإرسال الرسالة:
from twilio.rest import Client
لإضافة إمكانية إرسال رسائل إلى نصنا ، ما عليك سوى نسخ هذا الرمز هناك. ومع ذلك ، تحتاج إلى التأكد من عدم إرسال الرسالة على كل إطار ، حيث يمكنك رؤية المساحة الخالية. لذلك ، سيكون لدينا علامة على أنه في الحالة المثبتة لن يسمح بإرسال الرسائل لبعض الوقت أو حتى يتم إخلاء مكان آخر.
وضع كل ذلك معا
import numpy as np import cv2 import mrcnn.config import mrcnn.utils from mrcnn.model import MaskRCNN from pathlib import Path from twilio.rest import Client
لتشغيل هذا الرمز ، تحتاج أولاً إلى تثبيت Python
3.6+ و
Matterport Mask R-CNN و
OpenCV .
كتبت على وجه التحديد رمز بسيط قدر الإمكان. على سبيل المثال ، إذا رأى سيارة على الإطار الأول ، فإنه يخلص إلى أنهم جميعًا متوقفة. حاول تجربة ذلك ومعرفة ما إذا كان يمكنك تحسين موثوقيتها.
فقط عن طريق تغيير معرفات الكائنات التي يبحث عنها النموذج ، يمكنك تحويل الشفرة إلى شيء مختلف تمامًا. على سبيل المثال ، تخيل أنك تعمل في منتجع للتزلج. بعد إجراء بعض التغييرات ، يمكنك تحويل هذا البرنامج النصي إلى نظام يتعرف تلقائيًا على المتزلجين من القفز من الطريق المنحدر ويسجل مقاطع الفيديو بقفزات باردة. أو ، إذا كنت تعمل في محمية طبيعية ، يمكنك إنشاء نظام يقوم بحساب الحمير الوحشية. انت محدودة فقط من خيالك.
يمكن قراءة المزيد من هذه المقالات في قناة Telegram
Neuron (neurondata)
رابط الترجمة البديلة:
tproger.ru/translations/parking-searching/كل المعرفة. تجربة!