خطوط زمینی

خلاصه

خطوط زمین آزمایشی است که به شما امکان می دهد تصاویر ماهواره ای Google Earth را از طریق ژست کاوش کنید. با استفاده از ترکیبی از یادگیری ماشین، بهینه سازی داده ها، و قدرت کارت گرافیک، این آزمایش می تواند بدون نیاز به سرورهای پشتیبان به طور موثر در مرورگر وب گوشی شما اجرا شود. این نگاهی به روند توسعه ما و رویکردهای مختلفی است که ما سعی کردیم ما را به نتیجه نهایی هدایت کنیم.

https://g.co/LandLines

وقتی تیم Data Arts در مورد کاوش مجموعه داده‌ای از تصاویر زمین به من نزدیک شد، بسیار هیجان‌زده شدم - تصاویر زیبا بودند، انواع مختلف ساختارها و بافت‌ها، چه ساخته‌شده توسط انسان و چه طبیعی را آشکار می‌کردند، و من شیفته نحوه اتصال این داده‌ها بودم. تنظیم. من آزمایش‌های اولیه مختلفی را انجام دادم که شباهت تصویر و روش‌های مختلف فیلتر کردن و سازمان‌دهی آنها را بررسی کردم.

طرح شباهت t-sne
طرح بندی شباهت t-sne، وضوح بالا 50 مگابایت

ما به عنوان یک گروه مدام به خطوط زیبا و غالب در تصاویر باز می گشتیم. این خطوط به راحتی قابل تشخیص بودند - بزرگراه ها، رودخانه ها، لبه های کوه ها و قطعات زمین - و ما چند پروژه برای کشف آنها طراحی کردیم. من به عنوان یک هنرمند از کارهای زیبایی که می توانید با مجموعه خطوط انجام دهید الهام گرفتم - برای مثال کار کاساندرا سی جونز با رعد و برق را ببینید - و من برای کار با این مجموعه داده هیجان زده بودم.

تشخیص خط

یکی از چالش های اولیه نحوه تشخیص خطوط در تصاویر بود. بیرون آوردن یک تکه کاغذ ردیابی، انداختن آن در بالای پرینت یکی از این عکس‌ها و کشیدن خطوطی که چشم شما می‌بیند آسان است، اما به طور کلی الگوریتم‌های بینایی کامپیوتری برای یافتن خطوط معمولاً در تصاویر بسیار متنوع به خوبی کار نمی‌کنند. .

من یک نسخه قبلی از جستجو را با ترسیم الگوریتم روی یک پروژه با پروژه‌های محلی توسعه دادم و برای آن خطوط را برای جستجو به صورت دستی حاشیه‌نویسی کردیم. کشیدن بر روی آثار هنری سرگرم کننده بود اما وقتی از ده ها تصویر به هزاران تصویر می روید خسته کننده بود. من می خواستم سعی کنم فرآیند یافتن خطوط را خودکار کنم.

با این تصاویر هوایی، الگوریتم‌های سنتی تشخیص خط مانند الگوریتم تشخیص لبه‌های ساده openCv را امتحان کردم، اما متوجه شدم که آنها یا بخش‌های خط بسیار ناپیوسته را ارائه می‌دهند یا اگر آستانه خیلی آرام باشد، هزاران خطوط جعلی را ارائه می‌دهند. همچنین، آستانه‌های رسیدن به نتایج خوب در مجموعه‌های تصویر مختلف متفاوت بود و من الگوریتمی برای یافتن مجموعه‌ای از خطوط خوب بدون نظارت می‌خواستم.

من با انواع الگوریتم‌های تشخیص خط از جمله الگوریتم‌های اخیر مانند gPb (PDF) آزمایش کردم که اگرچه نتایج شگفت‌انگیزی تولید می‌کردند، اما اجرای هر تصویر به دقیقه‌ها نیاز داشت. در پایان من با تشخیص لبه جنگل ساختاریافته ، الگوریتمی که با openCV ارسال می شود، حل و فصل کردم.

هنگامی که من یک "تصویر خط" خوب داشتم، هنوز مشکل دریافت خطوط و شناسایی خطوط جداگانه از یکدیگر را داشتم - به عنوان مثال، چگونه می توانم این داده های شطرنجی را بگیرم و آن را برداریم. اغلب اوقات وقتی به مشکلات بینایی رایانه نگاه می کنم، imageJ را بررسی می کنم، یک محیط پردازش تصویر مبتنی بر جاوا منبع باز که توسط دانشمندان و محققان استفاده می شود و دارای یک اکوسیستم سالم از پلاگین ها است. من افزونه‌ای به نام تشخیص رج پیدا کردم که به گرفتن یک تصویر با شدت و تبدیل آن به مجموعه‌ای از بخش‌های خط کمک می‌کند. (به عنوان یک نکته، این کد تشخیص لبه و برچسب گذاری از Matlab را نیز مفید یافتم).

تصویر با بخش های خط شناسایی شده
تصویر با بخش های خط شناسایی شده

بدون سرور

همچنین می‌خواستم ببینم آیا می‌توان یک برنامه تجسم داده‌ای که اساساً بدون سرور است، که در آن کار سخت تطبیق و اتصال در سمت مشتری اتفاق می‌افتد، انجام داد. من معمولاً در openFrameworks کار می‌کنم، یک چارچوب c++ برای کدنویسی خلاقانه و علاوه بر پروژه‌های گاه به گاه گره ، کدنویسی سمت سرور زیادی انجام نداده‌ام. من کنجکاو بودم که آیا می توان تمام محاسبات سمت مشتری را انجام داد و فقط از سرور فقط برای ارائه داده های json و تصویر استفاده کرد.

برای برنامه قرعه کشی، تطبیق یک عملیات بسیار سنگین است. وقتی خطی را رسم می‌کنید، باید نزدیک‌ترین تطابق را در بین بیش از ده‌ها هزار پاره خط پیدا کنیم. برای محاسبه فاصله یک نقاشی تا نقاشی دیگر، از یک متریک از شناسه ژست دلار استفاده می کنیم که خود شامل محاسبات فاصله زیادی است. در گذشته، من از threading و دیگر ترفندها استفاده می‌کردم، اما برای اینکه بتوانم آن را در زمان واقعی روی یک دستگاه مشتری (از جمله تلفن‌های همراه) کار کنم، به چیز بهتری نیاز داشتم. من به درخت‌های متریک برای یافتن نزدیک‌ترین/نزدیک‌ترین همسایگان نگاه کردم و روی درخت‌های نقطه‌نظر مستقر شدم ( اجرای جاوا اسکریپت ). درخت نقطه‌ی برتری اساساً از مجموعه‌ای از داده‌ها و یک متریک فاصله ساخته می‌شود و وقتی یک قطعه جدید از داده را وارد می‌کنید، به سرعت فهرستی از نزدیک‌ترین مقادیر را به شما می‌دهد. اولین باری که این اثر را روی تلفن همراه دیدم فوراً کف کردم. یکی از مزایای بزرگ پیاده‌سازی درخت نقطه برتری خاص این است که می‌توانید درخت را پس از محاسبه ذخیره کنید و در هزینه‌های محاسبه این درخت صرفه‌جویی کنید.

نزدیکترین نتایجنتایج ترسیم شده
نمونه‌هایی از نتایج درخت امتیاز، ورودی ترسیم شده در سمت راست و نزدیک‌ترین نتایج در سمت چپ هستند.

یکی دیگر از چالش‌های ایجاد آن بدون سرور، بارگیری داده‌ها بر روی یک دستگاه تلفن همراه است - برای ترسیم، داده‌های بخش درخت و خط بیش از 12 مگابایت بود و تصاویر بسیار بزرگ هستند، ما می‌خواستیم تجربه سریع و پاسخ‌گو باشد و هدف ما باشد. این است که سعی کنید دانلود را کوچک نگه دارید. راه حل ما بارگذاری تدریجی داده ها بود. در برنامه قرعه کشی، مجموعه داده های درخت نقطه برتری را به 5 قسمت تقسیم می کنیم و زمانی که برنامه بارگذاری می شود، تنها قسمت اول را بارگیری می کند و سپس هر 10 ثانیه یک تکه دیگر از داده ها را در پس زمینه بارگذاری می کند، بنابراین اساساً برنامه بهتر و بهتر می شود. اولین دقیقه استفاده در برنامه کشیدن نیز سخت کار شد تا تصاویر کش شوند تا با کشیدن، تصاویر جدید در پس زمینه بارگذاری شوند.

در نهایت، چیزی که سخت‌تر از آنچه انتظار می‌رفتم، ساختن یک پیش‌لودر برای هر دو برنامه بود، بنابراین تاخیر اولیه هنگام بارگیری داده‌ها قابل درک است. من از پاسخ تماس پیشرفت در درخواست‌های ajax و در سمت pixi.js استفاده کردم، تصاویر بررسی شده که به‌صورت ناهمزمان بارگیری می‌شوند، در واقع بارگیری شده‌اند و از آن برای هدایت پیام پیش‌بارگیری استفاده می‌کنم.

خط متصل

برای کشیدن، می خواستم از خطوطی که در تشخیص لبه پیدا کردیم، یک خط بی پایان ایجاد کنم. اولین مرحله فیلتر کردن خطوط از الگوریتم تشخیص خط و شناسایی خطوط طولانی بود که از یک لبه شروع و به یکی از سه لبه دیگر ختم می شوند.

خطوط خوب برای اتصال با رنگ قرمز مشخص شده اندخطوط خوب برای اتصال با رنگ قرمز مشخص شده اند
خطوط خوب برای اتصال با رنگ قرمز مشخص شده اند

هنگامی که مجموعه‌ای از خطوط طولانی (یا به عبارت دقیق‌تر، چند خط ، مجموعه‌ای از نقاط متصل) داشتم، این خطوط را به مجموعه‌ای از تغییرات زاویه تبدیل کردم. معمولاً وقتی به چند خط فکر می کنید، آن را مجموعه ای از نقاط تصور می کنید: نقطه a به نقطه b که به نقطه c متصل است متصل می شود. در عوض، می توانید خط را به عنوان مجموعه ای از تغییرات زاویه در نظر بگیرید: به جلو حرکت کنید و مقداری بچرخانید، به جلو حرکت کنید و مقداری بچرخانید. یک راه خوب برای تجسم این موضوع، فکر کردن به ماشین های خم کن سیم است که یک تکه سیم را می گیرند و در حین اکسترود شدن، چرخش را انجام می دهند. شکل نقاشی از چرخش به وجود می آید.

اگر خط را به عنوان تغییر زاویه و نه نقطه در نظر بگیرید، ترکیب خطوط در یک خط بزرگتر با ناپیوستگی کمتر آسان تر می شود - به جای دوختن نقاط، اساساً تغییرات زاویه نسبی را اضافه می کنید. برای اضافه کردن یک خط، زاویه فعلی خط اصلی aimage0 را می گیرید و تغییرات نسبی خطی را که می خواهید اضافه کنید به آن اضافه کنید.

به عنوان یادداشت جانبی، من از این تکنیک تبدیل یک خط به مجموعه‌ای از تغییرات زاویه برای بهره‌برداری هنری استفاده کرده‌ام - می‌توانید نقاشی‌ها را شبیه به پیچش و بازشدن سیم‌ها به صورت «لحن‌دار» کنید. چند مثال: یک ، دو ، سه

این محاسبه زاویه چیزی است که به ما امکان می‌دهد هنگام کشیدن خط، خط را هدایت کنیم - ما محاسبه می‌کنیم که زاویه اصلی از جایی که می‌خواهیم باشیم چقدر فاصله دارد و به دنبال تصویری می‌گردیم که به بیشترین کمک کند که خط در جهت درست پیش برود. همه چیز مربوط به تفکر نسبی است.

در نهایت، فقط می‌خواهم بگویم که این یک پروژه واقعاً سرگرم‌کننده بود. به عنوان یک هنرمند هیجان انگیز است که از شما خواسته شود از مجموعه داده ای به زیبایی این تصاویر استفاده کنید و باعث افتخار من است که تیم Data Arts با آنها تماس گرفته است. امیدوارم از تجربه کردن آن لذت ببرید!