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!"}