
Pengenalan otomatis citra satelit atau udara adalah cara yang paling menjanjikan untuk mendapatkan informasi tentang lokasi berbagai objek di darat. Penolakan segmentasi gambar manual sangat relevan ketika datang untuk memproses area besar permukaan bumi dalam waktu singkat.
Baru-baru ini, saya mendapat kesempatan untuk menerapkan keterampilan teoretis dan mencoba sendiri di bidang pembelajaran mesin pada proyek segmentasi citra nyata. Tujuan dari proyek ini adalah pengakuan tegakan hutan, yaitu mahkota pohon dalam citra satelit resolusi tinggi. Di bawah potongan, saya akan membagikan pengalaman dan hasil saya.
Ketika datang ke pemrosesan gambar, segmentasi dapat diberikan definisi berikut - ini adalah kehadiran pada gambar area karakteristik yang sama-sama dijelaskan dalam ruang fitur ini.
Bedakan antara kecerahan, kontur, tekstur, dan segmentasi semantik.
Segmentasi gambar semantik (atau semantik) adalah untuk menyorot area pada gambar, yang masing-masing sesuai dengan atribut tertentu. Secara umum, masalah segmentasi semantik sulit untuk algoritma, sehingga jaringan saraf convolutional yang menunjukkan hasil yang baik saat ini banyak digunakan untuk segmentasi gambar.
Pernyataan masalah
Masalah segmentasi biner sedang dipecahkan - gambar berwarna (gambar satelit resolusi tinggi) diumpankan ke input jaringan saraf, di mana perlu untuk menyoroti area piksel milik kelas yang sama - pohon.
Sumber data
Yang saya inginkan ada satu set ubin gambar satelit dari area persegi panjang yang cocok dengan poligon. Di dalamnya, dan Anda perlu mencari pohon. Poligon atau multipoligon disajikan sebagai file GeoJSON. Dalam kasus saya, ubin dalam format png ukuran 256 oleh 256 piksel dalam warna sebenarnya. (sayangnya, tanpa IR) Penomoran ubin dalam bentuk /zoom/x/y.png.
Dijamin bahwa semua ubin di set tersebut diperoleh dari gambar satelit yang diambil pada waktu yang hampir bersamaan (akhir musim semi - awal musim gugur, tergantung pada iklim daerah tertentu) dan satu hari dengan sudut yang sama dengan permukaan, di mana sedikit tutupan awan diizinkan.
Persiapan data
Karena luas poligon yang diinginkan mungkin kurang dari luas persegi ini, hal pertama yang harus dilakukan adalah mengecualikan ubin yang melampaui batas poligon. Untuk melakukan ini, ditulis sebuah skrip sederhana yang memilih ubin yang diperlukan dari poligon file GeoJSON. Ini berfungsi sebagai berikut. Untuk mulai dengan, koordinat semua simpul poligon
dikonversi menjadi nomor ubin dan ditambahkan ke array. Ada juga offset relatif terhadap titik asal. Untuk inspeksi visual, gambar dihasilkan di mana satu piksel sama dengan satu ubin. Poligon pada gambar diisi sudah memperhitungkan offset menggunakan PIL. Setelah itu, gambar ditransfer ke array, dari mana ubin yang diperlukan dipilih, yang jatuh di dalam poligon.
from PIL import Image, ImageDraw
Hasil visual dari mengubah poligon menjadi satu set ubinModel jaringan
Untuk memecahkan masalah segmentasi gambar,
ada sejumlah model jaringan saraf convolutional. Saya memutuskan untuk menggunakan
U-Net , yang telah membuktikan dirinya dalam tugas segmentasi gambar biner. Arsitektur U-Net terdiri dari apa yang disebut jalur kontrak dan ekspansif, yang dihubungkan oleh probros pada tahap ukuran yang sesuai, dan pertama-tama mengurangi resolusi gambar, dan kemudian meningkatkannya, sebelumnya menggabungkannya dengan data gambar dan melewati lapisan lain konvolusi. Dengan demikian, jaringan bertindak sebagai semacam filter. Blok kompresi dan dekompresi disajikan sebagai serangkaian blok dimensi tertentu. Dan setiap blok terdiri dari operasi dasar: konvolusi, ReLu dan max pooling. Ada implementasi model U-Net pada Keras, Tensorflow, Caffe, dan PyTorch. Saya menggunakan Keras.
Membuat set pelatihan
Untuk mempelajari model Unet ini, Anda memerlukan gambar. Hal pertama yang muncul di kepala saya adalah gagasan untuk mengambil data OpenStreetMap dan membuat topeng untuk pelatihan berdasarkan pada mereka. Tetapi ternyata dalam kasus saya, keakuratan poligon yang saya butuhkan meninggalkan banyak yang diinginkan. Saya juga membutuhkan keberadaan pohon tunggal, yang tidak selalu dipetakan. Karena itu, saya harus meninggalkan usaha seperti itu. Tetapi perlu dikatakan, untuk objek lain, seperti jalan atau bangunan, pendekatan ini bisa
efektif .

Karena gagasan untuk secara otomatis menghasilkan sampel pelatihan berdasarkan data OSM harus ditinggalkan, saya memutuskan untuk secara manual menandai area kecil. Untuk melakukan ini, saya menggunakan editor JOSM, di mana saya menggunakan gambar terrain yang tersedia sebagai substrat, yang saya tempatkan di server lokal. Kemudian masalah lain muncul - saya tidak menemukan kesempatan untuk menghidupkan tampilan kotak ubin menggunakan alat JOSM biasa. Oleh karena itu, beberapa baris sederhana dalam .htaccess pada server yang sama dari direktori yang berbeda mulai mengeluarkan ubin kosong dengan batas piksel untuk setiap permintaan dari bentuk grid_tile / z / x / y.png dan menambahkan lapisan dadakan ke JOSM. Sepeda seperti itu.

Pertama, saya menandai sekitar 30 ubin. Dengan tablet grafis dan "mode menggambar cepat" di JOSM, tidak butuh banyak waktu. Saya mengerti bahwa jumlah seperti itu tidak cukup untuk pelatihan penuh, tetapi memutuskan untuk memulai dengan ini. Terlebih lagi, pelatihan tentang begitu banyak data akan cukup cepat.
Pelatihan dan hasil pertama
Jaringan telah dilatih selama 15 era tanpa augmentasi data sebelumnya. Grafik menunjukkan nilai kerugian dan akurasi pada sampel uji:

Hasil pengenalan gambar yang tidak dalam pelatihan maupun dalam sampel uji ternyata cukup waras:

Setelah mempelajari hasil yang lebih menyeluruh, beberapa masalah menjadi jelas. Banyak kesalahan ada di daerah bayangan gambar - jaringan baik menemukan pohon di tempat teduh di mana mereka tidak, atau justru sebaliknya. Ini diharapkan, karena ada beberapa contoh dalam set pelatihan. Tetapi saya tidak menyangka bahwa beberapa bagian permukaan air dan atap gelap dari profil logam (mungkin) akan dikenali sebagai pohon. Ada juga ketidakakuratan dengan rumput. Diputuskan untuk meningkatkan sampel dengan menambahkan sejumlah besar gambar dengan bagian kontroversial, sehingga sampel pelatihan hampir dua kali lipat.
Augmentasi Data
Untuk lebih meningkatkan jumlah data, saya memutuskan untuk memutar gambar pada sudut yang sewenang-wenang. Pertama-tama, saya mencoba modul standar keras.preprocessing.image.ImageDataGenerator. Saat Anda memutar sambil mempertahankan skala, area kosong tetap berada di tepi gambar, yang isinya diatur oleh parameter
fill_mode . Anda cukup mengisi area ini dengan warna dengan menetapkannya dalam
cval , tapi saya ingin rotasi lengkap, berharap pemilihannya akan lebih lengkap, dan saya mengimplementasikan generator sendiri. Ini memungkinkan untuk meningkatkan ukuran lebih dari sepuluh kali.
fill_mode = terdekatGenerator data saya menempelkan empat ubin tetangga menjadi satu sumber ubin 512x512 px. Sudut rotasi dipilih secara acak, dengan mempertimbangkannya, interval yang diijinkan dari x dan y dihitung untuk pusat ubin yang dihasilkan, di mana ia tidak melampaui ubin asli. Koordinat pusat dipilih secara acak dengan mempertimbangkan interval waktu yang diperbolehkan. Tentu saja, semua transformasi ini berlaku untuk pasangan topeng ubin. Semua ini diulangi untuk berbagai kelompok ubin tetangga. Dari satu grup, Anda bisa mendapatkan lebih dari selusin ubin dengan bagian medan yang berbeda diputar pada sudut yang berbeda.
Contoh hasil generatorBelajar dengan lebih banyak data
Hasilnya, ukuran sampel pelatihan adalah 1.881 gambar, saya juga menambah jumlah era menjadi 30:

Setelah melatih model tentang volume data baru, masalah dengan segmentasi atap dan air yang keliru tidak lagi terdeteksi. Sama sekali tidak mungkin untuk menghilangkan kesalahan di tempat teduh, tetapi mereka menjadi lebih sedikit di mata, serta kesalahan dengan rumput. Perlu dicatat bahwa secara umum sebagian besar kesalahan adalah bahwa jaringan melihat pohon di mana mereka tidak, dan bukan sebaliknya. Akurasi yang dicapai dapat ditingkatkan dengan menggunakan gambar satelit dengan sejumlah besar saluran dan memodifikasi arsitektur jaringan untuk tugas tertentu.

Secara umum, saya puas dengan hasil pekerjaan yang dilakukan, dan prototipe jaringan yang terlatih diaplikasikan untuk memecahkan masalah nyata. Misalnya, menghitung kepadatan tegakan hutan di Moskow:
