root16285 commited on
Commit
766dbd9
·
1 Parent(s): 82ff894

Add ZKA detection application with YOLOv5

Browse files
Files changed (3) hide show
  1. README.md +49 -6
  2. app.py +315 -0
  3. requirements.txt +8 -0
README.md CHANGED
@@ -1,13 +1,56 @@
1
  ---
2
- title: Zka Detection
3
- emoji: 🦀
4
- colorFrom: indigo
5
- colorTo: pink
6
  sdk: gradio
7
- sdk_version: 6.2.0
8
  app_file: app.py
9
  pinned: false
10
  license: mit
11
  ---
12
 
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: ZKA Marchés CI - Détection d'Objets
3
+ emoji: 🚦
4
+ colorFrom: blue
5
+ colorTo: purple
6
  sdk: gradio
7
+ sdk_version: 4.44.0
8
  app_file: app.py
9
  pinned: false
10
  license: mit
11
  ---
12
 
13
+ # 🚀 ZKA Marchés CI - Détection d'Objets par IA
14
+
15
+ ## 📋 Description
16
+
17
+ **ZKA Marchés CI** est un système intelligent de gestion des flux dans les marchés d'Abidjan (Côte d'Ivoire) basé sur la vision par ordinateur avec **YOLOv5**.
18
+
19
+ Cette application permet de détecter en temps réel:
20
+ - 👥 **Personnes** - Pour la gestion des flux piétons
21
+ - 🚗 **Véhicules** - Voitures, motos, bus, camions
22
+ - 🚲 **Deux-roues** - Vélos, trottinettes
23
+ - 🛒 **Objets de marché** - Mobilier urbain et infrastructure
24
+
25
+ ## 🎯 Objectifs du Projet
26
+
27
+ Le projet vise à résoudre les problématiques majeures des marchés africains:
28
+
29
+ - **Surpopulation** : Jusqu'à 50 000 personnes/jour dans certains marchés
30
+ - **Sécurité** : Prévention des bousculades et accidents
31
+ - **Congestion** : Gestion optimale des voies de circulation
32
+ - **Données** : Collecte de statistiques fiables pour la planification urbaine
33
+
34
+ ## 🛠️ Technologies Utilisées
35
+
36
+ - **YOLOv5** (Ultralytics) - Détection d'objets en temps réel
37
+ - **PyTorch** - Framework de deep learning
38
+ - **Gradio** - Interface web interactive
39
+ - **OpenCV** - Traitement d'images
40
+
41
+ ## 🚀 Utilisation
42
+
43
+ 1. **Uploadez une image** ou utilisez les exemples fournis
44
+ 2. **Ajustez le seuil de confiance** selon vos besoins (0.1 à 0.9)
45
+ 3. **Choisissez la langue** des labels (Français 🇫🇷 ou English 🇬🇧)
46
+ 4. **Cliquez sur "Détecter les Objets"** pour lancer l'analyse
47
+
48
+ ## 📊 Capacités de Détection
49
+
50
+ L'application peut détecter **80 classes d'objets** du dataset COCO.
51
+
52
+ ## 🎓 Contexte Académique
53
+
54
+ Projet développé à **ESATIC** (École Supérieure Africaine des TIC) pour la gestion urbaine en Afrique.
55
+
56
+ **Marchés ciblés:** Adjamé, Treichville, Cocody, Yopougon (Abidjan)
app.py ADDED
@@ -0,0 +1,315 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ ZKA Marchés CI - Détection d'Objets avec YOLOv5
3
+ Application Gradio pour Hugging Face Spaces
4
+ """
5
+
6
+ import gradio as gr
7
+ import torch
8
+ import cv2
9
+ import numpy as np
10
+ from PIL import Image
11
+ import sys
12
+ from pathlib import Path
13
+
14
+ # Add YOLOv5 to path
15
+ YOLOV5_ROOT = Path(__file__).resolve().parent
16
+ if str(YOLOV5_ROOT) not in sys.path:
17
+ sys.path.insert(0, str(YOLOV5_ROOT))
18
+
19
+ # Charger le modèle YOLOv5
20
+ print("🔄 Chargement du modèle YOLOv5...")
21
+ try:
22
+ model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
23
+ model.conf = 0.25 # Seuil de confiance
24
+ model.iou = 0.45 # Seuil IoU pour NMS
25
+ print("✅ Modèle chargé avec succès!")
26
+ except Exception as e:
27
+ print(f"❌ Erreur de chargement: {e}")
28
+ model = None
29
+
30
+ # Traduction des classes en français
31
+ CLASS_NAMES_FR = {
32
+ 'person': 'Personne',
33
+ 'bicycle': 'Vélo',
34
+ 'car': 'Voiture',
35
+ 'motorcycle': 'Moto',
36
+ 'airplane': 'Avion',
37
+ 'bus': 'Bus',
38
+ 'train': 'Train',
39
+ 'truck': 'Camion',
40
+ 'boat': 'Bateau',
41
+ 'traffic light': 'Feu de circulation',
42
+ 'fire hydrant': 'Borne d\'incendie',
43
+ 'stop sign': 'Panneau stop',
44
+ 'parking meter': 'Parcomètre',
45
+ 'bench': 'Banc',
46
+ 'bird': 'Oiseau',
47
+ 'cat': 'Chat',
48
+ 'dog': 'Chien',
49
+ 'horse': 'Cheval',
50
+ 'sheep': 'Mouton',
51
+ 'cow': 'Vache',
52
+ 'elephant': 'Éléphant',
53
+ 'bear': 'Ours',
54
+ 'zebra': 'Zèbre',
55
+ 'giraffe': 'Girafe',
56
+ 'backpack': 'Sac à dos',
57
+ 'umbrella': 'Parapluie',
58
+ 'handbag': 'Sac à main',
59
+ 'tie': 'Cravate',
60
+ 'suitcase': 'Valise',
61
+ 'frisbee': 'Frisbee',
62
+ 'skis': 'Skis',
63
+ 'snowboard': 'Snowboard',
64
+ 'sports ball': 'Ballon de sport',
65
+ 'kite': 'Cerf-volant',
66
+ 'baseball bat': 'Batte de baseball',
67
+ 'baseball glove': 'Gant de baseball',
68
+ 'skateboard': 'Skateboard',
69
+ 'surfboard': 'Planche de surf',
70
+ 'tennis racket': 'Raquette de tennis',
71
+ 'bottle': 'Bouteille',
72
+ 'wine glass': 'Verre à vin',
73
+ 'cup': 'Tasse',
74
+ 'fork': 'Fourchette',
75
+ 'knife': 'Couteau',
76
+ 'spoon': 'Cuillère',
77
+ 'bowl': 'Bol',
78
+ 'banana': 'Banane',
79
+ 'apple': 'Pomme',
80
+ 'sandwich': 'Sandwich',
81
+ 'orange': 'Orange',
82
+ 'broccoli': 'Brocoli',
83
+ 'carrot': 'Carotte',
84
+ 'hot dog': 'Hot-dog',
85
+ 'pizza': 'Pizza',
86
+ 'donut': 'Donut',
87
+ 'cake': 'Gâteau',
88
+ 'chair': 'Chaise',
89
+ 'couch': 'Canapé',
90
+ 'potted plant': 'Plante en pot',
91
+ 'bed': 'Lit',
92
+ 'dining table': 'Table à manger',
93
+ 'toilet': 'Toilettes',
94
+ 'tv': 'Télévision',
95
+ 'laptop': 'Ordinateur portable',
96
+ 'mouse': 'Souris',
97
+ 'remote': 'Télécommande',
98
+ 'keyboard': 'Clavier',
99
+ 'cell phone': 'Téléphone portable',
100
+ 'microwave': 'Micro-ondes',
101
+ 'oven': 'Four',
102
+ 'toaster': 'Grille-pain',
103
+ 'sink': 'Évier',
104
+ 'refrigerator': 'Réfrigérateur',
105
+ 'book': 'Livre',
106
+ 'clock': 'Horloge',
107
+ 'vase': 'Vase',
108
+ 'scissors': 'Ciseaux',
109
+ 'teddy bear': 'Ours en peluche',
110
+ 'hair drier': 'Sèche-cheveux',
111
+ 'toothbrush': 'Brosse à dents'
112
+ }
113
+
114
+ def detect_objects(image, confidence_threshold, language):
115
+ """
116
+ Détecte les objets dans une image
117
+
118
+ Args:
119
+ image: Image PIL
120
+ confidence_threshold: Seuil de confiance (0-1)
121
+ language: Langue pour les labels ('fr' ou 'en')
122
+
123
+ Returns:
124
+ image_result: Image avec les bounding boxes
125
+ stats_text: Statistiques de détection
126
+ detections_html: Tableau HTML des détections
127
+ """
128
+ if model is None:
129
+ return None, "❌ Modèle non chargé", ""
130
+
131
+ if image is None:
132
+ return None, "❌ Aucune image fournie", ""
133
+
134
+ try:
135
+ # Mettre à jour le seuil de confiance
136
+ model.conf = confidence_threshold
137
+
138
+ # Effectuer la détection
139
+ results = model(image)
140
+
141
+ # Obtenir les détections
142
+ detections = results.pandas().xyxy[0]
143
+
144
+ # Créer l'image avec les bounding boxes
145
+ img_result = np.array(results.render()[0])
146
+ img_result = Image.fromarray(img_result)
147
+
148
+ # Statistiques
149
+ num_detections = len(detections)
150
+
151
+ if num_detections == 0:
152
+ stats_text = "🔍 Aucun objet détecté"
153
+ detections_html = ""
154
+ else:
155
+ # Compter les objets par classe
156
+ class_counts = detections['name'].value_counts().to_dict()
157
+
158
+ # Texte des statistiques
159
+ stats_text = f"✅ **{num_detections} objet(s) détecté(s)**\n\n"
160
+ stats_text += "**Répartition par classe:**\n"
161
+ for class_name, count in class_counts.items():
162
+ if language == 'fr' and class_name in CLASS_NAMES_FR:
163
+ class_name = CLASS_NAMES_FR[class_name]
164
+ stats_text += f"- {class_name}: {count}\n"
165
+
166
+ # Tableau HTML des détections
167
+ detections_html = "<table style='width:100%; border-collapse: collapse;'>"
168
+ detections_html += "<tr style='background-color: #f2f2f2;'>"
169
+ detections_html += "<th style='border: 1px solid #ddd; padding: 8px;'>Classe</th>"
170
+ detections_html += "<th style='border: 1px solid #ddd; padding: 8px;'>Confiance</th>"
171
+ detections_html += "<th style='border: 1px solid #ddd; padding: 8px;'>Position (x1, y1, x2, y2)</th>"
172
+ detections_html += "</tr>"
173
+
174
+ for idx, row in detections.iterrows():
175
+ class_name = row['name']
176
+ if language == 'fr' and class_name in CLASS_NAMES_FR:
177
+ class_name = CLASS_NAMES_FR[class_name]
178
+
179
+ conf = row['confidence']
180
+ x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax'])
181
+
182
+ detections_html += f"<tr>"
183
+ detections_html += f"<td style='border: 1px solid #ddd; padding: 8px;'>{class_name}</td>"
184
+ detections_html += f"<td style='border: 1px solid #ddd; padding: 8px;'>{conf:.2%}</td>"
185
+ detections_html += f"<td style='border: 1px solid #ddd; padding: 8px;'>({x1}, {y1}, {x2}, {y2})</td>"
186
+ detections_html += "</tr>"
187
+
188
+ detections_html += "</table>"
189
+
190
+ return img_result, stats_text, detections_html
191
+
192
+ except Exception as e:
193
+ error_msg = f"❌ Erreur lors de la détection: {str(e)}"
194
+ return None, error_msg, ""
195
+
196
+ # Interface Gradio
197
+ with gr.Blocks(theme=gr.themes.Soft(), title="ZKA - Détection d'Objets") as demo:
198
+
199
+ gr.Markdown("""
200
+ # 🚀 ZKA Marchés CI - Détection d'Objets par IA
201
+
202
+ ### Système intelligent de gestion des flux dans les marchés d'Abidjan
203
+
204
+ Cette application utilise **YOLOv5** pour détecter en temps réel différents objets dans vos images.
205
+ Développée dans le cadre d'un projet de gestion des flux humains et véhicules dans les marchés d'Abidjan.
206
+
207
+ 📌 **Instructions:**
208
+ 1. Uploadez une image ou utilisez un exemple
209
+ 2. Ajustez le seuil de confiance si nécessaire
210
+ 3. Choisissez la langue des labels
211
+ 4. Cliquez sur "🔍 Détecter les Objets"
212
+ """)
213
+
214
+ with gr.Row():
215
+ with gr.Column(scale=1):
216
+ # Entrées
217
+ input_image = gr.Image(
218
+ type="pil",
219
+ label="📸 Image d'entrée",
220
+ height=400
221
+ )
222
+
223
+ confidence_slider = gr.Slider(
224
+ minimum=0.1,
225
+ maximum=0.9,
226
+ value=0.25,
227
+ step=0.05,
228
+ label="🎯 Seuil de confiance",
229
+ info="Plus la valeur est élevée, plus les détections sont précises (mais moins nombreuses)"
230
+ )
231
+
232
+ language_radio = gr.Radio(
233
+ choices=[("Français 🇫🇷", "fr"), ("English 🇬🇧", "en")],
234
+ value="fr",
235
+ label="🌍 Langue des labels"
236
+ )
237
+
238
+ detect_btn = gr.Button("🔍 Détecter les Objets", variant="primary", size="lg")
239
+
240
+ gr.Markdown("""
241
+ ### 🎯 Objets détectables:
242
+
243
+ **Transport & Mobilité:**
244
+ - Personnes, véhicules (voitures, motos, bus, camions)
245
+ - Vélos, trottinettes
246
+
247
+ **Infrastructure & Commerce:**
248
+ - Mobilier urbain (bancs, tables)
249
+ - Objets de marché
250
+
251
+ **Total:** 80 classes d'objets COCO
252
+ """)
253
+
254
+ with gr.Column(scale=1):
255
+ # Sorties
256
+ output_image = gr.Image(
257
+ type="pil",
258
+ label="✅ Image avec détections",
259
+ height=400
260
+ )
261
+
262
+ stats_output = gr.Markdown(label="📊 Statistiques")
263
+
264
+ detections_table = gr.HTML(label="📋 Détails des détections")
265
+
266
+ # Exemples
267
+ gr.Markdown("### 📷 Exemples d'images")
268
+ gr.Examples(
269
+ examples=[
270
+ ["https://images.unsplash.com/photo-1573164713988-8665fc963095?w=800", 0.25, "fr"],
271
+ ["https://images.unsplash.com/photo-1449824913935-59a10b8d2000?w=800", 0.25, "fr"],
272
+ ["https://images.unsplash.com/photo-1519046904884-53103b34b206?w=800", 0.3, "fr"],
273
+ ],
274
+ inputs=[input_image, confidence_slider, language_radio],
275
+ outputs=[output_image, stats_output, detections_table],
276
+ fn=detect_objects,
277
+ cache_examples=False,
278
+ )
279
+
280
+ # Actions
281
+ detect_btn.click(
282
+ fn=detect_objects,
283
+ inputs=[input_image, confidence_slider, language_radio],
284
+ outputs=[output_image, stats_output, detections_table]
285
+ )
286
+
287
+ gr.Markdown("""
288
+ ---
289
+
290
+ ### 📖 À propos du projet
291
+
292
+ **ZKA Marchés CI** est un système intelligent de gestion des flux dans les marchés d'Abidjan basé sur YOLOv5.
293
+
294
+ **Objectifs:**
295
+ - Détection en temps réel des personnes et véhicules
296
+ - Prévention de la surpopulation
297
+ - Gestion optimale de l'espace
298
+ - Amélioration de la sécurité
299
+
300
+ **Technologies:**
301
+ - YOLOv5 (Ultralytics)
302
+ - PyTorch
303
+ - Gradio
304
+
305
+ **Développé par:** ESATIC (École Supérieure Africaine des TIC)
306
+
307
+ ---
308
+
309
+ 💡 **Conseil:** Pour de meilleurs résultats, utilisez des images claires avec un bon éclairage.
310
+ """)
311
+
312
+ # Lancer l'application
313
+ if __name__ == "__main__":
314
+ print("🚀 Lancement de l'application ZKA...")
315
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ gradio>=4.0.0
2
+ torch>=2.0.0
3
+ torchvision>=0.15.0
4
+ ultralytics>=8.0.0
5
+ opencv-python>=4.8.0
6
+ pillow>=10.0.0
7
+ numpy>=1.24.0
8
+ pandas>=2.0.0