Deteksi kapal pada gambar Sentinel-2 dengan model Mask R-CNN – Menuju AI — Publikasi AI dan Teknologi Terkemuka di Dunia

Pengarang: Andrea C.

Awalnya diterbitkan di Towards AI the World’s Leading AI and Technology News and Media Company. Jika Anda sedang membangun produk atau layanan terkait AI, kami mengundang Anda untuk mempertimbangkan untuk menjadi sponsor AI. Di Towards AI, kami membantu menskalakan AI dan startup teknologi. Biarkan kami membantu Anda melepaskan teknologi Anda kepada massa.

Pembelajaran Mendalam

Deteksi Kapal pada Gambar Sentinel-2 dengan Model Mask R-CNN

Analisis waktu lalu lintas maritim menggunakan PyTorch dan data terbuka

Foto oleh Steve Doig di Unsplash

Sebagai bagian dari proyek ML yang lebih besar, kami memutuskan untuk menjajaki kemungkinan menilai lalu lintas maritim menggunakan citra satelit yang tersedia untuk umum. Secara khusus, tujuan kami adalah untuk memperkirakan deret waktu yang mewakili volume lalu lintas maritim yang diamati dari waktu ke waktu di wilayah tertentu. Dalam artikel ini, kami membahas metodologi dan hasil yang diperoleh.

Catatan: semua kode yang dibahas berikut ini tersedia di GitHub pribadi saya di https://github.com/andrea-ci/s2-ship-detection.

Mengapa data satelit?

Foto oleh Matthijs van Heerikhuize di Unsplash

Satelit sudah naik ke langit
Hal-hal seperti itu membuatku keluar dari pikiranku
Saya menontonnya sebentar
Saya suka menonton sesuatu di TV

Lou Reed, “Satelit cinta”

Dalam beberapa tahun terakhir, penginderaan jauh telah berkembang secara dramatis dan begitu juga bidang lain seperti visi komputer dan pembelajaran mesin. Selain itu, semakin banyak citra satelit yang tersedia untuk umum. Contoh penting termasuk citra konstelasi Landsat dan Sentinel-2.

Satelit menunjukkan tiga keuntungan mendasar bagi pengguna:

mereka mengizinkan akses ke informasi yang seringkali sulit diperoleh dengan cara lain; mereka menyediakan cakupan geografis global; mereka mengumpulkan informasi secara berkala dan dengan resolusi temporal yang tinggi (yang disebut periode kunjungan ulang).

Selain itu, resolusi spasial gambar, yaitu kemampuan untuk membedakan dua objek yang berdekatan, terus meningkat, sehingga memungkinkan semakin banyak aplikasi baru. Contoh terkenal diberikan oleh perusahaan riset pasar [1] yang baru-baru ini memanfaatkan citra satelit untuk menghitung mobil di tempat parkir, untuk memperkirakan permintaan ritel. Pada prinsipnya, metode serupa dapat digunakan juga untuk aplikasi dengan tujuan sosial dan administratif, seperti mengukur lalu lintas perkotaan atau menghitung massa pada rapat umum politik.

Misi Sentinel-2

Dalam percobaan ini, kami mempertimbangkan misi ESA Sentinel-2. Satelit Sentinel-2 dilengkapi dengan Multi-Spectral Instrument (MSI) yang mengumpulkan data menggunakan 13 pita pada 3 resolusi berbeda: 10, 20, dan 60 meter. Untuk mendapatkan resolusi terbaik yang tersedia, kami telah bekerja dengan pita B02, B03, dan B04, yang terletak di spektrum tampak dan memberikan resolusi 10 meter.

Sentinel-2 band dengan resolusi 10 meter — Sumber: https://sentinels.copernicus.eu

Gambar Sentinel-2 dapat diakses dengan berbagai cara, termasuk:

Pendekatan pemodelan

Mendeteksi kapal pada gambar adalah tugas yang sulit karena dengan konstruksi jumlah sampel positif (yaitu piksel milik kapal) sangat kecil dibandingkan dengan jumlah yang negatif. Jadi, alih-alih mencoba tugas klasifikasi semantik, saya memilih untuk menggunakan pendekatan deteksi objek.

Alur kerja pemrosesan — gambar oleh penulis

Sebagai dasar, model Mask R-CNN yang telah dilatih sebelumnya telah dipertimbangkan. Model ini menambahkan cabang tambahan ke model Faster R-CNN, yang pada gilirannya didasarkan pada arsitektur Resnet, yang diperkenalkan dalam “Pembelajaran Residual Mendalam untuk Pengenalan Gambar”.

Resnet adalah singkatan dari Residual Network karena jaringan ini memperkenalkan konsep pembelajaran residual. Pembelajaran residual adalah pendekatan yang bertujuan untuk meningkatkan kinerja jaringan saraf konvolusi dalam untuk tugas klasifikasi dan pengenalan. Secara umum, jaringan dalam mempelajari fitur pada tingkat rendah, menengah, dan tinggi melalui lapisannya. Jaringan residual mempelajari residual, yaitu perbedaan antara fitur, dengan menggunakan koneksi pintasan antar lapisan. Pendekatan ini telah terbukti membuat pelatihan lebih mudah, mendapatkan nilai akurasi yang lebih baik. Model Resnet hadir dalam 5 varian, masing-masing berisi 18, 34, 50, 101, dan 152 lapisan.

Untuk implementasi deep learning, saya telah menggunakan PyTorch dengan model Mask R-CNN yang disediakan oleh TorchVision. Muncul dengan 50 lapisan dan telah dilatih sebelumnya pada dataset COCO.

Sekarang saatnya untuk menyempurnakan model.

Penyesuaian model: data dan pelatihan

Untuk menyempurnakan model, saya telah menggunakan data kompetisi dari Kaggle Airbus Ship Detection Challenge.

Dataset ini terdiri dari 192556 gambar, di mana hanya 42556 yang berisi setidaknya satu kapal (22% dari total). Apalagi sebagian besar (sekitar 60%) berisi tepat satu kapal. Dengan demikian, dataset sangat tidak seimbang dan jumlah sampel positif sangat terbatas.

Untuk membuat segalanya lebih sulit, kapal yang terdapat dalam gambar dapat berbeda secara signifikan dalam ukuran dan mereka dapat ditempatkan di laut lepas atau di dermaga dan marina, misalnya berdekatan dengan daratan.

Dataset dilengkapi dengan file CSV di mana masker kapal diwakili oleh pengkodean run-length. Karena sebagian besar gambar tidak berisi kapal apa pun, saya menghapusnya dari kumpulan data. Untuk yang lainnya, masker dihasilkan sehingga dapat digunakan untuk pembuatan target model.

Mempersiapkan data pelatihan — gambar oleh penulis

Mask adalah array 2D berbasis bilangan bulat, artinya untuk setiap piksel x:

x=0, jika tidak mewakili kapal; x=1, jika merupakan bagian dari kapal pertama; x=2, jika merupakan bagian dari kapal kedua; dan seterusnya.

Penomoran piksel diperlukan untuk mengidentifikasi kapal yang akhirnya disertakan dalam gambar karena model mengembalikan objek (kapal) dan setiap objek dicirikan oleh kotak pembatas yang unik.

Jadi, mengikuti tutorial luar biasa yang disediakan oleh TorchVision, saya telah menyiapkan kode untuk dataset Airbus seperti yang ditunjukkan pada cuplikan berikutnya.

kelas AirbusShipDetection(Dataset): def __init__(self, image_ids, dir_images, dir_masks, transforms = None): self.image_ids = image_ids
self.dir_images = dir_images
self.dir_masks = dir_masks
self._transforms = transforms def __getitem__(self, idx): # Baca gambar RGB.
fn_image = f'{self.image_ids[idx]}.jpg’
path_image = path.join(self.dir_images, fn_image)
image = Image.open(path_image).convert(“RGB”) # Baca topeng berbasis bilangan bulat.
fn_mask = f'{self.image_ids[idx]}_mask.png’
path_mask = path.join(self.dir_mask, fn_mask)
mask = np.array(Image.open(path_mask)) # Instance dikodekan dengan bilangan bulat yang berbeda.
obj_ids = np.unique(mask) # Kami menghapus background (id=0) dari mask.
obj_id = obj_id[1:]
num_objs = len(obj_ids) # Pisahkan topeng menjadi satu set topeng biner
#masker.bentuk[0] = jumlah kejadian
topeng = topeng == obj_ids[:, None, None]
# Dapatkan kotak pembatas setiap topeng.
kotak = []
untuk topeng di topeng: pos = np.where(mask) xmin = np.min(pos[1])
xmax = np.max(pos[1])
ymin = np.min (pos[0])
ymax = np.max(pos[0]) # Terapkan area positif.
jika xmax – xmin < 1:
xmaks += 1
jika ymax – ymin < 1:
ymax += 1 kotak.tambahkan([xmin, ymin, xmax, ymax]) box = torch.as_tensor(boxes, dtype = torch.float32) # Hitung luasnya.
luas = (kotak[:, 3] – kotak[:, 1]) * (kotak[:, 2] – kotak[:, 0]) # Hanya satu kelas (kapal).
label = torch.ones((num_objs,), dtype = torch.int64)
mask = torch.as_tensor(masks, dtype = torch.uint8) # Bendera kerumunan tidak berlaku di sini.
iscrowd = torch.zeros((num_objs,), dtype=torch.int64) image_id = torch.tensor([idx]) sasaran = {}
target[‘boxes’] = kotak
target[‘labels’] = label
target[‘masks’] = topeng
target[‘image_id’] = gambar_id
target[‘area’] = luas
target[‘iscrowd’] = iscrowd # Terapkan augmentasi gambar.
jika self._transforms:
image, target = self._transforms(image, target) mengembalikan gambar, target def __len__(self):
# panjang kembali dari
kembali len(self.image_ids)

Struktur keluaran model terlihat jelas di sini: terdiri dari kamus dengan informasi yang terkait dengan objek yang dideteksi oleh model.

Setelah 10 periode pelatihan, metrik evaluasi menunjukkan nilai yang dapat diterima sehingga pelatihan dapat dihentikan dan model akhirnya siap untuk diterapkan pada gambar Sentinel-2.

Evaluasi model — gambar oleh penulis

Inferensi pada data Sentinel-2

Untuk percobaan, saya memfokuskan pada area kecil di sekitar pelabuhan kota Olbia, di Sardinia (Italia). Pelabuhan ini merupakan salah satu jalur akses utama ke pulau untuk feri yang datang dari semenanjung Italia, terutama selama liburan musim panas.

Periode yang termasuk antara 2017 dan 2020 telah dipertimbangkan dan dua gambar telah diperoleh, pada interval waktu reguler, untuk setiap bulan. Hasilnya, input model terdiri dari urutan 96 gambar RGB mentah. Sayangnya, beberapa di antaranya menghasilkan format yang salah, baik karena masalah API selama pengunduhan atau karena tidak lulus pemeriksaan kualitas rantai pemrosesan Sentinel-2 sehingga harus dibuang.

Inferensi pada snapshot Sentinel-2 — gambar oleh penulis

Urutan gambar diproses oleh model dan hasil deteksi disimpan ke file CSV: untuk setiap gambar, tanggal akuisisi dan jumlah kapal yang terdeteksi dilaporkan. Juga, total area yang ditempati oleh kapal disertakan, meskipun tidak digunakan untuk analisis ini.

Hasil deteksi— gambar oleh penulis

Analisis hasil

Menggunakan Pandas, mudah untuk mengekstrak dan memvisualisasikan deret waktu dari file CSV. Hitungan yang dilaporkan dalam file dirata-ratakan setiap bulan sehingga untuk mendapatkan deret waktu kapal yang diamati setiap hari pada bulan referensi.

Deret waktu menunjukkan musim yang kuat. Kemungkinan besar perilaku ini disebabkan oleh beberapa alasan berbeda:

kegiatan pelabuhan terutama dari jenis wisata dan arus wisatawan lebih besar di musim panas; kondisi cuaca di musim panas mendukung perolehan gambar yang lebih bersih (yaitu dengan tingkat kekeruhan yang rendah), sehingga memungkinkan lebih banyak kapal untuk dideteksi dengan benar.

Kedua faktor ini menyebabkan volume lalu lintas maksimum di musim panas, yang kemudian secara bertahap menurun hingga mencapai nilai minimum selama musim dingin.

Menurut surat kabar lokal [2], di musim panas tahun 2020 pelabuhan Olbia telah mencatat pengurangan lalu lintas sekitar 15% sehubungan dengan 2019, karena pembatasan pandemi yang mempengaruhi seluruh negeri.

Mempertimbangkan jumlah agregat penghitungan yang diperoleh selama musim panas (yaitu antara April dan September, keduanya termasuk), data yang diperoleh konsisten dengan pernyataan ini karena menunjukkan pengurangan lalu lintas sekitar 16,28% pada tahun 2020.

Gambar oleh penulis

Kesimpulan

Citra satelit dalam spektrum tampak sangat sensitif terhadap kondisi cuaca dan penggunaannya harus dievaluasi secara hati-hati berdasarkan persyaratan proyek tertentu (misalnya wilayah yang diminati, periode kunjungan ulang, resolusi citra). Namun, aplikasi mereka untuk mengekstrak ukuran proksi untuk kegiatan maritim tampaknya, pada prinsipnya, dimungkinkan.

Referensi

[1] https://internationalbanker.com/brokerage/how-satellite-imagery-is-helping-hedge-funds-outperform/

[2] https://www.lanuovasardegna.it/olbia/cronaca/2021/08/19/news/e-ripartito-anche-il-porto-aumentano-i-passeggeri-1.40616298

[3] https://sentinel.esa.int/web/sentinel/missions/sentinel-2

[4] https://scihub.copernicus.eu/

[5] https://sentinelhub-py.readthedocs.io/en/latest/index.html

[6] https://pytorch.org/tutorials/intermediate/torchvision_tutorial.html

[7] https://www.kaggle.com/c/airbus-ship-detection

Deteksi kapal pada gambar Sentinel-2 dengan model Mask R-CNN awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.

Diterbitkan melalui Menuju AI