Latar belakang
Pernyataan Masalah
Tujuan
Cakupan
Memuat dan Mempersiapkan Gambar
Pemformatan dan Konversi Gambar
Ekstraksi dan Seleksi Fitur
Regresi Logistik
Analisis Diskriminan Linier
K Tetangga Terdekat
Pohon Keputusan
Hutan Acak
Bayes Naif
Mendukung Mesin Vektor
Metrik Akurasi dan Kinerja
Perbandingan Model Pembelajaran Mesin
Keterbatasan dan Tantangan
Ringkasan Prestasi
Kontribusi dan Signifikansi
Pekerjaan dan Perbaikan di Masa Depan
Penyakit tanaman menimbulkan ancaman signifikan terhadap produktivitas pertanian, yang menyebabkan hilangnya hasil dan kesulitan ekonomi bagi petani. Deteksi penyakit tanaman yang tepat waktu dan akurat sangat penting untuk menerapkan strategi pengelolaan penyakit yang efektif dan meminimalkan kerusakan tanaman. Metode diagnosis penyakit manual yang tradisional dapat memakan waktu, subyektif, dan rawan kesalahan. Oleh karena itu, integrasi teknologi, seperti pembelajaran mesin dan pemrosesan gambar, muncul sebagai pendekatan yang menjanjikan untuk mengotomatisasi dan meningkatkan deteksi penyakit tanaman.
Tujuan utama dari proyek ini adalah untuk mengembangkan Sistem Deteksi Penyakit Tanaman menggunakan algoritma pembelajaran mesin dan teknik pemrosesan gambar. Sistem ini bertujuan untuk mengklasifikasikan daun tanaman secara akurat sebagai sehat atau sakit dengan menganalisis gambar digital daun. Dengan mengotomatiskan proses deteksi, petani dan pakar pertanian dapat segera mengidentifikasi dan mengatasi penyakit tanaman sehingga memungkinkan intervensi tepat waktu dan mengoptimalkan praktik pengelolaan tanaman.
Tujuan utama dari proyek ini adalah sebagai berikut
Mengembangkan Sistem Deteksi Penyakit Tanaman yang kuat dan akurat
Menerapkan algoritma pembelajaran mesin untuk klasifikasi otomatis daun tanaman
Memanfaatkan teknik pemrosesan gambar untuk mengekstrak fitur yang relevan dari gambar daun
Evaluasi performa dan akurasi berbagai model pembelajaran mesin
Menyediakan antarmuka yang ramah pengguna untuk interaksi yang mudah dan intuitif dengan sistem
Proyek ini berfokus pada deteksi penyakit tanaman khususnya pada daun apel. Dataset yang digunakan untuk pelatihan dan pengujian model diperoleh dari Plant-Village Dataset yang berisi gambar daun apel sehat dan daun yang terkena penyakit seperti Keropeng Apel, Busuk Hitam, dan Karat Apel Cedar. Sistem ini bertujuan untuk mencapai akurasi yang tinggi dalam klasifikasi penyakit dan menyediakan alat praktis bagi petani dan profesional pertanian untuk mengidentifikasi dan mengelola penyakit tanaman secara efektif. Proyek ini tidak mencakup deteksi penyakit secara real-time di lapangan atau integrasi perangkat keras untuk akuisisi gambar
Dataset yang digunakan untuk Sistem Deteksi Penyakit Tanaman ini terdiri dari gambar daun apel yang diperoleh dari Dataset Plant-Village. Kumpulan data disusun menjadi empat kategori utama yang mewakili berbagai kelas kondisi daun apel Apple___Apple_scab, Apple___Black_rot, Apple___Cedar_apple_rust, dan Apple___healthy
Apple___Apple_scab: Kategori ini berisi 630 gambar, dengan 598 gambar ditugaskan untuk pelatihan dan 32 gambar untuk pengujian
Apple___Black_rot: Kumpulan data mencakup 621 gambar dalam kategori ini, dengan 589 gambar dialokasikan untuk pelatihan dan 32 gambar untuk pengujian
Apple___Cedar_apple_rust: Dataset terdiri dari 275 gambar daun yang terkena karat apel cedar, dengan 261 gambar digunakan untuk pelatihan dan 14 gambar untuk pengujian
Apel___sehat: Kategori ini berisi 1645 gambar daun apel yang sehat. Dari jumlah tersebut, 1562 gambar ditujukan untuk pelatihan, dan 83 gambar dicadangkan untuk pengujian.
Gambar pelatihan digunakan untuk mengajarkan model pembelajaran mesin mengenali pola dan membedakan daun yang sehat dan yang sakit. Gambar pengujian digunakan untuk mengevaluasi kinerja dan keakuratan model yang dilatih pada data yang tidak terlihat. Dengan memanfaatkan kumpulan data yang beragam ini, Sistem Deteksi Penyakit Tanaman bertujuan untuk secara akurat mengklasifikasikan daun apel sebagai daun yang sehat atau terkena penyakit seperti keropeng apel, busuk hitam, atau karat apel cedar. Komposisi kumpulan data memungkinkan sistem untuk belajar dari berbagai kondisi daun dan meningkatkan kemampuannya untuk menggeneralisasi dan mengidentifikasi penyakit tanaman secara akurat
Memuat dan Mempersiapkan Gambar
Dalam konteks proyek deteksi penyakit daun apel, langkah pertama adalah memperoleh kumpulan data yang terdiri dari gambar daun apel yang terkena berbagai penyakit. Gambar-gambar ini kemudian dimuat ke dalam sistem agar dapat diakses untuk diproses lebih lanjut. Selain itu, gambar disiapkan dengan melakukan penyesuaian yang diperlukan seperti mengubah ukurannya ke resolusi yang konsisten, memotong bagian yang tidak perlu, atau menormalkan distribusi warna. Pemformatan dan Konversi Gambar Setelah gambar daun apel dimuat, gambar tersebut perlu diformat dan dikonversi untuk memastikan kompatibilitas dengan tahapan proyek selanjutnya. Ini melibatkan standarisasi format gambar dengan mengonversinya ke jenis file tertentu seperti JPEG atau PNG. Selain itu, penyesuaian dapat dilakukan pada resolusi ruang warna, atau atribut gambar lainnya untuk memastikan konsistensi dan memfasilitasi analisis yang akurat
Ekstraksi dan Seleksi Fitur
Ekstraksi ciri merupakan langkah penting dalam mendeteksi penyakit pada daun apel. Berbagai teknik digunakan untuk mengekstrak fitur-fitur yang relevan dari gambar daun. Teknik-teknik tersebut antara lain menganalisis tekstur untuk menangkap pola tekstur yang berhubungan dengan penyakit, memeriksa warna untuk mengidentifikasi variasi yang terkait dengan penyakit tertentu, dan mempelajari bentuk untuk mendeteksi ketidakteraturan morfologi daun. Dengan mengekstraksi fitur-fitur khusus ini, algoritme pembelajaran mesin selanjutnya dapat secara efektif membedakan antara daun apel yang sehat dan yang sakit
Pemilihan Fitur
Langkah ini melibatkan pemilihan subkumpulan fitur yang diekstraksi berdasarkan relevansi dan kekuatan diskriminatifnya. Pemilihan fitur membantu mengurangi dimensi kumpulan data dengan menghilangkan gangguan atau informasi yang berlebihan. Dengan memilih fitur yang paling informatif, efisiensi dan akurasi model deteksi penyakit dapat ditingkatkan
Proyek deteksi penyakit daun apel menggunakan serangkaian algoritma pembelajaran mesin untuk mengembangkan model klasifikasi penyakit yang efektif. Algoritma berikut digunakan
Regresi Logistik: Regresi Logistik digunakan untuk memprediksi kemungkinan daun apel sehat atau sakit berdasarkan fitur yang diekstraksi
Analisis Diskriminan Linier: Analisis Diskriminan Linier membantu mengklasifikasikan daun apel dengan menemukan kombinasi fitur linier yang paling baik dalam membedakan sampel sehat dan sakit.
K Tetangga Terdekat (KNN): K Tetangga Terdekat mengklasifikasikan daun apel dengan membandingkan fitur-fiturnya dengan tetangga terdekat di ruang fitur
Pohon Keputusan: Pohon Keputusan menggunakan serangkaian kondisi if-else untuk mengklasifikasikan sampel berdasarkan fitur dan hubungan hierarkinya
Random Forest: Random Forest adalah metode pembelajaran ansambel yang menggabungkan beberapa pohon keputusan untuk meningkatkan akurasi klasifikasi
Naïve Bayes: Naïve Bayes adalah algoritma probabilistik yang menghitung probabilitas daun apel termasuk dalam kelas penyakit tertentu
Support Vector Machine (SVM): Support Vector Machine membuat hyperplane dalam ruang fitur berdimensi tinggi untuk mengklasifikasikan daun apel
Setelah memilih algoritme pembelajaran mesin, model dilatih menggunakan kumpulan data berlabel yang terdiri dari gambar daun apel dengan label penyakit yang sesuai. Model belajar mengenali pola dan hubungan antara fitur dan kelas penyakit selama fase pelatihan ini. Untuk memastikan keandalan dan generalisasi model, proses validasi dilakukan. Model yang dilatih dievaluasi menggunakan kumpulan data validasi terpisah yang tidak digunakan selama pelatihan. Hal ini membantu menilai kemampuan model untuk secara akurat mengklasifikasikan sampel daun apel yang tidak terlihat
Setelah model dilatih dan divalidasi, model tersebut diuji pada kumpulan data pengujian terpisah yang berisi gambar daun apel baru yang belum terlihat. Model tersebut memprediksi kelas penyakit untuk setiap sampel, dan metrik evaluasi kinerja seperti akurasi, presisi, perolehan, dan skor F1 dihitung untuk mengukur efektivitas model dalam deteksi penyakit.
Dalam [1]:
# -----------------------------------# EKSTRAKSI FITUR GLOBAL# --------- --------------------------from sklearn.preprocessing import LabelEncoderfrom sklearn.preprocessing import MinMaxScalerimport numpy as npimport mahotasimport cvimport osimport h5py# ----- ---------------# parameter merdu# --------------------images_per_class = 800fixed_size = tuple(( 500 , 500 ))train_path = "../dataset/train"test_path = "../dataset/test"h5_train_features = "../embeddings/features/features.h5"h5_train_labels = "../embeddings/labels/labels.h5 "bins = 8##### Konversi BGR Ke RGBDalam [2]:# Mengonversi setiap gambar ke RGB dari BGR formatdef rgb_bgr(image):rgb_img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)mengembalikan rgb_img##### Konversi RGB ke HSV (Nilai Saturasi Warna)Dalam [3]:# Konversi ke format gambar HSV dari RGBdef bgr_hsv(rgb_img) :hsv_img = cv2.cvtColor(rgb_img, cv2.COLOR_RGB2HSV)return hsv_img##### Segmentasi GambarDalam [4]:# untuk ekstraksi img_segmentasi warna hijau dan coklat(rgb_img, hsv_img):lower_green = np.array([ 25 , 0 , 20 ])upper_green = np. susunan([ 100 , 255 , 255 ])healthy_mask = cv2.inRange(hsv_img, lower_green, upper_green)result = cv2.bitwise_and(rgb_img, rgb_img, mask=healthy_mask)lower_ brown = np.array([ 10 , 0 , 10 ])upper_ brown = np.array([ 30 , 255 , 255 ])mask_penyakit = cv2.inRange(hsv_img, coklat_bawah, coklat_atas)hasil_penyakit = cv2.bitwise_and(rgb_img, rgb_img, masker=masker_penyakit)mask_akhir = masker_sehat + masker_penyakit_hasil_akhir = cv2.bitwise_and(rgb_img, rgb_img, masker=masker_akhir)kembali final_result##### Menentukan deskriptor fitur###### 1. Hu MomentsDalam [5]:# feature-descriptor-1: Hu Momentsdef fd_hu_moments(image):image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) fitur = cv2.HuMoments(cv2.moments(image)).flatten()fitur pengembalian###### 2. Tekstur HaralickDalam [6]:# deskripsi-fitur-2: Haralick Texturedef fd_haralick(image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)haralick = mahotas.features.haralick(gray).mean(axis= 0 )kembalikan haralick###### 3. Histogram WarnaDalam [7]:# deskripsi-fitur-3: Histogramdef Warna fd_histogram(gambar, mask=Tidak Ada):gambar = cv2.cvtColor(gambar, cv2.COLOR_BGR2HSV)hist = cv2.calcHist( [gambar], [ 0 , 1 , 2 ], Tidak ada, [tempat sampah, tempat sampah, tempat sampah], [ 0 , 256 , 0 , 256 , 0 ,256 ] )cv2.normalize(hist, hist)return hist.flatten()##### Memuat kumpulan data pelatihanDalam [8]:# dapatkan label pelatihanstrain_labels = os.listdir(train_path)# urutkan label pelatihanstrain_labels.sort() print(train_labels)# daftar kosong untuk menampung vektor fitur dan labelsglobal_features = []labels = [] ['Apple___Apple_scab', 'Apple___Black_rot', 'Apple___Cedar_apple_rust','Apple___healthy']##### Membuat Fitur dan Penyematan Label dari kumpulan dataDalam [9]:# mengulang subfolder data pelatihan untuk nama_pelatihan di train_labels:# gabung jalur data pelatihan dan folder pelatihan setiap spesiesimg_dir_path = os.path.join(train_path, training_name)# dapatkan label pelatihan saat inicurrent_label = nama_pelatihan# ulangi gambar di setiap sub-folder untuk img di os.listdir(img_dir_path):# ambil file gambar namefile = os.path.join( img_dir_path, img)# baca gambar dan ubah ukurannya menjadi ukuran tetapimage = cv2.imread(file)image = cv2.resize(image, fixed_size)# Menjalankan Fungsi Sedikit Demi BitRGB_BGR = rgb_bgr(image)BGR_HSV = bgr_hsv(RGB_BGR)IMG_SEGMENT = img_segmentation(RGB_BGR, BGR_HSV)# Panggilan untuk Deskriptor Fitur Globalfv_hu_moments = fd_hu_moments(IMG_SEGMENT)fv_haralick = fd_haralick(IMG_SEGMENT)fv_histogram = fd_histogram(IMG_SEGMENT)# Gabungkan fitur globalglobal_feature = np.hstack([fv_histogram, fv_haralick,fv_hu_moments])# perbarui daftar label dan fitur vectorslabels.append(current_label)global_features.append(global_feature)print("[STATUS] folder yang diproses: {}".format(current_label))print("[STATUS] menyelesaikan Ekstraksi Fitur Global...") Folder yang diproses [STATUS]: Apple___Apple_scab[STATUS] folder yang diproses: Apple___Black_rot[STATUS] folder yang diproses: Apple___Cedar_apple_rust[STATUS] folder yang diproses: Apple___healthy[STATUS] menyelesaikan Ekstraksi Fitur Global...Dalam [10]:# print(global_features)Dalam [ 41]:# dapatkan ukuran vektor fitur secara keseluruhanprint("[STATUS] fitur vektor ukuran{}".format(np.array(global_features).shape)) [STATUS] menampilkan ukuran vektor (3010, 532)Dalam [12]:# dapatkan ukuran label pelatihan keseluruhan# print(labels)print("[STATUS] training Labels {}".format(np.array(labels).shape )) [STATUS] Label pelatihan (3010,)
Label Nilai yang dikodekanApple___Apple_scab 0Apple___Black_rot 1Apple___Cedar_apple_rust 2Apple___healthy 3
Dalam [13]:
targetNames = np.unique(labels) le = LabelEncoder() target = le.fit_transform(labels) print(targetNames) print("[STATUS] label pelatihan dikodekan...") ['Apple___Apple_scab' 'Apple___Black_rot' 'Apple___Cedar_apple_rust' ' Apple___healthy'] [STATUS] label pelatihan dikodekan...
Dalam [14]:
dari sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler(feature_range=( 0 , 1 ))rescaled_features = scaler.fit_transform(global_features)print("[STATUS] vektor fitur dinormalisasi...")rescaled_features[STATUS] vektor fitur dinormalisasi...Keluar [14]:array([[0.8974175 , 0,03450962, 0,01845123, ..., 0,02027887, 0,12693291,0.96573218], [0,89815922, 0,13025558, 0,02774864, ..., 0,02027767, 0,12692423,0,96573354], [0,56777027, 0. , 0,01540143, ..., 0,02027886, 0,12693269,0,96573218], ..., [0,95697685, 0,01228793, 0,00548476, ..., 0,02027886, 0,12693346,0,96573218], [0,97704002, 0,10614054, 0,03136325, ..., 0,02027885, 0,12692424,0,96573217], [0.95214074, 0.03819411, 0.03671892, ..., 0.02027886, 0.12692996,0.96573217]])print("[STATUS] label target: {}".format(target))print("[STATUS] bentuk label target: {}".format(target.bentuk)) [STATUS] label target: [0 0 0 ... 3 3 3] Bentuk label target [STATUS]: (3010,)
A. Fitur
h5f_data = h5py.File(h5_train_features, "w")h5f_data.create_dataset("dataset_1", data=np.array(rescaled_features))Out[16]:
h5f_label = h5py.File(h5_train_labels, "w")h5f_label.create_dataset("dataset_1", data=np.array(target))Out[17]:Dalam [43]:h5f_data.close()h5f_label.close()
# --------------------# PELATIHAN MODEL KAMI# --------- --------------------------import h5pyimport numpy as npimport osimport cvimport warningsfrom matplotlib import pyplotfrom sklearn.model_selection import train_test_split, cross_val_scorefrom sklearn.model_selection import KFold, StratifiedKFoldfrom sklearn.metrics mengimpor Confusion_matrix, skor_akurasi,laporan_klasifikasidari sklearn.linear_model import LogisticRegressionfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.discriminant_analisis import LinearDiscriminantAnalysisfrom sklearn.naive_bayes import GaussianNBfrom sklearn.svm import SVCimport joblibwarnings.filterwarnings("ignore")# --------------------# merdu-parameter# ----------- ---------num_trees = 100test_size = 0.seed = 9scoring = "accuracy"# dapatkan label pelatihanstrain_labels = os.listdir(train_path)# urutkan label pelatihanstrain_labels.sort()jika tidak os.path.exists(test_path):os.makedirs(test_path)# membuat semua model pembelajaran mesinmodels = []models.append(("LR", LogisticRegression(random_state=seed)))models.append(("LDA" , LinearDiscriminantAnalysis()))models.append(("KNN", KNeighborsClassifier()))models.append(("DTC", DecisionTreeClassifier(random_state=seed)))models.append(("RF", RandomForestClassifier(n_estimators=num_trees,random_state=seed)))models.append(("NB", GaussianNB()))models.append(("SVM ", SVC(random_state=seed)))# variabel untuk menampung hasil dan namahasil = []nama = []# impor vektor fitur dan melatih labelsh5f_data = h5py.File(h5_train_features, "r")h5f_label = h5py.File(h5_train_labels, "r")global_features_string = h5f_data["dataset_1"]global_labels_string = h5f_label["dataset_1"]global_features = np.array(global_features_string)global_labels = np.array(global_labels_string)h5f_data.close()h5f_label.close()# verifikasi bentuk vektor fitur dan labelsprint("[STATUS] bentuk fitur: {}".format(global_features. bentuk))print("[STATUS] bentuk label: {}".format(global_labels.shape))print("Pelatihan [STATUS] dimulai...")print(global_labels, len(global_labels), len(global_features)) [STATUS] menampilkan bentuk: (3010, 532) Bentuk label [STATUS]: (3010,) [STATUS] pelatihan dimulai... [0 0 0 ... 3 3 3] 3010 3010
Dalam [38]:
(trainDataGlobal,testDataGlobal,trainLabelsGlobal,testLabelsGlobal, ) = train_test_split(np.array(global_features), np.array(global_labels),test_size=test_size, random_state=seed)print("[STATUS] memisahkan data kereta dan data pengujian...")print("Data kereta : {} ".format(trainDataGlobal.shape))print("Data pengujian : {}".format(testDataGlobal.shape)) [STATUS] memisahkan data kereta dan pengujian...Data kereta : (2408, 532)Data pengujian : (602, 532)Dalam [40]:trainDataGlobalOut[40]:array([[9.47066972e-01, 1.97577832e-02 , 5.34481987e-04, ...,2.02788613e-02, 1.26936845e-01, 9.65732178e-01], [9.67673181e-01, 4.20456024e-02, 5.76285634e-02, ...,2.02788294e-02, 1.26933581e-01, 9.65732217e-01], [9.84705756e-01, 2.97800312e-02, 1.34500344e-02, ...,2.02788553e-02, 1.26941878e-01, 9.65732187e-01], ..., [8.64347882e-01, 5.89053245e-02, 4.27430333e-02, ...,2.02791643e-02, 1.26961451e-01, 9.65733689e-01], [9.85818416e-01, 1.47428536e-03, 3.35008392e-03, ...,2.02767694e-02, 1.26792776e-01, 9.65732951e-01], [9.93152188e-01, 1.31020292e-03, 8.50637768e-04, ...,2.02910354e-02, 1.27475382e-01, 9.65721108e-01]])
Dalam [22]:
untuk nama, model dalam model:kfold = KFold(n_splits= 10 )cv_results = cross_val_score(model, trainDataGlobal, trainLabelsGlobal, cv=kfold,scoring=scoring)results.append(cv_results)names.append(name)msg = "%s : %f (%f)" % (nama, cv_results.mean(), cv_results.std())print(msg)LR: 0,900346 (0,020452)LDA: 0,892038 (0,017931)KNN: 0,884978 (0,019588)KERANI: 0,886210 (0,014771)RF: 0,967191 (0,012676)NB: 0,839293 (0,014065)SVM: 0,885813 (0,021190)
Dalam [23]:
fig = pyplot.figure()fig.suptitle("Perbandingan algoritme Pembelajaran Mesin")ax = fig.add_subplot( 111 )pyplot.boxplot(hasil)ax.set_xticklabels(nama)pyplot.show()
Dari hasil diatas terlihat bahwa model Random Forest Classifier memiliki akurasi tertinggi sebesar 96.7% dan model Gaussian NB memiliki akurasi terendah sebesar 83.9%.