MASK-RCNN للعثور على أسطح من صور الطائرات بدون طيار


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

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

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

ونتيجة لذلك ، يبدو هذا:


مشاكل


لنبدأ بالمشكلات الفنية التي واجهناها:

  • هناك فرق كبير بين الصور الجوية الشتوية والصيفية (نموذج تم تدريبه فقط في الصور الصيفية غير قادر تمامًا على العثور على أسطح في الشتاء) ؛
  • , ;
  • , ( ), ( ) , ;
  • , , ( ). ;
  • (, ) .

وتجلب الطائرات بدون طيار أحيانًا هذه الصور:


أود أيضًا أن أشير إلى المشاكل التي كان يمكن أن تكون ، لكنها لم تهمنا:

  • لم يكن لدينا أي مهمة لإجراء الاستدلال لفترة محدودة (على سبيل المثال ، مباشرة في وقت الرحلة) ، والتي حلت على الفور جميع المشاكل المحتملة في الأداء ؛
  • عند الإدخال للمعالجة ، تلقينا على الفور صورًا عالية الجودة وعالية الدقة (باستخدام عدسات ذات بؤري 21 مم على ارتفاع 250 م ، وهو 5 سم / بكسل) من عملائنا ، شركة Shakhty ، يمكنهم استخدام خبرتهم في تحديد الموقع الجغرافي للأشياء على الخرائط ، و كما أتيحت لهم الفرصة لوضع مجموعة محددة من المتطلبات لرحلات الطائرات بدون طيار في المستقبل ، مما أدى في النهاية إلى تقليل احتمال وجود بلاط فريد للغاية لم يكن في مجموعة التدريب ؛

الحل الأول للمشكلة ، هو السكتة الدماغية باستخدام مربع الحدود 


بضع كلمات حول الأدوات التي استخدمناها لإنشاء الحل.

  • أناكوندا هو نظام ملائم لإدارة حزم Python و R.
  • Tensorflow هي مكتبة برامج تعلم آلي مفتوحة المصدر طورتها Google.
  • Keras هو إضافة للإطارات Deeplearning4j و TensorFlow و Theano.
  • OpenCV هي مكتبة خوارزميات لرؤية الكمبيوتر ومعالجة الصور والخوارزميات العددية مفتوحة المصدر للأغراض العامة.
  • Flask هو إطار عمل لإنشاء تطبيقات الويب بلغة برمجة Python.

كما استخدم نظام التشغيل Ubuntu 18.04. مع وجود برامج التشغيل على GPU (NVIDIA) في Ubuntu ، كل شيء على ما يرام ، لذا يتم حل المهمة عادةً بأمر واحد:

> sudo apt install nvidia-cuda-toolkit

تحضير البلاط


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

لإجراء التجانب ، تحتاج إلى تحديد المقياس والحجم المطلوبين في الإعدادات.


للترجمات بين أنظمة الإحداثيات ، استخدمنا مكتبة pyproj:

from pyproj import Proj, transform

class Converter:
    P3857 = Proj(init='epsg:3857')
    P4326 = Proj(init='epsg:4326')
...
    def from_3857_to_GPS(self, point):
        x, y = point
        return transform(self.P3857, self.P4326, x, y)
    def from_GPS_to_3857(self, point):
        x, y = point
        return transform(self.P4326, self.P3857, x, y)
...

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


لتثبيت برنامج GeoServer ، يجب عليك إكمال الخطوات التالية.
  1. Java 8.
  2. GeoServer.
  3. , , /usr/share/geoserver
  4.  

    echo «export GEOSERVER_HOME=/usr/share/geoserver» >> ~/.profile
  5. :

    sudo groupadd geoserver
  6. , , :

    sudo usermod -a -G geoserver <user_name>
  7. - :

    sudo chown -R :geoserver /usr/share/geoserver/
  8. :

    sudo chmod -R g+rwx /usr/share/geoserver/
  9. GeoServer 

    cd geoserver/bin && sh startup.sh

GeoServer ليس التطبيق الوحيد الذي يسمح لنا بحل مشكلتنا. كبديل ، على سبيل المثال ، يمكنك التفكير في ArcGIS for Server ، ولكن هذا المنتج ملكية ، لذلك لم نستخدمه.

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

ترميز بيانات التدريب 


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

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

الآن هناك العديد من الخدمات المتاحة التي تتيح لك ترميز الصور - سواء مع رمز مفتوح المصدر للتثبيت على جهاز الكمبيوتر / الخادم الخاص بك ، وحلول الشركة التي تشمل عمل المقيمين الخارجيين ، على سبيل المثال Yandex.Tolok. في هذا المشروع ، استخدمنا أبسط مُعلِّق صور VGG . بدلاً من ذلك ، يمكنك تجربة coco-annotator أو studio-studio . عادة ما نستخدم الأخير لترميز الملفات النصية والصوتية.


للتدريب على ترميز مختلف التعليقات التوضيحية ، تحتاج عادةً إلى إجراء تحول صغير في الحقول ، كمثال لـ VGG .

من أجل حساب مساحة السقف التي سقطت في منطقة التخصيص المستطيل بشكل صحيح ، من الضروري مراعاة عدة شروط:

  • / . :


  • , , :


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

...

lines = cv2.HoughLinesP(edges, 1, np.pi/180, 50, minLineLength=minLineLength, maxLineGap=5)
if lines is not None:
    length = image.shape[0]
    angles = []
    for x1, y1, x2, y2 in lines[0]:
        angle = math.degrees(math.atan2(y2 — y1, x2 - x1))
        angles.append(angle)
    parts_angles.append(angles)
    median_angle = np.median(angles)
...

#     

for x in range(0, image.shape[0]-1, image.shape[0] // count_crops):
    for y in range(0, image.shape[1]-1, image.shape[1] // count_crops):
        get_line(image[x:x+image.shape[0]//count_crops, y:y+image.shape[1]//count_crops, :])
...

#      

np.median([a if a>0 else 90+a for a in np.array(parts_angles).flatten()])

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


h, w = image.shape[:2]
image_center = (w/2, h/2)

if size is None:
    radians = math.radians(angle)
    sin = math.sin(radians)
    cos = math.cos(radians)
    size = (int((h * abs(sin)) + (w * abs(cos))), int((h * abs(cos)) + (w * abs(sin))))
    rotation_matrix = cv2.getRotationMatrix2D(image_center, angle, 1)
    rotation_matrix[0, 2] += ((size[0] / 2) — image_center[0])
    rotation_matrix[1, 2] += ((size[1] / 2) — image_center[1])
else:
    rotation_matrix = cv2.getRotationMatrix2D(image_center, angle, 1)

cv2.warpAffine(image, rotation_matrix, size)

رمز المثال الكامل هنا . إليك ما يبدو عليه:



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

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



الحل النهائي على أساس Mask-RCNN


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

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

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

يضيف Mask R-CNN أيضًا تراكب قناع بكسل لكل بكسل للحصول على المخطط التفصيلي للكائن.

يمكن رؤية صندوق الحدود والأقنعة بوضوح في نتيجة تشغيل النموذج (يتم تشغيل المرشح حسب الحد الأدنى لمنطقة البناء):


تقليديا ، هناك 4 مراحل في تشغيل هذه الشبكة:

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

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

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


المقاييس المستخدمة لتقييم جودة النموذج


عند تحديد جودة النماذج ، غالبًا ما استخدمنا مقياس التقاطع عبر الاتحاد (IoU)


نموذج لتعليمة برمجية لحساب IoU باستخدام geometry.shapely library:

from shapely.geometry import Polygon

true_polygon = Polygon([(2, 2), (2, 6), (5, 6), (5, 2)])
predicted_polygon = Polygon([(3, 3), (3, 7), (6, 7), (6, 3)])
print(true_polygon.intersection(predicted_polygon).area / true_polygon.union(predicted_polygon).area)

>>> 0.3333333333333333

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


يوفر Tensorboard بيانات حول العديد من المقاييس المختلفة. الأكثر إثارة للاهتمام بالنسبة لنا هي:

  • val_mrcnn_bbox_loss - يوضح مدى نجاح النموذج في توطين الكائنات (أي يفرض مربع حدود) ؛
  • val_mrcnn_mask_loss - يوضح مدى نجاح نموذج قطع الكائنات (أي يفرض قناعًا).

التدريب على النماذج والتحقق من صحتها


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

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

إنشاء خدمة خلفية للاعتراف


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

يستخدم Ubuntu systemd ، وسيعطى مثال خاص لهذا النظام. يمكن الاطلاع على رمز الخدمة نفسها هنا . توجد وحدات المستخدم في دليل / etc / systemd / system ، حيث سننشئ ملف الخدمة الخاص بنا. تحرير الملف:

cd /etc/systemd/system

sudo touch my_srv.service




sudo vim my_srv.service

تتكون وحدة النظام من ثلاثة أقسام:

  • [الوحدة] - تصف ترتيب وحالة البداية (على سبيل المثال ، يمكنك إخبار العملية بانتظار بدء خدمة معينة ثم البدء بنفسك فقط) ؛
  • [الخدمة] - تصف معلمات بدء التشغيل ؛
  • [تثبيت] - يصف سلوك الخدمة عند إضافتها لبدء التشغيل.

ونتيجة لذلك ، سيبدو ملفنا كما يلي:

[Unit]
Description=my_test_unit

[Service]
WorkingDirectory=/home/user/test_project
User=root
ExecStart=/home/user/test_project/venv/bin/python3 /home/user/test_project/script.py

[Install]
WantedBy=multi-user.target

الآن أعد تحميل تهيئة systemd وقم بتشغيل خدمتنا:

sudo systemctl daemon-reload
sudo systemctl start my_srv.service

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

الموجودات


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

نتيجة لتقييم دقة النموذج على بيانات الاختبار ، تم الحصول على القيم التالية: عدد الأسقف التي تم العثور عليها - 91٪ ، دقة مضلعات الخطوط العريضة - 94٪.

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

الآن حتى دار الأوبرا في سيدني لن تفلت من أعين نموذجنا. 


نخطط لتقديم هذه الخدمة مع نموذج مدرب على الطلب لدينا. إذا كنت مهتمًا بتجربة الخدمة على صورك ، فأرسل التطبيقات إلى ai@norbit.ru.

All Articles