-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdimensionalidad_final_py.py
More file actions
124 lines (94 loc) · 3.54 KB
/
dimensionalidad_final_py.py
File metadata and controls
124 lines (94 loc) · 3.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# -*- coding: utf-8 -*-
"""dimensionalidad_final.py
Automatically generated by Colab.
Original file is located at
https://colab.research.google.com/drive/1H5SCXykJ6MhTwnqgWfH0fo0paQOxPKGB
"""
import cv2
import glob
import pandas as pd
import numpy as np
from scipy import stats
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
import os
def extraer_caracteristicas(ruta_imagen):
"""
Carga una imagen, la convierte a escala de grises y extrae
estadísticas básicas (media, mediana, moda, max, min).
"""
# Cargar imagen directamente
img = cv2.imread(ruta_imagen)
# Validación: verificar si la imagen se cargó correctamente
if img is None:
print(f"Advertencia: No se pudo cargar la imagen {ruta_imagen}")
return None
# Conversión directa BGR a Escala de Grises (ahorramos un paso)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Redimensionar (64x64)
re_size = cv2.resize(gray, (64, 64))
# Aplanar la imagen para cálculos estadísticos más rápidos
flat_img = re_size.flatten()
# Extracción de características
media = np.mean(flat_img)
mediana = np.median(flat_img)
# stats.mode con axis=None busca la moda en todo el array
mode_result = stats.mode(flat_img, axis=None, keepdims=True)
moda = mode_result.mode[0] if isinstance(mode_result.mode, np.ndarray) else mode_result.mode
maximo = np.max(flat_img)
minimo = np.min(flat_img)
return [media, mediana, moda, maximo, minimo]
def generar_dataset(rutas_dict, nombre_archivo="dataset.csv"):
"""
Recorre los directorios, extrae características y guarda un CSV nuevo.
"""
datos = []
print("Procesando imágenes...")
for clase, ruta_patron in rutas_dict.items():
archivos = glob.glob(ruta_patron)
print(f" -> Procesando clase '{clase}': {len(archivos)} imágenes encontradas.")
for ruta in archivos:
features = extraer_caracteristicas(ruta)
if features:
features.append(clase)
datos.append(features)
columnas = ["Media", "Mediana", "Moda", "Maximo", "Minimo", "Clase"]
df = pd.DataFrame(datos, columns=columnas)
df.to_csv(nombre_archivo, index=False, header=False)
print(f"Dataset guardado exitosamente en '{nombre_archivo}' con {len(df)} registros.")
def entrenar_knn(ruta_dataset):
if not os.path.exists(ruta_dataset):
print("Error: El archivo del dataset no existe.")
return
# Cargar datos
data = pd.read_csv(ruta_dataset, header=None)
# Separar Features (X) y Etiquetas (y)
X = data.iloc[:, :-1].values
y = data.iloc[:, -1].values
print(f"Dataset cargado: {X.shape[0]} instancias, {X.shape[1]} características.")
# Split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=8)
# Modelo
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# Evaluación
y_pred = knn.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print("--- Resultados ---")
print(f"Exactitud (Accuracy): {acc*100:.2f}%")
return knn
def main():
# Diccionario de rutas para mantener el código ordenado
rutas = {
'A': 'A/*.JPG',
'B': 'B/*.JPG',
'C': 'C/*.JPG',
'D': 'D/*.JPG'
}
# 1. Generar el dataset:
generar_dataset(rutas)
# 2. Entrenar el modelo:
entrenar_knn("dataset.csv")
if __name__ == '__main__':
main()