RaulHuaroteZegarra commited on
Commit
0185c37
verified
1 Parent(s): c9e83d0

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +1 -1
  2. app.py +30 -129
  3. requirements.txt +5 -1
Dockerfile CHANGED
@@ -1,5 +1,5 @@
1
  # Usa una imagen base de Python
2
- FROM python:3.12.4
3
  # Establece el directorio de trabajo
4
  WORKDIR /code
5
 
 
1
  # Usa una imagen base de Python
2
+ FROM python:3.12.7
3
  # Establece el directorio de trabajo
4
  WORKDIR /code
5
 
app.py CHANGED
@@ -1,142 +1,43 @@
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))
 
1
+ from fastapi import FastAPI, File, UploadFile, HTTPException
2
+ from fastapi.responses import HTMLResponse
3
  from pydantic import BaseModel
 
 
4
  from typing import List
5
+ import cv2
6
+ from PIL import Image
7
+ import numpy as np
8
+ from io import BytesIO
9
 
 
 
 
 
10
  app = FastAPI()
11
 
12
+ # Funci贸n modificada para detectar solo sonrisas
13
+ def buscar_existe(image):
14
+ existe = "no se detectecta una sonrisa"
15
+ print("resultado: ", image.shape)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
+ # Cargar el clasificador de sonrisas
18
+ smile_cascade = cv2.CascadeClassifier('haarcascade_smile.xml')
19
+
20
+ # Convertir la imagen a escala de grises
21
+ gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
22
+
23
+ # Detectar sonrisas en la imagen completa
24
+ smiles = smile_cascade.detectMultiScale(gray, 1.8, 20, minSize=(25, 25))
25
+
26
+ numsmile = len(smiles)
27
+ if len(smiles) > 0:
28
+ existe = "se ha detectado al menos 1 sonrisa"
29
+ return existe
 
 
 
 
 
 
 
 
30
 
31
  # Ruta de predicci贸n
32
+ @app.post('/predict/')
33
+ async def predict(file: UploadFile = File(...)):
34
  try:
35
+ # Leer la imagen desde el archivo subido
36
+ image = Image.open(BytesIO(await file.read()))
37
+ image = np.asarray(image)
 
 
 
 
 
 
 
 
 
38
 
39
+ # Usar la funci贸n para detectar sonrisas
40
+ prediction = buscar_existe(image)
 
 
41
  return {"prediction": prediction}
42
  except Exception as e:
43
  raise HTTPException(status_code=500, detail=str(e))
requirements.txt CHANGED
@@ -1,3 +1,7 @@
1
  fastapi
2
  numpy
3
- pydantic
 
 
 
 
 
1
  fastapi
2
  numpy
3
+ pydantic
4
+ opencv-python-headless
5
+ uvicorn[standard]
6
+ python-multipart
7
+ pillow