Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os # Untuk operasi sistem seperti mengakses direktori
- import cv2 # OpenCV untuk pemrosesan gambar
- import numpy as np # Numpy untuk operasi array
- import matplotlib.pyplot as plt # Matplotlib untuk visualisasi
- import seaborn as sns # Seaborn untuk visualisasi grafik yang lebih menarik
- from sklearn import svm # SVM dari Scikit-Learn untuk klasifikasi
- from sklearn.metrics import classification_report, accuracy_score, confusion_matrix # Untuk evaluasi model
- from sklearn.model_selection import train_test_split # Untuk membagi data menjadi set pelatihan dan pengujian
- from sklearn.preprocessing import LabelEncoder # Untuk encoding label
- # Fungsi untuk memuat data gambar
- def load_data(data_dir):
- labels = [] # Untuk menyimpan label
- images = [] # Untuk menyimpan gambar
- file_counts = {} # Untuk menyimpan jumlah file yang cocok per label
- for label in os.listdir(data_dir): # Iterasi melalui setiap folder (A-Z)
- label_dir = os.path.join(data_dir, label) # Path ke folder label
- if os.path.isdir(label_dir): # Memastikan bahwa itu adalah direktori
- count = 0 # Menghitung file dalam setiap folder
- for file in os.listdir(label_dir): # Iterasi melalui setiap file dalam folder
- file_path = os.path.join(label_dir, file) # Path ke file gambar
- image = cv2.imread(file_path, cv2.IMREAD_COLOR) # Membaca gambar dalam warna
- if image is not None: # Memastikan gambar berhasil dimuat
- image = cv2.resize(image, (128, 128)) # Mengubah ukuran gambar menjadi 128x128 piksel
- images.append(image) # Menyimpan gambar
- labels.append(label) # Menyimpan label
- count += 1 # Menambah jumlah file yang cocok
- file_counts[label] = count # Menyimpan jumlah file yang cocok untuk setiap label
- return np.array(images), np.array(labels), file_counts # Mengembalikan gambar, label, dan jumlah file
- # Fungsi untuk menampilkan gambar asli dan hasil pengolahan citra
- def plot_comparison(images, processed_images, labels, num_samples=5):
- unique_labels = np.unique(labels) # Mendapatkan label unik
- for label in unique_labels: # Iterasi melalui setiap label unik
- indices = np.where(labels == label)[0][:num_samples] # Mendapatkan beberapa sampel untuk setiap label
- if len(indices) > 0:
- plt.figure(figsize=(15, 5)) # Ukuran plot
- for i, idx in enumerate(indices):
- # Menampilkan gambar asli
- plt.subplot(2, num_samples, i + 1)
- plt.imshow(cv2.cvtColor(images[idx], cv2.COLOR_BGR2RGB))
- plt.title(f"Original {label}")
- plt.axis('off')
- # Menampilkan gambar hasil pengolahan
- plt.subplot(2, num_samples, i + 1 + num_samples)
- plt.imshow(processed_images[idx], cmap='gray')
- plt.title(f"Processed {label}")
- plt.axis('off')
- plt.show() # Menampilkan plot
- # Fungsi untuk memproses gambar menggunakan GLCM
- def process_images_glcm(images):
- processed_images = [] # Untuk menyimpan gambar hasil pengolahan
- features = [] # Untuk menyimpan fitur yang diekstrak
- for image in images:
- gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Konversi gambar ke skala abu-abu
- glcm = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)).apply(gray_image) # Menerapkan CLAHE untuk meningkatkan kontras
- processed_images.append(glcm) # Menyimpan gambar hasil pengolahan
- stats = cv2.calcHist([glcm], [0], None, [256], [0, 256]) # Menghitung histogram dari gambar hasil pengolahan
- features.append(stats.flatten()) # Menyimpan fitur yang diekstrak
- return np.array(processed_images), np.array(features) # Mengembalikan gambar hasil pengolahan dan fitur
- # Memuat data
- data_dir = '/content/drive/My Drive/SIBI_data' # Ubah ini sesuai dengan direktori data Anda
- images, labels, file_counts = load_data(data_dir) # Memuat gambar, label, dan jumlah file yang cocok
- # Memproses gambar menggunakan GLCM
- processed_images, features = process_images_glcm(images) # Memproses gambar dan mengekstrak fitur
- # Encode label
- le = LabelEncoder() # Inisialisasi encoder
- encoded_labels = le.fit_transform(labels) # Encode label menjadi numerik
- # Membagi data
- X_train, X_test, y_train, y_test = train_test_split(features, encoded_labels, test_size=0.2, random_state=42) # Membagi data
- # Melatih model SVM
- clf = svm.SVC(kernel='linear') # Inisialisasi model SVM dengan kernel linear
- clf.fit(X_train, y_train) # Melatih model
- # Memprediksi
- y_pred = clf.predict(X_test) # Memprediksi data uji
- # Mencetak Classification Report
- print("Classification Report:")
- print(classification_report(y_test, y_pred, target_names=le.classes_, zero_division=0)) # Mencetak laporan klasifikasi
- # Mencetak Akurasi
- print("Akurasi:", accuracy_score(y_test, y_pred)) # Mencetak akurasi model
- # Mencetak jumlah file yang cocok untuk setiap folder
- print("Jumlah file/data yang cocok untuk setiap folder:")
- for label, count in file_counts.items(): # Iterasi melalui setiap label dan jumlah file yang cocok
- print(f"{label}: {count} file") # Mencetak label dan jumlah file yang cocok
- # Menampilkan Confusion Matrix
- def plot_confusion_matrix(y_true, y_pred):
- cm = confusion_matrix(y_true, y_pred) # Membuat confusion matrix
- plt.figure(figsize=(10, 7)) # Ukuran plot
- sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=le.classes_, yticklabels=le.classes_) # Membuat heatmap
- plt.xlabel('Predicted') # Label sumbu x
- plt.ylabel('Actual') # Label sumbu y
- plt.title('Confusion Matrix') # Judul plot
- plt.show() # Menampilkan plot
- plot_confusion_matrix(y_test, y_pred) # Menampilkan confusion matrix
- # Menampilkan beberapa gambar asli dan hasil pengolahan citra
- plot_comparison(images, processed_images, labels, num_samples=5) # Menampilkan perbandingan gambar asli dan hasil pengolahan
- # Menghitung akurasi per folder
- folder_accuracies = {}
- for label in np.unique(y_test):
- indices = np.where(y_test == label)
- folder_accuracy = accuracy_score(y_test[indices], y_pred[indices])
- folder_accuracies[le.inverse_transform([label])[0]] = folder_accuracy
- # Menampilkan akurasi per folder dalam bentuk grafik
- plt.figure(figsize=(10, 6))
- plt.bar(folder_accuracies.keys(), folder_accuracies.values())
- plt.xlabel('Folder')
- plt.ylabel('Akurasi')
- plt.title('Akurasi per Folder')
- plt.xticks(rotation=90)
- plt.show()
- # Menampilkan akurasi keseluruhan
- overall_accuracy = accuracy_score(y_test, y_pred)
- print("Akurasi Keseluruhan:", overall_accuracy)
Add Comment
Please, Sign In to add comment