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()