DavidNgoue commited on
Commit
f18029c
·
verified ·
1 Parent(s): 0921a8d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -15
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 (TensorFlow)", "👨‍💻À propos", "Légendes des modèles"])
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=300)
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=300)
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=300)
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 (TensorFlow)":
 
252
  st.subheader("Classification avec ResNet50 (TensorFlow)")
253
- uploaded_file = st.file_uploader("Téléchargez une image", type=["jpg", "jpeg", "png"])
 
 
 
 
 
 
 
 
 
 
 
 
254
 
255
  if uploaded_file is not None:
 
256
  image = Image.open(uploaded_file)
257
- st.image(image, caption="Image Téléchargée", use_container_width=True)
258
 
259
- if st.button("Classifier"):
260
- label, probabilities = predict_with_tensorflow(MODEL_TF_PATH, image) # Fonction de prédiction adaptée pour ResNet50
261
- st.markdown(f'<div class="result">Classe prédite : <b>{label}</b></div>', unsafe_allow_html=True)
 
262
 
263
- # Affiche un graphique en barres des probabilités des classes
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
264
  st.bar_chart(probabilities)
265
 
266
- # Résultat visuel en fonction de la classe prédite
267
  if label == "Normal":
268
- st.balloons() # Animation festive si la prédiction est "Normal"
 
269
  else:
270
- st.markdown("<h2 style='color: red;'>Désolé, le résultat indique une anomalie...</h2>", unsafe_allow_html=True)
 
 
 
 
 
 
 
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")