NoahH7 commited on
Commit
1016a0c
·
verified ·
1 Parent(s): a111acb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -21
app.py CHANGED
@@ -37,7 +37,7 @@ def generate_text_with_gemini(api_key, prompt):
37
  return response.status_code, response_json
38
 
39
  # Fonction de traitement de l'image et d'encadrement des personnes détectées
40
- def process_image(image):
41
  processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50", revision="no_timm")
42
  model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50", revision="no_timm")
43
 
@@ -47,7 +47,7 @@ def process_image(image):
47
 
48
  # Post-traitement des résultats pour obtenir les boîtes englobantes et les labels
49
  target_sizes = torch.tensor([image.size[::-1]])
50
- results = processor.post_process_object_detection(outputs, target_sizes=target_sizes, threshold=0.9)[0]
51
 
52
  # Convertir l'image pour dessiner
53
  draw_image = image.copy()
@@ -56,44 +56,55 @@ def process_image(image):
56
  # Compter le nombre de personnes détectées
57
  persons = 0
58
  for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
59
- if model.config.id2label[label.item()] == 'person':
60
  persons += 1
61
  box = [round(i, 2) for i in box.tolist()]
62
  # Dessiner le rectangle rouge autour de la personne détectée
63
  draw.rectangle(box, outline="red", width=3)
64
 
65
- expected_number_of_persons = 10 # Nombre attendu de personnes
66
- absents = expected_number_of_persons - persons
67
-
68
- # Assurez-vous que le nombre d'absents ne soit pas négatif
69
- if absents < 0:
70
- absents = 0
71
-
72
- # Générer le contenu de l'email avec Gemini
73
- prompt = f"Notifier de l'absence: Le nombre de personnes présentes est de {persons}. Le nombre d'absents est de {absents}."
74
- gemini_api_key = "AIzaSyCJVUr-76I4TL42X98d9U0THbRD3MKlB38" # Votre clé API Gemini
75
- status_code, response_json = generate_text_with_gemini(gemini_api_key, prompt)
76
- email_content = response_json.get('candidates', [{}])[0].get('content', {}).get('parts', [{}])[0].get('text', 'Content generation failed.')
77
-
78
- return draw_image, email_content
79
 
80
  # Interface Streamlit
81
  st.title("Analyse d'Images pour Détection de Personnes")
82
 
 
 
 
83
  uploaded_files = st.file_uploader("Choisissez jusqu'à 3 images", type=["jpg", "jpeg", "png"], accept_multiple_files=True)
84
 
 
 
 
85
  if uploaded_files:
 
 
 
 
86
  for uploaded_file in uploaded_files:
87
  # Lire l'image téléchargée
88
  image = Image.open(uploaded_file)
89
  st.image(image, caption=f'Image téléchargée : {uploaded_file.name}', use_column_width=True)
90
 
91
  # Traitement de l'image
92
- modified_image, email_content = process_image(image)
93
 
 
 
 
 
 
94
  # Afficher l'image modifiée
95
  st.image(modified_image, caption=f'Image avec personnes détectées : {uploaded_file.name}', use_column_width=True)
96
 
97
- # Afficher le contenu généré
98
- st.write(f"**Contenu généré pour {uploaded_file.name} :**")
99
- st.markdown(email_content)
 
 
 
 
 
 
 
 
 
 
37
  return response.status_code, response_json
38
 
39
  # Fonction de traitement de l'image et d'encadrement des personnes détectées
40
+ def process_image(image, confidence_threshold=0.7):
41
  processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50", revision="no_timm")
42
  model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50", revision="no_timm")
43
 
 
47
 
48
  # Post-traitement des résultats pour obtenir les boîtes englobantes et les labels
49
  target_sizes = torch.tensor([image.size[::-1]])
50
+ results = processor.post_process_object_detection(outputs, target_sizes=target_sizes, threshold=confidence_threshold)[0]
51
 
52
  # Convertir l'image pour dessiner
53
  draw_image = image.copy()
 
56
  # Compter le nombre de personnes détectées
57
  persons = 0
58
  for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
59
+ if score >= confidence_threshold and model.config.id2label[label.item()] == 'person':
60
  persons += 1
61
  box = [round(i, 2) for i in box.tolist()]
62
  # Dessiner le rectangle rouge autour de la personne détectée
63
  draw.rectangle(box, outline="red", width=3)
64
 
65
+ return draw_image, persons
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
  # Interface Streamlit
68
  st.title("Analyse d'Images pour Détection de Personnes")
69
 
70
+ # Saisie du nombre de personnes attendues pour chaque image
71
+ number_of_people = st.number_input("Nombre attendu de personnes pour chaque image", min_value=1, value=10, step=1)
72
+
73
  uploaded_files = st.file_uploader("Choisissez jusqu'à 3 images", type=["jpg", "jpeg", "png"], accept_multiple_files=True)
74
 
75
+ # Option pour définir le seuil de confiance
76
+ confidence_threshold = st.slider("Seuil de confiance pour la détection", 0.0, 1.0, 0.7)
77
+
78
  if uploaded_files:
79
+ max_absents = -1
80
+ best_image = None
81
+ best_image_name = ""
82
+
83
  for uploaded_file in uploaded_files:
84
  # Lire l'image téléchargée
85
  image = Image.open(uploaded_file)
86
  st.image(image, caption=f'Image téléchargée : {uploaded_file.name}', use_column_width=True)
87
 
88
  # Traitement de l'image
89
+ modified_image, detected_persons = process_image(image, confidence_threshold)
90
 
91
+ # Calculer le nombre d'absents
92
+ absents = number_of_people - detected_persons
93
+ if absents < 0:
94
+ absents = 0
95
+
96
  # Afficher l'image modifiée
97
  st.image(modified_image, caption=f'Image avec personnes détectées : {uploaded_file.name}', use_column_width=True)
98
 
99
+ # Afficher le nombre d'absents
100
+ st.write(f"**Nombre d'absents pour {uploaded_file.name} : {absents}**")
101
+
102
+ # Garder une trace de l'image avec le plus grand nombre d'absents
103
+ if absents > max_absents:
104
+ max_absents = absents
105
+ best_image = modified_image
106
+ best_image_name = uploaded_file.name
107
+
108
+ # Afficher l'image avec le plus grand nombre d'absents
109
+ if best_image:
110
+ st.image(best_image, caption=f'Image avec le plus grand nombre d\'absents : {best_image_name}', use_column_width=True)