تعد صور الأقمار الصناعية أحد مصادر البيانات الرئيسية لخدمة Yandex.Maps. لجعلها ملائمة للعمل مع الخريطة ، يتم وضع علامة على الأشياء بمضلعات في الصور: الغابات والبرك والشوارع والمنازل ، وما إلى ذلك عادة ، يشارك رسامي الخرائط في وضع العلامات. قررنا مساعدتهم وتعليم الكمبيوتر لإضافة مضلعات من المنازل دون مشاركة الناس.
بالنسبة للعمليات باستخدام الصور ، يلتقي مجال تكنولوجيا المعلومات ، والذي يسمى رؤية الكمبيوتر. على مدى السنوات القليلة الماضية ، تم حل معظم المهام في هذا المجال بنجاح كبير باستخدام الشبكات العصبية. اليوم سنخبر قراء هبر عن تجربتنا في استخدام الشبكات العصبية في رسم الخرائط.
بادئ ذي بدء ، سنقوم بتدريب شبكة عصبية ، ستنخرط في التجزئة الدلالية ، أي تحديد ما إذا كانت كل نقطة في صورة القمر الصناعي مرتبطة بالمنزل. لماذا يكون التجزئة الدلالي وليس الكشف عن الأشياء فقط؟ عندما يتم حل مشكلة الكشف ، سنحصل عند الإخراج على مجموعة من المستطيلات ، علاوة على ذلك محددة: وجهان عموديان ، وجانبان أفقيان. وعادة ما يتم تدوير المنازل بالنسبة لمحاور الصورة ، وبعض المباني لها أيضًا شكل معقد.
يتم حل مهمة التجزئة الدلالية من خلال شبكات مختلفة (
FCN ،
SegNet ،
UNet ، إلخ). ما عليك سوى اختيار الأفضل بالنسبة لنا.
بعد استلام القناع من صورة القمر الصناعي ، نختار مجموعات كبيرة بما يكفي من النقاط التي تنتمي إلى المنازل ، ونجمعها في مناطق متصلة ونقدم حدود المناطق في شكل ناقل في شكل مضلعات.
من الواضح أن القناع لن يكون دقيقًا تمامًا ، مما يعني أن المنازل المجاورة يمكن أن تلتصق ببعضها البعض في منطقة متصلة واحدة. للتعامل مع هذه المشكلة ، قررنا زيادة تدريب الشبكة. ستجد في الصورة الأضلاع (حدود المنازل) وتفصل المباني الملصقة معًا.
لذا ، فإن مثل هذا المخطط يلوح في الأفق:
لم نتخلص تمامًا من شبكات الكشف وحاولنا استخدام
Mask R-CNN . زائد في المقارنة مع التقسيم المعتاد هو أن Mask R-CNN يكتشف الأشياء ويولد القناع ، لذلك ليس هناك حاجة إلى العبث بتقسيم القناع المشترك إلى مناطق متصلة. حسنًا ، ناقص (كما هو بدونه) في الدقة الثابتة لقناع كل كائن ، أي للمنازل الكبيرة ذات الحدود المعقدة ، من الواضح أن هذه الحدود مبسطة.
الأدوات
ثم كان من الضروري اتخاذ قرار بشأن الأدوات. كان كل شيء واضحًا جدًا هنا: إن
OpenCV هو الأنسب لمهام رؤية الكمبيوتر. إن اختيار الشبكات العصبية أوسع إلى حد ما.
استقرنا في
Tensorflow . مزاياها:
- مجموعة متطورة إلى حد ما من "المكعبات" الجاهزة التي يمكنك من خلالها تجميع شبكاتك ؛
- Python API ، ملائمة لإنشاء بنية الشبكة بسرعة والتدريب ؛
- يمكن استخدام شبكة مدربة في برنامجك من خلال واجهة C ++ (ضعيفة جدًا مقارنة بجزء Python ، ولكنها كافية تمامًا لتشغيل الشبكات الجاهزة).
بالنسبة للتدريب والحوسبة الثقيلة الأخرى ، خططنا لاستخدام Nirvana - منصة Yandex الرائعة
التي تحدثنا عنها بالفعل .
مجموعة البيانات
يتكون 80٪ من النجاح في العمل مع شبكة عصبية من مجموعة بيانات جيدة. لذا ، بالنسبة للمبتدئين ، كان يجب أن نجمع مجموعة البيانات هذه. يحتوي Yandex على عدد كبير من صور الأقمار الصناعية مع كائنات مميزة بالفعل. يبدو أن كل شيء بسيط: ما عليك سوى تحميل هذه البيانات وجمعها في مجموعة بيانات. ومع ذلك ، هناك تحذير واحد.
تنقيح مجموعة البيانات
عندما يبحث شخص عن منزل في صورة القمر الصناعي ، فإن أول شيء يراه هو السقف. لكن ارتفاع المنازل يختلف ، يمكن للقمر الصناعي أن يأخذ نفس التضاريس من زوايا مختلفة - وإذا وضعنا مضلعًا مطابقًا للسقف على الخريطة المتجهة ، فلا يوجد ضمان بأن السقف لن يغادر عند تحديث الصورة. ولكن يتم حفر الأساس في الأرض ، ومن أي زاوية تخلعها ، تظل طوال الوقت في مكان واحد. هذا هو السبب في وضع علامة على المنازل على ناقل Yandex.Map "على الأسس". هذا صحيح ، ولكن بالنسبة لمهمة تقسيم الصور ، من الأفضل تعليم الشبكة للبحث عن الأسقف: الأمل في أن يتم تدريب الشبكة على التعرف على الأسس صغير جدًا. لذلك ، في مجموعة البيانات ، يجب وضع علامة على كل شيء على الأسطح. لذا ، لإنشاء مجموعة بيانات جيدة ، نحتاج إلى معرفة كيفية تحويل تصميم ناقلات المنازل من الأسس إلى الأسطح.
حاولنا عدم التحول ، لكن الجودة لم تكن جيدة جدًا ، وهذا أمر مفهوم: زوايا التصوير للقمر الصناعي مختلفة ، وارتفاعات المنازل مختلفة ، ونتيجة لذلك ، تم تغيير الأساس في الصور في اتجاهات مختلفة وعلى مسافات مختلفة من السقف. يتم فقدان الشبكة من مثل هذا التنوع ، وفي أحسن الأحوال ، تدرب على شيء بينهما ، في أسوأ الأحوال - لشيء غير مفهوم. علاوة على ذلك ، تنتج شبكة التجزئة الدلالية نتيجة مشابهة لشيء مقبول ، ولكن عند البحث عن الحواف ، تنخفض الجودة بشكل كبير.نهج النقطية
منذ أن دخلنا في مجال رؤية الكمبيوتر ، كان أول شيء فعلناه هو تجربة نهج متعلق برؤية الكمبيوتر هذه. أولاً ، يتم تنقيط خريطة المتجه (يتم رسم مضلعات المنازل بخطوط بيضاء على خلفية سوداء) ، ويختار
مرشح سوبل الحواف في صورة القمر الصناعي. ثم هناك إزاحة لصورتين بالنسبة لبعضهما البعض ، مما يزيد من الترابط بينهما. الحواف بعد مرشح سوبل صاخبة للغاية ، لذلك ، إذا تم تطبيق هذا النهج على مبنى واحد ، فلن يتم دائمًا الحصول على نتيجة مقبولة. ومع ذلك ، تعمل الطريقة بشكل جيد في المناطق ذات المباني ذات الارتفاع نفسه: إذا كنت تبحث عن إزاحة على الفور على مساحة كبيرة من الصورة ، فستكون النتيجة أكثر استقرارًا.
نهج "هندسي"
إذا كانت المنطقة مبنية ليس من نفس النوع ، ولكن مع منازل مختلفة ، فلن تعمل الطريقة السابقة. لحسن الحظ ، نعرف أحيانًا ارتفاع المباني على خريطة متجه ياندكس وموقع القمر الصناعي أثناء التصوير. وبالتالي ، يمكننا استخدام المعرفة المدرسية للهندسة وحساب أين ومتى يتحرك السقف بالنسبة إلى الأساس. وقد حسنت هذه الطريقة مجموعة البيانات في المناطق ذات المباني الشاهقة.
نهج "يدوي"
الطريقة الأكثر استهلاكًا للوقت: دحرج أكمامك ، واكشف عن الماوس ، وتحديق في الشاشة ، وقم بتحويل تخطيط ناقلات المنازل يدويًا من الأسس إلى الأسطح. تجلب هذه التقنية نتيجة مدهشة ببساطة من حيث الجودة ، ولكن لا يوصى باستخدامها بكميات كبيرة: المطورين الذين يشاركون في مثل هذه المهام يقعون بسرعة في حالة من اللامبالاة ويفقدون الاهتمام بالحياة.
شبكة عصبية
في النهاية ، حصلنا على ما يكفي من صور الأقمار الصناعية ، والتي تم تمييزها جيدًا على الأسطح. لذلك ، كانت هناك فرصة لتدريب الشبكة العصبية (في الوقت الحالي ، على الرغم من ذلك ، ليس للتجزئة ، ولكن لتحسين تخطيط صور الأقمار الصناعية الأخرى). وفعلنا ذلك.
كانت البيانات المدخلة للشبكة العصبية التلافيفية صورة ساتلية وتحولت إلى علامات نقطية. عند الإخراج ، تلقينا متجهًا ثنائي الأبعاد: الإزاحة الرأسية والأفقية.
بمساعدة شبكة عصبية ، وجدنا الإزاحة اللازمة ، مما سمح لنا بتحقيق نتائج جيدة في المباني التي لم يتم تحديد ارتفاعها. ونتيجة لذلك ، قللنا بشكل كبير من تصحيح الترميز اليدوي.
مناطق مختلفة - منازل مختلفة
هناك العديد من المناطق والدول المثيرة للاهتمام على Yandex.Maps. ولكن حتى في روسيا ، فإن المنازل متنوعة للغاية ، مما يؤثر على كيفية ظهورها في صور الأقمار الصناعية. لذا ، عليك أن تعكس التنوع في مجموعة البيانات. وفي البداية لم نفهم حقًا كيفية التعامل مع كل هذا الروعة. اجمع مجموعة بيانات ضخمة ثم درب شبكة واحدة عليها؟ هل تريد إنشاء مجموعة بيانات خاصة بك لكل نوع (مشروط) من التطوير وتدريب شبكة منفصلة؟ تدريب شبكة أساسية معينة ثم تدريبها لنوع معين من التطوير؟
تجريبيا ، وجدنا أن:
- مما لا شك فيه أنه من الضروري توسيع مجموعة البيانات لأنواع مختلفة من المباني التي تم التخطيط لاستخدام الأداة عليها. شبكة مدربة على نوع واحد قادرة على تمييز المباني من نوع آخر ، على الرغم من أنها سيئة للغاية.
- من الأفضل تدريب شبكة واحدة كبيرة على مجموعة البيانات بالكامل. يعمم بشكل جيد إلى مناطق مختلفة. إذا قمت بتدريب شبكات منفصلة لكل نوع من التطوير ، فستظل الجودة كما هي أو بالكاد تتحسن. لذلك من غير المجدي تنفيذ شبكات مختلفة لمناطق مختلفة. بالإضافة إلى ذلك ، يتطلب ذلك المزيد من البيانات ومصنفًا إضافيًا لنوع التطوير.
- إذا كنت تستخدم الشبكات القديمة عند إضافة مناطق جديدة إلى البيانات ، فستتعلم الشبكات بشكل أسرع. تؤدي إعادة تدريب الشبكات القديمة على البيانات الموسعة إلى نفس النتيجة تقريبًا مثل تدريب الشبكة من البداية ، ولكنها تتطلب وقتًا أقل بكثير.
خيارات الحل
التجزئة الدلالي
التقسيم الدلالي هو مهمة مدروسة جيدًا. بعد ظهور مقالة
الشبكات التلافيفية بالكامل ، يتم حلها في الغالب باستخدام الشبكات العصبية. يبقى فقط اختيار شبكة (اعتبرنا
FCN و
SegNet و
UNet ) ، للتفكير في ما إذا كنا بحاجة إلى حيل إضافية مثل CRF عند الإخراج ، ولتحديد كيفية ووظيفة الخطأ التي سيتم تدريب التدريب عليها.
ونتيجة لذلك ، استقرنا على بنية U-Net تشبه وظيفة
التعميم الشاملة للاتحاد كدالة خطأ. للتدريب ، قطعنا صور الأقمار الصناعية وعلاماتها المقابلة (بالطبع ، منقطة) إلى مربعات وتجميعها في مجموعات البيانات. اتضح أنه لطيف ، وأحيانًا ما يرام.
في المناطق ذات المباني الفردية ، كان التجزئة الدلالي كافياً للانتقال إلى المرحلة التالية - التوجيه. عندما يكون المبنى كثيفًا ، تكون المنازل أحيانًا عالقة معًا في منطقة متماسكة. استغرق فصلهم.
كشف الحواف
للتعامل مع هذه المهمة ، يمكنك العثور على الحواف في الصورة. لاكتشاف الحواف ، قررنا أيضًا تدريب الشبكة (من الواضح أن خوارزميات البحث التي لا تستخدم الشبكات العصبية شيء من الماضي). تدريب شبكة من نوع HED ، موصوفة في
الكشف عن الحواف المتداخلة شموليًا . في المقالة الأصلية ، تم تدريب الشبكة على مجموعة بيانات BSDS-500 ، حيث يتم وضع علامة على جميع الحواف على الصور. تعثر الشبكة المدربة على جميع الحواف الواضحة: حدود المنازل والطرق والبحيرات وما إلى ذلك. وهذا يكفي بالفعل لفصل المباني القريبة. لكننا قررنا الذهاب إلى أبعد من ذلك واستخدام نفس مجموعة البيانات للتدريب كما هو الحال في التجزئة الدلالية ، ولكن عند التنقيط ، لا ترسم المضلعات الكاملة للمباني ، ولكن رسم حدودها فقط.
كانت النتيجة جميلة للغاية لدرجة أننا قررنا تحويل المباني مباشرة من الحواف المستلمة من الشبكة. وقد حدث ذلك تمامًا.
كشف قمة الرأس
نظرًا لأن شبكة مثل HED أعطت نتيجة ممتازة على الحواف ، قررنا تدريبها على اكتشاف القمم. في الواقع ، لدينا شبكة ذات أوزان عامة على الطبقات التلافيفية. كان لديها مخرجان في نفس الوقت: للحواف والقمم. ونتيجة لذلك ، قمنا بعمل نسخة أخرى من تحويل المباني ، وفي بعض الحالات أظهر نتائج معقولة جدًا.
قناع r-cnn
Mask R-CNN هو توسع جديد نسبيًا للشبكات مثل Faster R-CNN. يبحث Mask R-CNN عن الكائنات ويحدد قناعًا لكل منها. نتيجة لذلك ، بالنسبة للمنازل ، لا نحصل فقط على مستطيلات مقيدة ، ولكن أيضًا بنية راقية. يقارن هذا النهج بشكل إيجابي مع الكشف البسيط (لا نعرف كيف يقع المبنى داخل المستطيل) والتجزئة الطبيعية (يمكن لعدة منازل أن تلتصق ببعضها البعض في واحد ، وليس من الواضح كيفية فصلها). مع Mask R-CNN ، لم تعد بحاجة إلى التفكير في الحيل الإضافية: يكفي أن تقوم بتوجيه حدود القناع لكل كائن والحصول على النتيجة على الفور. هناك أيضًا ناقص: حجم قناع الكائن ثابت دائمًا ، أي بالنسبة للمباني الكبيرة ، ستكون دقة تخطيط البكسل منخفضة. تبدو نتيجة Mask R-CNN كما يلي:
لقد جربنا Mask R-CNN في النهاية وتأكدنا من أن هذا النهج يتفوق على بعض أنواع المباني.
المتجه
المستطيل المتجه
مع كل التنوع المعماري الحديث ، لا تزال المنازل على صور الأقمار الصناعية تبدو في الغالب مثل المستطيلات. علاوة على ذلك ، بالنسبة لكتلة الأراضي ، لا يلزم وضع علامة بمضلعات معقدة. ولكن ما زلت أريد أن يتم تمييز المنازل على الخريطة. (حسنًا ، على سبيل المثال ، شراكة البستنة: عادة ما يكون هناك الكثير من المنازل هناك ، ولا يعد وضع العلامات يدويًا مهمًا جدًا ، ولكن وضع علامة على المستطيلات على الخريطة جيد جدًا.) لذلك ، كان النهج الأول للتوجيه بسيطًا للغاية.
- خذ المنطقة النقطية المقابلة لـ "المنزل".
- ابحث عن مستطيل الحد الأدنى للمساحة الذي يحتوي على هذه المساحة (على سبيل المثال ، مثل: OpenCV :: minAreaRect ). تم حل المشكلة.
من الواضح أن جودة هذا النهج ليست مثالية. ومع ذلك ، فإن الخوارزمية بسيطة للغاية وتعمل في كثير من الحالات.
متجه المضلع
إذا كانت جودة التجزئة جيدة بما فيه الكفاية ، يمكنك إعادة رسم محيط المنزل بدقة أكبر. في معظم المباني ذات الشكل المعقد ، تكون الزوايا صحيحة في الغالب ، لذلك قررنا تقليل المشكلة إلى مهمة بناء مضلع بجوانب متعامدة. من خلال حلها ، نريد تحقيق هدفين في وقت واحد: للعثور على أبسط مضلع وتكرار شكل المباني بأكبر قدر ممكن من الدقة. تتعارض هذه الأهداف مع بعضها البعض ، لذلك عليك إدخال شروط إضافية: لتحديد الحد الأدنى لطول الجدران ، والحد الأقصى للانحراف عن منطقة المسح ، وما إلى ذلك.
كانت الخوارزمية التي حدثت لنا أولاً تستند إلى بناء إسقاط النقاط على خطوط مستقيمة:
- ابحث عن مخطط المنطقة النقطية المقابلة لمنزل واحد.
- قلل عدد النقاط في الدائرة بتبسيطها ، على سبيل المثال ، باستخدام خوارزمية دوغلاس بيكر .
- ابحث عن أطول جانب في المخطط. إنها زاوية ميلها التي ستحدد زاوية المضلع المتعامد المستقبلي بأكمله.
- أنشئ إسقاطًا من نقطة الكفاف التالية إلى الجانب السابق.
- توسيع الجانب إلى نقطة الإسقاط. إذا كانت المسافة من النقطة إلى إسقاطها أكبر من أقصر جدار للمبنى ، فأضف الجزء الناتج إلى محيط المبنى.
- كرر الخطوتين 4 و 5 حتى تغلق الدائرة.
هذه الخوارزمية بسيطة للغاية وتجلب النتائج بسرعة ، ولكن لا يزال يظهر في بعض الأحيان أن يكون محيط المبنى صاخبًا تمامًا. في محاولة للتعامل مع هذه المشكلة ، وجدنا
حلًا مثيرًا للاهتمام للمشكلة ، والذي يستخدم شبكة مربعة في الفضاء لتقريب المضلع. يتم وصف الخوارزمية بإيجاز ، وتتكون من ثلاثة إجراءات:
- بناء شبكة مربعة في مساحة تتمركز عند الصفر.
- في نقاط الشبكة التي لا تقع على بعد مسافة معينة من المحيط الأصلي ، قم ببناء مضلعات مختلفة.
- حدد مضلعًا يحتوي على الحد الأدنى من القمم.
نظرًا لأن زاوية دوران الشبكة المطلوبة غير معروفة مسبقًا ، فمن الضروري فرز عدة قيم ، مما يؤثر على الأداء بشكل سيئ. ومع ذلك ، تتيح لك الخوارزمية تحقيق نتائج أكثر جمالا بصريا.
تحسين المتجه
بينما عملنا بالفعل مع كل منزل على حدة. عند اكتمال المرحلة الأولى ، يمكنك بالفعل العمل مع الصورة ككل وتحسين النتيجة. لهذا ، تمت إضافة خوارزمية للمعالجة اللاحقة لمجموعة من المضلعات. استخدمنا الاستدلال التالي:
- عادة تكون جدران المنازل المجاورة متوازية. علاوة على ذلك: في معظم الأحيان ، يمكن دمج المنازل في مجموعات ، حيث يتم محاذاة جميع العناصر داخلها.
- إذا تم وضع علامة على الشوارع بالفعل على الصورة ، فمن المحتمل جدًا أن تكون جوانب المضلعات موازية للشوارع.
- إذا تقاطعت المضلعات ، فمن الأرجح أن تحرك الجدران بحيث يختفي التقاطع.
ونتيجة لذلك ، ظهرت الخوارزمية التالية:
- نقوم بتجميع المنازل التي تم العثور عليها من خلال المسافة بينهما وزاوية الدوران. نحن نحسب متوسط المباني في كل عنقود. نكرر حتى يتوقف موقف المباني عن التغيير أو حتى تبدأ المنازل في الانحراف كثيرًا عن الموقع الأولي.
- نختار المنازل القريبة من الطرق ، نجد أطول وأقرب إلى جانب الطريق. نحول المنزل إلى موازاة الجانب المحدد والطريق.
- نزيل التقاطعات بين المضلعات ، ونغير جوانب مبنيين متقاطعين بما يتناسب مع حجم الجانبين.
النتيجة
ونتيجة لذلك ، حصلنا على أداة يمكنها التعرف على المباني من أنواع مختلفة من المباني. إنه يساعد رسامي الخرائط في عملهم الشاق: يسرع بشكل كبير البحث عن المنازل المفقودة ويملأ مناطق جديدة غير مزروعة بعد. تمت حاليًا إضافة أكثر من 800 ألف عنصر جديد إلى خريطة الأشخاص باستخدام هذه الأداة.
أدناه سترى بعض الأمثلة على الاعتراف.