import streamlit as st import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import seaborn as sns from PIL import Image import time # Chargement du modèle pré-entraîné model = tf.keras.models.load_model("babong_kidney_classification_model_Tensorflow.h5") # Redéfinition des classes (nouvelles légendes) class_names = ["Cyst", "Normal", "Stone", "Tumor"] # Configuration de la page et style global st.set_page_config(page_title="Analyse d'Imagerie Rénale", page_icon="🧬", layout="wide") st.markdown(""" """, unsafe_allow_html=True) # Titre et description principale st.title("Analyse d'Imagerie Rénale 🧬") st.subheader("Diagnostic assisté par Intelligence Artificielle") st.write( "Chargez vos radiographies rénales pour obtenir une prédiction détaillée sur la présence de Kyste, Calcul, Tumeur ou un état Normal.") # Zone de téléversement dans la barre latérale st.sidebar.header("Téléversement des Images") uploaded_files = st.sidebar.file_uploader( "Glissez-déposez vos images ou cliquez ici (formats acceptés: JPG, PNG, JPEG)", type=["jpg", "png", "jpeg"], accept_multiple_files=True, key="fileUploader" ) if uploaded_files: images = [] predictions_list = [] # Traitement de chaque image téléversée for uploaded_file in uploaded_files: with st.container(): st.markdown(f"
Analyse de l'image : {uploaded_file.name}
", unsafe_allow_html=True) image = Image.open(uploaded_file) st.image(image, caption=f"Image fournie : {uploaded_file.name}", use_column_width=True) # Prétraitement de l'image image_resized = image.resize((224, 224)) image_array = np.array(image_resized) if image_array.shape[-1] == 4: # Gestion des images avec canal alpha image_array = image_array[..., :3] image_array = np.expand_dims(image_array, axis=0) / 255.0 # Prédiction avec animation de chargement with st.spinner("Analyse en cours..."): time.sleep(2) predictions = model.predict(image_array) index = np.argmax(predictions) predicted_label = class_names[index] confidence = np.max(predictions) predictions_list.append((predicted_label, confidence, predictions[0])) images.append(image) st.success(f"**Résultat :** {predicted_label}") st.info(f"**Niveau de Confiance :** {confidence:.2f}") # Affichage graphique des scores fig, ax = plt.subplots(figsize=(6, 4)) sns.barplot(x=class_names, y=predictions[0], palette="viridis", ax=ax) ax.set_ylim(0, 1) ax.set_title("Répartition des Scores de Diagnostic", fontsize=14, color="#004d40") ax.set_xlabel("Catégories", fontsize=12, color="#004d40") ax.set_ylabel("Score", fontsize=12, color="#004d40") st.pyplot(fig) # Si deux images sont téléversées, comparaison côte à côte if len(images) == 2: st.markdown("
", unsafe_allow_html=True) st.subheader("Comparaison Visuelle et Statistique") col1, col2 = st.columns(2) with col1: st.image(images[0], caption="Image A", use_column_width=True) st.write(f"**Diagnostic :** {predictions_list[0][0]}") st.write(f"**Score :** {predictions_list[0][1]:.2f}") with col2: st.image(images[1], caption="Image B", use_column_width=True) st.write(f"**Diagnostic :** {predictions_list[1][0]}") st.write(f"**Score :** {predictions_list[1][1]:.2f}") # Graphique comparatif des deux images fig, ax = plt.subplots(figsize=(8, 4)) x = np.arange(len(class_names)) width = 0.35 ax.bar(x - width / 2, predictions_list[0][2], width, label="Image A", color="#00796b") ax.bar(x + width / 2, predictions_list[1][2], width, label="Image B", color="#c62828") ax.set_xticks(x) ax.set_xticklabels(class_names) ax.legend(title="Images", fontsize=10) ax.set_title("Comparaison des Scores de Classification", fontsize=14, color="#004d40") ax.set_ylabel("Score de Classification", fontsize=12, color="#004d40") st.pyplot(fig) # Note informative en bas de page st.markdown("""
Attention : Ce système fournit une aide au diagnostic basée sur l'IA. Pour un diagnostic définitif, consultez un professionnel de santé.
""", unsafe_allow_html=True)