RaulHuaroteZegarra commited on
Commit
c9e83d0
verified
1 Parent(s): 966e6f1

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +4 -5
  2. app.py +131 -78
  3. requirements.txt +1 -7
Dockerfile CHANGED
@@ -1,17 +1,16 @@
1
  # Usa una imagen base de Python
2
- FROM python:3.11
3
  # Establece el directorio de trabajo
4
  WORKDIR /code
5
 
6
- RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y
7
  # Copia los archivos necesarios al contenedor
8
  COPY ./requirements.txt /code/requirements.txt
9
- RUN pip install --upgrade pip
10
  RUN pip install --no-cache-dir -r /code/requirements.txt
11
- RUN apt-get update && apt-get install -y python3-opencv
12
  RUN pip install fastapi uvicorn
13
 
 
 
14
  RUN chmod -R 777 /code
15
 
16
  # Comando para ejecutar la aplicaci贸n
17
- CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
 
1
  # Usa una imagen base de Python
2
+ FROM python:3.12.4
3
  # Establece el directorio de trabajo
4
  WORKDIR /code
5
 
 
6
  # Copia los archivos necesarios al contenedor
7
  COPY ./requirements.txt /code/requirements.txt
 
8
  RUN pip install --no-cache-dir -r /code/requirements.txt
 
9
  RUN pip install fastapi uvicorn
10
 
11
+ COPY . .
12
+
13
  RUN chmod -R 777 /code
14
 
15
  # Comando para ejecutar la aplicaci贸n
16
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
app.py CHANGED
@@ -1,89 +1,142 @@
1
- import pickle
2
- from minisom import MiniSom
3
- import numpy as np
4
- import cv2
5
-
6
- import urllib.request
7
- import uuid
8
  from fastapi import FastAPI, HTTPException
9
  from pydantic import BaseModel
 
 
10
  from typing import List
11
 
12
  class InputData(BaseModel):
13
- data: str # image url
14
-
 
15
  app = FastAPI()
16
 
17
- # Funci贸n para construir el modelo manualmente
18
- def build_model():
19
- with open('somlucuma.pkl', 'rb') as fid:
20
- somecoli = pickle.load(fid)
21
- MM = np.loadtxt('matrizMM.txt', delimiter=" ")
22
- return somecoli,MM
23
-
24
- som,MM = build_model() # Construir el modelo al iniciar la aplicaci贸n
25
-
26
- from scipy.ndimage import median_filter
27
- from scipy.signal import convolve2d
28
-
29
- def sobel(patron):
30
- gx = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtype=np.float32)
31
- gy = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]], dtype=np.float32)
32
-
33
- Gx = convolve2d(patron, gx, mode='valid')
34
- Gy = convolve2d(patron, gy, mode='valid')
35
-
36
- return Gx, Gy
37
-
38
- def medfilt2(G, d=3):
39
- return median_filter(G, size=d)
40
-
41
- def orientacion(patron, w):
42
- Gx, Gy = sobel(patron)
43
- Gx = medfilt2(Gx)
44
- Gy = medfilt2(Gy)
45
-
46
- m, n = Gx.shape
47
- mOrientaciones = np.zeros((m // w, n // w), dtype=np.float32)
48
-
49
- for i in range(m // w):
50
- for j in range(n // w):
51
- Gx_patch = Gx[i*w:(i+1)*w, j*w:(j+1)*w]
52
- Gy_patch = Gy[i*w:(i+1)*w, j*w:(j+1)*w]
53
-
54
- YY = np.sum(2 * Gx_patch * Gy_patch)
55
- XX = np.sum(Gx_patch**2 - Gy_patch**2)
56
-
57
- mOrientaciones[i, j] = (0.5 * np.arctan2(YY, XX) + np.pi / 2.0) * (18.0 / np.pi)
58
-
59
- return mOrientaciones
60
-
61
- def redimensionar(img, h, v):
62
- return cv2.resize(img, (h, v), interpolation=cv2.INTER_AREA)
63
-
64
- def prediction(som, imgurl):
65
- archivo = f"/tmp/test-{uuid.uuid4()}.jpg"
66
- urllib.request.urlretrieve(imgurl, archivo)
67
- Xtest = redimensionar(cv2.imread(archivo),256,256)
68
- Xtest = np.array(Xtest)
69
- Xtest = cv2.cvtColor(Xtest, cv2.COLOR_BGR2GRAY)
70
-
71
- orientaciones = orientacion(Xtest, w=14)
72
- Xtest = Xtest.astype('float32') / 255.0
73
- orientaciones = orientaciones.reshape(-1)
74
- return som.winner(orientaciones)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
 
76
  # Ruta de predicci贸n
77
  @app.post("/predict/")
78
  async def predict(data: InputData):
79
- print(f"Data: {data}")
80
- global som
81
- global MM
82
- try:
83
- # Convertir la lista de entrada a un array de NumPy para la predicci贸n
84
- imgurl = data.data
85
- print(type(data.data))
86
- w = prediction(som, imgurl)
87
- return {"prediction": MM[w]}
88
- except Exception as e:
89
- raise HTTPException(status_code=500, detail=str(e))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  from fastapi import FastAPI, HTTPException
2
  from pydantic import BaseModel
3
+ import numpy as np
4
+ import random
5
  from typing import List
6
 
7
  class InputData(BaseModel):
8
+ data: List[float] # Lista de caracter铆sticas num茅ricas (flotantes)
9
+ data2: List[float] # Lista de caracter铆sticas num茅ricas (flotantes)
10
+
11
  app = FastAPI()
12
 
13
+ # ------------- algoritmo genetico -------------
14
+ # Funci贸n para generar una poblaci贸n inicial aleatoria
15
+ def generar_poblacion(num_individuos, num_ciudades):
16
+ poblacion = []
17
+ for _ in range(num_individuos):
18
+ individuo = list(range(num_ciudades))
19
+ random.shuffle(individuo)
20
+ poblacion.append(individuo)
21
+ return poblacion
22
+
23
+ # Funci贸n para evaluar la aptitud de un individuo (distancia total del recorrido)
24
+ def calcular_aptitud(individuo, distancias, coordenadas):
25
+ distancia_total = 0
26
+ coordenadas_iguales = all(coord == coordenadas[0] for coord in coordenadas)
27
+
28
+ if not coordenadas_iguales:
29
+ for i in range(len(individuo) - 1):
30
+ ciudad_actual = individuo[i]
31
+ siguiente_ciudad = individuo[i + 1]
32
+ distancia_total += distancias[ciudad_actual][siguiente_ciudad]
33
+
34
+ distancia_total += distancias[individuo[-1]][individuo[0]]
35
+
36
+ return distancia_total
37
+
38
+ # Funci贸n para seleccionar individuos para la reproducci贸n (torneo binario)
39
+ def seleccion_torneo(poblacion, distancias, coordenadas):
40
+ seleccionados = []
41
+ for _ in range(len(poblacion)):
42
+ torneo = random.sample(poblacion, 2)
43
+ aptitud_torneo = [
44
+ calcular_aptitud(individuo, distancias, coordenadas) for individuo in torneo
45
+ ]
46
+ seleccionado = torneo[aptitud_torneo.index(min(aptitud_torneo))]
47
+ seleccionados.append(seleccionado)
48
+ return seleccionados
49
+
50
+ # Funci贸n para realizar el cruce de dos padres para producir un hijo
51
+ def cruzar(padre1, padre2):
52
+ punto_cruce = random.randint(0, len(padre1) - 1)
53
+ hijo = padre1[:punto_cruce] + [
54
+ gen for gen in padre2 if gen not in padre1[:punto_cruce]
55
+ ]
56
+ return hijo
57
+
58
+
59
+ # Funci贸n para aplicar mutaciones en la poblaci贸n
60
+ def mutar(individuo, probabilidad_mutacion):
61
+ if random.random() < probabilidad_mutacion:
62
+ indices = random.sample(range(len(individuo)), 2)
63
+ individuo[indices[0]], individuo[indices[1]] = (
64
+ individuo[indices[1]],
65
+ individuo[indices[0]],
66
+ )
67
+ return individuo
68
+
69
+ # Funci贸n para generar distancias aleatorias entre ciudades y sus coordenadas bidimensionales
70
+ def generar_distancias(num_ciudades):
71
+ distancias = [[0] * num_ciudades for _ in range(num_ciudades)]
72
+ coordenadas = [
73
+ (random.uniform(0, 100), random.uniform(0, 100)) for _ in range(num_ciudades)
74
+ ]
75
+
76
+ for i in range(num_ciudades):
77
+ for j in range(i + 1, num_ciudades):
78
+ distancias[i][j] = distancias[j][i] = (
79
+ sum((x - y) ** 2 for x, y in zip(coordenadas[i], coordenadas[j])) ** 0.5
80
+ )
81
+
82
+ return distancias, coordenadas
83
+ # Funci贸n para generar distancias aleatorias entre ciudades y sus coordenadas bidimensionales
84
+ def generar_distanaias_coordenadas(listapuntos):
85
+ num_ciudades = int(max(listapuntos.shape)/2)
86
+ distancias = [[0] * (num_ciudades) for _ in range(num_ciudades)]
87
+ coordenadas = [
88
+ (listapuntos[i], listapuntos[i+1]) for i in range(0,2*num_ciudades-1,2)
89
+ ]
90
+ for i in range(num_ciudades):
91
+ for j in range(i + 1, num_ciudades):
92
+ distancias[i][j] = distancias[j][i] = (
93
+ sum((x - y) ** 2 for x, y in zip(coordenadas[i], coordenadas[j])) ** 0.5
94
+ )
95
+ return distancias, coordenadas
96
+
97
+ def algoritmo_genetico(num_generaciones,num_ciudades,num_individuos,probabilidad_mutacion,distancias,coordenadas):
98
+ poblacion = generar_poblacion(num_individuos, num_ciudades)
99
+ for generacion in range(num_generaciones):
100
+ poblacion = sorted(
101
+ poblacion, key=lambda x: calcular_aptitud(x, distancias, coordenadas)
102
+ )
103
+ mejor_individuo = poblacion[0]
104
+ mejor_distancia = calcular_aptitud(mejor_individuo, distancias, coordenadas)
105
+ seleccionados = seleccion_torneo(poblacion, distancias, coordenadas)
106
+ nueva_poblacion = []
107
+ for i in range(0, len(seleccionados), 2):
108
+ padre1, padre2 = seleccionados[i], seleccionados[i + 1]
109
+ hijo1 = cruzar(padre1, padre2)
110
+ hijo2 = cruzar(padre2, padre1)
111
+ hijo1 = mutar(hijo1, probabilidad_mutacion)
112
+ hijo2 = mutar(hijo2, probabilidad_mutacion)
113
+ nueva_poblacion.extend([hijo1, hijo2])
114
+ poblacion = nueva_poblacion
115
+ mejor_solucion = poblacion[0]
116
+ mejor_distancia = calcular_aptitud(mejor_solucion, distancias, coordenadas)
117
+ return mejor_solucion, mejor_distancia
118
 
119
  # Ruta de predicci贸n
120
  @app.post("/predict/")
121
  async def predict(data: InputData):
122
+ try:
123
+ input_data = np.array(data.data).reshape(
124
+ 1, -1
125
+ ) # Asumiendo que la entrada debe ser de forma (1, num_features)
126
+
127
+ num_ciudades = int(input_data[0][0])
128
+ num_individuos = int(input_data[0][1])
129
+ probabilidad_mutacion = float(input_data[0][2])
130
+ num_generaciones = int(input_data[0][3])
131
+ distancias, coordenadas = generar_distanaias_coordenadas(np.array(data.data2))
132
+ print(f"Coordenadas al inicio: {coordenadas}")
133
+ mejor_solucion, mejor_distancia = algoritmo_genetico(num_generaciones,num_ciudades,num_individuos,probabilidad_mutacion,distancias,coordenadas)
134
+ mejor_solucion.append(int(mejor_distancia))
135
+
136
+ prediction = mejor_solucion
137
+ print(f"Coordenadas al final: {coordenadas}")
138
+ print(f"Predicci贸n: {prediction}")
139
+ #return {"prediction": prediction.tolist()}
140
+ return {"prediction": prediction}
141
+ except Exception as e:
142
+ raise HTTPException(status_code=500, detail=str(e))
requirements.txt CHANGED
@@ -1,9 +1,3 @@
1
- scikit-learn
2
- #pillow
3
- #tensorflow
4
- minisom
5
  fastapi
6
  numpy
7
- pydantic
8
- opencv-python
9
- matplotlib
 
 
 
 
 
1
  fastapi
2
  numpy
3
+ pydantic