Selasa, 12 Maret 2024

Tutorial Implementasi Algoritma Regresi Logistik untuk Klasifikasi Gambar Menggunakan OpenCV


Pada tutorial kali ini kita akan belajar bagaimana algoritma regresi logistik standar, yang secara alami dirancang untuk klasifikasi biner, dapat dimodifikasi untuk menangani masalah klasifikasi multi-kelas dengan menerapkannya pada tugas klasifikasi gambar.

Setelah menyelesaikan tutorial ini, Anda akan tahu:

  1. Beberapa karakteristik paling penting dari algoritma regresi logistik.
  2. Bagaimana algoritma regresi logistik dapat dimodifikasi untuk masalah klasifikasi multi-kelas.
  3. Bagaimana menerapkan regresi logistik pada masalah klasifikasi gambar.
  4. Memulai proyek Anda dengan buku saya "Machine Learning in OpenCV". Ini menyediakan tutorial belajar mandiri dengan kode kerja.

Regresi Logistik untuk Klasifikasi Gambar Menggunakan OpenCV

Pada tutorial sebelumnya, kita mulai menjelajahi implementasi OpenCV dari algoritma regresi logistik. Sejauh ini, kita telah menerapkannya pada dataset dua kelas kustom yang kita buat, terdiri dari titik-titik dua dimensi yang dikumpulkan dalam dua cluster.

Mengikuti tutorial Jason Brownlee tentang regresi logistik, kita juga merangkum poin-poin penting tentang regresi logistik. Kita telah melihat bahwa regresi logistik erat kaitannya dengan regresi linear karena keduanya melibatkan kombinasi linear fitur dalam menghasilkan output bernilai riil. Namun, regresi logistik memperluas proses ini dengan menerapkan fungsi logistik (atau sigmoid). Oleh karena itu namanya. Ini untuk memetakan output bernilai riil menjadi nilai probabilitas dalam rentang [0, 1]. Nilai probabilitas ini kemudian diklasifikasikan sebagai milik kelas default jika melebihi ambang batas 0.5; sebaliknya, diklasifikasikan sebagai milik kelas non-default. Ini membuat regresi logistik secara inheren menjadi metode untuk klasifikasi biner.

Model regresi logistik direpresentasikan oleh sebanyak koefisien yang ada pada fitur data input, ditambah dengan nilai bias tambahan. Koefisien dan nilai bias ini dipelajari selama pelatihan menggunakan teknik gradien turun atau estimasi likelihood maksimum (MLE).

Modifikasi Regresi Logistik untuk Masalah Klasifikasi Multi-Kelas

Seperti disebutkan dalam bagian sebelumnya, metode regresi logistik standar hanya mendukung masalah dua kelas melalui fungsi logistik dan proses thresholding yang menghasilkan output bernilai riil dari kombinasi linear fitur ke kelas 0 atau kelas 1.

Oleh karena itu, untuk menangani masalah klasifikasi multi-kelas (atau masalah yang melibatkan lebih dari dua kelas) dengan regresi logistik, diperlukan modifikasi pada algoritma standar.

Salah satu teknik untuk mencapai ini melibatkan membagi masalah klasifikasi multi-kelas menjadi beberapa submasalah klasifikasi biner. Metode regresi logistik standar kemudian dapat diterapkan pada setiap submasalah ini. Inilah cara OpenCV mengimplementasikan regresi logistik multi-kelas:

"Regresi Logistik mendukung klasifikasi baik biner maupun multi-kelas (untuk multi-kelas, itu membuat beberapa pengklasifikasi 2-kelas)."

— Regresi Logistik, OpenCV

Teknik seperti ini dikenal sebagai pendekatan satu lawan satu, yang melibatkan pelatihan pengklasifikasi biner terpisah untuk setiap pasangan unik kelas dalam dataset. Selama prediksi, setiap pengklasifikasi biner ini memberikan suara untuk salah satu dari dua kelas yang dilatih, dan kelas yang menerima suara terbanyak di antara semua pengklasifikasi diambil sebagai kelas yang diprediksi.

Terdapat teknik lain untuk mencapai klasifikasi multi-kelas dengan regresi logistik, seperti pendekatan satu lawan lainnya. Anda dapat menemukan informasi lebih lanjut di tutorial [1, 2].

Menerapkan Regresi Logistik pada Masalah Klasifikasi Multi-Kelas

Untuk tujuan ini, kita akan menggunakan dataset digit dalam OpenCV, meskipun kode yang akan kita kembangkan juga dapat diterapkan pada dataset multi-kelas lainnya.

Langkah pertama kita adalah memuat gambar digit OpenCV, membaginya menjadi beberapa sub-gambar yang menampilkan digit tulisan tangan dari 0 hingga 9, dan membuat label kebenaran dasar yang akan memungkinkan kita mengukur akurasi model regresi logistik yang terlatih nanti. Untuk contoh ini, kita akan mengalokasikan 80% gambar dataset ke set pelatihan dan 20% sisanya ke set pengujian:

# Muat gambar digit

img, sub_imgs = split_images('Images/digits.png', 20)

# Dapatkan dataset pelatihan dan pengujian dari gambar digit

digits_train_imgs, digits_train_labels, digits_test_imgs, digits_test_labels = split_data(20, sub_imgs, 0.8)

Selanjutnya, kita akan mengikuti proses serupa dengan yang kita lakukan pada tutorial sebelumnya, di mana kita melatih dan menguji algoritma regresi logistik pada dataset dua kelas, mengubah beberapa parameter untuk menyesuaikannya dengan dataset multi-kelas yang lebih besar.

Langkah pertama adalah, sekali lagi, membuat model regresi logistik itu sendiri:

# Buat model regresi logistik kosong

lr_digits = ml.LogisticRegression_create()

Kita dapat, sekali lagi, memastikan bahwa OpenCV mengimplementasikan Batch Gradient Descent sebagai metode pelatihan defaultnya (dilambangkan dengan nilai 0) dan kemudian melanjutkan untuk mengubahnya menjadi metode Mini-Batch Gradient Descent, menentukan ukuran mini-batch:

# Periksa met

ode pelatihan default

print('Metode Pelatihan:', lr_digits.getTrainMethod())

# Atur metode pelatihan menjadi Mini-Batch Gradient Descent dan ukuran mini-batch

lr_digits.setTrainMethod(ml.LogisticRegression_MINI_BATCH)

lr_digits.setMiniBatchSize(400)


Berbagai ukuran mini-batch tentu akan memengaruhi pelatihan model dan akurasi prediksi. Pilihan kami untuk ukuran mini-batch dalam contoh ini didasarkan pada pendekatan heuristik untuk praktis, di mana beberapa ukuran mini-batch diuji, dan nilai yang menghasilkan akurasi prediksi yang cukup tinggi (seperti yang akan kita lihat nanti) diidentifikasi. Namun, Anda sebaiknya mengikuti pendekatan yang lebih sistematis, yang dapat memberikan Anda keputusan yang lebih terinformasi tentang ukuran mini-batch yang menawarkan kompromi yang lebih baik antara biaya komputasional dan akurasi prediksi untuk tugas yang dihadapi.

Selanjutnya, kita akan menentukan jumlah iterasi yang ingin kita jalankan pada algoritma pelatihan yang dipilih sebelum terminasi:

# Atur jumlah iterasi

lr_digits.setIterations(10)

Kita sekarang siap untuk melatih model regresi logistik pada data pelatihan:

# Latih regresi logistik pada set data pelatihan

lr_digits.train(digits_train_imgs.astype(float32), ml.ROW_SAMPLE, digits_train_labels.astype(float32))

Pada tutorial sebelumnya, kita mencetak koefisien yang dipelajari untuk mengetahui bagaimana model yang paling baik memisahkan sampel dua kelas yang kita kerjakan, didefinisikan. Kali ini, kita tidak akan mencetak koefisien yang dipelajari, terutama karena ada terlalu banyak dari mereka, mengingat kita sekarang bekerja dengan data input dengan dimensionalitas yang lebih tinggi.

Sebagai gantinya, apa yang akan kita lakukan adalah mencetak jumlah koefisien yang dipelajari (daripada koefisien itu sendiri) serta jumlah fitur input agar dapat membandingkannya:

# Cetak jumlah koefisien yang dipelajari, dan jumlah fitur input

print('Jumlah koefisien:', len(lr_digits.get_learnt_thetas()[0]))

print('Jumlah fitur input:', len(digits_train_imgs[0, :]))

Hasil:

Jumlah koefisien: 401

Jumlah fitur input: 400


Memang, kita menemukan bahwa kita memiliki jumlah nilai koefisien sebanyak fitur input, ditambah dengan nilai bias tambahan, sesuai dengan yang kita harapkan (kita bekerja dengan gambar pixel, dan kita menggunakan nilai pixel itu sendiri sebagai fitur input, oleh karena itu 400 fitur per gambar).

Kita dapat menguji seberapa baik model ini memprediksi label kelas target dengan mencobanya pada bagian pengujian dari dataset:

# Prediksi label target dari data pengujian

_, y_pred = lr_digits.predict(digits_test_imgs.astype(float32))

# Hitung dan cetak akurasi yang dicapai

akurasi = (sum(y_pred[:, 0] == digits_test_labels[:, 0]) / digits_test_labels.size) * 100

print('Akurasi:', akurasi, '%')

Hasil

Akurasi: 88.8 %


Sebagai langkah terakhir, mari lanjutkan dan hasilkan serta plot matriks kebingungan untuk mendapatkan wawasan lebih dalam tentang digit mana yang keliru dianggap sebagai digit lain:

# Hasilkan dan plot matriks kebingungan

cm = confusion_matrix(digits_test_labels, y_pred)

disp = ConfusionMatrixDisplay(confusion_matrix=cm)

disp.plot()

show()

Dengan cara ini, kita dapat melihat bahwa kelas dengan kinerja terendah adalah 5 dan 2, yang keliru paling banyak dianggap sebagai 8.

Kode lengkapnya adalah sebagai berikut:

from cv2 import ml

from sklearn.datasets import make_blobs

from sklearn import model_selection as ms

from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

from numpy import float32

from matplotlib.pyplot import show

from digits_dataset import split_images, split_data

 

# Muat gambar digit

img, sub_imgs = split_images('Images/digits.png', 20)

 

# Dapatkan dataset pelatihan dan pengujian dari gambar digit

digits_train_imgs, digits_train_labels, digits_test_imgs, digits_test_labels = split_data(20, sub_imgs, 0.8)

 

# Buat model regresi logistik kosong

lr_digits = ml.LogisticRegression_create()

 

# Periksa metode pelatihan default

print('Metode Pelatihan:', lr_digits.getTrainMethod())

 

# Atur metode pelatihan menjadi Mini-Batch Gradient Descent dan ukuran mini-batch

lr_digits.setTrainMethod(ml.LogisticRegression_MINI_BATCH)

lr_digits.setMiniBatchSize(400)

 

# Atur jumlah iterasi

lr_digits.setIterations(10)

 

# Latih regresi logistik pada set data pelatihan

lr_digits.train(digits_train_imgs.astype(float32), ml.ROW_SAMPLE, digits_train_labels.astype(float32))

 

# Cetak jumlah koefisien yang dipelajari, dan jumlah fitur input

print('Jumlah koefisien:', len(lr_digits.get_learnt_thetas()[0]))

print('Jumlah fitur input:', len(digits_train_imgs[0, :]))

 

# Prediksi label target dari data pengujian

_, y_pred = lr_digits.predict(digits_test_imgs.astype(float32))

 

# Hitung dan cetak akurasi yang dicapai

akurasi = (sum(y_pred[:, 0] == digits_test_labels[:, 0]) / digits_test_labels.size) * 100

print('Akurasi:', akurasi, '%')

 

# Hasilkan dan plot matriks kebingungan

cm = confusion_matrix(digits_test_labels, y_pred)

disp = ConfusionMatrixDisplay(confusion_matrix=cm)

disp.plot()

show()

```


Pada tutorial ini, kita telah menerapkan metode regresi logistik, yang secara alami dirancang untuk klasifikasi biner, pada masalah klasifikasi multi-kelas. Kita telah menggunakan nilai piksel sebagai fitur input yang mewakili setiap gambar, mendapatkan akurasi klasifikasi sebesar 88,8% dengan nilai parameter yang dipilih.

Referensi: Stefania Cristina, Logistic Regression for Image Classification Using OpenCV. MachineLearningMastery.com, Diakses 13 Maret 2024

0 komentar:

Posting Komentar