Spaces:
Sleeping
Sleeping
import streamlit as st | |
import PIL.Image | |
import os | |
import google.generativeai as genai | |
# Configuration de la page | |
st.set_page_config( | |
page_title="Mariam Anglais", | |
page_icon="🇬🇧", | |
layout="wide", | |
initial_sidebar_state="expanded" | |
) | |
# CSS personnalisé pour un design plus esthétique | |
st.markdown( | |
""" | |
<style> | |
body { | |
background-color: #f4f4f4; | |
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; /* Police plus moderne */ | |
} | |
.stButton>button { | |
background-color: #4CAF50; | |
color: white; | |
padding: 0.75rem 1.5rem; | |
border-radius: 0.5rem; | |
font-weight: bold; | |
transition: all 0.2s ease-in-out; /* Animation au survol */ | |
} | |
.stButton>button:hover { | |
background-color: #3e8e41; /* Couleur plus foncée au survol */ | |
box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.2); /* Ombre au survol */ | |
transform: translateY(-2px); /* Légère élévation au survol */ | |
} | |
.stFileUploader { | |
padding: 1rem; | |
border: 2px dashed #4CAF50; | |
border-radius: 0.5rem; | |
} | |
.stRadio>div>label { | |
font-weight: bold; | |
} | |
.st-bb { | |
border-bottom: 2px solid #4CAF50; | |
} | |
.st-el { /* Pour les messages d'avertissement et de succès */ | |
border-radius: 0.5rem; | |
padding: 0.75rem; | |
} | |
.st-ek { /* Zone de texte */ | |
border-radius: 0.5rem; | |
} | |
.st-ef { /* Titres */ | |
font-weight: bold; | |
color: #267629; | |
} | |
.stProgress>div>div>div>div { | |
background-color: #4CAF50; | |
} | |
</style> | |
""", | |
unsafe_allow_html=True | |
) | |
# Configuration de l'API Google Generative AI | |
GOOGLE_API_KEY = st.secrets["GOOGLE_API_KEY"] # Définir le chemin d'accès dans les secrets de l'application | |
genai.configure(api_key=GOOGLE_API_KEY) | |
# Titre et introduction avec effet d'animation | |
st.markdown( | |
""" | |
<h1 style='text-align: center; color: #267629; font-size: 3em; font-weight: bold;'> | |
<span style='opacity: 0; animation: fadeIn 1s ease-in-out forwards;'>✨ Mariam Anglais ✨</span> | |
</h1> | |
<style> | |
@keyframes fadeIn { | |
from { opacity: 0; } | |
to { opacity: 1; } | |
} | |
</style> | |
""", | |
unsafe_allow_html=True | |
) | |
st.markdown("<br>", unsafe_allow_html=True) # Espace | |
st.write("Bienvenue sur votre plateforme d'analyse d'images intelligente! Téléchargez vos images, choisissez votre type d'analyse, et laissez la magie opérer.") | |
# Colonnes pour une meilleure disposition | |
col1, col2 = st.columns(2, gap="large") # Ajout d'un gap plus grand | |
with col1: | |
# Section de téléchargement d'images | |
st.subheader("📷 Téléchargement d'images") | |
uploaded_files = st.file_uploader("", type=["jpg", "jpeg", "png"], accept_multiple_files=True, label_visibility="collapsed") # Label caché | |
# Aperçu des images téléchargées avec possibilité de les supprimer individuellement | |
if uploaded_files: | |
st.write("Aperçu des images :") | |
for i, uploaded_file in enumerate(uploaded_files): | |
col_img, col_del = st.columns([4, 1]) # Colonnes pour l'image et le bouton de suppression | |
with col_img: | |
st.image(uploaded_file, width=200, caption=f"Image {i+1}") | |
with col_del: | |
if st.button(f"🗑️", key=f"del_{i}"): | |
del uploaded_files[i] | |
st.experimental_rerun() | |
with col2: | |
# Section de choix du type d'analyse | |
st.subheader("🎛️ Choix du type d'analyse") | |
analysis_type = st.radio("", | |
("🔍 Type 1: Analyse de base", "🧠 Type 2: Analyse approfondie"), label_visibility="collapsed") | |
# Description des types d'analyse (cachée par défaut, visible en cliquant) | |
with st.expander("ℹ️ En savoir plus sur les types d'analyse"): | |
if analysis_type == "🔍 Type 1: Analyse de base": | |
st.write("L'analyse de base effectue une reconnaissance d'objets simple et rapide.") | |
else: | |
st.write("L'analyse approfondie utilise des algorithmes d'intelligence artificielle avancés pour une analyse plus précise et détaillée.") | |
# Bouton de soumission | |
if st.button("🚀 Soumettre", key="submit"): | |
if uploaded_files: | |
st.write("Type d'analyse sélectionné :", analysis_type) | |
# Préparation des images pour l'API | |
image_parts = [] | |
for uploaded_file in uploaded_files: | |
try: | |
image = PIL.Image.open(uploaded_file) | |
image_parts.append(image) | |
except Exception as e: | |
st.error(f"Erreur lors du chargement de l'image : {e}") | |
st.stop() | |
# Définir le prompt en fonction du type d'analyse | |
if analysis_type == "🔍 Type 1: Analyse de base": | |
prompt = "Décris les objets présents dans ces images." | |
else: | |
prompt = "Effectue une analyse détaillée de ces images, en te concentrant sur les détails et les relations entre les différents éléments." | |
# Appel de l'API Google Generative AI | |
try: | |
model = genai.GenerativeModel(model_name="gemini-2.0-flash-exp") | |
with st.spinner("Analyse en cours..."): | |
progress_bar = st.progress(0) | |
response = model.generate_content([prompt] + image_parts, stream=True) | |
response.resolve() | |
progress_bar.progress(100) | |
# Affichage de la réponse | |
st.subheader("📝 Résultat de l'analyse :") | |
st.write(response.text) | |
except Exception as e: | |
st.error(f"Erreur lors de l'analyse : {e}") | |
else: | |
st.warning("⚠️ Veuillez télécharger au moins une image.") | |
# Pied de page | |
st.markdown("---") | |
st.write("© 2024 Mariam Anglais - Tous droits réservés.") |