Site icon Blog SIG dan Geografi

Neural Network Untuk Klasifikasi Citra Menggunakan Tensorflow di Python Bagian 2

Di sini, akan mempergunakan enam band (band 2 – band 7) dari Landsat 5 TM sebagai fitur dan mencoba untuk memprediksi kelas biner/indeks wilayah terbangun. Data Landsat 5 multispektral yang diperoleh pada tahun 2011 untuk Bangalore dan layer biner/indeks yang terkait akan digunakan untuk proses training dan pengujian. Akhirnya, data Landsat 5 multispektral lain yang diperoleh pada tahun 2011 untuk Hyderabad akan digunakan untuk prediksi baru.

Selain itu menggunakan pustaka Tensorflow Google dengan Python untuk membangun Neural Network (NN). Pustaka berikut akan diperlukan, pastikan Anda menginstalnya terlebih dahulu:

pyrsgis – untuk membaca dan menulis GeoTIFF
scikit-learn – untuk pra-pemrosesan data dan pemeriksaan akurasi
numpy – untuk operasi array dasar

Tempatkan ketiga file dalam direktori – tulis path ke file  dan masukkan nama file dalam skrip, dan baca file GeoTIFF.

import os
from pyrsgis import raster

os.chdir(“E:\\directorianda”)
mxBangalore = ‘l5_Bangalore2011_raw.tif’
builtupBangalore = ‘l5_Bangalore2011_builtup.tif’
mxHyderabad = ‘l5_Hyderabad2011_raw.tif’

# Read the rasters as array
ds1, featuresBangalore = raster.read(mxBangalore, bands=’all’)
ds2, labelBangalore = raster.read(builtupBangalore, bands=1)
ds3, featuresHyderabad = raster.read(mxHyderabad, bands=’all’)

Modul raster dari paket pyrsgis membaca informasi geolokasi GeoTIFF dan nilai angka digital (DN) sebagai array NumPy secara terpisah. Cetak ukuran data yang telah kita baca.

print(“Bangalore multispectral image shape: “, featuresBangalore.shape)
print(“Bangalore binary built-up image shape: “, labelBangalore.shape)
print(“Hyderabad multispectral image shape: “, featuresHyderabad.shape)

Keluaran:

Sebagai bukti dari output, jumlah baris dan kolom dalam citra Bangalore adalah sama, dan jumlah layer dalam citra multispektral adalah sama. Model akan belajar untuk memutuskan apakah suatu pixel adalah daerah terbangun atau tidak berdasarkan nilai DN masing-masing di semua band, dan oleh karena itu, kedua gambar multispektral harus memiliki jumlah layer (band) yang sama yang ditumpuk dalam urutan yang sama.

Sekarang file yang berbentuk array diubah menjadi array dua dimensi, yang merupakan standar input oleh sebagian besar algoritma ML, di mana setiap baris mewakili piksel. Modul konversi paket pyrsgis akan melakukannya.

from pyrsgis.convert import changeDimension

featuresBangalore = changeDimension(featuresBangalore)
labelBangalore = changeDimension (labelBangalore)
featuresHyderabad = changeDimension(featuresHyderabad)
nBands = featuresBangalore.shape[1]
labelBangalore = (labelBangalore == 1).astype(int)

print(“Bangalore multispectral image shape: “, featuresBangalore.shape)
print(“Bangalore binary built-up image shape: “, labelBangalore.shape)
print(“Hyderabad multispectral image shape: “, featuresHyderabad.shape)

Output:

Pada baris ketujuh dari cuplikan kode di atas, diekstrak semua piksel dengan nilai satu. Ini adalah cara untuk menghindari masalah karena piksel NoData yang sering memiliki nilai sangat tinggi dan rendah.

Sekarang, data akan dibagi untuk pelatihan dan validasi. Ini dilakukan untuk memastikan bahwa model belum melihat data uji dan kinerjanya sama baiknya pada data baru. Jika tidak, model akan overfit dan hanya bekerja dengan baik pada data latih.

from sklearn.model_selection import train_test_split

xTrain, xTest, yTrain, yTest = train_test_split(featuresBangalore, labelBangalore, test_size=0.4, random_state=42)

print(xTrain.shape)
print(yTrain.shape)

print(xTest.shape)
print(yTest.shape)

Output:

Test_size (0,4) dalam cuplikan kode di atas menandakan bahwa proporsi pengujian-pelatihan adalah 60/40.

Banyak algoritma ML/Machine Learning termasuk NN mengharapkan data dinormalisasi. Ini berarti bahwa histogram diregangkan dan diskalakan antara rentang tertentu (di sini, 0 hingga 1). Data di atas akan dinormalisasi untuk mencukupi persyaratan ini. Normalisasi dapat dicapai dengan mengurangi nilai minimum dan membaginya dengan rentang. Karena data Landsat adalah data 8-bit, nilai minimum dan maksimum adalah 0 dan 255 (2 pangkat 8 = 256 nilai).

Langkah pra-pemrosesan tambahan lainnya adalah membangun data dari dua dimensi menjadi tiga dimensi, sehingga setiap baris mewakili satu piksel.

# Normalise the data
xTrain = xTrain / 255.0
xTest = xTest / 255.0
featuresHyderabad = featuresHyderabad / 255.0

# Reshape the data
xTrain = xTrain.reshape((xTrain.shape[0], 1, xTrain.shape[1]))
xTest = xTest.reshape((xTest.shape[0], 1, xTest.shape[1]))
featuresHyderabad = featuresHyderabad.reshape((featuresHyderabad.shape[0], 1, featuresHyderabad.shape[1]))

# Print the shape of reshaped data
print(xTrain.shape, xTest.shape, featuresHyderabad.shape)

Output:

Sekarang semuanya sudah ada, mari mulai membangun model menggunakan keras. Untuk memulainya, kita akan menggunakan model sekuensial, untuk menambahkan layer satu demi satu. Ada satu layer input dengan jumlah node sama dengan nBands. Satu layer tersembunyi dengan 14 node dan ‘relu’ sebagai fungsi aktivasi. Layer terakhir berisi dua node untuk kelas biner wilayah terbangun dengan fungsi aktivasi ‘softmax’, yang cocok untuk output kategori. Anda dapat menemukan banyak fungsi aktivasi di sini.

from tensorflow import keras

# Define the parameters of the model
model = keras.Sequential([
keras.layers.Flatten(input_shape=(1, nBands)),
keras.layers.Dense(14, activation=’relu’),
keras.layers.Dense(2, activation=’softmax’)])

# Define the accuracy metrics and parameters
model.compile(optimizer=”adam”, loss=”sparse_categorical_crossentropy”, metrics=[“accuracy”])

# Run the model
model.fit(xTrain, yTrain, epochs=2)

 

 

Seperti disebutkan pada baris 10, proses mengkompilasi model dengan optimisasi ‘adam’. (Ada beberapa jenis optimisasi lain yang dapat dicoba.) Jenis loss yang akan kami gunakan, untuk saat ini, adalah categorical-sparse-crossentropy. Anda dapat memeriksa detailnya di sini. Metrik untuk evaluasi kinerja model adalah ‘akurasi’.

Akhirnya, kita menjalankan model pada xTrain dan yTrain dengan dua epoch (atau iterasi). Menyesuaikan model akan memakan waktu tergantung pada ukuran data Anda dan daya komputasi. Berikut ini dapat dilihat setelah kompilasi model:

Nilai diperiksa untuk data uji yang disimpan secara terpisah, dan melakukan berbagai pemeriksaan akurasi.

from sklearn.metrics import confusion_matrix, precision_score, recall_score

# Predict for test data
yTestPredicted = model.predict(xTest)
yTestPredicted = yTestPredicted[:,1]

# Calculate and display the error metrics
yTestPredicted = (yTestPredicted>0.5).astype(int)
cMatrix = confusion_matrix(yTest, yTestPredicted)
pScore = precision_score(yTest, yTestPredicted)
rScore = recall_score(yTest, yTestPredicted)

print(“Confusion matrix: for 14 nodes\n”, cMatrix)
print(“\nP-Score: %.3f, R-Score: %.3f” % (pScore, rScore))

Fungsi softmax menghasilkan kolom terpisah untuk setiap nilai probabilitas tipe kelas. Yang akan diekstrak kali ini hanya untuk kelas satu (terbangun), seperti yang disebutkan di baris keenam dalam cuplikan kode di atas. Model-model untuk analisis geospasial sulit untuk dievaluasi karena tidak seperti masalah Machine Learning umum lainnya; lokasi spasial adalah kunci dari model. Oleh karena itu, matriks confusion, presisi dan recall dapat mencerminkan gambaran yang lebih jelas tentang seberapa baik kinerja model.

Seperti yang terlihat dalam matriks confusion di atas, ada ribuan piksel wilayah terbangun yang diklasifikasikan sebagai bukan wilayah terbangun dan sebaliknya, tetapi proporsi terhadap ukuran data total lebih kecil. Presisi dan recall yang diperoleh pada data uji lebih dari 0,8.

Anda melakukan beberapa iterasi untuk menemukan jumlah optimal layer tersembunyi, jumlah node di setiap layer tersembunyi, dan jumlah epoch untuk mendapatkan akurasi. Beberapa indeks penginderaan jarak jauh yang umum digunakan seperti NDBI atau NDWI juga dapat digunakan. Setelah akurasi yang diinginkan tercapai, gunakan model untuk memprediksi data baru dan ekspor GeoTIFF. Model serupa dengan tweak minor dapat diterapkan untuk aplikasi serupa.

predicted = model.predict(featuresHyderabad)
predicted = predicted[:,1]

#Export raster
prediction = np.reshape(predicted, (ds.RasterYSize, ds.RasterXSize))
outFile = ‘Hyderabad_2011_BuiltupNN_predicted.tif’
raster.export(prediction, ds3, filename=outFile, dtype=’float’)

Keakuratan model telah dievaluasi dengan presisi dan recall – Anda juga dapat melakukan pemeriksaan tradisional (mis. Koefisien kappa) pada raster yang baru diprediksi. Terlepas dari tantangan yang disebutkan sebelumnya dari klasifikasi data satelit, keterbatasan intuitif lainnya termasuk ketidakmampuan model untuk memprediksi data yang diperoleh di musim yang berbeda dan di berbagai wilayah, karena variasi dalam signature spektral.

Model yang digunakan dalam artikel ini adalah arsitektur yang sangat mendasar dari NN, beberapa model kompleks termasuk Convolution Neural Networks (CNN) telah dibuktikan oleh para peneliti menghasilkan hasil yang lebih baik. Keuntungan utama dari klasifikasi tersebut adalah skalabilitasnya setelah model dilatih.

Exit mobile version
Skip to toolbar