Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,6 +1,8 @@
|
|
| 1 |
import streamlit as st
|
| 2 |
from PIL import Image
|
| 3 |
import numpy as np
|
|
|
|
|
|
|
| 4 |
import tensorflow as tf
|
| 5 |
from tensorflow.keras.models import load_model
|
| 6 |
import random
|
|
@@ -179,13 +181,13 @@ st.markdown("""
|
|
| 179 |
# Application Streamlit
|
| 180 |
st.markdown('<div class="title">Application de Classification d\'Images</div>', unsafe_allow_html=True)
|
| 181 |
|
| 182 |
-
menu = st.sidebar.selectbox("Menu", ["🧠 Accueil", "Classification avec ResNet50
|
| 183 |
|
| 184 |
if menu == "🧠 Accueil":
|
| 185 |
st.write("Bienvenue dans notre application de classification d'images. Cette application a été développée pour la classification d'images dans le contexte du **CT-KIDNEY-DATASET-Normal-Cyst-Tumor-Stone**, un dataset médical contenant des images de tomodensitométrie (CT) de reins, avec des catégories représentant des reins normaux, des kystes, des tumeurs et des calculs rénaux.")
|
| 186 |
|
| 187 |
st.write("""
|
| 188 |
-
Cette application a pour objectif de classer ces images en différentes catégories (Normal, Cyst, Tumor, Stone) à l'aide de modèles de machine learning.
|
| 189 |
Nous avons effectué du Transfer Learning sur trois modèles pré entrainés et avons fait un comparatif des trois avant de choisir **ResNet50** comme celui avec les meilleurs caractéristiques.
|
| 190 |
Ces modèles ont été entraînés sur le dataset CT-KIDNEY-DATASET et peuvent être utilisés pour prédire la catégorie d'une image donnée, en détectant des anomalies ou en validant l'état du rein à partir des images CT.
|
| 191 |
""")
|
|
@@ -194,7 +196,7 @@ if menu == "🧠 Accueil":
|
|
| 194 |
tab_resnet50, tab_vgg16, tab_mobilenetv2 = st.tabs(["ResNet50", "VGG16", "MobileNetV2"])
|
| 195 |
|
| 196 |
with tab_resnet50:
|
| 197 |
-
st.image("resnet50_image.webp", caption="ResNet50", width=
|
| 198 |
st.write("""
|
| 199 |
**ResNet50** est un réseau de neurones convolutif profond (CNN) très populaire pour la classification d'images, introduit dans l'article "Deep Residual Learning for Image Recognition".
|
| 200 |
|
|
@@ -211,7 +213,7 @@ if menu == "🧠 Accueil":
|
|
| 211 |
""")
|
| 212 |
|
| 213 |
with tab_vgg16:
|
| 214 |
-
st.image("vgg16_image.jpg", caption="VGG16", width=
|
| 215 |
st.write("""
|
| 216 |
**VGG16** est un modèle de CNN développé par l'équipe de recherche Visual Geometry Group (VGG). Il est connu pour sa simplicité et son efficacité dans la classification d'images.
|
| 217 |
|
|
@@ -228,7 +230,7 @@ if menu == "🧠 Accueil":
|
|
| 228 |
""")
|
| 229 |
|
| 230 |
with tab_mobilenetv2:
|
| 231 |
-
st.image("mobilenetv2.webp", caption="MobileNetV2", width=
|
| 232 |
st.write("""
|
| 233 |
**MobileNetV2** est un modèle léger optimisé pour les appareils mobiles et embarqués. Il repose sur des blocs convolutifs de profondeur et des connexions résiduelles.
|
| 234 |
|
|
@@ -248,26 +250,64 @@ if menu == "🧠 Accueil":
|
|
| 248 |
|
| 249 |
|
| 250 |
|
| 251 |
-
elif menu == "Classification avec ResNet50
|
|
|
|
| 252 |
st.subheader("Classification avec ResNet50 (TensorFlow)")
|
| 253 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 254 |
|
| 255 |
if uploaded_file is not None:
|
|
|
|
| 256 |
image = Image.open(uploaded_file)
|
| 257 |
-
st.image(image, caption="Image
|
| 258 |
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
|
|
|
| 262 |
|
| 263 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 264 |
st.bar_chart(probabilities)
|
| 265 |
|
| 266 |
-
#
|
| 267 |
if label == "Normal":
|
| 268 |
-
st.balloons() # Animation festive si
|
|
|
|
| 269 |
else:
|
| 270 |
-
st.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 271 |
|
| 272 |
elif menu == "Légendes des modèles":
|
| 273 |
st.subheader("Légendes des modèles")
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
from PIL import Image
|
| 3 |
import numpy as np
|
| 4 |
+
import torch
|
| 5 |
+
from torchvision.transforms import Compose, Resize, ToTensor, Normalize
|
| 6 |
import tensorflow as tf
|
| 7 |
from tensorflow.keras.models import load_model
|
| 8 |
import random
|
|
|
|
| 181 |
# Application Streamlit
|
| 182 |
st.markdown('<div class="title">Application de Classification d\'Images</div>', unsafe_allow_html=True)
|
| 183 |
|
| 184 |
+
menu = st.sidebar.selectbox("Menu", ["🧠 Accueil", "Classification de l'état des reins avec ResNet50", "👨💻À propos", "Légendes des modèles"])
|
| 185 |
|
| 186 |
if menu == "🧠 Accueil":
|
| 187 |
st.write("Bienvenue dans notre application de classification d'images. Cette application a été développée pour la classification d'images dans le contexte du **CT-KIDNEY-DATASET-Normal-Cyst-Tumor-Stone**, un dataset médical contenant des images de tomodensitométrie (CT) de reins, avec des catégories représentant des reins normaux, des kystes, des tumeurs et des calculs rénaux.")
|
| 188 |
|
| 189 |
st.write("""
|
| 190 |
+
Cette application a pour objectif de classer ces images en différentes catégories (**Normal** Aucun problème: , **Cyst**: Kystes rénaux, **Tumor**: Tumeur rénale, **Stone**: Calculs rénaux) à l'aide de modèles de machine learning.
|
| 191 |
Nous avons effectué du Transfer Learning sur trois modèles pré entrainés et avons fait un comparatif des trois avant de choisir **ResNet50** comme celui avec les meilleurs caractéristiques.
|
| 192 |
Ces modèles ont été entraînés sur le dataset CT-KIDNEY-DATASET et peuvent être utilisés pour prédire la catégorie d'une image donnée, en détectant des anomalies ou en validant l'état du rein à partir des images CT.
|
| 193 |
""")
|
|
|
|
| 196 |
tab_resnet50, tab_vgg16, tab_mobilenetv2 = st.tabs(["ResNet50", "VGG16", "MobileNetV2"])
|
| 197 |
|
| 198 |
with tab_resnet50:
|
| 199 |
+
st.image("resnet50_image.webp", caption="ResNet50", width=700)
|
| 200 |
st.write("""
|
| 201 |
**ResNet50** est un réseau de neurones convolutif profond (CNN) très populaire pour la classification d'images, introduit dans l'article "Deep Residual Learning for Image Recognition".
|
| 202 |
|
|
|
|
| 213 |
""")
|
| 214 |
|
| 215 |
with tab_vgg16:
|
| 216 |
+
st.image("vgg16_image.jpg", caption="VGG16", width=700)
|
| 217 |
st.write("""
|
| 218 |
**VGG16** est un modèle de CNN développé par l'équipe de recherche Visual Geometry Group (VGG). Il est connu pour sa simplicité et son efficacité dans la classification d'images.
|
| 219 |
|
|
|
|
| 230 |
""")
|
| 231 |
|
| 232 |
with tab_mobilenetv2:
|
| 233 |
+
st.image("mobilenetv2.webp", caption="MobileNetV2", width=700)
|
| 234 |
st.write("""
|
| 235 |
**MobileNetV2** est un modèle léger optimisé pour les appareils mobiles et embarqués. Il repose sur des blocs convolutifs de profondeur et des connexions résiduelles.
|
| 236 |
|
|
|
|
| 250 |
|
| 251 |
|
| 252 |
|
| 253 |
+
elif menu == "Classification de l'état des reins avec ResNet50":
|
| 254 |
+
# Ajout d'un sous-titre explicatif pour informer sur la fonctionnalité
|
| 255 |
st.subheader("Classification avec ResNet50 (TensorFlow)")
|
| 256 |
+
|
| 257 |
+
# Présentation de la fonctionnalité pour l'utilisateur
|
| 258 |
+
st.markdown("""
|
| 259 |
+
Cette section vous permet de **classer une image d'état des reins** en fonction de son apparence.
|
| 260 |
+
Le modèle utilise **ResNet50**, une architecture d'apprentissage profond optimisée pour analyser les images.
|
| 261 |
+
Voici ce que vous devez faire :
|
| 262 |
+
1. Téléchargez une image au format `jpg`, `jpeg` ou `png`.
|
| 263 |
+
2. Cliquez sur le bouton **Classifier** pour lancer l'analyse.
|
| 264 |
+
3. Obtenez le résultat du diagnostic (Normal ou Anomalie) accompagné d'un graphique des probabilités.
|
| 265 |
+
""")
|
| 266 |
+
|
| 267 |
+
# Étape 1 : L'utilisateur télécharge une image
|
| 268 |
+
uploaded_file = st.file_uploader("Téléchargez une image des reins (format jpg, jpeg ou png)", type=["jpg", "jpeg", "png"])
|
| 269 |
|
| 270 |
if uploaded_file is not None:
|
| 271 |
+
# Affiche l'image téléchargée
|
| 272 |
image = Image.open(uploaded_file)
|
| 273 |
+
st.image(image, caption="Image téléchargée avec succès", use_container_width=True)
|
| 274 |
|
| 275 |
+
# Explication pour l'étape suivante
|
| 276 |
+
st.markdown("""
|
| 277 |
+
Cliquez sur le bouton **Classifier** pour que le modèle analyse l'image et détermine si l'état des reins est **Normal** ou présente une **Anomalie**.
|
| 278 |
+
""")
|
| 279 |
|
| 280 |
+
# Étape 2 : L'utilisateur clique pour classifier l'image
|
| 281 |
+
if st.button("Classifier"):
|
| 282 |
+
# Appel de la fonction de prédiction avec le modèle ResNet50
|
| 283 |
+
label, probabilities = predict_with_tensorflow(MODEL_TF_PATH, image)
|
| 284 |
+
|
| 285 |
+
# Affichage du résultat
|
| 286 |
+
st.markdown(f"""
|
| 287 |
+
### Résultat de la classification :
|
| 288 |
+
**Classe prédite :** {label}
|
| 289 |
+
""", unsafe_allow_html=True)
|
| 290 |
+
|
| 291 |
+
# Affichage des probabilités sous forme de graphique
|
| 292 |
+
st.markdown("""
|
| 293 |
+
#### Confiance du modèle dans chaque catégorie :
|
| 294 |
+
Le graphique ci-dessous montre la probabilité associée à chaque classe. Une probabilité élevée indique la classe la plus probable.
|
| 295 |
+
""")
|
| 296 |
st.bar_chart(probabilities)
|
| 297 |
|
| 298 |
+
# Affichage d'un message visuel en fonction de la classe prédite
|
| 299 |
if label == "Normal":
|
| 300 |
+
st.balloons() # Animation festive si le résultat est "Normal"
|
| 301 |
+
st.success("Félicitations ! L'image a été classée comme **Normale**.")
|
| 302 |
else:
|
| 303 |
+
st.error("Désolé, le modèle indique une **Anomalie** dans l'image téléchargée.")
|
| 304 |
+
st.markdown("""
|
| 305 |
+
#### Que faire en cas d'anomalie ?
|
| 306 |
+
Si une anomalie est détectée, il est recommandé de :
|
| 307 |
+
- Vérifier l'image téléchargée pour s'assurer qu'elle est correcte.
|
| 308 |
+
- Contacter un professionnel de santé pour une analyse approfondie.
|
| 309 |
+
""")
|
| 310 |
+
|
| 311 |
|
| 312 |
elif menu == "Légendes des modèles":
|
| 313 |
st.subheader("Légendes des modèles")
|