Jalur Tanah

Ringkasan

Garis Tanah adalah eksperimen yang memungkinkan Anda menjelajahi gambar satelit Google Earth melalui gestur. Dengan kombinasi machine learning, pengoptimalan data, dan daya kartu grafis, eksperimen ini dapat berjalan secara efisien di browser web ponsel Anda tanpa memerlukan server backend. Ini adalah gambaran tentang proses pengembangan kami dan berbagai pendekatan yang telah kami coba untuk mengarahkan kami ke hasil akhir.

https://g.co/LandLines

Ketika tim Data Arts mendekati saya untuk mengeksplorasi kumpulan data gambar bumi, saya cukup bersemangat - gambarnya indah, memperlihatkan semua jenis struktur dan tekstur yang berbeda, baik buatan manusia maupun alami, dan saya tertarik dengan cara menghubungkan set data ini. Saya melakukan berbagai eksperimen awal untuk melihat kesamaan gambar dan cara yang berbeda untuk menyaring dan mengatur gambar tersebut.

Tata letak kemiripan t-sne
tata letak kesamaan t-sne, resolusi tinggi 50 mb

Sebagai grup, kami terus kembali ke garis-garis indah dan dominan dalam gambar. Garis-garis ini mudah ditemukan - jalan raya, sungai, tepi gunung, dan bidang tanah - dan kami merancang beberapa proyek untuk mengeksplorasinya. Sebagai seorang seniman, saya terinspirasi oleh hal-hal indah yang dapat Anda lakukan dengan koleksi garis - lihat misalnya karya Cassandra C Jones dengan petir - dan saya sangat bersemangat untuk bekerja dengan kumpulan data ini.

Deteksi Garis

Salah satu tantangan awal adalah bagaimana mendeteksi garis dalam gambar. Anda dapat dengan mudah mengambil selembar kertas kalkir, melemparnya di atas cetakan salah satu foto ini, dan menggambar garis yang dilihat mata Anda. Namun, dalam algoritma penglihatan komputer umum untuk menemukan garis cenderung tidak berfungsi dengan baik pada gambar yang sangat beragam.

Saya mengembangkan penelusuran versi sebelumnya dengan menggambar algoritma pada project dengan Local Projects dan untuk itu, kami menyerahkan anotasi baris yang harus ditelusuri. Menggambar di atas karya seni itu menyenangkan, tetapi membosankan saat berpindah dari puluhan gambar ke ribuan gambar. saya ingin mencoba mengotomatiskan proses pencarian garis.

Dengan gambar udara ini, saya mencoba algoritma deteksi garis tradisional seperti deteksi tepi celah openCv, tetapi saya menemukan bahwa gambar tersebut memberikan segmen garis yang sangat terputus-putus atau jika batasnya terlalu longgar, terlalu banyak garis palsu. Selain itu, batas untuk mendapatkan hasil yang baik berbeda-beda di berbagai kumpulan gambar, dan saya menginginkan algoritma untuk menemukan kumpulan garis bagus yang konsisten tanpa pengawasan.

Saya bereksperimen dengan berbagai algoritma deteksi garis, termasuk yang terbaru seperti gPb (PDF) yang meskipun memberikan hasil luar biasa, hanya membutuhkan beberapa menit untuk dijalankan per gambar. Pada akhirnya, saya memilih deteksi tepi Datar Terstruktur, sebuah algoritma yang mengirimkan openCV.

Setelah saya memiliki "gambar garis" yang bagus, saya masih kesulitan untuk mendapatkan garis dan mengidentifikasi baris satu per satu satu sama lain - dengan kata lain, bagaimana cara mengambil data raster ini dan membuatnya menjadi vektor. Sering kali saat saya mempelajari masalah penglihatan komputer, saya menyelidiki imageJ, lingkungan pemrosesan gambar berbasis java open source yang digunakan oleh para ilmuwan dan periset dengan ekosistem plugin yang sehat. Saya menemukan plugin bernama deteksi batas, yang membantu mengambil gambar intensitas dan mengubahnya menjadi satu set segmen garis. (Sebagai catatan, saya juga mendapati kode pendeteksian tepi dan pelabelan dari Matlab ini berguna).

Gambar dengan segmen garis yang terdeteksi
Gambar dengan segmen garis yang terdeteksi

Serverless

Saya juga ingin melihat apakah mungkin membuat aplikasi visualisasi data yang pada dasarnya serverless, dengan kerja keras mencocokkan dan menghubungkan di sisi klien. Saya biasanya bekerja di openFrameworks, yakni framework c++ untuk coding kreatif, dan selain project node sesekali, saya belum melakukan banyak coding sisi server. Saya penasaran apakah mungkin melakukan semua penghitungan sisi klien dan hanya menggunakan server untuk menyajikan data json dan gambar.

Untuk aplikasi gambar, pencocokan adalah operasi yang sangat berat. Saat Anda menggambar sebuah garis, kita perlu menemukan hasil yang paling cocok di antara lebih dari puluhan ribu segmen garis. Untuk menghitung jarak satu gambar ke gambar lainnya, kami menggunakan metrik dari pengenal gestur dolar yang juga melibatkan banyak penghitungan jarak. Sebelumnya, saya telah menggunakan threading dan trik lainnya, tetapi untuk membuatnya berfungsi secara real time di perangkat klien (termasuk ponsel), saya membutuhkan sesuatu yang lebih baik. Saya mempelajari hierarki metrik untuk menemukan tetangga terdekat/terdekat, dan saya memilih pohon titik pandang (penerapan JavaScript). Hierarki titik pandang pada dasarnya dibuat berdasarkan sekumpulan data dan metrik jarak. Saat Anda memasukkan bagian data baru, hierarki ini akan memberi Anda daftar nilai terdekat dengan cukup cepat. Pertama kali saya melihat pekerjaan ini di ponsel, saya terkejut. Salah satu manfaat besar dari implementasi hierarki titik yang menguntungkan ini adalah Anda dapat menyimpan hierarki setelah dihitung dan menghemat biaya komputasi pohon ini.

Hasil terdekat Hasil yang digambar
Contoh hasil dari hierarki sudut pandang, input yang digambar ada di sisi kanan, dan hasil terdekat ada di sebelah kiri.

Tantangan lain untuk membuatnya berfungsi tanpa server adalah memuat data ke perangkat seluler - Untuk gambar, data segmen garis dan hierarki lebih dari 12 MB dan gambarnya cukup besar, kami ingin pengalaman terasa cepat dan responsif, dan tujuannya adalah mencoba agar download tetap kecil. Solusi kami adalah memuat data secara bertahap. Di aplikasi gambar, kami membagi kumpulan data hierarki titik pandang menjadi 5 bagian dan saat aplikasi dimuat, hanya memuat potongan pertama, lalu setiap 10 detik, aplikasi akan memuat potongan data lain di latar belakang sehingga pada dasarnya aplikasi menjadi semakin baik dan semakin baik selama menit pertama digunakan. Gambar baru dimuat di latar belakang saat aplikasi tarik juga bekerja keras untuk meng-cache gambar.

Terakhir, satu hal yang saya temukan lebih sulit dari yang diharapkan adalah membuat pra-pemuat untuk kedua aplikasi, sehingga penundaan awal karena pemuatan data dapat dimengerti. Saya menggunakan callback progres pada permintaan ajax dan di sisi pixi.js, memeriksa bahwa gambar yang dimuat secara asinkron benar-benar dimuat dan menggunakannya untuk mendorong pesan pramuat.

Saluran Terhubung

Untuk tarik, saya ingin membuat garis tak berujung dari garis yang kita temukan di deteksi tepi. Langkah pertama adalah memfilter garis dari algoritme deteksi garis dan mengidentifikasi garis panjang yang dimulai di satu tepi dan berakhir di salah satu dari tiga tepi lainnya.

Jalur sambungan ditandai dengan warna merah Jalur sambungan ditandai dengan warna merah
Jalur baik untuk sambungan ditandai dengan warna merah

Setelah saya memiliki sekumpulan garis panjang (atau untuk menggunakan istilah yang lebih akurat, polyline, kumpulan titik yang terhubung) untuk menghubungkannya, saya mengonversi garis ini menjadi satu set perubahan sudut. Biasanya, jika memikirkan polyline, Anda membayangkannya sebagai satu set titik: titik a terhubung dengan titik b yang terhubung ke titik c. Sebagai gantinya, Anda dapat memperlakukan garis sebagai himpunan perubahan sudut: Bergerak maju dan putar sejumlah jumlah, gerakkan maju, dan putar sejumlah besar. Cara yang baik untuk memvisualisasikan hal ini adalah dengan memikirkan mesin bending kawat, yang mengambil sepotong kabel dan saat sedang diekstrusi, lakukan rotasi. Bentuk gambar berasal dari putaran.

Jika Anda menganggap garis sebagai perubahan sudut dan bukan titik, akan lebih mudah untuk menggabungkan garis menjadi satu garis yang lebih besar dengan lebih sedikit diskontinuitas - daripada titik merangkai yang pada dasarnya Anda menambahkan perubahan sudut relatif. Untuk menambahkan garis, ambil sudut saat ini dari garis utama aimage0nd dan tambahkan perubahan relatif dari garis yang ingin Anda tambahkan.

Sebagai catatan, saya telah menggunakan teknik untuk mengubah garis menjadi kumpulan perubahan sudut untuk eksploitasi artistik - Anda dapat membuat gambar "uncurl" dengan cara yang mirip dengan cara meluruskan dan merentangkan kabel. Beberapa contoh: satu, dua, tiga

Penghitungan sudut inilah yang memungkinkan kita untuk mengarahkan garis saat Anda menarik - kami menghitung seberapa besar sudut utama dari tempat yang diinginkan, dan kami mencari gambar yang akan membantu untuk garis paling besar yang bergerak ke arah yang tepat. Ini semua hanyalah masalah berpikir secara relatif.

Akhirnya, saya ingin mengatakan bahwa ini adalah proyek yang sangat menyenangkan untuk dikerjakan. Sungguh menyenangkan sebagai seorang seniman yang diminta untuk menggunakan {i>dataset<i} seindah gambar-gambar ini dan saya merasa terhormat karena telah dihubungi oleh tim Data Arts. Saya harap Anda senang bereksperimen dengan ini!