franklc's picture
Update app.py
540efcf verified
import gradio as gr
import tensorflow as tf
import numpy as np
from tensorflow.keras.preprocessing import image
from huggingface_hub import hf_hub_download
from tensorflow.keras.applications.inception_v3 import preprocess_input
import plotly.graph_objects as go
# Descarga el modelo a tu máquina local
model_path = hf_hub_download(repo_id="franklc/InceptionV3_72", filename="InceptionV3_72.keras")
# Cargar tu modelo de TensorFlow en formato .keras
model = keras.models.load_model(model_path)
# Etiquetas de clase para el modelo de fitoplancton
class_labels = ['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']
# Función de clasificación de imágenes
def classify_image(img):
# Preprocesar la imagen
img = img.resize((299, 299))
img_array = image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0)
img_array = preprocess_input(img_array)
# Realizar la predicción
predictions = model.predict(img_array)[0]
# Obtener las 10 clases con mayor probabilidad
top_indices = np.argsort(predictions)[-10:][::-1]
top_classes = [class_labels[i] for i in top_indices]
top_probabilities = [predictions[i] * 100 for i in top_indices]
# Crear un gráfico de barras para los resultados
fig = go.Figure(data=go.Bar(x=top_probabilities, y=top_classes, orientation='h', marker=dict(color='skyblue')))
fig.update_layout(
title="Top 10 Predicciones",
xaxis_title="Probabilidad (%)",
yaxis_title="Género de Fitoplancton",
height=500,
margin=dict(l=150, r=50, b=50, t=50)
)
# Devolver resultados como texto y gráfico
return {top_classes[i]: f"{top_probabilities[i]:.2f}%" for i in range(10)}, fig
# Configurar la interfaz de Gradio
iface = gr.Interface(
fn=classify_image,
inputs=gr.Image(type="pil"),
outputs=[gr.Label(num_top_classes=10), gr.Plot()],
title="Clasificador de Fitoplancton",
description="Sube una imagen de fitoplancton para identificar los géneros principales.",
)
iface.launch()