Spaces:
Build error
Build error
Upload 2 files
Browse files- app.py +217 -0
- requirements.txt +15 -0
app.py
ADDED
@@ -0,0 +1,217 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import tensorflow as tf
|
3 |
+
import numpy as np
|
4 |
+
from streamlit_option_menu import option_menu
|
5 |
+
import streamlit.components.v1 as components
|
6 |
+
import os
|
7 |
+
from groq import Groq
|
8 |
+
from keras.applications import ResNet50
|
9 |
+
from keras.utils import load_img, img_to_array
|
10 |
+
from keras.models import load_model
|
11 |
+
from dotenv import load_dotenv
|
12 |
+
from keras.preprocessing import image
|
13 |
+
|
14 |
+
# Charger les variables d'environnement à partir du fichier .env
|
15 |
+
load_dotenv()
|
16 |
+
|
17 |
+
# Récupérer les clés API depuis les variables d'environnement
|
18 |
+
GROQ_API = os.getenv("GROQ_API")
|
19 |
+
HF_API = os.getenv("HF_API")
|
20 |
+
|
21 |
+
#changement du logo et du titre de mon application en anglais
|
22 |
+
st.set_page_config(page_title="Amelioration de la santé dentaire", page_icon=":tooth:", layout="centered", menu_items=None)
|
23 |
+
|
24 |
+
|
25 |
+
|
26 |
+
# Créer trois colonnes de largeur égale
|
27 |
+
col1, col2, col3 = st.columns(3)
|
28 |
+
|
29 |
+
# Laisser la première et la troisième colonne vides
|
30 |
+
with col1:
|
31 |
+
st.write("")
|
32 |
+
|
33 |
+
# Afficher le logo dans la deuxième colonne
|
34 |
+
with col2:
|
35 |
+
st.image("img/logo2.png", use_column_width=None)
|
36 |
+
|
37 |
+
with col3:
|
38 |
+
st.write("")
|
39 |
+
|
40 |
+
selected = option_menu(
|
41 |
+
menu_title=None, # required
|
42 |
+
options=["Accueil", "Chatbot","Prediction"], # required
|
43 |
+
icons=["house","chat-dots","bullseye" ], # optional
|
44 |
+
menu_icon="cast", # optional
|
45 |
+
default_index=0, # optional
|
46 |
+
orientation="horizontal",
|
47 |
+
)
|
48 |
+
|
49 |
+
if selected == "Accueil":
|
50 |
+
st.image("img/dentaire.jpg",width=300, use_column_width=True)
|
51 |
+
st.title(" ***BIENVENUE SUR DENTAIL.AI!*** ")
|
52 |
+
# Titre de l'application
|
53 |
+
st.title("Application de Prédiction des Maladies Dentaires")
|
54 |
+
|
55 |
+
# Texte explicatif
|
56 |
+
st.markdown("""
|
57 |
+
## Bienvenue dans notre Application de Prédiction des Maladies Cardiaques !
|
58 |
+
|
59 |
+
Les maladies bucco-dentaires restent un problème de santé publique majeur, et leur détection précoce est essentielle pour prévenir les complications graves. Notre application utilise des techniques avancées d'apprentissage automatique pour aider à prédire le risque de maladies bucco-dentaires chez les individus.
|
60 |
+
|
61 |
+
### Comment cela fonctionne :
|
62 |
+
|
63 |
+
1. **Saisie des données :** Vous pouvez fournir des informations telles que votre radiographie de la bouche,votre âge, vos habitudes d’hygiène dentaire, vos antécédents médicaux et vos résultats de tests dentaires pour générer une prédiction précise.
|
64 |
+
|
65 |
+
2. **Analyse des données :** Grâce à un modèle pré-entraîné, notre application analyse vos données pour évaluer votre risque de développer des maladies bucco-dentaires telles que la carie dentaire, la gingivite ou la parodontite.
|
66 |
+
|
67 |
+
3. **Résultats instantanés :** Vous recevrez rapidement une évaluation personnalisée, vous permettant de prendre les mesures nécessaires pour préserver votre santé bucco-dentaire.
|
68 |
+
### Pourquoi utiliser notre application :
|
69 |
+
|
70 |
+
- **Rapidité :** Obtenez des résultats instantanés sans devoir attendre de longues consultations ou analyses dentaires.
|
71 |
+
|
72 |
+
- **Facilité d'utilisation :** Notre interface intuitive rend la saisie des données et la compréhension des résultats simple pour tous les utilisateurs..
|
73 |
+
|
74 |
+
- **Précision :** Basé sur des techniques avancées d’apprentissage automatique, notre modèle vise à fournir des prédictions fiables, pour une prise de décision informée.
|
75 |
+
|
76 |
+
Prenez soin de votre santé bucco-dentaire dès aujourd'hui grâce à notre application de prédiction des maladies bucco-dentaires !
|
77 |
+
""")
|
78 |
+
components.html(
|
79 |
+
"""
|
80 |
+
<div style="position: fixed; bottom: 0; left: 0; right: 0; text-align: center; font-size: 15px; color: gray;">
|
81 |
+
Tous droits réservés © Septembre 2024 Fosso Tchatat Sidoine
|
82 |
+
</div>
|
83 |
+
""",
|
84 |
+
height=70
|
85 |
+
)
|
86 |
+
if selected == "Chatbot":
|
87 |
+
# Sidebar settings
|
88 |
+
with st.sidebar:
|
89 |
+
st.sidebar.subheader("PARAMETRES")
|
90 |
+
temperature = st.slider("Temperature", 0.0, 5.0, 1.0)
|
91 |
+
tokens = st.slider("Max Tokens", 0, 8192, 900)
|
92 |
+
stream = st.toggle("Stream", value=True)
|
93 |
+
etat = stream
|
94 |
+
|
95 |
+
class GroqAPI:
|
96 |
+
# Handles API operations with Groq to generate chat responses
|
97 |
+
def __init__(self, model_name: str):
|
98 |
+
self.client = Groq(api_key="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")
|
99 |
+
self.model_name = model_name
|
100 |
+
|
101 |
+
# Internal method to get responses from Groq API
|
102 |
+
def _response(self, message):
|
103 |
+
return self.client.chat.completions.create(
|
104 |
+
model=self.model_name,
|
105 |
+
messages=message,
|
106 |
+
temperature=temperature,
|
107 |
+
max_tokens=tokens,
|
108 |
+
stream=etat,
|
109 |
+
stop=None,
|
110 |
+
)
|
111 |
+
|
112 |
+
# Generator to stream responses from API
|
113 |
+
def response_stream(self, message):
|
114 |
+
for chunk in self._response(message):
|
115 |
+
if chunk.choices[0].delta.content:
|
116 |
+
yield chunk.choices[0].delta.content
|
117 |
+
|
118 |
+
class Message:
|
119 |
+
# Manages chat messages in the Streamlit UI
|
120 |
+
system_prompt = "You are a professional AI. Please generate responses in English to all user inputs."
|
121 |
+
|
122 |
+
# Initializes the chat history if it doesn't exist in session state
|
123 |
+
def __init__(self):
|
124 |
+
if "messages" not in st.session_state:
|
125 |
+
st.session_state.messages = [{"role": "system", "content": self.system_prompt}]
|
126 |
+
|
127 |
+
# Adds a new message to the session state
|
128 |
+
def add(self, role: str, content: str):
|
129 |
+
st.session_state.messages.append({"role": role, "content": content})
|
130 |
+
|
131 |
+
# Displays all past messages in the UI, ignoring system messages
|
132 |
+
def display_chat_history(self):
|
133 |
+
for message in st.session_state.messages:
|
134 |
+
if message["role"] == "system":
|
135 |
+
continue
|
136 |
+
with st.chat_message(message["role"]):
|
137 |
+
st.markdown(message["content"])
|
138 |
+
|
139 |
+
# Streams API responses to the Streamlit chat messages UI
|
140 |
+
def display_stream(self, generator):
|
141 |
+
with st.chat_message("assistant"):
|
142 |
+
return st.write_stream(generator)
|
143 |
+
|
144 |
+
class ModelSelector:
|
145 |
+
# Allows the user to select a model from a predefined list
|
146 |
+
def __init__(self):
|
147 |
+
# List of available models to choose from
|
148 |
+
self.models = ["llama3-70b-8192", "llama3-8b-8192", "gemma-7b-it", "mixtral-8x7b-32768"]
|
149 |
+
|
150 |
+
# Displays model selection in the sidebar with a title
|
151 |
+
def select(self):
|
152 |
+
with st.sidebar:
|
153 |
+
return st.selectbox("Model", self.models)
|
154 |
+
|
155 |
+
# Entry point for the Streamlit app "myChatbot"
|
156 |
+
def main():
|
157 |
+
user_input = st.chat_input("Chat avec moi...")
|
158 |
+
model = ModelSelector()
|
159 |
+
selected_model = model.select()
|
160 |
+
message = Message()
|
161 |
+
|
162 |
+
# If there is user input, process it via the selected model
|
163 |
+
if user_input:
|
164 |
+
llm = GroqAPI(selected_model)
|
165 |
+
message.add("user", user_input)
|
166 |
+
message.display_chat_history()
|
167 |
+
response = message.display_stream(llm.response_stream(st.session_state.messages))
|
168 |
+
message.add("assistant", response)
|
169 |
+
|
170 |
+
main()
|
171 |
+
|
172 |
+
|
173 |
+
|
174 |
+
model = load_model('model.h5')
|
175 |
+
mal_classes = {'Data_caries': 0, 'Gingivitis': 1, 'Mouth_Ulcer': 2, 'hypodontia': 3}
|
176 |
+
|
177 |
+
# Fonction pour prédire la classe de l'image
|
178 |
+
def predict_image(image):
|
179 |
+
#model = tf.keras.models.load_model('../model.h5')
|
180 |
+
img = load_img(image, target_size=(224, 224))
|
181 |
+
img_array = img_to_array(img)
|
182 |
+
img_array = np.expand_dims(img_array, axis=0)
|
183 |
+
#img_array = tf.keras.applications.resnet50.preprocess_input(img_array)
|
184 |
+
predictions = model.predict(img_array)
|
185 |
+
predicted_class = np.argmax(predictions, axis=1)
|
186 |
+
return predicted_class[0], predictions
|
187 |
+
|
188 |
+
if selected == "Prediction":
|
189 |
+
# Display prediction page with sidebar and main
|
190 |
+
# Sidebar
|
191 |
+
|
192 |
+
#st.markdown("<h1 style='text-align: center;'>Prédiction</h1>", unsafe_allow_html=True)
|
193 |
+
|
194 |
+
st.header("Détection des Maladies Bucco-Dentaires")
|
195 |
+
uploaded_file = st.file_uploader("Choisissez une image", type=["jpg", "jpeg", "png"])
|
196 |
+
if uploaded_file is not None:
|
197 |
+
st.image(uploaded_file, caption='Image chargée', use_column_width=True)
|
198 |
+
st.write("")
|
199 |
+
st.write("Prédiction en cours...")
|
200 |
+
|
201 |
+
class_index, predictions = predict_image(uploaded_file)
|
202 |
+
|
203 |
+
classes = ["Data_caries", "Gingivitis", "Mouth_Ulcer", "hypodontia"] # Noms de classes à ajuster
|
204 |
+
|
205 |
+
st.write(f"Maladie détectée : {classes[class_index]}")
|
206 |
+
#st.write("Probabilités :")
|
207 |
+
#for i, prob in enumerate(predictions[0]):
|
208 |
+
# st.write(f"{classes[i]}: {prob * 100:.2f}%")
|
209 |
+
|
210 |
+
components.html(
|
211 |
+
"""
|
212 |
+
<div style="position: fixed; bottom: 0; left: 0; right: 0; text-align: center; font-size: 15px; color: gray;">
|
213 |
+
Tous droits réservés © Septembre 2024 Fosso Tchatat Sidoine
|
214 |
+
</div>
|
215 |
+
""",
|
216 |
+
height=70
|
217 |
+
)
|
requirements.txt
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
streamlit
|
2 |
+
streamlit_option_menu
|
3 |
+
extra-streamlit-components
|
4 |
+
streamlit_elements==0.1.0
|
5 |
+
requests
|
6 |
+
time
|
7 |
+
os
|
8 |
+
groq
|
9 |
+
gtts
|
10 |
+
langdetect
|
11 |
+
speech_recognition
|
12 |
+
python-dotenv
|
13 |
+
pydub
|
14 |
+
|
15 |
+
|