خطوط أرضية

ملخّص

تتيح لك ميزة Land Lines (الخطوط الأرضية) استكشاف صور الأقمار الصناعية في Google Earth عبر الإيماءات. وباستخدام مزيج من تعلُّم الآلة وتحسين البيانات وطاقة بطاقة الرسومات، يمكن تنفيذ التجربة بكفاءة على متصفّح الويب في هاتفك بدون الحاجة إلى خوادم خلفية. هذه نظرة على عملية التطوير لدينا والأساليب المختلفة التي حاولناها والتي تقودنا إلى النتيجة النهائية.

https://g.co/LandLines

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

تخطيط التشابه t-sne
تنسيق التشابه مع t-sne، دقة عالية 50 ميغابايت

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

رصد الخطوط

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

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

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

لقد جربت مجموعة متنوعة من خوارزميات اكتشاف الخطوط من بينها خوارزميات حديثة مثل gPb (PDF) التي على الرغم من تحقيق نتائج مذهلة، إلا أنها تتطلب دقائق للتشغيل لكل صورة. في النهاية، استقريت على رصد حافة الغابة المنظَّمة، وهي خوارزمية يتم إضافتها إلى openCV.

بمجرد الحصول على "صورة خط" جيدة، لا تزال أواجه مشكلة في الحصول على الخطوط وتحديد الخطوط الفردية من بعضها البعض - على سبيل المثال، كيف أحصل على هذه البيانات النقطية وأجعلها متجهة. في كثير من الأحيان، عندما أنظر إلى مشاكل في رؤية الكمبيوتر، أستكشف imageJ، وهي بيئة مفتوحة المصدر لمعالجة الصور تستند إلى جافا يستخدمها العلماء والباحثون والتي لديها منظومة متكاملة سليمة من المكوّنات الإضافية. وعثرتُ على مكوّن إضافي يُسمى اكتشاف الحواف، يساعد في التقاط صورة بكثافة وتحويلها إلى مجموعة من القطع الخطية. (ملاحظة جانبية، وجدت أيضًا أن رمز اكتشاف الحواف والتصنيف من مكتبة Matlab مفيد).

صورة تضم مقاطع من الخطوط المكتشفة
صورة بها أجزاء من الخط المكتشف

الحوسبة بدون خادم

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

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

أقرب النتائج النتائج المرسومة
تتوفّر أمثلة على النتائج من شجرة نقاط الجودة، والمدخلات المرسومة على الجانب الأيمن، وتكون أقرب النتائج على اليمين.

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

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

خط متصل

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

تم وضع علامة باللون الأحمر على الخطوط الجيدة للاتصال تم وضع علامة باللون الأحمر على الخطوط الجيدة للاتصال
تم وضع علامة على الخطوط الجيدة للاتصال باللون الأحمر

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

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

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

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

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