Upload 5 files
Browse files- Dockerfile +1 -5
- app.py +14 -14
- modelo_cnn_tbc_mejorado.h5 +3 -0
- modelo_cnn_tbc_mejorado.json +0 -0
Dockerfile
CHANGED
|
@@ -1,14 +1,12 @@
|
|
| 1 |
# Dockerfile
|
| 2 |
|
| 3 |
# Usar una imagen base oficial de Python.
|
| 4 |
-
# 'slim' es una versión ligera, ideal para producción.
|
| 5 |
FROM python:3.9-slim
|
| 6 |
|
| 7 |
# Establecer el directorio de trabajo dentro del contenedor
|
| 8 |
WORKDIR /app
|
| 9 |
|
| 10 |
# Copiar el archivo de requerimientos primero para aprovechar el cache de Docker.
|
| 11 |
-
# Si los requerimientos no cambian, esta capa no se reconstruirá.
|
| 12 |
COPY requirements.txt .
|
| 13 |
|
| 14 |
# Instalar las dependencias de Python
|
|
@@ -18,10 +16,8 @@ RUN pip install --no-cache-dir -r requirements.txt
|
|
| 18 |
# Esto incluye app.py y tu modelo .h5
|
| 19 |
COPY . .
|
| 20 |
|
| 21 |
-
# Exponer el puerto en el que se ejecutará la aplicación.
|
| 22 |
-
# Hugging Face Spaces espera que las apps escuchen en el puerto 7860.
|
| 23 |
EXPOSE 7860
|
| 24 |
|
| 25 |
# El comando para iniciar la aplicación cuando el contenedor se ejecute.
|
| 26 |
-
# --host 0.0.0.0 es crucial para que la app sea accesible desde fuera del contenedor.
|
| 27 |
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
|
|
|
|
| 1 |
# Dockerfile
|
| 2 |
|
| 3 |
# Usar una imagen base oficial de Python.
|
|
|
|
| 4 |
FROM python:3.9-slim
|
| 5 |
|
| 6 |
# Establecer el directorio de trabajo dentro del contenedor
|
| 7 |
WORKDIR /app
|
| 8 |
|
| 9 |
# Copiar el archivo de requerimientos primero para aprovechar el cache de Docker.
|
|
|
|
| 10 |
COPY requirements.txt .
|
| 11 |
|
| 12 |
# Instalar las dependencias de Python
|
|
|
|
| 16 |
# Esto incluye app.py y tu modelo .h5
|
| 17 |
COPY . .
|
| 18 |
|
| 19 |
+
# Exponer el puerto en el que se ejecutará la aplicación (7860 para Hugging Face).
|
|
|
|
| 20 |
EXPOSE 7860
|
| 21 |
|
| 22 |
# El comando para iniciar la aplicación cuando el contenedor se ejecute.
|
|
|
|
| 23 |
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
|
app.py
CHANGED
|
@@ -9,24 +9,24 @@ from tensorflow.keras.models import load_model
|
|
| 9 |
|
| 10 |
# Inicializar la aplicación FastAPI
|
| 11 |
app = FastAPI(
|
| 12 |
-
title="API de Clasificación de TBC",
|
| 13 |
-
description="Una API para clasificar radiografías de tórax como 'normal' o 'tbc' usando un modelo CNN.",
|
| 14 |
-
version="
|
| 15 |
)
|
| 16 |
|
| 17 |
# --- Carga del Modelo ---
|
| 18 |
-
# Cargar el modelo .h5 al iniciar la aplicación
|
| 19 |
-
# Esto es mucho más eficiente que cargarlo en cada solicitud.
|
| 20 |
try:
|
| 21 |
-
|
| 22 |
-
|
|
|
|
| 23 |
except Exception as e:
|
| 24 |
print(f"Error al cargar el modelo: {e}")
|
| 25 |
model = None
|
| 26 |
|
| 27 |
-
# Definir las constantes del modelo
|
| 28 |
-
IMG_HEIGHT =
|
| 29 |
-
IMG_WIDTH =
|
| 30 |
CLASS_NAMES = ["normal", "tbc"]
|
| 31 |
|
| 32 |
# --- Endpoints de la API ---
|
|
@@ -34,7 +34,7 @@ CLASS_NAMES = ["normal", "tbc"]
|
|
| 34 |
@app.get("/")
|
| 35 |
def read_root():
|
| 36 |
"""Endpoint raíz para verificar que la API está funcionando."""
|
| 37 |
-
return {"message": "Bienvenido a la API de Clasificación de TBC. Usa el endpoint /predict/
|
| 38 |
|
| 39 |
@app.post("/predict/")
|
| 40 |
async def predict(file: UploadFile = File(...)):
|
|
@@ -56,18 +56,18 @@ async def predict(file: UploadFile = File(...)):
|
|
| 56 |
return JSONResponse(status_code=400, content={"error": f"Archivo inválido. No se pudo procesar la imagen: {e}"})
|
| 57 |
|
| 58 |
# 3. Preprocesar la imagen para que coincida con la entrada del modelo
|
| 59 |
-
# Redimensionar la imagen
|
| 60 |
image = image.resize((IMG_WIDTH, IMG_HEIGHT))
|
| 61 |
# Convertir la imagen a un array de numpy
|
| 62 |
img_array = np.array(image)
|
| 63 |
# Normalizar los valores de los píxeles (de 0-255 a 0-1)
|
| 64 |
img_array = img_array / 255.0
|
| 65 |
-
# Añadir una dimensión de batch (el modelo espera una forma de [1,
|
| 66 |
image_batch = np.expand_dims(img_array, axis=0)
|
| 67 |
|
| 68 |
# 4. Realizar la predicción
|
| 69 |
prediction = model.predict(image_batch)
|
| 70 |
-
score = prediction[0][0]
|
| 71 |
|
| 72 |
# 5. Interpretar el resultado
|
| 73 |
if score > 0.5:
|
|
|
|
| 9 |
|
| 10 |
# Inicializar la aplicación FastAPI
|
| 11 |
app = FastAPI(
|
| 12 |
+
title="API de Clasificación de TBC (Mejorado)",
|
| 13 |
+
description="Una API para clasificar radiografías de tórax como 'normal' o 'tbc' usando un modelo CNN con Transfer Learning (MobileNetV2).",
|
| 14 |
+
version="2.0"
|
| 15 |
)
|
| 16 |
|
| 17 |
# --- Carga del Modelo ---
|
| 18 |
+
# Cargar el modelo .h5 mejorado al iniciar la aplicación.
|
|
|
|
| 19 |
try:
|
| 20 |
+
# Asegúrate de que el nombre del archivo coincida con el que guardaste
|
| 21 |
+
model = load_model('modelo_cnn_tbc_mejorado.h5')
|
| 22 |
+
print("Modelo mejorado cargado exitosamente.")
|
| 23 |
except Exception as e:
|
| 24 |
print(f"Error al cargar el modelo: {e}")
|
| 25 |
model = None
|
| 26 |
|
| 27 |
+
# Definir las constantes del nuevo modelo
|
| 28 |
+
IMG_HEIGHT = 224 # <-- ¡CAMBIO IMPORTANTE!
|
| 29 |
+
IMG_WIDTH = 224 # <-- ¡CAMBIO IMPORTANTE!
|
| 30 |
CLASS_NAMES = ["normal", "tbc"]
|
| 31 |
|
| 32 |
# --- Endpoints de la API ---
|
|
|
|
| 34 |
@app.get("/")
|
| 35 |
def read_root():
|
| 36 |
"""Endpoint raíz para verificar que la API está funcionando."""
|
| 37 |
+
return {"message": "Bienvenido a la API de Clasificación de TBC v2.0. Usa el endpoint /predict/."}
|
| 38 |
|
| 39 |
@app.post("/predict/")
|
| 40 |
async def predict(file: UploadFile = File(...)):
|
|
|
|
| 56 |
return JSONResponse(status_code=400, content={"error": f"Archivo inválido. No se pudo procesar la imagen: {e}"})
|
| 57 |
|
| 58 |
# 3. Preprocesar la imagen para que coincida con la entrada del modelo
|
| 59 |
+
# Redimensionar la imagen al tamaño esperado por MobileNetV2
|
| 60 |
image = image.resize((IMG_WIDTH, IMG_HEIGHT))
|
| 61 |
# Convertir la imagen a un array de numpy
|
| 62 |
img_array = np.array(image)
|
| 63 |
# Normalizar los valores de los píxeles (de 0-255 a 0-1)
|
| 64 |
img_array = img_array / 255.0
|
| 65 |
+
# Añadir una dimensión de batch (el modelo espera una forma de [1, 224, 224, 3])
|
| 66 |
image_batch = np.expand_dims(img_array, axis=0)
|
| 67 |
|
| 68 |
# 4. Realizar la predicción
|
| 69 |
prediction = model.predict(image_batch)
|
| 70 |
+
score = prediction[0][0]
|
| 71 |
|
| 72 |
# 5. Interpretar el resultado
|
| 73 |
if score > 0.5:
|
modelo_cnn_tbc_mejorado.h5
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:a40c8162063a472172d00f480684013773a74322057b39fa539b6ab313e51c4e
|
| 3 |
+
size 11540584
|
modelo_cnn_tbc_mejorado.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|