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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +20 -17
app.py CHANGED
@@ -2,7 +2,7 @@ import streamlit as st
2
  import requests
3
  from transformers import DetrImageProcessor, DetrForObjectDetection
4
  import torch
5
- from PIL import Image, ImageDraw
6
 
7
  # Fonction pour générer du texte avec Gemini
8
  def generate_text_with_gemini(api_key, prompt):
@@ -36,7 +36,7 @@ def generate_text_with_gemini(api_key, prompt):
36
 
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")
@@ -52,52 +52,55 @@ def process_image(image, confidence_threshold=0.7):
52
  # Convertir l'image pour dessiner
53
  draw_image = image.copy()
54
  draw = ImageDraw.Draw(draw_image)
 
55
 
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:
 
2
  import requests
3
  from transformers import DetrImageProcessor, DetrForObjectDetection
4
  import torch
5
+ from PIL import Image, ImageDraw, ImageFont
6
 
7
  # Fonction pour générer du texte avec Gemini
8
  def generate_text_with_gemini(api_key, prompt):
 
36
 
37
  return response.status_code, response_json
38
 
39
+ # Fonction de traitement de l'image et d'annotation 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")
 
52
  # Convertir l'image pour dessiner
53
  draw_image = image.copy()
54
  draw = ImageDraw.Draw(draw_image)
55
+ font = ImageFont.load_default()
56
 
57
  # Compter le nombre de personnes détectées
58
  persons = 0
59
+ for idx, (score, label, box) in enumerate(zip(results["scores"], results["labels"], results["boxes"])):
60
  if score >= confidence_threshold and model.config.id2label[label.item()] == 'person':
61
  persons += 1
62
  box = [round(i, 2) for i in box.tolist()]
63
+ # Dessiner le texte avec le numéro de la personne détectée
64
+ text = f'Personne {persons}'
65
+ draw.text((box[0], box[1]), text, fill="blue", font=font)
66
 
67
  return draw_image, persons
68
 
69
  # Interface Streamlit
70
  st.title("Analyse d'Images pour Détection de Personnes")
71
 
72
+ # Téléchargement des images
73
+ uploaded_files = st.file_uploader("Choisissez des images (vous pouvez en ajouter plusieurs)", type=["jpg", "jpeg", "png"], accept_multiple_files=True)
 
 
 
 
 
74
 
75
+ # Saisie du nombre de personnes attendues pour chaque image
76
  if uploaded_files:
77
+ number_of_people = []
78
+ for i in range(len(uploaded_files)):
79
+ count = st.number_input(f"Nombre attendu de personnes pour l'image {i + 1}", min_value=1, value=10, step=1, key=f"input_{i}")
80
+ number_of_people.append(count)
81
+
82
  max_absents = -1
83
  best_image = None
84
  best_image_name = ""
85
 
86
+ for i, uploaded_file in enumerate(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, detected_persons = process_image(image, confidence_threshold=0.7)
93
 
94
  # Calculer le nombre d'absents
95
+ absents = number_of_people[i] - detected_persons
96
  if absents < 0:
97
  absents = 0
98
 
99
  # Afficher l'image modifiée
100
+ st.image(modified_image, caption=f'Image avec personnes annotées : {uploaded_file.name}', use_column_width=True)
101
 
102
  # Afficher le nombre d'absents
103
+ st.write(f"**Nombre d'absents pour l'image {i + 1} ({uploaded_file.name}) : {absents}**")
104
 
105
  # Garder une trace de l'image avec le plus grand nombre d'absents
106
  if absents > max_absents: