Docfile commited on
Commit
7926155
·
verified ·
1 Parent(s): 482956a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -32
app.py CHANGED
@@ -69,6 +69,8 @@ UPLOAD_FOLDER = 'uploads'
69
  app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
70
  os.makedirs(UPLOAD_FOLDER, exist_ok=True)
71
 
 
 
72
  @app.route('/analyze', methods=['POST'])
73
  def analyze_image():
74
  try:
@@ -80,59 +82,82 @@ def analyze_image():
80
  return jsonify({'error': 'No selected file'}), 400
81
 
82
  if file:
 
83
  unique_filename = str(uuid.uuid4()) + os.path.splitext(file.filename)[1]
84
  filename = os.path.join(app.config['UPLOAD_FOLDER'], unique_filename)
85
  file.save(filename)
86
 
87
- # Charger l'image avec OpenCV
88
- image = cv2.imread(filename)
89
- image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # Convertir en RGB pour l'API Gemini
90
-
91
- # Préparer l'image pour l'API Gemini
92
  image_part = {
93
- "mime_type": "image/jpeg",
94
- "data": cv2.imencode('.jpg', image_rgb)[1].tobytes()
95
  }
 
96
 
97
- # Détection d'objets et dessin des boîtes (avec gestion d'erreur)
98
- detection_results = [] # Initialiser une liste vide pour les résultats de détection
99
- try:
100
- model = genai.GenerativeModel("gemini-1.5-flash-exp", safety_settings=safety_settings, generation_config=generation_config)
101
- response = model.generate_content([DETECTION_PROMPT, image_part])
102
- cleaned_response_text = response.text.replace('\n', '')
103
 
 
 
104
  if cleaned_response_text.startswith("```json"):
105
  cleaned_response_text = cleaned_response_text[7:]
106
  if cleaned_response_text.endswith("```"):
107
  cleaned_response_text = cleaned_response_text[:-3]
108
-
109
  detection_results = json.loads(cleaned_response_text)
 
 
 
110
 
111
- # Dessiner les boîtes englobantes avec OpenCV
112
- for item in detection_results:
 
 
 
 
 
 
113
  box = item['box_2d']
114
- label = str(item['label'])
115
- x0, y0, x1, y1 = box
116
- cv2.rectangle(image, (x0, y0), (x1, y1), (255, 0, 0), 2)
117
- cv2.putText(image, label, (x0, y0 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
 
 
 
 
 
 
118
 
119
- except Exception as e:
120
- print(f"Erreur lors de la détection d'objets ou du dessin des boîtes : {e}")
121
 
122
- # Enregistrer l'image traitée
123
- output_filename = os.path.join(app.config['UPLOAD_FOLDER'], 'output_' + unique_filename)
124
- cv2.imwrite(output_filename, image)
 
125
 
126
- # Générer la description
127
- model = genai.GenerativeModel("gemini-2.0-flash-exp", safety_settings=safety_settings, generation_config=generation_config)
128
  response = model.generate_content([DESCRIPTION_PROMPT, image_part])
129
  description = response.text
130
 
131
- return jsonify({
132
- 'image_path': '/uploads/' + 'output_' + unique_filename,
133
- 'description': description,
134
- 'detected_objects': detection_results
135
- })
 
 
 
 
 
 
 
 
 
 
 
 
136
 
137
  except Exception as e:
138
  print(f"Une erreur s'est produite : {e}")
 
69
  app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
70
  os.makedirs(UPLOAD_FOLDER, exist_ok=True)
71
 
72
+
73
+
74
  @app.route('/analyze', methods=['POST'])
75
  def analyze_image():
76
  try:
 
82
  return jsonify({'error': 'No selected file'}), 400
83
 
84
  if file:
85
+ # Générer un nom de fichier unique pour éviter les conflits
86
  unique_filename = str(uuid.uuid4()) + os.path.splitext(file.filename)[1]
87
  filename = os.path.join(app.config['UPLOAD_FOLDER'], unique_filename)
88
  file.save(filename)
89
 
90
+ # 1. Détection d'objets avec Gemini
91
+ model = genai.GenerativeModel("gemini-2.0-flash-exp",safety_settings=safety_settings,generation_config=generation_config)
 
 
 
92
  image_part = {
93
+ "mime_type": "image/jpeg", # Assurez-vous que cela corresponde au type de votre image
94
+ "data": open(filename, "rb").read() # Le fichier est lu ici
95
  }
96
+ response = model.generate_content([DETECTION_PROMPT, image_part])
97
 
98
+ # Nettoyer la réponse JSON en supprimant les sauts de ligne
99
+ cleaned_response_text = response.text.replace('\n', '')
 
 
 
 
100
 
101
+ try:
102
+ # Enlever les ```json et ``` au début et à la fin de la chaîne
103
  if cleaned_response_text.startswith("```json"):
104
  cleaned_response_text = cleaned_response_text[7:]
105
  if cleaned_response_text.endswith("```"):
106
  cleaned_response_text = cleaned_response_text[:-3]
 
107
  detection_results = json.loads(cleaned_response_text)
108
+ except json.JSONDecodeError:
109
+ print(f"Erreur de décodage JSON : {cleaned_response_text}")
110
+ detection_results = [] # Initialiser à une liste vide en cas d'erreur
111
 
112
+ # 2. Dessiner les boîtes englobantes (avec gestion d'erreur)
113
+ image = Image.open(filename)
114
+ draw = ImageDraw.Draw(image)
115
+
116
+ draw_success = True # Indicateur de succès du dessin
117
+
118
+ for item in detection_results:
119
+ try:
120
  box = item['box_2d']
121
+ label = item['label']
122
+
123
+ # Convertir la liste 'box' en tuple
124
+ box_tuple = tuple(box)
125
+
126
+ draw.rectangle(box_tuple, outline=(255, 0, 0), width=2)
127
+ text_position = (box[0], box[1] - 10)
128
+
129
+ # S'assurer que le label est une chaîne de caractère
130
+ label_str = str(label)
131
 
132
+ # Utiliser une couleur valide (blanc)
133
+ draw.text(text_position, label_str, fill="white")
134
 
135
+ except Exception as e:
136
+ print(f"Erreur lors du dessin des boîtes ou du texte : {e}")
137
+ draw_success = False # Échec du dessin
138
+ break # Sortir de la boucle en cas d'erreur
139
 
140
+ # 3. Générer la description (toujours exécuté)
 
141
  response = model.generate_content([DESCRIPTION_PROMPT, image_part])
142
  description = response.text
143
 
144
+ # 4. Renvoyer les résultats
145
+ if draw_success:
146
+ # Enregistrer l'image avec les boîtes si le dessin a réussi
147
+ output_filename = os.path.join(app.config['UPLOAD_FOLDER'], 'output_' + unique_filename)
148
+ image.save(output_filename)
149
+ return jsonify({
150
+ 'image_path': '/uploads/' + 'output_' + unique_filename,
151
+ 'description': description,
152
+ 'detected_objects': detection_results
153
+ })
154
+ else:
155
+ # Renvoyer la description et les résultats de détection, même si le dessin a échoué
156
+ return jsonify({
157
+ 'image_path': None, # Indiquer qu'aucune image n'a été générée
158
+ 'description': description,
159
+ 'detected_objects': detection_results
160
+ })
161
 
162
  except Exception as e:
163
  print(f"Une erreur s'est produite : {e}")