import os import numpy as np from sklearn import svm from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report, confusion_matrix from skimage.io import imread from skimage.transform import resize from sklearn.model_selection import train_test_split, RandomizedSearchCV from scipy.stats import uniform from configs import * # Set the path to your dataset folder, where each subfolder represents a class dataset_path = COMBINED_DATA_DIR + str(1) # Function to load, resize, and convert images to grayscale def load_resize_and_convert_to_gray(folder, target_size=(100, 100)): images = [] for filename in os.listdir(folder): img_path = os.path.join(folder, filename) if os.path.isfile(img_path): img = imread(img_path, as_gray=True) img = resize(img, target_size, anti_aliasing=True) images.append(img) return images # Load, resize, and convert images to grayscale from folders X = [] # List to store images y = [] # List to store corresponding labels class_folders = os.listdir(dataset_path) class_folders.sort() # Sort the class folders to ensure consistent class ordering for class_folder in class_folders: class_path = os.path.join(dataset_path, class_folder) if os.path.isdir(class_path): images = load_resize_and_convert_to_gray(class_path) X.extend(images) y.extend([class_folder] * len(images)) # Assign labels based on folder name # Convert data to NumPy arrays X = np.array(X) y = np.array(y) # Split the dataset into training and testing sets X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # Define the parameter distributions for random search param_dist = { "C": uniform(loc=0, scale=10), # Randomly sample from [0, 10] "kernel": ["linear", "rbf", "poly"], "gamma": uniform(loc=0.001, scale=0.1), # Randomly sample from [0.001, 0.1] } # Flatten the images to a 1D array X_train_flat = X_train.reshape(X_train.shape[0], -1) X_test_flat = X_test.reshape(X_test.shape[0], -1) # Create an SVM classifier svm_classifier = svm.SVC() # Perform Randomized Search with cross-validation random_search = RandomizedSearchCV( svm_classifier, param_distributions=param_dist, n_iter=50, cv=5, n_jobs=-1, verbose=2, random_state=42, ) # Fit the Randomized Search on the training data random_search.fit(X_train_flat, y_train) # Print the best hyperparameters print("Best Hyperparameters:") print(random_search.best_params_) # Get the best SVM model with the tuned hyperparameters best_svm_model = random_search.best_estimator_ # Evaluate the best model on the test set y_pred = best_svm_model.predict(X_test_flat) # Calculate accuracy and other metrics accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy) # Confusion Matrix conf_matrix = confusion_matrix(y_test, y_pred) print("Confusion Matrix:\n", conf_matrix) # You can also print other classification metrics like precision, recall, and F1-score from sklearn.metrics import classification_report report = classification_report(y_test, y_pred) print("Classification Report:\n", report)