Spaces:
Sleeping
Sleeping
File size: 5,645 Bytes
920555e 8ad26f5 4814442 620a4c4 35d0e4b 4814442 3500bf9 6f6a021 3500bf9 6f6a021 3500bf9 6f6a021 3500bf9 6f6a021 8ad26f5 6f6a021 ab3db06 3500bf9 620a4c4 1016a0c 920555e 1016a0c d9b2e08 50963d3 920555e 620a4c4 1016a0c 920555e 50963d3 620a4c4 50963d3 1016a0c 3500bf9 920555e 50963d3 8ad26f5 019b0aa 879c40b b1a2dec 1016a0c 620a4c4 35d0e4b 879c40b 35d0e4b b1a2dec 50963d3 620a4c4 50963d3 35d0e4b 50963d3 620a4c4 35d0e4b 1016a0c 35d0e4b ab3db06 019b0aa 879c40b 019b0aa ab3db06 019b0aa 879c40b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
import streamlit as st
import requests
from transformers import DetrImageProcessor, DetrForObjectDetection
import torch
from PIL import Image, ImageDraw
import math # Importer la bibliothèque math pour arrondir au supérieur
# Fonction pour générer du texte avec Gemini
def generate_text_with_gemini(api_key, prompt):
url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent"
headers = {
"Content-Type": "application/json",
}
params = {
"key": api_key
}
data = {
"contents": [
{
"parts": [
{"text": prompt}
]
}
]
}
response = requests.post(url, headers=headers, params=params, json=data)
# Debug: Print the raw response
print(f"Gemini response status code: {response.status_code}")
print(f"Gemini response content: {response.text}")
try:
response_json = response.json()
except ValueError:
response_json = {}
print("Failed to decode JSON response")
# Renvoyer le texte généré ou un message d'erreur
if response.status_code == 200 and "candidates" in response_json:
return response_json["candidates"][0]["content"]["parts"][0]["text"]
else:
return "Erreur lors de la génération du texte."
# Fonction de traitement de l'image et d'encadrement des personnes détectées
def process_image(image, confidence_threshold=0.7):
processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50", revision="no_timm")
model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50", revision="no_timm")
# Préparer l'image pour le modèle
inputs = processor(images=image, return_tensors="pt")
outputs = model(**inputs)
# Post-traitement des résultats pour obtenir les boîtes englobantes et les labels
target_sizes = torch.tensor([image.size[::-1]])
results = processor.post_process_object_detection(outputs, target_sizes=target_sizes, threshold=confidence_threshold)[0]
# Convertir l'image pour dessiner
draw_image = image.copy()
draw = ImageDraw.Draw(draw_image)
# Compter le nombre de personnes détectées
persons = 0
for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
if score >= confidence_threshold and model.config.id2label[label.item()] == 'person':
persons += 1
box = [round(i, 2) for i in box.tolist()]
# Dessiner le rectangle rouge autour de la personne détectée
draw.rectangle(box, outline="red", width=2)
return draw_image, persons
# Interface Streamlit
st.title("Analyse d'Images pour Détection de Personnes")
# Ajout d'une boîte de sélection pour la localisation
location = st.selectbox("Sélectionnez la localisation de la photo :", ["École", "Manifestation", "Meeting", "Autre"])
# Champ pour entrer le nom du destinataire
recipient_name = st.text_input("Entrez le nom du destinataire de l'e-mail :")
# Champ pour entrer le nom de l'expéditeur
sender_name = st.text_input("Entrez votre nom (expéditeur) :")
# Téléchargement des images
uploaded_files = st.file_uploader("Choisissez des images (vous pouvez en ajouter plusieurs)", type=["jpg", "jpeg", "png"], accept_multiple_files=True)
# Saisie du seuil de confiance
confidence_threshold = st.slider("Seuil de confiance pour la détection (0 à 1)", 0.0, 1.0, 0.7, 0.01)
# Traitement des images et calcul de la moyenne
if uploaded_files and recipient_name and sender_name: # S'assurer que des images sont téléchargées, qu'un destinataire et un expéditeur sont fournis
total_persons = 0
total_images = len(uploaded_files)
for i, uploaded_file in enumerate(uploaded_files):
# Lire l'image téléchargée
image = Image.open(uploaded_file)
st.image(image, caption=f'Image téléchargée : {uploaded_file.name}', use_column_width=True)
# Traitement de l'image
modified_image, detected_persons = process_image(image, confidence_threshold=confidence_threshold)
# Ajouter au total des personnes détectées
total_persons += detected_persons
# Afficher l'image modifiée
st.image(modified_image, caption=f'Image avec personnes détectées : {uploaded_file.name}', use_column_width=True)
st.write(f"**Personnes détectées sur l'image {i + 1} ({uploaded_file.name}) : {detected_persons}**")
# Calcul de la moyenne et arrondi au supérieur
if total_images > 0:
average_persons = math.ceil(total_persons / total_images) # Arrondir au supérieur
st.write(f"**Moyenne des personnes détectées sur toutes les images : {average_persons}**")
# Générer un e-mail avec Gemini basé sur la moyenne arrondie et les détails du contexte
prompt = (
f"Génère-moi un mail destiné à {recipient_name}, attaché de promotion, pour lui signaler que la moyenne "
f"des personnes détectées sur les images est de {average_persons} élèves dans le cadre d'une {location}. "
f"Le mail doit être prêt à l'envoi, clair, concis et adapté à un contexte professionnel. "
f"L'e-mail doit être signé par {sender_name}."
)
api_key = "AIzaSyCJVUr-76I4TL42X98d9U0THbRD3MKlB38" # Clé d'API
email_text = generate_text_with_gemini(api_key, prompt)
st.write("**E-mail généré :**")
st.write(email_text)
else:
st.write("Veuillez télécharger des images, entrer le nom du destinataire et votre nom (expéditeur).")
|