Dari Satelit ke Peta Hutan
Apa yang dilakukan pipeline ini — dan apa yang terjadi saat Anda menjalankannya
Citra satelit masuk. Peta hutan keluar.
DAS Cisokan di Jawa Barat merupakan mosaik sawah, perkebunan, hutan, dan bangunan — dan dari luar angkasa, sulit membedakannya. Pipeline ini membaca citra satelit dan secara otomatis memberi label setiap petak lahan dengan salah satu dari sembilan kelas tutupan lahan.
Hasilnya adalah peta raster di mana setiap piksel menjawab: apa lahan ini?
Input
10 citra satelit PlanetScope selama 2 tahun, ditambah data radar dan ketinggian kanopi
Pipeline
12 skrip Python yang melakukan segmentasi, pengukuran, dan klasifikasi — berjalan 45–90 menit pada awal pertama
Output
Peta tutupan lahan 9 kelas dengan resolusi 3 m yang mencakup seluruh DAS
Telusuri apa yang terjadi saat Anda menjalankannya
Bayangkan Anda membuka terminal dan mengetik python planetscope_10epoch_obia_v3.py. Inilah perjalanan tepat yang ditempuh data Anda — dari piksel satelit mentah hingga peta hutan berwarna di layar.
Sembilan jawaban yang dapat diberikan peta
Pipeline ini menggunakan hierarki dua tingkat. Tingkat 1 mengelompokkan lahan ke dalam 7 kategori besar. Tingkat 2 memperbesar "Vegetasi Lebat" dan membaginya menjadi tiga subtipe hutan.
Danau, sungai, waduk Cisokan — setiap permukaan air terbuka
Lahan padi irigasi — perubahan NDVI yang kuat antara masa tanam dan panen
Jalan, atap, permukiman — kecerahan tinggi di semua musim
Awan, bayangan, piksel campuran — apa pun yang tidak masuk ke label lain
Hutan primer dan sekunder — kanopi tertinggi, biomassa terbesar
Perkebunan kayu — lebat namun lebih muda, kanopi lebih seragam
Kebun campuran (kopi, karet, buah-buahan) — heterogen dan sulit diklasifikasikan
Padang rumput, semak, lahan terdegradasi — mencakup 46% DAS
Pertanian lahan kering — jagung, singkong, tanaman semusim campuran
Cisokan memiliki sangat sedikit tanah yang benar-benar terbuka secara permanen — apa yang terlihat sebagai "Lahan Terbuka" sebagian besar merupakan kondisi sementara (sawah setelah panen, bera, bayangan awan). Memaksa model untuk mempelajari kelas yang tidak konsisten memperburuk segalanya. Menghapusnya meningkatkan akurasi keseluruhan dari 87% menjadi 89,5%.
Seberapa baik hasilnya?
Sebelum menyelami mekanismenya, inilah intinya: pipeline ini mencapai akurasi keseluruhan 89,5% untuk peta L1 7 kelas — diverifikasi pada 228 segmen yang tidak pernah dilihat model selama pelatihan.
Akurasi L1
89,5% akurasi keseluruhan, 92% dalam validasi silang 5-lipatan. Setiap kelas mencapai F1 ≥ 0,82.
Akurasi L2
57,5% untuk subtipe hutan — masalah lebih sulit, hanya 137 sampel latih. Hutan produksi adalah kelas yang paling sulit.
Faktor kunci
Data ketinggian kanopi (fitur terpenting #1 dan #3) — tinggi pohon memisahkan hutan dari lahan pertanian lebih baik daripada band spektral mana pun.
Modul 2 memperkenalkan 12 skrip. Modul 3 menguraikan bagaimana piksel mentah menjadi 591 pengukuran. Modul 4 menjelaskan segmentasi dan Random Forest. Modul 5 menunjukkan cara membaca angka akurasi dan cara meningkatkan model.
Mengenal Para Pemain
12 skrip Python, masing-masing dengan satu tugas — dan tiga sumber data satelit yang mereka gunakan
Bayangkan setiap skrip seperti spesialis dalam kru film
Tidak ada satu orang pun di lokasi syuting yang melakukan segalanya — sutradara tidak sekaligus mengoperasikan kamera. Ide yang sama berlaku di sini. Setiap skrip Python memiliki satu tanggung jawab yang terfokus, dan mereka menyerahkan pekerjaan satu sama lain dalam urutan yang jelas.
Skrip-skrip ini terbagi menjadi empat kelompok: pengunduh data, pembangun fitur, klasifikator, dan alat analisis.
Tiga mata di langit
Klasifikator tidak bergantung pada satu satelit saja. Ia memadukan tiga jenis data yang benar-benar berbeda — masing-masing melihat sesuatu yang tidak dapat dilihat oleh yang lain.
Sepuluh citra diambil dari Maret 2024 hingga Maret 2026. Tulang punggung pipeline — memberi tahu seberapa hijau, basah, atau cerah setiap petak, serta bagaimana perubahannya antar musim.
Pulsa radar memantul berbeda dari kulit kayu yang kasar, permukaan air yang halus, atau atap logam. Bekerja di malam hari dan saat hujan. 19 fitur Sentinel-1 + 5 fitur PALSAR-2.
Seberapa tinggi vegetasinya? Hutan Alam setinggi 40 m terlihat sangat berbeda dari semak setinggi 3 m. Ketinggian kanopi adalah fitur tunggal yang paling penting dalam seluruh model.
SAR melihat apa yang tidak dapat dilihat sensor optis: struktur hutan. Radar pita L (PALSAR-2) sebenarnya menembus kanopi dan memantul dari batang pohon, sementara pita C (Sentinel-1) menyebar dari daun dan ranting. Bersama-sama keduanya menyandikan informasi biomassa yang tidak dapat disediakan oleh kamera warna biasa.
Para skrip di hari eksekusi
Pada pengaturan baru, skrip-skrip berjalan dalam urutan ini, menyerahkan pekerjaan satu sama lain. Begini cara mereka mendeskripsikannya:
Uji pengetahuan Anda
Sebelum melanjutkan, periksa pemahaman Anda tentang skrip mana yang melakukan apa — dan kapan menjalankannya.
Anda memiliki citra PlanetScope baru dari unduhan terkini. Skrip mana yang harus Anda jalankan sebelum klasifikator utama?
Mengapa pipeline repot-repot mengunduh data SAR padahal PlanetScope sudah memiliki 8 band spektral?
591 Cara Melihat Pohon
Bagaimana piksel satelit mentah menjadi tabel 591 kolom — satu baris per petak hutan
Mengapa model membutuhkan 591 angka per petak?
Satu piksel pada satu tanggal hanya memberi sedikit informasi. Sawah dan jalan tanah basah terlihat hampir identik di bulan Maret. Namun amati keduanya di 10 tanggal berbeda, ukur respons radarnya, periksa ketinggian vegetasinya — kini keduanya benar-benar berbeda.
Keahlian pipeline ini adalah mengubah setiap segmen 93 piksel menjadi "sidik jari" yang kaya — 591 angka yang mendeskripsikan segala sesuatu yang dapat diamati tentang petak tersebut dari luar angkasa.
138 Fitur Piksel Warisan
8 band × 10 epoch = 80 rata-rata band mentah, ditambah NDVI, NDWI, NDBI, EVI per epoch dan ringkasan temporal. Dibangun oleh planetscope_10epoch_local.py.
100 Indeks Epoch Baru
10 indeks spektral (NDRE, EVI2, BSI, OSAVI, VARI, MNDWI, CIG, GNDVI, ARI, SIPI) di semua 10 tanggal. Lebih diskriminatif dibanding band mentah.
48 Fitur SAR
19 band Sentinel-1 + 5 band PALSAR-2, masing-masing dengan rata-rata dan standar deviasi di seluruh segmen = 48 angka. Backscatter radar mengkodekan kekasaran kanopi dan kelembaban tanah.
12 Fitur Ketinggian Kanopi
Meta v2 (rata-rata, stdev, p95, penutupan) + ETH (mean, std) — 6 mentah × mean + std = 12. Fitur terpenting ke-1 dan ke-3 dalam seluruh model.
11 Tekstur + Bentuk
6 statistik tekstur dari NDVI/NIR (varians, kontras...) + 5 properti geometri (luas, kekompakan, elongasi...) per segmen.
Trik statistik zona — dari piksel ke petak
Bayangkan setiap segmen sebagai wilayah di peta. Anda ingin mendeskripsikan wilayah itu — bukan piksel per piksel, melainkan secara keseluruhan. Pipeline menggunakan teknik penghitungan cerdas yang disebut statistik zona.
Untuk masing-masing dari 316.000 segmen dan masing-masing dari ~266 fitur piksel, dihitung dua angka: rata-rata (nilai khas di dalam wilayah ini) dan standar deviasi (seberapa beragam nilainya). Ini menghasilkan 266 × 2 = 532 fitur zona.
count = np.bincount(lbl, minlength=n_seg+1)
s = np.bincount(lbl, weights=val, minlength=n_seg+1)
sq = np.bincount(lbl, weights=val*val, minlength=n_seg+1)
mean = s / count
std = np.sqrt(sq/count - mean**2)
Hitung berapa piksel yang ada di setiap segmen (seperti sensus)
Jumlahkan semua nilai piksel di dalam setiap segmen
Jumlahkan semua nilai kuadrat (diperlukan untuk menghitung sebaran)
Bagi total dengan jumlah untuk mendapatkan nilai rata-rata per segmen
Hitung sebaran: seberapa jauh piksel individu menyimpang dari rata-rata
Perulangan di 316.000 segmen × 266 fitur × 93 piksel akan memakan waktu berjam-jam. numpy.bincount melakukan pekerjaan yang sama dengan mengakumulasi ember histogram dalam satu lintasan atas larik piksel. Waktu eksekusi: ~4 menit vs berjam-jam.
Mengapa menghitung indeks dan bukan sekadar menggunakan band mentah?
Nilai reflektansi mentah sensitif terhadap pencahayaan, atmosfer, dan keanehan sensor. Indeks spektral adalah rasio yang membatalkan banyak derau tersebut dan memperkuat sinyal yang Anda pedulikan.
NDVI
Indeks Vegetasi Perbedaan Ternormalisasi — seberapa hijau dan aktif secara fotosintesis. Indeks klasik.
NDRE
Versi Red-Edge dari NDVI — lebih sensitif terhadap klorofil kanopi, kurang jenuh di atas hutan lebat.
NDWI / MNDWI
Indeks air — tinggi di atas badan air, rendah di atas tanah kering. Kunci untuk memisahkan Sawah dari Ladang.
BSI
Indeks Tanah Terbuka — tinggi di atas tanah gundul, rendah di atas vegetasi. Berlawanan dengan NDVI.
VARI
Indeks Ketahanan Atmosfer Tampak — bekerja hanya dengan RGB, sangat baik untuk Ladang pada citra bulan Maret.
OSAVI / EVI2
Indeks vegetasi yang disesuaikan tanah — lebih baik dari NDVI di mana tanah terbuka terlihat melalui kanopi jarang.
Musiman adalah senjata rahasia
Satu tanggal bisa ambigu — sawah yang baru dipanen dan lereng tandus terlihat identik di musim kemarau. Namun di 10 tanggal, sawah memiliki tanda tangan yang sangat khas: menghijau cepat (tanam), mencapai puncak, lalu menguning cepat (panen). Hutan tetap hijau sepanjang tahun.
Pipeline menghitung fitur ringkasan temporal yang menangkap ritme ini:
Persentil ke-50 (median) NDVI menangkap kehijauan "khas" dengan mengabaikan tanggal ekstrem. Rentang antara p10 dan p90 menangkap fluktuasi musiman.
Pasangkan gelombang sinusoidal pada NDVI lintas waktu. Amplitudo menunjukkan seberapa besar variasinya secara musiman. Fase menunjukkan kapan puncaknya. Bersama-sama, keduanya mengidentifikasi kalender tanam.
Bandingkan bulan yang sama di dua tahun berbeda. Hutan stabil menunjukkan perubahan hampir nol. Lahan yang dibuka menunjukkan penurunan NDVI mendadak. Ini mendeteksi gangguan.
Peringkat kepentingan fitur menunjukkan bahwa indeks September (NDBI, NDWI, NDRE, OSAVI, BSI) mendominasi daftar 15 teratas. September adalah musim kemarau — kontras maksimum antara tanah gundul, tanaman yang mengering, dan hutan hijau abadi. Waktu musiman sama pentingnya dengan rentang spektral.
Cocokkan fitur dengan apa yang dideteksinya
Seret setiap kelompok fitur ke properti tutupan lahan yang paling baik dideteksinya.
Memisahkan Hutan Alam yang tinggi dari semak rendah dan ladang
Menembus kanopi hutan untuk mengukur volume kayu dan biomassa
Membedakan badan air terbuka dan sawah tergenang dari lahan kering
Mendeteksi kalender tanam musiman — seberapa besar NDVI berosilasi sepanjang tahun
Mesin Pemikir
Bagaimana segmentasi LSMS menggambar batas — dan bagaimana Random Forest belajar melabeli isinya
Mengapa tidak mengklasifikasikan piksel per piksel saja?
Pendekatan naif adalah: untuk masing-masing dari 300 juta piksel dalam citra Cisokan, tentukan kelasnya. Masalahnya? Satu piksel berukuran 3 m × 3 m — kira-kira seukuran mobil. Satu piksel "hutan" bisa saja berupa celah terkena sinar matahari, bayangan, atau ujung ranting. Derau mengalahkan sinyal.
OBIA memecahkan masalah ini dengan terlebih dahulu mengelompokkan piksel-piksel berdekatan yang serupa menjadi segmen — petak 50–500 piksel yang memiliki warna, tekstur, dan kecerahan yang mirip — kemudian mengklasifikasikan setiap petak sebagai satu unit.
Piksel per piksel (cara lama)
300 juta keputusan. Setiap piksel hanya melihat satu kotak 3 m. Derau pada satu piksel gelap salah memberi label "bayangan" sebagai "air." Kesalahan salt-and-pepper di mana-mana.
Segmen per segmen (OBIA)
316.000 keputusan. Setiap segmen melihat 93 piksel yang dirata-ratakan. Derau saling meniadakan. Anda juga bisa menghitung bentuk (bulat vs. memanjang) — air berbentuk bulat, jalan berbentuk garis tipis.
LSMS: penyortir piksel
LSMS bekerja seperti algoritma penyortir kerumunan di sebuah festival. Setiap piksel "berjalan" menuju klaster tetangga berwarnatama serupa yang paling dekat. Setelah semua piksel menetap, kelompok-kelompok itu menjadi segmen.
Tiga parameter menentukan seberapa halus hasilnya:
spatialr = 3
Radius pencarian dalam piksel — seberapa jauh sebuah piksel mencari tetangga yang serupa. Lebih kecil = segmen lebih halus.
ranger = 12.0
Toleransi spektral — seberapa berbeda dua piksel boleh tetap digabung. Lebih rendah = lebih banyak segmen.
minsize = 50
Ukuran segmen minimum dalam piksel. Serpihan kecil di bawah batas ini digabungkan ke segmen tetangga.
Eksperimen awal menggunakan parameter kasar (spatialr=15, ranger=30) yang menghasilkan 60.000 segmen dengan ~485 piksel per segmen. Penyempitan ke pengaturan halus saat ini melipattigakan jumlah segmen menjadi 316.000, mengurangi piksel per segmen menjadi 93, menggandakan set latih yang dapat digunakan, dan meningkatkan akurasi validasi silang dari 81% menjadi 88,7% — dengan standar deviasi yang menyusut dari ±4,9 poin persentase menjadi ±1,7 poin persentase (jauh lebih stabil).
Random Forest — hutan yang mengklasifikasikan hutan
Sebuah Random Forest bukanlah satu model melainkan ansambel 100 pohon keputusan, masing-masing dilatih secara independen pada subset data yang acak. Prediksi akhir adalah suara terbanyak dari 100 pohon tersebut.
Berikut adalah konfigurasi persis yang digunakan dalam pipeline ini:
RandomForestClassifier(
n_estimators=100,
min_samples_leaf=1,
max_samples=0.5,
bootstrap=True,
max_features="sqrt",
random_state=42,
n_jobs=-1,
)
Buat komite dari 100 pohon keputusan
Setiap simpul daun dapat mewakili satu contoh latih (tanpa penghalusan)
Setiap pohon hanya melihat 50% data latih — memaksa keberagaman
Pengambilan sampel dengan pengembalian (seperti mengambil kartu lalu mengembalikannya)
Setiap pohon melihat subset acak berukuran akar kuadrat dari 591 fitur
Keacakan tetap — jalankan dua kali, hasilnya sama
Gunakan semua inti CPU secara paralel — pelatihan lebih cepat
Dua pengklasifikasi, dua pertanyaan
Pipeline menjalankan dua Random Forest secara berurutan. Bayangkan seperti wawancara dua babak: penyaring pertama mempersempit bidang, kemudian spesialis membuat keputusan akhir.
7 kelas luas — Badan Air, Sawah, Terbangun, Lainnya, Vegetasi Lebat, Vegetasi Jarang, Ladang
Semua segmen "Vegetasi Lebat" diserahkan ke L2
3 subtipe hutan — Hutan Alam, Hutan Produksi, Agroforest
Peta akhir menggabungkan L1 + L2 menjadi raster hierarkis 9 kelas
Versi pipeline sebelumnya (v2) memperluas setiap titik latih menjadi baris berbobot dan menetapkan label fraksional per segmen. Ini menciptakan kontaminasi lintas-split — segmen yang sama muncul di split latih maupun validasi dengan label berbeda. Skema suara terbanyak v1 yang ketat (digunakan di v3) menghindari hal ini sepenuhnya. Pelajaran: selalu periksa split latih/validasi Anda untuk kebocoran data.
Men-debug pengklasifikasi
Anda telah menerapkan model. Seorang kolega melaporkan bahwa segmen Hutan Alam sering salah dilabeli sebagai Hutan Produksi. Terapkan apa yang telah Anda pelajari untuk mendiagnosis masalah ini.
Hutan Alam dan Hutan Produksi sama-sama merupakan "Vegetasi Lebat" dalam model L1. Di mana kebingungan sebenarnya terjadi?
Apa tindakan bernilai tertinggi tunggal untuk meningkatkan klasifikasi Hutan Produksi?
Membaca Angka
Apa yang sebenarnya disampaikan metrik akurasi — dan cara menggunakan feature importance untuk memperbaiki model
Overall Accuracy dan Kappa — apa arti angka utama ini
Setelah pelatihan, pipeline menahan 30% segmen berlabel untuk ujian akhir — segmen yang tidak pernah dilihat model selama pelatihan. Model memprediksi kelas untuk setiap segmen, lalu membandingkannya dengan label ground truth.
Overall Accuracy (OA)
Persentase segmen validasi yang diklasifikasikan dengan benar. 89,5% berarti 9 dari 10 segmen yang belum pernah dilihat mendapatkan label yang tepat. Intuitif, tetapi menyesatkan jika kelas tidak seimbang.
Kappa Cohen
Kappa menyesuaikan OA terhadap kesesuaian secara kebetulan. Jika model hanya memprediksi "Vegetasi Jarang" untuk segalanya, ia akan mendapatkan 46% OA secara gratis. Kappa menghukum hal itu. Kappa 0,875 adalah nilai yang sangat baik.
5-Fold Cross-Validation
Ulangi pembagian latih/uji sebanyak 5 kali dengan partisi berbeda. Rata-rata (92,0%) dan standar deviasi (±1,6%) bersama-sama memberi tahu Anda: "model ini sekaligus akurat dan stabil."
Model segmentasi kasar memiliki CV OA 81% ± 4,9pp. Model halus: 88,7% ± 1,7pp. Rata-ratanya membaik, tetapi standar deviasi yang menyusut 3 kali lebih kecil jauh lebih penting untuk produksi — ini berarti model konsisten di berbagai pembagian data, bukan hanya beruntung pada satu pembagian saja.
F1 Score — nilai jujur per kelas
Akurasi keseluruhan menyembunyikan kegagalan di tingkat kelas. F1 score menangkap kegagalan tersebut: kelas dengan F1 = 0,50 mendapatkan setengah prediksinya salah, meskipun OA terlihat baik.
Others: 0.97
Kelas tangkapan semua — sangat konsisten karena segala hal yang ambigu dikirim ke sini
Built-up: 0.90
Atap dan jalan memiliki tanda spektral + radar yang unik — kepercayaan tinggi
Paddy: 0.89
Siklus NDWI musiman yang kuat membuat sawah mudah dikenali
Waterbody: 0.93
Air secara spektral unik — reflektansi sangat rendah di semua band
Crops: 0.91
+0,24 dibanding model kasar — segmen lebih halus memecah kebingungan lahan/vegetasi jarang
Sparse Vegetation: 0.82
+0,25 dibanding model kasar — peningkatan terbesar dari segmentasi halus
Dense Vegetation: 0.83
L1 benar — subtipe kemudian ditangani di L2 dengan Random Forest terpisah
Apa yang sebenarnya dipelajari model untuk diperhatikan
Feature importance seperti sorotan cahaya pada perhatian model. Setelah pelatihan, Anda bisa bertanya: "Dari 591 fitur, mana yang paling diandalkan oleh pohon-pohon?" Jawabannya mengejutkan — dan dapat ditindaklanjuti.
Seberapa tinggi rata-rata kanopi di seluruh segmen ini? Tidak ada yang memisahkan hutan alami setinggi 40 m dari tanaman setinggi 1 m lebih cepat dari satu angka ini.
Seberapa besar sinyal tanah terbuka berfluktuasi sepanjang tahun? Hutan tetap stabil. Tanaman pertanian berubah dari tanah terbuka menjadi bervegetasi dan kembali lagi. Ritme ini adalah kunci untuk memisahkan keduanya.
Seberapa bervariasi ketinggian kanopi di dalam segmen ini? Perkebunan seragam memiliki std rendah. Hutan alami campuran dengan celah memiliki std tinggi. Ini membedakan subtipe hutan.
Radar L-band menembus kanopi dan memantul dari batang kayu. HV tinggi = biomassa kayu yang padat. Ini adalah informasi struktural yang tidak dapat disediakan oleh band optik mana pun.
Model Top-20 mencapai akurasi yang identik dengan model fitur lengkap. Ini adalah tanda kejenuhan fitur — begitu segmen cukup homogen (LSMS halus), 20 fitur teratas menangkap semua yang dibutuhkan model. Anda bisa menerapkan model 20 fitur 30 kali lebih cepat tanpa kehilangan akurasi.
Masalah L2 — dan cara memperbaikinya
Klasifier subtipe hutan L2 mencapai akurasi 57,5% pada 40 segmen validasi. Mode kegagalan yang dominan: 7 dari 14 segmen Hutan Produksi berlabel sebagai Hutan Alami.
Berikut adalah matriks kebingungan lengkapnya:
| Pred. Alami | Pred. Produksi | Pred. Agroforest | |
|---|---|---|---|
| Aktual Alami (n=18) | 11 | 5 | 2 |
| Aktual Produksi (n=14) | 7 | 7 | 0 |
| Aktual Agroforest (n=8) | 1 | 2 | 5 |
Hutan Produksi dan Hutan Alami keduanya memiliki kanopi yang tinggi dan lebat. Fitur yang seharusnya memisahkan keduanya — tree_height_std, S1_VV_stdDev — tersedia, tetapi model hanya memiliki 48 contoh latih Produksi untuk dipelajari. Solusinya jelas: kumpulkan 30–50 titik latih Hutan Produksi tambahan dari area di mana baris penanaman terlihat pada citra dasar satelit.
Tantangan akhir — membaca skenario nyata
Model L2 melaporkan CV OA sebesar 64,9% ± 7,6%. Seorang rekan berkata "64,9% sudah lumayan." Apa yang disampaikan ±7,6% yang terlewat oleh mereka?
Anda ingin meningkatkan akurasi L2 tanpa mengumpulkan lebih banyak titik latih. Tindakan mana yang akan berdampak paling besar?
1) Tambahkan 30–50 sampel latih Hutan Produksi. 2) Selidiki mengapa 46% AOI adalah Vegetasi Jarang — sebagian mungkin merupakan Agroforest pinggiran yang salah klasifikasi. 3) Uji aturan YRF (Young Regenerated Forest) dengan sampel khusus. 4) Pertimbangkan SAR skala halus pada 10 m untuk model L2 setelah set latih lebih besar.