Projet de Deep Learning for Computer Vision — SISE 2025/2026
Détection automatique d'équipements de protection individuelle (EPI) par finetuning de YOLOv8n sur un dataset annoté de scènes industrielles et de chantier.
L'objectif est de détecter automatiquement 5 types d'EPI dans des images de scènes industrielles ou de chantier. Le modèle est entraîné par transfert d'apprentissage (COCO → EPI) sur un petit dataset de ~400 images.
SISE_Safety_Vision_Detection/
├── SafetyVision/ # Dataset (format YOLOv8)
│ ├── train/ # 358 images + annotations
│ ├── valid/ # 19 images + annotations
│ ├── test/ # 30 images + annotations
│ └── data.yaml # Configuration Roboflow
├── notebook1_training.ipynb # EDA + entraînement + validation
├── notebook2_evaluation.ipynb # Évaluation test + analyse qualitative
├── model/
│ └── best_model.pt # Meilleur modèle (généré après notebook 1)
├── graph/ # Figures sauvegardées (générées à l'exécution)
└── runs/detect/ # Logs et poids Ultralytics (générés à l'exécution)
- Source : Roboflow Universe — Licence CC BY 4.0
- 407 images au total (358 train / 19 val / 30 test)
- Format : YOLOv8 XYWH normalisé
- Preprocessing Roboflow : auto-orientation EXIF + resize 512×512 + augmentation de luminosité ±15%
| ID | Classe | Description | Annotations (train) |
|---|---|---|---|
| 0 | Gloves | Gants de protection | 350 |
| 1 | Safety-Helmet | Casque de chantier | 480 |
| 2 | Safety-Vest | Gilet de sécurité fluorescent | 327 |
| 3 | lab-coat | Blouse de laboratoire | 177 |
| 4 | safety_goggles | Lunettes de protection | 149 |
Modèle one-stage anchor-free, pré-entraîné sur COCO (118k images, 80 classes).
Innovations clés par rapport à YOLOv5 :
- Blocs C2f : meilleur flux de gradient qu'un bloc C3 classique
- Tête découplée : branches séparées pour classification et régression
- Anchor-Free + DFL Loss : prédit la distribution de distance aux bords — pas de tuning d'ancres
- Neck PAN-FPN : fusion multi-échelle pour détecter gants (petits) et gilets (grands)
Pourquoi la variante nano (3.2M paramètres) ? Avec 358 images d'entraînement, une capacité faible est préférable pour éviter le sur-apprentissage. YOLOv8m (25.9M params) sur-apprendrait inévitablement sur un tel dataset.
| Hyperparamètre | Valeur | Justification |
|---|---|---|
epochs |
100 | Convergence assurée par early stopping (patience=20) |
imgsz |
512 | Correspond à la résolution native du dataset |
batch |
16 | Compromis mémoire / stabilité du gradient |
optimizer |
AdamW | Convergence plus rapide que SGD sur petit dataset |
lr0 |
0.001 | Faible pour préserver les poids pré-entraînés |
lrf |
0.01 | Décroissance cosine : lr_final = lr0 × lrf |
warmup_epochs |
3 | Montée progressive du LR |
patience |
20 | Early stopping si pas d'amélioration pendant 20 epochs |
weight_decay |
0.0005 | Régularisation L2 contre le sur-apprentissage |
mosaic |
1.0 | Augmentation mosaïque (4 images collées) |
mixup |
0.1 | Interpolation légère pour la robustesse |
| Métrique | Valeur |
|---|---|
| Précision (P) | 0.8041 |
| Rappel (R) | 0.7663 |
| mAP@0.50 | 0.8400 |
| mAP@0.50:0.95 | 0.6205 |
| Classe | P | R | mAP@0.50 | mAP@0.50:0.95 |
|---|---|---|---|---|
| Gloves | 0.888 | 0.440 | 0.637 | 0.446 |
| Safety-Helmet | 0.951 | 0.876 | 0.966 | 0.641 |
| Safety-Vest | 0.928 | 0.682 | 0.771 | 0.581 |
| lab-coat | 0.699 | 1.000 | 0.995 | 0.865 |
| safety_goggles | 0.555 | 0.833 | 0.831 | 0.570 |
| Métrique | Valeur |
|---|---|
| Précision (P) | 0.8768 |
| Rappel (R) | 0.6498 |
| F1-Score | 0.7464 |
| mAP@0.50 | 0.7667 |
| mAP@0.50:0.95 | 0.4867 |
| Classe | P | R | mAP@0.50 | F1 |
|---|---|---|---|---|
| Gloves | 0.888 | 0.208 | 0.452 | 0.337 |
| Safety-Helmet | 0.959 | 0.822 | 0.912 | 0.885 |
| Safety-Vest | 0.765 | 0.692 | 0.778 | 0.727 |
| lab-coat | 0.873 | 0.526 | 0.706 | 0.657 |
| safety_goggles | 0.900 | 1.000 | 0.986 | 0.947 |
Observations :
Safety-Helmetetsafety_gogglessont bien détectés (mAP > 0.90)Glovesest la classe la plus difficile : recall faible dû à la petite taille et aux occlusionslab-coatbénéficie du transfer learning (formes similaires à des vêtements dans COCO)
- Installation des dépendances
- Exploration du dataset (EDA) : distribution des classes, visualisation des annotations, tailles des bounding boxes
- Justification de l'architecture YOLOv8n et des hyperparamètres
- Entraînement par transfert d'apprentissage depuis COCO
- Analyse des courbes d'apprentissage (loss, mAP, P, R)
- Métriques sur le jeu de validation par classe
- Recherche du seuil de confiance optimal (maximisation du F1 macro)
- Visualisation des prédictions sur la validation
- Sauvegarde du meilleur modèle (
model/best_model.pt)
- Chargement du meilleur modèle
- Évaluation quantitative sur le jeu de test (P, R, F1, mAP@0.50, mAP@0.50:0.95)
- Matrice de confusion et courbes PR / F1
- Analyse qualitative : cas réussis (recall élevé) et erreurs (GT manqués / faux positifs)
- Vue d'ensemble des 30 images de test
- Analyse TP / FP / FN par classe
- Distribution des scores de confiance
- Analyse du seuil optimal sur le jeu de test
- Rapport final
pip install ultralytics==8.3.0 matplotlib seaborn pandas numpy PyYAMLPrérequis hardware : GPU recommandé (testé sur NVIDIA RTX 4070 SUPER). Fonctionne aussi sur CPU (plus lent) et Apple MPS.
Exécuter les notebooks dans l'ordre :
1. notebook1_training.ipynb → génère model/best_model.pt
2. notebook2_evaluation.ipynb → évaluation complète sur le jeu de test
Les graphiques sont sauvegardés dans graph/ et les logs Ultralytics dans runs/detect/.
Le dataset SafetyVision est distribué sous licence CC BY 4.0 (Roboflow Universe). Le code des notebooks est fourni à des fins pédagogiques dans le cadre du cours SISE 2025/2026.