import streamlit as st
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.metrics.pairwise import euclidean_distances
import plotly.express as px
import plotly.graph_objects as go
from streamlit_option_menu import option_menu
import json
import requests
import pydeck as pdk
import snowflake.connector
import numpy as np
from keras.preprocessing import image
from keras.models import load_model
import tensorflow as tf
# Layout
st.set_page_config(
page_title="PulmoCare",
layout="wide",
initial_sidebar_state="expanded")
# Data Pull and Functions
st.markdown("""
""", unsafe_allow_html=True)
@st.cache_data
def load_lottiefile(filepath: str):
with open(filepath, "r") as f:
return json.load(f)
@st.cache_data
def pull_clean():
master_zip = pd.read_csv('MASTER_ZIP.csv', dtype={'ZCTA5': str})
master_city = pd.read_csv('MASTER_CITY.csv', dtype={'ZCTA5': str})
return master_zip, master_city
def clear_image():
st.session_state.image = None
def resize_image(img, img_size):
return img.resize(img_size)
@st.cache_data
def classifier_image(image_path):
# Redimensionner l'image
img = resize_image(image_path, (224, 224))
# Convertir l'image en tableau numpy
img_array = image.img_to_array(img)
# Ajouter une dimension pour représenter le batch (1 image)
img_array = np.expand_dims(img_array, axis=0)
# Normaliser l'image
img_array = img_array / 255.0
# Charger le modèle depuis le fichier .h5
model = load_model("keras_model.h5")
# Effectuer la prédiction
predictions = model.predict(img_array)
# Interpréter la prédiction
class_labels = [ 'Taro', 'koki', 'Couscous_gombo' ,'Ero', 'Ndole', 'Nkui', 'Okok', 'riz','riz_sauté']
results = {class_labels[i]: float(predictions[0][i]*100) for i in range(8)}
# for i, class_label in enumerate(class_labels):
# results.append((class_label, predictions[0][i] * 100))
return results
# Options Menu
with st.sidebar:
selected = option_menu('Camfood', ["Acceuil", 'Documention', 'A propos'],
icons=['play-btn', "bi-file-earmark-bar-graph-fill", 'info-circle'], menu_icon='intersect', default_index=0)
# Intro Page
if selected == "Acceuil":
# Header
st.markdown(
"
Bienvenue sur Camfood
", unsafe_allow_html=True)
st.markdown(
"Pour l'instant l'application est juste encore en test. Elle a été utilisé juste pour reconnaitre 8 plats du Cameroun
",
unsafe_allow_html=True
)
st.divider()
# Use Cases
with st.container():
col1, col2 = st.columns(2)
with col1:
st.markdown(
"Charger l'image à analyser ici !
", unsafe_allow_html=True)
uploaded_file = st.file_uploader(
"", type=["jpg", "jpeg", "png"])
with st.container():
subcol1, subcol2, subcol3, subcol4 = st.columns(4)
with subcol1:
sub = st.button("Soumettre")
with subcol2:
if st.button("Néttoyer"):
clear_image()
if uploaded_file is not None:
# Display the uploaded image
custom_width = 500 # Modifier cette valeur selon vos besoins
st.image(uploaded_file, caption='Uploaded Image', width=500)
st.session_state.image = uploaded_file
with col2:
if sub:
if 'image' in st.session_state:
img = st.session_state.image
img = image.load_img(uploaded_file)
img = img.copy()
prediction_result = classifier_image(img)
st.markdown(
"Resultats de l'analyse
", unsafe_allow_html=True)
for label, percentage in prediction_result.items():
st.write(
f"{label}: {percentage:.2f}%", unsafe_allow_html=True)
# st.write(
# f"> {label} -------------------------------------------------------- {percentage:.2f}%")
else:
st.write("S'il vous plait charger une image .")
with st.container():
col1, col2 = st.columns(2)
with col1:
st.markdown(
"Cas d'utilisation
", unsafe_allow_html=True)
st.markdown(
"""
- _**Detection** : reconnaitre quelques plats Camerounais ._
"""
)
st.divider()
# Tutorial Video
# st.header('Tutorial Video')
# video_file = open('Similo_Tutorial3_compressed.mp4', 'rb')
# video_bytes = video_file.read()
# st.video(video_bytes)
# Search Page
if selected == "Documention":
st.write("## Fait par Powo kamdem Arnold")
st.write("## Utilisation de l'Application CAMFOOD")
st.write("### 1. Exécution de l'Application")
st.write(" Pour utiliser Camfood, assurez-vous d'avoir le script Python contenant l'application Streamlit. Ensuite, exécutez la commande suivante dans votre terminal :")
st.code("streamlit run app.py")
st.write("### 2. Téléchargement de l'Image")
st.write(" Lorsque l'application est lancée, vous serez redirigé vers la page d'accueil de PulmoDetect.")
st.write(
" - Sur la page d'accueil, vous verrez une section permettant de télécharger une image.")
st.write(" - Cliquez sur le bouton 'Parcourir les fichiers' pour sélectionner l'image que vous souhaitez analyser.")
st.write("### 3. Analyse de l'Image")
st.write(" Après avoir téléchargé l'image, vous pouvez cliquer sur le bouton 'Submit' pour lancer l'analyse.")
st.write(" - Les résultats de l'analyse seront affichés sur la page, indiquant les pourcentages associés à chaque classe de maladie pulmonaire détectée.")
st.write("### 4. Nettoyage de l'Image")
st.write(" Si vous souhaitez supprimer l'image téléchargée et recommencer, vous pouvez cliquer sur le bouton 'Clear'. Cela effacera l'image chargée et vous pourrez télécharger une nouvelle image.")
st.write("## Remarque")
st.write("Assurez-vous d'avoir le modèle de détection des plats (.h5) dans le même répertoire que le script Python de l'application.")
# About Page
if selected == 'A propos':
st.write("## À PROPOS DU MODÈLE")
st.write("Ce modèle a été conçu pour la classification d'images de tumeurs cérébrales en utilisant le dataset masoudnickparvar/brain-tumor-mri-dataset de Kaggle.")
st.write("### PERFORMANCE DU MODÈLE")
st.write(
"Notre modèle EfficientNetB0 a atteint les performances suivantes lors des tests :")
st.write("- Précision: 98%")
st.write("- Rappel moyen: 98%")
st.write("- Score F1 moyen: 98%")
st.write("- Nombre total d'échantillons: 1311")
st.write("- Nombre d'erreurs trouvées: 23")
st.write("### ARCHITECTURE DU MODÈLE")
st.write(
"L'architecture de notre modèle EfficientNetB0 est configurée comme suit :")
st.write("- Paramètres totaux: 4,418,375 (16.85 MB)")
st.write("- Paramètres entraînables: 3,688,004 (1.41 MB)")
st.write("- Paramètres non-entraînables: 4,045,971 (15.45 MB)")
st.write("Le modèle comprend des couches convolutives personnalisées en plus des couches de pooling et une couche dense finale pour la classification en 4 classes.")
st.write("### DATASET UTILISÉ")
st.write("Les ensembles de données utilisés pour l'entraînement et la validation sont les suivants :")
st.write("- Fichiers d'entraînement: 5712 fichiers, répartis en 4 classes.")
st.write("- Fichiers de validation: 1311 fichiers, répartis en 4 classes.")
st.write("Note: Les données ont été préparées et réparties pour assurer une répartition équilibrée, ce qui est crucial pour l'entraînement d'un modèle de classification robuste.")
st.divider()
with st.container():
col1, col2 = st.columns(2)
with col1:
st.image("loss.png", caption="Courbe de Loss",
use_column_width=True)
with col2:
st.image("accuracy.png", caption="Courbe d'Accuracy",
use_column_width=True)