Pembelajaran Mendalam, Pembelajaran Mesin, Python

Klasifikasi Gambar menggunakan Deep Learning & PyTorch: Studi Kasus dengan Data Gambar Bunga

Mengklasifikasikan gambar Bunga menggunakan Convolutional Deep Neural Network dengan perpustakaan PyTorch

Mengklasifikasikan data gambar adalah salah satu penggunaan teknik Deep Learning yang sangat populer. Pada artikel kali ini kita akan membahas identifikasi citra bunga menggunakan deep convolutional neural network.

Untuk ini, kami akan menggunakan pustaka Python PyTorch, TorchVision & PIL

Eksplorasi Data

Kumpulan data yang diperlukan untuk masalah ini dapat ditemukan di Kaggle. Ini berisi struktur folder & gambar bunga di dalamnya. Terdapat 5 jenis bunga yang berbeda. Struktur foldernya terlihat seperti di bawah ini

Sekarang, kita akan melihat contoh gambar bunga dari folder 'mawar'

show_image("../data/flowers/rose/537207677_f96a0507bb.jpg")

Pra-pemrosesan Data

PyTorch selalu mengharapkan data dalam bentuk 'tensor'. 'Tensor' ini berjalan di antara node Jaringan Syaraf Tiruan dan berisi data asli & sebelum atau sesudah diproses. Pada dasarnya, singkatnya, 'tensor' dianalogikan dengan array 'numpy'.

Untuk data gambar juga, kita harus membaca gambar sebagai tensor dan menerapkan beberapa tahap pra-pemrosesan sebelum melakukan klasifikasi apa pun.

Kita dapat menganggap gambar sebagai tensor tiga dimensi. Setiap gambar dapat memiliki 3 jenis nilai warna pikselnya — masing-masing Merah, Hijau & Biru. Kami menyebutnya pengkodean warna RGB. Dua dimensi lainnya adalah nilai piksel panjang & lebar.

Secara umum, dua tahap pra-pemrosesan yang umum diperlukan untuk data gambar seperti yang diberikan di bawah ini:

  1. Mengubah ukuran menjadi template:Mengubah ukuran gambar menjadi berbentuk persegi. Untuk kasus kami, kami akan mengubah ukuran setiap gambar menjadi gambar 64x64.
  2. Normalisasi:Normalisasi statistik menggunakan mekanisme (x — mean)/sd dari setiap nilai piksel. Ini membantu meningkatkan visualisasi, menyempurnakan fitur, dan memperluas kontras pada gambar.

Dengan menggunakan PyTorch, kita akan melakukan rangkaian pra-pemrosesan ini

Kita juga dapat menentukan fungsi untuk menampilkan sekumpulan gambar yang diubah

Sekarang, kita dapat melihat gambar transformasi dari batch pertama

show_transformed_image(make_grid(image))

Kita juga dapat meminta kelas untuk mengindeks kamus data

Ini akan membantu dalam mengidentifikasi kelas-kelas.

Membangun Model

Untuk membangun model pembelajaran mesin untuk data gambar, memasukkan nilai piksel saja tidak cukup. Ada banyak fitur tersembunyi dalam gambar yang belum ditemukan. Untuk ini, kita harus menggunakan kombinasi lapisan konvolusi & pengumpulan maksimal untuk mengekstrak fitur-fitur penting.

Lapisan konvolusi

Secara matematis, operasi konvolusi antara dua fungsi f & g didefinisikan sebagai

Praktisnya, jika kita menganggap f sebagai tensor gambar, maka g seharusnya merupakan tensor lain yang dapat berfungsi sebagai ''kernel konvolusi''.

Ini adalah penjumlahan piksel dari nilai perkalian dua tensor.

Diagram di bawah menunjukkan pengaruh operasi konvolusi pada contoh tensor gambar

Kernel konvolusi berukuran 3x3 bergerak mengelilingi tensor gambar sebagai jendela mulai dari lokasi (0,0) dan hasil sampel pada (0,0) tensor keluaran muncul seperti perhitungan di bawah ini

Output(0,0) = Tensor Gambar(0,0) x Kernel(0,0) + Tensor Gambar(0,1) x Kernel(0,1)+ Tensor Gambar(0,2) x Kernel(0,2 ) + Tensor Gambar(1,0) x Kernel(1,0) + Tensor Gambar(1,1) x Kernel(1,1) + Tensor Gambar(1,2) x Kernel(1,2) + Tensor Gambar( 2,0) x Kernel(2,0) + Tensor Gambar(2,1) x Kernel(2,1) + Tensor Gambar(2,2) x Kernel(2,2)= 1 x 1 + 1 x 0 + 1 x 1 + 0 x 0 + 1 x 1 + 1 x 0 + 0 x 1 + 0 x 0 + 1 x 1 = 4

Kernel menggeser lokasi sebanyak 1 tempat untuk menghitung nilai lokasi lain dari tensor keluaran. 'Pergeseran' ini dikenal sebagai 'langkah'.

Lapisan konvolusi diperlukan untuk menyempurnakan dan mengekstrak fitur penting & tersembunyi dari gambar. Dalam kasus kami, 'bunga' mungkin terletak di posisi tengah gambar, jadi penerapan konvolusi membantu mengambil fitur inti bunga dengan mengabaikan objek & warna latar belakang lainnya.

Karena setiap gambar mengikuti kode warna RGB, kita akan menerapkan operasi konvolusi untuk setiap warna dan karenanya kita akan mendapatkan tiga tensor keluaran. Hasil akhirnya adalah penjumlahan tensor ketiganya. Masing-masing 'kode warna' ini dikenal sebagai 'saluran' dalam terminologi PyTorch API.

Secara matematis, jika filter berukuran kxk diterapkan pada gambar berukuran WxH maka akan menghasilkan gambar keluaran/tensor berukuran (W-k+1)x(H-k+1)

Dalam kasus kami, konvolusi dibuat seperti ini

self.conv1 = nn.Conv2d(in_channels=3, out_channels=12, kernel_size=3,stride=1, padding=1)

'out_channels' menentukan berapa banyak filter yang akan diterapkan. Di sini kami telah menerapkan 12 filter dan ini akan menghasilkan 12 tensor gambar perantara berukuran 62x62. Masing-masing gambar ini berisi satu fitur unik dari gambar aslinya.

Untuk lebih jelasnya mengenai 'Filter Konvolusi', pembaca dapat mengikuti tautan di bawah ini



lapisan ULT

'ReLU' adalah fungsi aktivasi yang menangkap non-linearitas pada keluaran fungsi lain. Secara matematis, ini didefinisikan sebagai

Jadi, selalu mengembalikan nilai positif. Kita dapat mengatakan, ini adalah 'filter positif'. Kami akan menerapkan lapisan 'ReLU' setelah konvolusi.

Dalam kasus kami, 'ReLU' dibuat seperti di bawah ini

self.relu1 = nn.ReLU()

Lapisan Penggabungan Maks

'Max pooling layer' umumnya muncul setelah 'ReLU'. 'Kumpulan maksimal' berukuran 2 adalah jendela 2x2 yang melintasi tensor keluaran operasi 'ReLU' dan memilih nilai piksel maksimum di dalam jendela. Operasi ini dapat dijelaskan melalui diagram di bawah ini

Tujuan dari lapisan 'Max Pool' adalah untuk memilih hanya fitur-fitur yang berdampak tinggi dan memiliki nilai besar. Ini membantu mengurangi dimensi fitur.

Dalam kasus kami, 'Max Pool' dibuat seperti di bawah ini

self.maxpool1 = nn.MaxPool2d(kernel_size=2)

Ini akan mengurangi dimensi gambar sebesar 50% (32 = 64/2).

Lapisan fungsi linier

Sesuai dengan namanya, ini adalah fungsi linier yang mengambil keluaran 'Max Pool' sebagai array rata dan menghasilkan keluaran sebagai indeks kelas. Nilai keluaran dari 'Fungsi Linier' untuk indeks kelas yang diprediksi akan maksimal.

Dalam kasus kami, 'Fungsi linier' dibuat seperti di bawah ini

self.lf = nn.Linear(in_features=32 * 32 * 24, out_features=num_classes)

Arsitektur keseluruhan model

Kami akan menerapkan lapisan yang berbeda seperti diagram di bawah ini

Kami memiliki dua set lapisan 'konvolusi' & 'ReLU'. 'View' melakukan perataan tensor keluaran dari lapisan 'ReLU' terakhir. Kami memiliki tensor gambar berukuran 64x64 sebagai input yang akan dikurangi menjadi 32x32 karena penerapan 'MaxPool2D' ukuran kernel 2x2 (32 = 64/2).

Pertama, kita akan membagi dataset menjadi train & test dengan rasio 80:20

Kemudian, kita akan menulis kelas khusus untuk menumpuk lapisan ini dengan memperluas 'Modul' yang diberikan oleh perpustakaan PyTorch

'__init__' mendefinisikan setiap lapisan & parameternya sedangkan fungsi 'maju' melakukan panggilan sebenarnya & penumpukan lapisan. Output dari lapisan terakhir dikembalikan dari fungsi 'maju'.

Pelatihan model

Kita perlu memiliki fungsi pengoptimal & kerugian untuk pelatihan model. Kami akan menggunakan 'Pengoptimal Adam'' & 'Kerugian Lintas Entropi'' untuk ini.

from torch.optim import Adam
cnn_model = FlowerClassifierCNNModel()
optimizer = Adam(cnn_model.parameters())
loss_fn = nn.CrossEntropyLoss()

Dengan PyTorch, kita perlu mengatur model dalam mode pelatihan dan kemudian menjalankan pelatihan dengan melakukan iterasi melalui kumpulan data pelatihan, menghitung kerugian dan menambah langkah pengoptimal.

Kita dapat menulis fungsi untuk ini

Pemanggilan fungsi 'loss.backward' kembali ke lapisan dan menghitung kerugian yang terjadi selama proses.

Kami akan menggunakan 'epoche' 200 untuk melatih model

train_and_build(200)

Pengujian & Akurasi model

Kita harus menyetel model ke mode 'eval' untuk menguji keakuratannya pada kumpulan data pengujian

Fungsi 'torch.max' mengembalikan nilai maksimum dari tensor keluaran 'Fungsi linier'. Nilai maksimum menyimpulkan label kelas yang diprediksi.

Fungsi 'torch.sum' merangkum kehadiran '1 di tensor yang merupakan keluaran dari operasi 'DAN' antara tensor 'prediksi' & 'keluaran pengujian aktual'. Jadi penjumlahan ini memberikan jumlah gambar yang diprediksi dengan benar.

Dan di sini kita mendapatkan keakuratannya

test_accuracy

Hampir 70,52%. Kami mendapatkan akurasi yang baik dengan model sederhana. Model ini dapat disesuaikan lebih lanjut.

Menggunakan model untuk prediksi dengan gambar sampel

Sekarang kita akan melihat cara menggunakan model ini dengan contoh gambar dari kumpulan data kita.

show_image("../data/flowers/dandelion/13920113_f03e867ea7_m.jpg")

Ini adalah gambar 'Dandelion'.

Sekarang kita akan membaca gambar menggunakan API gambar PIL dan memasukkannya ke dalam pipeline transformasi untuk pra-pemrosesan yang diperlukan dan kemudian menggunakan model untuk prediksi

class_index

Jadi, dari kamus kelas hingga indeks seperti yang disebutkan di atas, kami dapat memastikan bahwa itu adalah 'Dandelion'. Jadi, model pengklasifikasi gambar kami berfungsi dengan baik!!

Kesimpulan

Kami mempelajari cara melakukan klasifikasi gambar menggunakan perpustakaan PyTorch. Dalam prosesnya, kami membahas pra-pemrosesan gambar, membangun lapisan konvolusi, dan menguji model untuk gambar masukan.

Akurasi model dapat lebih ditingkatkan dengan penyetelan 'Hyperparameter' seperti bereksperimen dengan parameter 'Pengoptimal Adam', menambahkan lapisan konvolusi tambahan, penyetelan dengan ukuran kernel & ukuran jendela kumpulan maksimal, dll. Pembaca artikel ini dapat mencoba teknik ini sendiri .

Notebook Jupyter untuk ini dapat ditemukan dari link di bawah ini



Baru-baru ini saya menulis buku tentang ML (https://twitter.com/bpbonline/status/1256146448346988546)