Download utils/utils.py from handeerdal/submission_phasea1: direct link, hf CLI and curl.
- Browser
- Download file 6.2 kB
-
https://huggingface.co/handeerdal/submission_phasea1/resolve/main/utils/utils.py
- Command line
-
hf download hf://handeerdal/submission_phasea1/utils/utils.py
-
curl -L -o utils.py https://huggingface.co/handeerdal/submission_phasea1/resolve/main/utils/utils.py
6.2 kB
| import cv2 | |
| import numpy as np | |
| from skimage.feature.texture import graycomatrix, graycoprops | |
| from skimage.feature import local_binary_pattern, hog | |
| from sklearn.svm import SVC | |
| from sklearn.model_selection import train_test_split, GridSearchCV | |
| from sklearn.metrics import accuracy_score, classification_report, precision_score, confusion_matrix | |
| from sklearn.preprocessing import StandardScaler | |
| def rgb_histogram(image, bins=256): | |
| hist_features = [] | |
| for i in range(3): | |
| hist, _ = np.histogram(image[:, :, i], bins=bins, range=(0, 256), density=True) | |
| hist_features.append(hist) | |
| return np.concatenate(hist_features) | |
| def hu_moments(image): | |
| gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) | |
| moments = cv2.moments(gray) | |
| hu_moments = cv2.HuMoments(moments).flatten() | |
| return hu_moments | |
| def glcm_features(image, distances=[1], angles=[0], levels=256, symmetric=True, normed=True): | |
| gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) | |
| glcm = graycomatrix(gray, distances=distances, angles=angles, levels=levels, symmetric=symmetric, normed=normed) | |
| contrast = graycoprops(glcm, 'contrast').flatten() | |
| dissimilarity = graycoprops(glcm, 'dissimilarity').flatten() | |
| homogeneity = graycoprops(glcm, 'homogeneity').flatten() | |
| energy = graycoprops(glcm, 'energy').flatten() | |
| correlation = graycoprops(glcm, 'correlation').flatten() | |
| asm = graycoprops(glcm, 'ASM').flatten() | |
| return np.concatenate([contrast, dissimilarity, homogeneity, energy, correlation, asm]) | |
| def local_binary_pattern_features(image, P=8, R=1): | |
| gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) | |
| lbp = local_binary_pattern(gray, P, R, method='uniform') | |
| (hist, _) = np.histogram(lbp.ravel(), bins=np.arange(0, P + 3), range=(0, P + 2), density=True) | |
| return hist | |
| def extract_features_from_image(image): | |
| hist_features = rgb_histogram(image, bins=64) | |
| hu_features = hu_moments(image) | |
| glcm_features_vector = glcm_features(image) | |
| lbp_features = local_binary_pattern_features(image) | |
| gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) | |
| hog_features = hog( | |
| gray, | |
| orientations=8, | |
| pixels_per_cell=(32, 32), | |
| cells_per_block=(2, 2), | |
| visualize=False, | |
| feature_vector=True | |
| ) | |
| color_moments_features = [] | |
| for channel in cv2.split(image): | |
| color_moments_features.append(np.mean(channel)) | |
| color_moments_features.append(np.std(channel)) | |
| color_moments_features = np.array(color_moments_features) | |
| edges = cv2.Canny(gray, 50, 150) | |
| edge_density = np.sum(edges > 0) / edges.size | |
| edge_features = np.array([edge_density]) | |
| image_features = np.concatenate([ | |
| hist_features, | |
| hu_features, | |
| glcm_features_vector, | |
| lbp_features, | |
| hog_features, | |
| color_moments_features, | |
| edge_features | |
| ]) | |
| return image_features | |
| def perform_pca(data, num_components): | |
| mean = np.mean(data, axis=0) | |
| std_dev = np.std(data, axis=0) | |
| data_standardized = (data - mean) / std_dev | |
| covariance_matrix = np.cov(data_standardized, rowvar=False) | |
| eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix) | |
| sorted_indices = np.argsort(eigenvalues)[::-1] | |
| sorted_eigenvalues = eigenvalues[sorted_indices] | |
| sorted_eigenvectors = eigenvectors[:, sorted_indices] | |
| top_k_eigenvectors = sorted_eigenvectors[:, :num_components] | |
| data_reduced = np.dot(data_standardized, top_k_eigenvectors) | |
| data_reduced = np.real(data_reduced) | |
| return data_reduced | |
| def train_svm_model(features, labels, test_size=0.2, use_grid_search=False, use_precision_optimization=False): | |
| if labels.ndim > 1 and labels.shape[1] > 1: | |
| labels = np.argmax(labels, axis=1) | |
| X_train, X_test, y_train, y_test = train_test_split( | |
| features, labels, test_size=test_size, random_state=42, | |
| stratify=labels | |
| ) | |
| scaler = StandardScaler() | |
| X_train_scaled = scaler.fit_transform(X_train) | |
| X_test_scaled = scaler.transform(X_test) | |
| if use_grid_search: | |
| print("Grid Search...") | |
| param_grid = { | |
| 'C': [0.1, 1, 10, 100, 1000], | |
| 'kernel': ['rbf', 'linear', 'poly'], | |
| 'gamma': ['scale', 'auto', 0.001, 0.01, 0.1], | |
| 'class_weight': ['balanced', None], | |
| 'degree': [2, 3, 4] | |
| } | |
| svm = SVC(random_state=42, probability=True) | |
| scoring = 'precision_weighted' if use_precision_optimization else 'accuracy' | |
| grid_search = GridSearchCV( | |
| svm, param_grid, | |
| cv=5, | |
| scoring=scoring, | |
| n_jobs=-1, | |
| verbose=1 | |
| ) | |
| grid_search.fit(X_train_scaled, y_train) | |
| svm_model = grid_search.best_estimator_ | |
| print(f"\nbest params: {grid_search.best_params_}") | |
| print(f" CV Score: {grid_search.best_score_:.4f}") | |
| else: | |
| svm_model = SVC( | |
| kernel='rbf', | |
| C=10, | |
| gamma='scale', | |
| class_weight='balanced', | |
| random_state=42, | |
| probability=True | |
| ) | |
| svm_model.fit(X_train_scaled, y_train) | |
| y_pred = svm_model.predict(X_test_scaled) | |
| accuracy = accuracy_score(y_test, y_pred) | |
| print(f'Test Accuracy: {accuracy:.2f}') | |
| if use_precision_optimization: | |
| precision_weighted = precision_score(y_test, y_pred, average='weighted', zero_division=0) | |
| precision_macro = precision_score(y_test, y_pred, average='macro', zero_division=0) | |
| print(f'Test Precision (Weighted): {precision_weighted:.4f}') | |
| print(f'Test Precision (Macro): {precision_macro:.4f}') | |
| print(f'\nClassification Report:') | |
| print(classification_report(y_test, y_pred, zero_division=0)) | |
| results = { | |
| 'model': svm_model, | |
| 'scaler': scaler, | |
| 'accuracy': accuracy, | |
| 'precision_weighted': precision_weighted, | |
| 'precision_macro': precision_macro, | |
| 'y_test': y_test, | |
| 'y_pred': y_pred | |
| } | |
| if use_grid_search: | |
| results['best_params'] = grid_search.best_params_ | |
| results['cv_score'] = grid_search.best_score_ | |
| return svm_model, results | |
| return svm_model | |