Calamar49 commited on
Commit
ff00022
·
1 Parent(s): b6f8b84
Files changed (2) hide show
  1. Dockerfile +1 -1
  2. app.py +12 -14
Dockerfile CHANGED
@@ -4,4 +4,4 @@ COPY ./requirements.txt /code/requirements.txt
4
  RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
5
  COPY . /code
6
  EXPOSE 7860
7
- CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
 
4
  RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
5
  COPY . /code
6
  EXPOSE 7860
7
+ CMD ["python", "app.py"]
app.py CHANGED
@@ -1,4 +1,4 @@
1
- # app.py (versión para el modelo híbrido con Gradio y FastAPI)
2
 
3
  import torch
4
  import torchvision.transforms as transforms
@@ -6,43 +6,40 @@ from PIL import Image
6
  import json
7
  import timm
8
  import gradio as gr
9
- from fastapi import FastAPI
10
 
11
  # --- 1. Importar la definición del modelo ---
12
- from VisionEnsembleModel import VisionEnsembleModel # <-- ¡Importante!
13
 
14
  # --- 2. Carga del Modelo y Componentes ---
15
- device = torch.device("cpu") # Usar CPU es más seguro en el plan gratuito
16
- MODEL_PATH = "model/best_vision_ensemble_model.pth" # <-- RUTA AL MODELO HÍBRIDO
17
  LABELS_PATH = "model/species_labels_map.json"
18
  NUM_CLASSES = 156
19
 
20
  with open(LABELS_PATH) as f:
21
  labels_map = json.load(f)
22
 
23
- # --- Instanciamos y cargamos el modelo ensamblado ---
24
- model = VisionEnsembleModel(num_classes=NUM_CLASSES) # <-- Usamos nuestra clase personalizada
25
  model.load_state_dict(torch.load(MODEL_PATH, map_location=device))
26
  model.to(device)
27
  model.eval()
28
 
29
  print("Modelo Ensamblado Híbrido (CNN+ViT) cargado y listo.")
30
 
31
- # Definir las transformaciones de la imagen (sin cambios)
32
  transforms_val = transforms.Compose([
33
  transforms.Resize((224, 224)),
34
  transforms.ToTensor(),
35
  transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
36
  ])
37
 
38
- # --- 3. Función de Predicción (sin cambios en la lógica) ---
39
  def predict(image):
40
  pil_image = Image.fromarray(image.astype('uint8'), 'RGB')
41
  input_tensor = transforms_val(pil_image).unsqueeze(0).to(device)
42
  with torch.no_grad():
43
  output = model(input_tensor)
44
  probabilities = torch.nn.functional.softmax(output[0], dim=0)
45
-
46
  top5_prob, top5_catid = torch.topk(probabilities, 5)
47
  confidences = {}
48
  for i in range(top5_prob.size(0)):
@@ -52,7 +49,7 @@ def predict(image):
52
  confidences[species_name] = prob
53
  return confidences
54
 
55
- # --- 4. Crear la Interfaz de Gradio (sin cambios) ---
56
  iface = gr.Interface(
57
  fn=predict,
58
  inputs=gr.Image(type="numpy", label="Sube una imagen de tu orquídea"),
@@ -61,6 +58,7 @@ iface = gr.Interface(
61
  description="Sube una foto de una orquídea y la IA (CNN+ViT) intentará identificar la especie.",
62
  )
63
 
64
- # --- 5. Crear la App FastAPI y Montar Gradio (sin cambios) ---
65
- app = FastAPI()
66
- app = gr.mount_gradio_app(app, iface, path="/")
 
 
1
+ # app.py (versión final y simplificada con Gradio)
2
 
3
  import torch
4
  import torchvision.transforms as transforms
 
6
  import json
7
  import timm
8
  import gradio as gr
 
9
 
10
  # --- 1. Importar la definición del modelo ---
11
+ from VisionEnsembleModel import VisionEnsembleModel
12
 
13
  # --- 2. Carga del Modelo y Componentes ---
14
+ device = torch.device("cpu")
15
+ MODEL_PATH = "model/best_vision_ensemble_model.pth"
16
  LABELS_PATH = "model/species_labels_map.json"
17
  NUM_CLASSES = 156
18
 
19
  with open(LABELS_PATH) as f:
20
  labels_map = json.load(f)
21
 
22
+ model = VisionEnsembleModel(num_classes=NUM_CLASSES)
 
23
  model.load_state_dict(torch.load(MODEL_PATH, map_location=device))
24
  model.to(device)
25
  model.eval()
26
 
27
  print("Modelo Ensamblado Híbrido (CNN+ViT) cargado y listo.")
28
 
 
29
  transforms_val = transforms.Compose([
30
  transforms.Resize((224, 224)),
31
  transforms.ToTensor(),
32
  transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
33
  ])
34
 
35
+ # --- 3. Función de Predicción (sin cambios) ---
36
  def predict(image):
37
  pil_image = Image.fromarray(image.astype('uint8'), 'RGB')
38
  input_tensor = transforms_val(pil_image).unsqueeze(0).to(device)
39
  with torch.no_grad():
40
  output = model(input_tensor)
41
  probabilities = torch.nn.functional.softmax(output[0], dim=0)
42
+
43
  top5_prob, top5_catid = torch.topk(probabilities, 5)
44
  confidences = {}
45
  for i in range(top5_prob.size(0)):
 
49
  confidences[species_name] = prob
50
  return confidences
51
 
52
+ # --- 4. Crear y Lanzar la Interfaz de Gradio ---
53
  iface = gr.Interface(
54
  fn=predict,
55
  inputs=gr.Image(type="numpy", label="Sube una imagen de tu orquídea"),
 
58
  description="Sube una foto de una orquídea y la IA (CNN+ViT) intentará identificar la especie.",
59
  )
60
 
61
+ # Lanzamos la aplicación.
62
+ # server_name="0.0.0.0" es crucial para que funcione dentro de Docker.
63
+ # server_port=7860 es el puerto estándar que Hugging Face expone.
64
+ iface.launch(server_name="0.0.0.0", server_port=7860)