jbondy007 commited on
Commit
e939ec9
·
verified ·
1 Parent(s): db0c33e

Translation to Spanish

Browse files
Files changed (1) hide show
  1. app.py +82 -83
app.py CHANGED
@@ -1,5 +1,5 @@
1
  import streamlit as st
2
- #from streamlit_image_zoom import image_zoom # Import de la bibliothèque pour le zoom
3
  import base64
4
  import os
5
  from dotenv import load_dotenv
@@ -18,14 +18,14 @@ client = OpenAI(
18
  )
19
  #client = Anthropic()
20
  MODEL_NAME = "google/gemini-2.0-flash-lite-001" #"claude-3-opus-20240229"
21
- # Définir le style global
22
  st.set_page_config(
23
- page_title="Le Radiologue Virtuel",
24
  page_icon="🩺",
25
  layout="centered",
26
  )
27
 
28
- # CSS personnalisé pour styliser l'interface
29
  st.markdown("""
30
  <style>
31
  body {
@@ -58,25 +58,25 @@ st.markdown("""
58
  """, unsafe_allow_html=True)
59
 
60
  sample_prompt = """
61
- Vous êtes un professionnel de santé, expert dans l'analyse des images médicales (échographie, radiographie standard, TDM, IRM, ...), travaillant pour un hôpital de renom. Votre tâche consiste à examiner des images médicales afin d'identifier les anomalies, maladies ou problèmes de santé éventuels. Vous devez fournir des résultats détaillés, incluant toutes vos observations, les prochaines étapes, ainsi que des recommandations.
62
- Votre analyse reste dans le cadre éducatif d'étudiants en radiologie médicale et ne sera en aucun cas publique. L'objectif est d'initier ces étudiants à l'interpretation des clichés radiologique.
63
- **Instructions :**
64
- 1. Analysez uniquement les images liées au corps humain et aux problèmes de santé.
65
- 2. Rédigez votre réponse de manière structurée, détaillant :
66
- - Les anomalies identifiées (le cas échéant).
67
- - Les pathologies suspectées ou confirmées.
68
- - Les recommandations et étapes suivantes.
69
- 3. Si certains éléments ne sont pas clairs sur l'image, indiquez : *"Impossible de déterminer à partir de l'image fournie."*
70
- 4. Terminez toujours votre réponse par une mention : *"Consultez un médecin avant de prendre toute décision."*
71
  """
72
 
73
- # Initialisation des variables d'état
74
  if 'uploaded_file' not in st.session_state:
75
  st.session_state.uploaded_file = None
76
  if 'result' not in st.session_state:
77
  st.session_state.result = None
78
  if 'clinical_info' not in st.session_state:
79
- st.session_state.clinical_info = "" # Pour stocker les renseignements cliniques
80
 
81
 
82
  def encode_image(image_path):
@@ -88,17 +88,17 @@ def encode_image(image_path):
88
 
89
 
90
  def call_groq_model_for_analysis(filename: str, clinical_info: str, sample_prompt=sample_prompt):
91
- # Récupérer l'extension du fichier pour définir le media_type
92
- file_extension = os.path.splitext(filename)[1].lower() # Obtenir l'extension en minuscule
93
  if file_extension == ".jpg" or file_extension == ".jpeg":
94
  media_type = "image/jpeg"
95
  elif file_extension == ".png":
96
  media_type = "image/png"
97
  else:
98
- raise ValueError("Format de fichier non pris en charge.")
99
  base64_image = encode_image(filename)
100
- # Ajouter les renseignements cliniques au prompt
101
- full_prompt = sample_prompt + f"\n\n**Renseignements cliniques du patient :** {clinical_info}\n"
102
 
103
 
104
  message_list=[
@@ -145,7 +145,7 @@ def call_groq_model_for_analysis(filename: str, clinical_info: str, sample_promp
145
 
146
 
147
  def chat_eli(query):
148
- eli5_prompt = "Tu dois expliquer l'information ci-dessous à un enfant de cinq ans. \n" + query
149
  messages = [
150
  {
151
  "role": "user",
@@ -170,103 +170,102 @@ def chat_eli(query):
170
 
171
 
172
 
173
- # Titre de l'application
174
- st.title("🩺 **Le Radiologue Virtuel**")
175
- st.subheader("Une IA avancée pour l'analyse des images médicales")
176
 
177
- with st.expander("📖 A-Propos de cette Application"):
178
  st.markdown("""
179
- **Bienvenue sur LE RADIOLOGUE VIRTUEL**, votre assistant intelligent conçu pour fournir une analyse approfondie et précise des images médicales.
180
 
181
- ### Fonctionnalités principales :
182
- - **Analyse d'images médicales** : Téléchargez des clichés d'échographie, de radiographie, d'IRM ou de TDM, et laissez l'IA détecter les anomalies et fournir des recommandations détaillées.
183
- - **Explications simplifiées** : Grâce à la fonction ELI5, comprenez les résultats complexes sous une forme adaptée à un public non expert.
184
- - **Traitement d'image avancé** : Explorez l'image téléchargée avec des outils comme l'inversion pour une visualisation plus claire.
185
 
186
- ### Cas d'utilisation :
187
- - **Éducation médicale** : Destiné aux étudiants en radiologie, cet outil aide à se familiariser avec l'interprétation des images diagnostiques.
188
- - **Support clinique** : Bien que non conçu pour remplacer un professionnel de santé, cet assistant peut fournir des indications utiles pour guider les analyses.
189
- - **Recherche et apprentissage** : Une plateforme idéale pour expérimenter et apprendre l'impact de l'IA dans le domaine médical.
190
 
191
- ### Technologie utilisée :
192
- - **Modèle d'IA puissant** : L'IA utilise la technologie avancée de Llama 3.2 90B Vision, spécialisée dans l'analyse d'images complexes.
193
- - **Interaction intuitive** : Développé avec Python et Streamlit pour une interface simple et conviviale.
194
 
195
 
196
- **⚠️ Avertissement** :
197
- - Cet assistant n'est pas un outil médical certifié et ne remplace en aucun cas l'avis d'un médecin ou d'un spécialiste. Il est destiné à des fins éducatives et de support. Consultez toujours un professionnel de santé pour un diagnostic ou une décision médicale.
198
  """)
199
 
200
- # Champ d'entrée pour les renseignements cliniques
201
  clinical_info = st.text_area(
202
- "Renseignements cliniques du patient (facultatif)",
203
- placeholder="Exemple : Patient présentant une douleur thoracique depuis 3 jours."
204
  )
205
 
206
- # Stocker les renseignements cliniques dans la session
207
  st.session_state['clinical_info'] = clinical_info
208
 
209
- # Téléchargement de l'image
210
- st.markdown("### 📂 Téléchargez une image médicale")
211
- uploaded_file = st.file_uploader("Formats acceptés : JPG, JPEG, PNG", type=["jpg", "jpeg", "png"])
212
 
213
- # Gestion temporaire des fichiers
214
  if uploaded_file is not None:
215
  with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(uploaded_file.name)[1]) as tmp_file:
216
  tmp_file.write(uploaded_file.getvalue())
217
  st.session_state['filename'] = tmp_file.name
218
 
219
- st.image(uploaded_file, caption='Image Téléchargée')
220
 
221
- # Charger l'image avec PIL
222
  image = Image.open(uploaded_file)
223
 
224
- # Ajouter un bouton pour afficher l'image en négatif
225
- st.markdown("### 🔍 Explorez l'image")
226
- col1, col2, col3 = st.columns([1, 2, 1]) # colonnes avec différentes proportions
227
- col1.write("") # Espace dans la première colonne
228
- col3.write("") # Espace dans la troisième colonne
229
- col1.write("") # Espace dans la première colonne
230
- col3.write("") # Espace dans la troisième colonne
231
- if st.button("Afficher l'image en négatif"):
232
- # Créer une version négative de l'image
233
- negative_image = ImageOps.invert(image.convert("RGB")) # Convertir en RGB avant inversion
234
-
235
- # Afficher l'image en négatif
236
- st.subheader("Image en négatif :")
237
- st.image(negative_image, caption="Image en négatif")
238
- col1, col2, col3 = st.columns([1, 2, 1]) # colonnes avec différentes proportions
239
- col1.write("") # Espace dans la première colonne
240
- col3.write("") # Espace dans la troisième colonne
241
- col1.write("") # Espace dans la première colonne
242
- col3.write("") # Espace dans la troisième colonne
243
-
244
- # Bouton pour analyser l'image
245
- if st.button("Analyse l'Image"):
246
  if 'filename' in st.session_state and os.path.exists(st.session_state['filename']):
247
- with st.spinner("Analyse en cours... Veuillez patienter."):
248
  st.session_state['result'] = call_groq_model_for_analysis(
249
  st.session_state['filename'],
250
  st.session_state['clinical_info']
251
  )
252
- st.success("Analyse terminée avec succès !")
253
  st.markdown(st.session_state['result'], unsafe_allow_html=True)
254
- os.unlink(st.session_state['filename']) # Supprimer le fichier temporaire après le traitement
255
 
256
- # ELI5 Explanation
257
- # Explication simplifiée
258
- st.markdown("### 🤓 Explication Simplifiée")
259
  if 'result' in st.session_state and st.session_state['result']:
260
- st.info("Ci-dessous, vous avez une option pour ELI5 afin de comprendre en termes simples.")
261
- if st.radio("ELI5 - Explique-moi comme si j'avais 5 ans", ('NON', 'OUI')) == 'OUI':
262
- st.markdown("_Voici une explication simplifiée pour les non-initiés._")
263
  simplified_explanation = chat_eli(st.session_state['result'])
264
  st.markdown(simplified_explanation, unsafe_allow_html=True)
265
 
266
- # Pied de page
267
  st.markdown("""
268
  <hr>
269
  <footer style="text-align: center; font-size: 0.9em;">
270
- © 2025 - Le Radiologue Virtuel | Propulsé par M. ADJOUMANI
271
  </footer>
272
  """, unsafe_allow_html=True)
 
1
  import streamlit as st
2
+ #from streamlit_image_zoom import image_zoom # Importación de la biblioteca para el zoom
3
  import base64
4
  import os
5
  from dotenv import load_dotenv
 
18
  )
19
  #client = Anthropic()
20
  MODEL_NAME = "google/gemini-2.0-flash-lite-001" #"claude-3-opus-20240229"
21
+ # Definir el estilo global
22
  st.set_page_config(
23
+ page_title="El Radiólogo Virtual",
24
  page_icon="🩺",
25
  layout="centered",
26
  )
27
 
28
+ # CSS personalizado para estilizar la interfaz
29
  st.markdown("""
30
  <style>
31
  body {
 
58
  """, unsafe_allow_html=True)
59
 
60
  sample_prompt = """
61
+ Usted es un profesional de la salud, experto en el análisis de imágenes médicas (ecografía, radiografía estándar, TC, RM, ...), que trabaja para un hospital de renombre. Su tarea consiste en examinar imágenes médicas para identificar posibles anomalías, enfermedades o problemas de salud. Debe proporcionar resultados detallados, incluyendo todas sus observaciones, los próximos pasos, así como recomendaciones.
62
+ Su análisis se mantiene dentro del marco educativo de los estudiantes de radiología médica y no será público en ningún caso. El objetivo es iniciar a estos estudiantes en la interpretación de imágenes radiológicas.
63
+ **Instrucciones:**
64
+ 1. Analice únicamente las imágenes relacionadas con el cuerpo humano y los problemas de salud.
65
+ 2. Redacte su respuesta de manera estructurada, detallando:
66
+ - Las anomalías identificadas (si las hay).
67
+ - Las patologías sospechadas o confirmadas.
68
+ - Las recomendaciones y próximos pasos.
69
+ 3. Si algunos elementos no están claros en la imagen, indique: *"Imposible determinar a partir de la imagen proporcionada."*
70
+ 4. Termine siempre su respuesta con la mención: *"Consulte a un médico antes de tomar cualquier decisión."*
71
  """
72
 
73
+ # Inicialización de las variables de estado
74
  if 'uploaded_file' not in st.session_state:
75
  st.session_state.uploaded_file = None
76
  if 'result' not in st.session_state:
77
  st.session_state.result = None
78
  if 'clinical_info' not in st.session_state:
79
+ st.session_state.clinical_info = "" # Para almacenar la información clínica
80
 
81
 
82
  def encode_image(image_path):
 
88
 
89
 
90
  def call_groq_model_for_analysis(filename: str, clinical_info: str, sample_prompt=sample_prompt):
91
+ # Obtener la extensión del archivo para definir el media_type
92
+ file_extension = os.path.splitext(filename)[1].lower() # Obtener la extensión en minúscula
93
  if file_extension == ".jpg" or file_extension == ".jpeg":
94
  media_type = "image/jpeg"
95
  elif file_extension == ".png":
96
  media_type = "image/png"
97
  else:
98
+ raise ValueError("Formato de archivo no soportado.")
99
  base64_image = encode_image(filename)
100
+ # Añadir la información clínica al prompt
101
+ full_prompt = sample_prompt + f"\n\n**Información clínica del paciente:** {clinical_info}\n"
102
 
103
 
104
  message_list=[
 
145
 
146
 
147
  def chat_eli(query):
148
+ eli5_prompt = "Debes explicar la información a continuación a un niño de cinco años. \n" + query
149
  messages = [
150
  {
151
  "role": "user",
 
170
 
171
 
172
 
173
+ # Título de la aplicación
174
+ st.title("🩺 **El Radiólogo Virtual**")
175
+ st.subheader("Una IA avanzada para el análisis de imágenes médicas")
176
 
177
+ with st.expander("📖 Acerca de esta Aplicación"):
178
  st.markdown("""
179
+ **Bienvenido a EL RADIÓLOGO VIRTUAL**, su asistente inteligente diseñado para proporcionar un análisis profundo y preciso de imágenes médicas.
180
 
181
+ ### Funcionalidades principales:
182
+ - **Análisis de imágenes médicas**: Suba imágenes de ecografía, radiografía, RM o TC, y deje que la IA detecte anomalías y proporcione recomendaciones detalladas.
183
+ - **Explicaciones simplificadas**: Gracias a la función ELI5, comprenda los resultados complejos en una forma adaptada para un público no experto.
184
+ - **Procesamiento avanzado de imágenes**: Explore la imagen subida con herramientas como la inversión para una visualización más clara.
185
 
186
+ ### Casos de uso:
187
+ - **Educación médica**: Destinado a estudiantes de radiología, esta herramienta ayuda a familiarizarse con la interpretación de imágenes diagnósticas.
188
+ - **Soporte clínico**: Aunque no está diseñado para reemplazar a un profesional de la salud, este asistente puede proporcionar indicaciones útiles para guiar los análisis.
189
+ - **Investigación y aprendizaje**: Una plataforma ideal para experimentar y aprender el impacto de la IA en el campo médico.
190
 
191
+ ### Tecnología utilizada:
192
+ - **Modelo de IA potente**: La IA utiliza la tecnología avanzada de Llama 3.2 90B Vision, especializada en el análisis de imágenes complejas.
193
+ - **Interacción intuitiva**: Desarrollado con Python y Streamlit para una interfaz simple y amigable.
194
 
195
 
196
+ **⚠️ Advertencia**:
197
+ - Este asistente no es una herramienta médica certificada y no reemplaza en ningún caso la opinión de un médico o especialista. Está destinado a fines educativos y de soporte. Consulte siempre a un profesional de la salud para un diagnóstico o decisión médica.
198
  """)
199
 
200
+ # Campo de entrada para la información clínica
201
  clinical_info = st.text_area(
202
+ "Información clínica del paciente (opcional)",
203
+ placeholder="Ejemplo: Paciente con dolor torácico desde hace 3 días."
204
  )
205
 
206
+ # Almacenar la información clínica en la sesión
207
  st.session_state['clinical_info'] = clinical_info
208
 
209
+ # Carga de la imagen
210
+ st.markdown("### 📂 Suba una imagen médica")
211
+ uploaded_file = st.file_uploader("Formatos aceptados: JPG, JPEG, PNG", type=["jpg", "jpeg", "png"])
212
 
213
+ # Gestión temporal de archivos
214
  if uploaded_file is not None:
215
  with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(uploaded_file.name)[1]) as tmp_file:
216
  tmp_file.write(uploaded_file.getvalue())
217
  st.session_state['filename'] = tmp_file.name
218
 
219
+ st.image(uploaded_file, caption='Imagen Subida')
220
 
221
+ # Cargar la imagen con PIL
222
  image = Image.open(uploaded_file)
223
 
224
+ # Añadir un botón para mostrar la imagen en negativo
225
+ st.markdown("### 🔍 Explore la imagen")
226
+ col1, col2, col3 = st.columns([1, 2, 1]) # columnas con diferentes proporciones
227
+ col1.write("") # Espacio en la primera columna
228
+ col3.write("") # Espacio en la tercera columna
229
+ col1.write("") # Espacio en la primera columna
230
+ col3.write("") # Espacio en la tercera columna
231
+ if st.button("Mostrar la imagen en negativo"):
232
+ # Crear una versión negativa de la imagen
233
+ negative_image = ImageOps.invert(image.convert("RGB")) # Convertir a RGB antes de invertir
234
+
235
+ # Mostrar la imagen en negativo
236
+ st.subheader("Imagen en negativo:")
237
+ st.image(negative_image, caption="Imagen en negativo")
238
+ col1, col2, col3 = st.columns([1, 2, 1]) # columnas con diferentes proporciones
239
+ col1.write("") # Espacio en la primera columna
240
+ col3.write("") # Espacio en la tercera columna
241
+ col1.write("") # Espacio en la primera columna
242
+ col3.write("") # Espacio en la tercera columna
243
+
244
+ # Botón para analizar la imagen
245
+ if st.button("Analizar la Imagen"):
246
  if 'filename' in st.session_state and os.path.exists(st.session_state['filename']):
247
+ with st.spinner("Análisis en curso... Por favor, espere."):
248
  st.session_state['result'] = call_groq_model_for_analysis(
249
  st.session_state['filename'],
250
  st.session_state['clinical_info']
251
  )
252
+ st.success("Análisis completado con éxito!")
253
  st.markdown(st.session_state['result'], unsafe_allow_html=True)
254
+ os.unlink(st.session_state['filename']) # Eliminar el archivo temporal después del procesamiento
255
 
256
+ # Explicación simplificada
257
+ st.markdown("### 🤓 Explicación Simplificada")
 
258
  if 'result' in st.session_state and st.session_state['result']:
259
+ st.info("A continuación, tiene una opción para ELI5 para entender en términos simples.")
260
+ if st.radio("ELI5 - Explícame como si tuviera 5 años", ('NO', 'SI')) == 'SI':
261
+ st.markdown("_Aquí tiene una explicación simplificada para los no iniciados._")
262
  simplified_explanation = chat_eli(st.session_state['result'])
263
  st.markdown(simplified_explanation, unsafe_allow_html=True)
264
 
265
+ # Pie de página
266
  st.markdown("""
267
  <hr>
268
  <footer style="text-align: center; font-size: 0.9em;">
269
+ © 2025 - El Radiólogo Virtual | Por M. ADJOUMANI
270
  </footer>
271
  """, unsafe_allow_html=True)