Tanda dari Atas: Bagaimana Kami Menyelamatkan Kartografer dari Pekerjaan yang Tidak Perlu dan Mata Merah

gambar

2GIS bangga akan akurasi data. Setiap hari kerja di setiap kota, para ahli kami berkeliling ke seluruh area untuk memperbaiki semua perubahan pada peta - rumah baru, jalan dan bahkan jalan setapak. Dan mereka juga mengumpulkan dan memasang rambu-rambu jalan di atasnya, membantu membangun rute jalan dan kaki dengan benar. Dalam artikel ini saya akan memberi tahu Anda bagaimana kami memutuskan untuk membantu kartografer dan mulai mengumpulkan rambu-rambu jalan secara otomatis.

Apa itu Fiji dan mengapa ada tanda-tanda


Fiji adalah editor peta yang kami kembangkan untuk spesialis GIS kami. Ini adalah aplikasi server klien klasik. Sudah ada beberapa artikel di hub: di mana kita berbicara tentang Fiji:


Cara mengumpulkan tanda-tanda sebelumnya


Fiji memiliki mode operasi khusus untuk mengumpulkan dan memperbarui tanda-tanda. Dalam mode ini, mapper dapat membuka video yang direkam oleh DVR. Video itu sendiri ditampilkan di jendela terpisah, dan treknya ditampilkan di peta. Marker menunjukkan posisi saat ini.

gambar

Kotak diterapkan di atas video - memungkinkan Anda untuk menentukan jarak ke tanda. Segera setelah karakter menjadi ukuran sel, kartografer berhenti sebentar dan menciptakan karakter. Pada saat ini, kami tahu posisi saat ini dan jarak ke tanda, jadi kami bergerak maju dan menariknya ke tautan. Tautan dalam terminologi kami adalah representasi skematis dari bagian jalan. Setiap karakter memiliki kode numeriknya sendiri, kartografernya memasuki bidang khusus.

Jika kita sudah memasukkan karakter, maka kita memuatnya ke dalam editor karakter. Cartografer memeriksa video dan, jika perlu, melakukan perubahan menggunakan kode numerik yang sama. Atau, jika tandanya benar, tandai sebagai diperbarui.

Tentu saja, metode ini mengharuskan pembuat peta untuk melihat setiap video - dan kemudian juga menghabiskan waktu untuk memasukkan setiap karakter. Selain itu, posisi tanda pada peta tidak ditentukan secara akurat: kita cukup menyimpang dari posisi saat ini dengan jarak yang ditentukan oleh kisi, dan kemudian kita menggambar titik yang dihasilkan ke jalan terdekat. Akibatnya, tanda-tanda tidak dapat dibuat tepat di sana (atau bahkan tidak sama sekali) jika perlu. Ini berarti bahwa pembuat peta juga harus memindahkannya ke tempat yang tepat, yang juga menghabiskan waktunya. Selain itu, video mungkin tidak memiliki tanda sama sekali, tetapi kartografer masih dipaksa untuk melihatnya. Tentu saja, program ini memungkinkan Anda untuk meningkatkan kecepatan video, tetapi biaya waktu dalam hal apa pun akan lebih dari nol. Karena itu, kami memutuskan untuk mengotomatiskan proses ini.

Cara mengumpulkan sekarang


Kami masih membutuhkan video pendaftar. Tapi sekarang, alih-alih melihat masing-masing, kartografer hanya memilih file yang diperlukan dan menekan tombol "Unduh". Setelah itu, ia dapat melakukan hal-hal lain - video akan diproses dan rambu-rambu jalan akan muncul di peta. Berbagai kasus yang meragukan akan secara khusus dicatat. Oleh karena itu, yang tersisa bagi pembuat peta adalah memeriksa kasus-kasus ini dan memperbaikinya.

Arsitektur


gambar

Untuk mendapatkan objek dari kelas yang diperlukan dengan atribut yang diperlukan dari video, kami menulis beberapa layanan.

Yang pertama adalah VideoPreprocessingService - ini adalah tempat file video diunggah. Layanan mengirim file ke repositori, membuat catatan tentang hal itu dalam database, dan membuat tugas untuk diproses. Anda perlu memotong bingkai dari video dengan frekuensi tertentu, pilih titik GPS untuk mereka dari trek untuk mereka, mengirim hasilnya ke layanan Pemrosesan Bingkai.

Dua tugas pertama dilakukan bukan oleh layanan itu sendiri, tetapi oleh Pekerja. Ini dilakukan agar Anda dapat dengan mudah mengubah jumlah pekerja ini. Sehingga meningkatkan produktivitas, jika ada kebutuhan seperti itu.

FrameProcessingService menyimpan sendiri semua frame dan poin yang diterima. Dia juga mengunggah bingkai ke antrean. Itu dibaca oleh layanan yang ditulis oleh sesama ahli Pembelajaran Mesin kami. Dia mengenali rambu-rambu lalu lintas. Tentu saja, FrameProcessingService membaca kedua respons dari layanan ini - ini adalah kode karakter, jika mereka ada di bingkai, dan persegi panjang di mana karakter ini dituliskan. Mengetahui ukuran persegi panjang, kami memahami jarak ke tanda. Dan ketika semua frame dari video diproses - ia mengirimkannya ke server peta kami.

Server peta adalah bagian terpenting dari sistem. Klien menerima darinya semua data yang kami simpan ( kecuali untuk ubin ). Dia menyimpan data ini dan menjalankan semua logika bisnis.

Deskripsi Umum


Data peta kami adalah objek geo. Objek geo adalah geometri (yaitu, lokasi objek di ruang) dan sekumpulan atribut. Kami menyimpannya di basis data dan mengoperasikannya. Tapi dari FrameProcessingService kita hanya mendapatkan kode tanda, koordinat titik dari mana tanda itu dikenali, bingkai itu sendiri dan topeng tanda pada bingkai ini. Jadi kita perlu mengubah kumpulan data ini menjadi objek geo. Setiap objek geo milik kelas tertentu. Setiap jenis tanda jalan adalah kelas yang terpisah. Kita dapat dengan mudah mendapatkannya dari kode tanda. Dari kode tanda kita bisa mendapatkan atribut khusus untuk kelas ini. Misalnya, kami menerima kode 3_24_60. 3_24 - mengatakan bahwa ini adalah batas kecepatan (tandatangani 3,24 dalam peraturan lalu lintas). Nilai pembatasan harus ditunjukkan untuk karakter ini. Dia memberi tahu kita bagian ketiga dari kode - ini dia akan menjadi 60 km / jam.

Jadi, kelas objek geo didefinisikan, atributnya juga spesifik. Tampaknya Anda sudah dapat membuat objek geo. Tapi ini masih terlalu dini. Pertama, setiap tanda memiliki atribut "Arah", yang mengatakan ke arah mana tanda bertindak. Kedua, kami masih belum memiliki geometri untuk objek geo ini. Kami memiliki titik dari mana kami melihat tanda. Jadi, tanda itu sendiri agak jauh dari kita. Selain itu, geometrinya memengaruhi nilai atribut Direction.

gambar

Di sini kita akan melakukan penyimpangan kecil. Tentu saja, kami memiliki jaringan jalan. Ini terdiri dari tautan individual. Setiap tautan adalah sebuah garis. Pada bagian pertama gambar kita baru saja menggambar dua tautan. Panah menunjukkan arah di mana mereka ditarik, yaitu kiri ditarik dari bawah ke atas, dan kanan - dari atas ke bawah.

Setiap tautan membawa informasi tentang ke arah mana Anda dapat bergerak di sepanjang itu. Arah gerakan adalah atribut terpisah, tidak sama dengan arah render. Atribut ini memberi tahu kami ke arah mana Anda dapat bergerak di sepanjang tautan, relatif terhadap arah gambar. Di bagian kedua gambar, kedua tautan memiliki nilai yang sama untuk atribut ini, dan di angka ketiga - nilai yang berlawanan.

Bagaimana ini berhubungan dengan tanda? Jadi, kami bergerak di sepanjang tautan dari bawah ke atas, dan kami melihat semacam tanda. Jadi, di tautan kiri tandanya akan memiliki arah "Hanya lurus", di kanan - "Hanya kembali", yaitu sama seperti tautan pada gambar ketiga. Semuanya ternyata sederhana di sini, tetapi ini karena tautan kami satu arah. Pada kenyataannya, jumlah tautan yang sangat besar bersifat bilateral, mis. arah mereka memiliki arti "Di kedua arah." Dan tanda itu selalu diarahkan ke satu arah, dan kita perlu memahami ke arah mana.

Pencocokan peta


Sebelum mulai menempatkan rambu di peta, kita perlu memahami jalan apa yang kita kendarai saat merekam video. Data GPS tidak cukup untuk ini: sering keliru untuk puluhan meter. Selain itu, peta masih berupa skema dan mungkin juga tidak bertepatan dengan medan nyata. Misalnya, di jalan multi-jalur lebar.

Ini akan memecahkan sejumlah masalah sekaligus:

  • Tanda-tanda sudah bisa dibuat di jalan-jalan ini, jadi kami bisa mengubahnya, jika ada;
  • Beberapa tanda-tanda ini mungkin tidak muncul di video, dan kita dapat menemukan tanda-tanda tersebut - dan menempatkannya label khusus;
  • Kita dapat memahami jalan apa yang kita lalui ketika kita melihat tanda yang dikenali, yang, pada gilirannya, akan membantu kita menempatkan tanda ini di tempat yang tepat di peta.

Algoritma


Algoritma yang kami gunakan cukup sederhana. Sudah ada artikel tentang HabrΓ© dengan uraiannya. Secara umum, kedengarannya seperti ini: kami memiliki jalan yang dipilih, ambil titik GPS terdekat dengan ujungnya dari trek. Dan mengenai titik ini, kami mengevaluasi jalan yang bergabung dengan jalur kami - yaitu, kami mengevaluasi seberapa mungkin titik kami merujuk ke jalan khusus ini. Setiap jalan menerima poin, satu dengan poin terbanyak dipilih. Ulangi sampai trek berakhir.

Dalam prosesnya, kami membuat beberapa penambahan pada algoritma. Algoritma tidak memperhitungkan arah pada tautan jalan, jadi hal pertama yang kami lakukan adalah mulai memperhitungkannya: sekarang, jika tautannya satu arah, kami memahami arah yang harus kami tempuh. Dan jika arah ini tidak sesuai dengan arah tautan, kami membuang tautan ini.

Awalnya, menurut kami ini sudah cukup, dan tes pertama mengkonfirmasi hal ini. Tapi kemudian kami mulai memeriksa video yang direkam di lingkungan perumahan, dan semuanya ternyata tidak begitu cerah. Faktanya adalah kita memiliki akurasi data yang sangat tinggi, termasuk di jalan. Oleh karena itu, kami telah menggambar semua jalan masuk intra-kuartal, hingga ke detail terkecil. Di sisi lain - seperti yang saya katakan, GPS mungkin tidak terlalu akurat atau bahkan sangat tidak akurat. Dan jika Anda pergi di jalan di mana ada gedung-gedung tinggi, maka titik-titik di trek bisa pergi dengan sangat kuat. Dulu terjadi bahwa titik-titik bergerak ke arah lebih dari 20 meter. Hasilnya, ternyata banyak titik yang dekat dengan jalan-jalan yang tidak kami kunjungi. Hasil susut trek tersebut adalah gambar ini:

gambar
Akal sehat memberi tahu kami bahwa ada beberapa rambu di jalan-jalan seperti itu, dan karena itu tidak ada alasan khusus untuk mengumpulkannya di sana. Karena itu, kemungkinan besar, dalam kebanyakan kasus, mobil bergerak di sepanjang jalan utama. Oleh karena itu, untuk jalur masuk intra-kuartal, kami memperkenalkan denda. Denda yang kami maksudkan adalah penurunan jumlah titik di sepanjang jalan. Akibatnya, masalah dengan jalan masuk intra-kuartal diselesaikan - mereka tidak keluar ketika kami tidak mengikuti mereka, dan ketika kami benar-benar mengikuti mereka, bahkan meskipun baik-baik saja, mereka ternyata menjadi pilihan terbaik dan kemudian kami memilih mereka.

Setelah itu, hasilnya sudah sangat bagus. Dan bagi kami tampaknya pemetaan peta sudah berakhir. Tapi masalahnya datang, dari mana mereka tidak menunggu. Tiba-tiba ternyata ada kasus ketika jalan lain bercabang dari jalan, dan melakukannya dengan sangat lancar. Dan semuanya diperparah oleh kenyataan bahwa jalan cabang juga bisa paralel dengan jalan kita, setidaknya untuk beberapa waktu. Pada saat yang sama, saya ingatkan Anda, trek GPS hampir tidak pernah terletak di atas tautan yang kami lalui, sedikit mengimbangi ke beberapa sisi. Dan tentu saja, berkat semua ini, algoritme mulai melekat pada cabang-cabang ini. Karenanya, yang paling baik, kami menerima beberapa tautan yang sebenarnya tidak kami lalui. Dan yang terburuk - mereka duduk di jalur yang sangat salah.

gambar

Karena itu, kami datang dengan penilaian jalan tambahan. Kami mengambil titik sebelumnya dan selanjutnya dari trek GPS relatif terhadap titik dari mana kami memilih tautan. Dan kita melihat bahwa azimuth pada titik-titik ini tidak jauh berbeda dari azimuth pergerakan di sepanjang tautan ini. Jika ini sangat berbeda, kami memperbaiki tautan ini.

Akibatnya, kami mendapat hasil yang sesuai dengan kami, meskipun terkadang kesalahan kecil masih terjadi (terkadang tautan tambahan dapat dipilih yang tidak kami lalui). Tetapi mereka sangat jarang, dan karenanya tidak penting bagi kita.

Penempatan karakter


Sekarang kami memiliki satu set ruas jalan yang kami lewati, dan satu set bingkai dengan rambu. Serta informasi tentang karakter yang ada di bingkai ini, dari titik mana di jalur bingkai ini diperoleh dan topeng karakter (kotak yang menggambarkan karakter pada frame ini). Jadi, Anda dapat menempatkan tanda-tanda ini di peta.

Langkah pertama adalah mendapatkan informasi tambahan yang akan membantu kami menempatkan tanda di tempat yang tepat:

  1. Tanda Azimuth. Jika tanda terletak tepat di tengah bingkai, itu bertepatan dengan azimuth di titik GPS. Jika tanda tidak terpusat, ini adalah azimuth pada titik + sudut antara pusat bingkai dan tanda. Kami sudah memiliki azimuth dari titik GPS, dan kami dapat menghitung sudut antara pusat bingkai dan tanda, karena kita tahu di mana topeng tanda berada di bingkai dan kita tahu sudut melihat dengan mana video direkam.
  2. Jarak ke tanda dari titik GPS. Kami dapat menghitungnya, karena kita tahu ukuran topeng tanda, resolusi bingkai dan sudut pandang yang dengannya video direkam.

Sekarang Anda bisa langsung menuju pemasangan tanda. Karena titik di trek tidak selalu (tetapi sebenarnya tidak pernah) terletak di ruas jalan, pertama-tama kita harus meletakkan titik deteksi rambu di tautan. Kami melakukannya sebagai berikut:

  1. Di antara jalan tempat lintasan diletakkan, kami hanya menyisakan yang melintasi semacam penyangga di sekitar titik GPS kami;
  2. Kami menghitung jarak ke setiap jalan yang dipilih dan mengurutkannya berdasarkan peningkatannya;
  3. Kami mengambil jalan, menghitung proyeksi titik GPS di atasnya;
  4. Kita mendapatkan arah dengan mana kita bergerak pada titik ini di sepanjang jalan ini;
  5. Jika arah dari item 4 tidak dapat diterima di jalan ini, maka kami kembali ke item 3 dan mengambil jalan berikutnya di sana;
  6. Jika arahnya dapat diterima, maka berhentilah.

Sekarang kita memiliki jalan yang kita ambil ketika kita mengatur titik GPS, dan proyeksi titik ini ke jalan kita. Bahkan, jalan ini, dan karenanya intinya, mungkin tidak dipilih dengan benar. Misalnya, menikung sangat mudah untuk melakukan kesalahan.

gambar

Karena itu, sebelum melanjutkan, Anda perlu memastikan bahwa kami tidak salah. Atau, jika Anda membuat kesalahan, ganti jalan dengan yang benar dan dapatkan proyeksi ke sana. Untuk melakukan ini, ambil jalan yang menghubungkan ke jalan kami dan evaluasi dengan jarak dan azimuth. Akibatnya, kami mendapatkan jalan yang paling cocok untuk titik tertentu dan membuat proyeksi ke sana.

Sekarang setelah titik GPS kami ditarik ke jalan, kami dapat menghitung lokasi tanda relatif terhadapnya. Untuk melakukan ini, buat vektor dari titik ini dengan panjang yang sama dengan jarak ke tanda di arah yang bertepatan dengan tanda azimuth. Setelah itu, kami mencoba menarik tanda ke salah satu jalan tempat kami duduk. Dalam hal ini, kami memperhitungkan arah jalan dan arah tanda, yang dihitung untuk setiap jalan melalui azimuth tanda.

Pada tahap ini, mungkin ternyata tidak ada jalan yang cocok. Misalnya, karena tanda bahwa akan memiliki arah yang tidak dapat diterima di jalan-jalan ini (yaitu, mereka satu arah). Dalam hal ini, tanda ini terletak di beberapa jalan tetangga yang tidak kami lewati, yang berarti kami tidak akan membuatnya.

Sekarang kita memiliki koordinat tanda yang ditarik ke jalan, masih untuk memverifikasi bahwa itu diatur dengan benar, karena kadang-kadang kita dapat membuat kesalahan. Untuk melakukan ini, kami memverifikasi bahwa tanda tidak terlalu jauh dari titik GPS asli dengan membandingkan jarak ini dengan jarak ke tanda yang diperoleh melalui bingkai, dengan beberapa asumsi. Juga periksa bahwa tanda tidak di belakang titik GPS. Jika validasi berhasil, kami mendapat koordinat tanda di jalan dan arahnya, yang berarti bahwa objek geo kami memiliki geometri dan semua atribut yang diperlukan. Anda dapat melanjutkan untuk menyimpannya.

Gabungkan tanda


Faktanya, masih terlalu dini untuk beralih ke konservasi. Faktanya adalah bahwa setiap tanda dapat dilihat dari beberapa bingkai, dengan pengecualian beberapa kasus khusus, ketika tanda tersebut tersembunyi di balik beberapa hambatan, misalnya, di belakang truk, pada bagian dari bingkai.

Dari masing-masing frame ini kita mendapatkan objek geo untuk tanda, mereka memiliki atribut yang sama dan mereka berada di titik yang sama. Ini berarti bahwa kita hanya perlu meninggalkan satu dari mereka. Selain itu, jika tanda ini bukan baru, maka kita sudah memilikinya di database, yang berarti kita harus menandai bahwa itu diperbarui, dan tidak membuat objek geo baru.

Untuk ini, kami melakukan penggabungan objek geo baru antara kami dan yang sudah ada.
Pertama-tama, kita mendapatkan semua tanda yang sudah kita buat, pada tautan yang kita kendarai. Untuk mereka, kami menambahkan semua karakter yang kami kenali dari bingkai.

Apa yang perlu kita lakukan dengan mereka: kita perlu memahami dari kelas mereka, atribut dan geometri bahwa beberapa set objek geo ini adalah tanda yang sama. Jika ada objek geo yang ada di set ini, biarkan saja dan perhatikan bahwa itu telah diperbarui. Jika set hanya berisi objek geo baru, sisakan hanya satu.

Kami melakukan ini dalam empat langkah:

  1. Kelompokkan objek geo berdasarkan kelasnya;
  2. Di setiap grup dari langkah 1 kami memperoleh grup dengan atribut;
  3. Untuk setiap grup dari langkah 2, kami mengumpulkan grup dengan geometri;
  4. Jika ada tanda yang ada di grup dari langkah 3, kami hanya meninggalkannya (jika ada beberapa di antaranya, maka kami meninggalkan semuanya), dan jika tidak ada tanda yang ada di grup, kami meninggalkan yang ada di tengah.

Setelah itu, kami memiliki jumlah karakter yang diinginkan yang akhirnya dapat disimpan.

gambar

Tentu saja, mungkin kami memiliki semacam tanda, tetapi kami tidak mengenalinya dengan video. Dalam hal ini, simbol ini tidak akan diperbarui. Sayangnya, kami tidak dapat memastikan bahwa tanda ini juga sudah tidak ada lagi, karena itu bisa saja ditutupi oleh semacam kendala saat merekam video. Karena itu, kami tidak langsung menghapus tanda ini, tetapi menandainya sebagai hilang di video. Jika tanda ini terlihat di beberapa video lain, maka kami cukup menghapus tanda ini dan memperbaruinya. Jika dia masih tidak akan terlihat - kartografer harus berurusan dengan tanda ini. Dan hapus jika itu benar-benar tidak ada lagi.

Rencana segera


Tanda-tanda dari sisi jalan


Video ini menunjukkan tanda-tanda tidak hanya dari jalan yang kita kendarai, tetapi juga dari jalan samping: ini mungkin jalan yang melintasi kita atau yang bersebelahan dengan kita. Atau sebaliknya - jalan yang bercabang dari kita. Bahkan bisa berupa jalan yang sejajar dengan kita. Sangat sulit untuk membedakan tanda-tanda yang berdiri di jalan-jalan ini dari tanda-tanda yang kita butuhkan. Lagipula, seringkali mereka dekat dengan jalan kita.

Untuk mengatasi masalah, kami berencana untuk menggunakan sejumlah aturan semantik saat menempatkan tanda pada tautan. Misalnya, batas kecepatan 5 km / jam tidak mungkin berada di jalan raya, tetapi sangat mungkin itu berada di pintu masuk ke pompa bensin.

Tanda-tanda pelacakan


Terkadang kita tidak menyimpan tanda, dan terkadang sebaliknya - kita memegang tanda yang tidak perlu digabungkan. Oleh karena itu, kami berencana untuk melacak karakter dengan bingkai - untuk mengenali karakter yang sama pada bingkai yang berbeda bahkan sebelum kita mengubahnya menjadi objek geo. Dan gunakan pengetahuan ini dengan gabungan.

Kesimpulan


Versi saat ini pada dasarnya adalah beta. Karena itu, tidak sempurna. Ada masalah yang akan kita selesaikan dalam waktu dekat. Ada masalah yang masih belum jelas bagaimana menyelesaikannya. , . , GPS- . , β€” , . , , .

. , . , , - .

Source: https://habr.com/ru/post/id457342/


All Articles