File size: 4,374 Bytes
aa085bf 8f728a2 aa085bf 63dda1e aa085bf 46b2859 48b4546 8f728a2 aa085bf 8f728a2 1a61e89 aa085bf 8f728a2 595f3fc 8f728a2 aa085bf 82c435d 8f728a2 82c435d 8f728a2 82c435d 8f728a2 aa085bf 8f728a2 595f3fc 8f728a2 595f3fc 8f728a2 595f3fc aa085bf 82c435d aa085bf |
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 |
from fastapi import FastAPI, UploadFile, File
from pydantic import BaseModel
from huggingface_hub import hf_hub_download
from keras.models import load_model
from tensorflow.keras.applications.inception_v3 import preprocess_input
from tensorflow.keras.preprocessing.image import img_to_array
import numpy as np
from PIL import Image
import io
import base64
app = FastAPI()
# Lista de clases
class_names = ['acanthoica', 'akashiwo', 'alexandrium', 'amoeba', 'amphidinium', 'amylax', 'apedinella',
'asterionellopsis', 'bacillaria', 'bacteriastrum', 'biddulphia', 'calciopappus', 'cerataulina',
'ceratium', 'chaetoceros', 'chrysochromulina', 'cochlodinium', 'corethron', 'corymbellus',
'coscinodiscus', 'cryptophyta', 'cylindrotheca', 'dactyliosolen', 'delphineis', 'dictyocha',
'dinobryon', 'dinophysis', 'ditylum', 'emiliania', 'ephemera', 'eucampia', 'euglena',
'gonyaulax', 'guinardia', 'gyrodinium', 'hemiaulus', 'heterocapsa', 'karenia', 'katodinium',
'kryptoperidinium', 'laboea', 'lauderia', 'leptocylindrus', 'licmophora', 'nanoneis',
'odontella', 'ophiaster', 'ostreopsis', 'oxytoxum', 'paralia', 'parvicorbicula', 'phaeocystis',
'pleuronema', 'pleurosigma', 'polykrikos', 'prorocentrum', 'proterythropsis', 'protoperidinium',
'pseudo-nitzschia', 'pseudochattonella', 'pyramimonas', 'rhabdolithes', 'rhizosolenia',
'scrippsiella', 'skeletonema', 'stephanopyxis', 'syracosphaera', 'thalassionema', 'thalassiosira',
'trichodesmium', 'vicicitus', 'warnowia']
# Descargar y cargar el modelo desde Hugging Face Hub
model_path = hf_hub_download(repo_id="Daniel00611/InceptionV3_72", filename="InceptionV3_72.keras")
model = load_model(model_path)
def preprocess_image(img, target_size=(299, 299)):
# Convertir a RGB si la imagen no está en ese formato
if img.mode != "RGB":
img = img.convert("RGB")
img = img.resize(target_size)
img_array = img_to_array(img)
img_array = np.expand_dims(img_array, axis=0)
img_array = preprocess_input(img_array)
return img_array
# Modelo para recibir múltiples imágenes en Base64
class ImagesBase64(BaseModel):
images_base64: list[str] # Lista de imágenes en formato Base64
# Ruta para imágenes subidas como archivo
@app.post("/predict/")
async def predict(file: UploadFile = File(...)):
try:
# Leer la imagen subida
img = Image.open(io.BytesIO(await file.read()))
img_array = preprocess_image(img)
# Realizar predicción
predictions = model.predict(img_array)[0]
# Obtener el top 10 de predicciones
top_10_indices = predictions.argsort()[-10:][::-1]
top_10_classes = [class_names[i] for i in top_10_indices]
top_10_probabilities = predictions[top_10_indices]
# Formar respuesta en formato JSON
result = [{"class": top_10_classes[i], "probability": float(top_10_probabilities[i])} for i in range(10)]
return {"predictions": result}
except Exception as e:
return {"error": str(e)}
# Ruta para imágenes en formato Base64
@app.post("/predict_base64/")
async def predict_base64(image_data: ImagesBase64):
results = {}
try:
for index, image_base64 in enumerate(image_data.images_base64):
# Decodificar cada imagen Base64
image_bytes = base64.b64decode(image_base64)
img = Image.open(io.BytesIO(image_bytes))
img_array = preprocess_image(img)
# Realizar predicción
predictions = model.predict(img_array)[0]
# Obtener el top 10 de predicciones
top_10_indices = predictions.argsort()[-10:][::-1]
top_10_classes = [class_names[i] for i in top_10_indices]
top_10_probabilities = predictions[top_10_indices]
# Formar respuesta para la imagen actual
image_result = [{"class": top_10_classes[i], "probability": float(top_10_probabilities[i])} for i in range(10)]
results[f"imagen{index + 1}"] = image_result
return results
except Exception as e:
return {"error": str(e)}
@app.get("/")
def greet_json():
return {"Hello": "World!"}
|