🤖 YOLOv8 – Le Guide Ultime
Deep Dive : Ultralytics, Architecture, Tâches (Detect, Segment), Training (data.yaml) & Inférence.
1. C'est quoi YOLO ?
You Only Look Once. Détection d'objet "single-stage" (temps réel).
YOLO Real-time2. YOLOv8 (Ultralytics)
Le framework "SOTA". Anchor-Free. Nouveaux backbones (C2f). Facile (CLI & Python).
Ultralytics Anchor-Free3. 📈 Architecture
Backbone (CSPDarknet) -> Neck (PANet/FPN) -> Head (Decoupled, Anchor-Free).
Backbone Neck Head4. 🚀 Les 5 Tâches
Detect (BBox), Segment (Masque), Classify, Pose (Points clés), Track (Tracking).
Detect Segment5. Installation (ultralytics)
pip install ultralytics. L'API yolo (CLI) et YOLO() (Python).
6. Choix du Modèle
Trade-off Vitesse/Précision. -n (nano), -s, -m, -l, -x. (yolov8n.pt vs yolov8x.pt).
7. Inférence (CLI)
yolo predict model=... source=.... Args (conf, save, show).
8. Inférence (Python)
from ultralytics import YOLO. model = YOLO(). Boucle sur les results (.boxes).
9. 💾 Dataset Format (data.yaml)
Le fichier data.yaml (path, train, val, names). Format des labels (.txt).
10. 🧠 Entraînement (Train)
yolo train data=... model=.... Hyperparamètres (epochs, imgsz, batch).
11. Export (Prod)
yolo export format=.... ONNX, TensorRT. Optimisation (FP16).
12. Plugins & Projets
Roboflow (Addon: data), ClearML (Addon: tracking). Exemples de projets.
Roboflow ClearMLYOLO (You Only Look Once) est une famille d'architectures de réseaux de neurones (IA) pour la détection d'objets en temps réel (Computer Vision).
Sa philosophie (créée par Joseph Redmon) a révolutionné la détection en 2015. Au lieu de "regarder" une image des centaines de fois (comme les anciens "R-CNN"), YOLO "regarde" l'image une seule fois ("Only Look Once").
Le "Single-Stage Detector"
Ancienne méthode (Two-Stage, ex: R-CNN) :
1. Proposer des "régions" (boîtes) où un objet *pourrait* se trouver (lent).
2. Lancer un classificateur sur *chaque* boîte proposée (très lent).
Méthode YOLO (Single-Stage) :
1. Divise l'image en une grille (ex: 13x13).
2. En *une seule passe* (un seul "forward pass" du réseau), chaque cellule de la grille prédit :
a) Les "Bounding Boxes" (BBox) qu'elle contient.
b) La "confiance" (score) pour chaque boîte.
c) La "classe" (ex: "chien", "chat") pour chaque boîte.
Résultat : C'est *extrêmement* rapide, capable de tourner en temps réel (> 30 FPS) sur des GPUs modernes.
YOLOv8 est la 8ème itération de YOLO. Il est développé et maintenu par la société Ultralytics (qui a aussi fait le très populaire YOLOv5).
Ce n'est pas *juste* un modèle, c'est un framework complet (une "brique logicielle") qui gère l'entraînement, la validation, l'inférence, et l'exportation.
Les 3 Nouveautés Clés de YOLOv8 (vs v5/v7)
| Nouveauté | Description |
|---|---|
| 1. Anchor-Free (Sans Ancre) | Les versions précédentes (v5) utilisaient des "Anchor Boxes" (des boîtes "types" pré-définies). YOLOv8 est "Anchor-Free" : il prédit le *centre* de l'objet et ses dimensions (hauteur/largeur) directement. C'est plus simple et souvent plus précis. |
| 2. Nouveau Backbone (C2f) | Le "Backbone" (la partie qui analyse l'image) a été amélioré. Il utilise des modules C2f (basés sur CSPDarknet et ELAN de v7) qui sont plus efficaces (meilleur ratio performance/vitesse). |
| 3. "Decoupled Head" (Tête Découplée) | La "tête" (le classificateur/régresseur) est désormais "découplée" : une branche prédit les classes, une autre prédit les boîtes (BBox). (Inspiré de YOLOX). |
L'API ultralytics
La plus grande force de YOLOv8 est sa simplicité d'utilisation. Ultralytics fournit une seule API unifiée (en CLI et Python) pour tout faire :
# 1. Interface en Ligne de Commande (CLI)
$ yolo predict model=yolov8n.pt source=...
$ yolo train data=coco.yaml model=yolov8n.pt epochs=100
# 2. Interface Python
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
results = model.predict(source=...)
L'architecture de tous les "YOLO" modernes est divisée en 3 parties :
Diagramme d'Architecture (Conceptuel)
(Image 640x640)
|
▼
+---------------------+
| 1. BACKBONE | (ex: C2f, CSPDarknet)
| (Extracteur de features)
+---------------------+
|
| (Features "grossières" (sémantique) -> P5)
| (Features "fines" (détails) -> P3)
▼
+---------------------+
| 2. NECK | (ex: PANet, FPN)
| (Mélangeur de features)
+---------------------+
|
| (Features P3, P4, P5 "riches")
▼
+---------------------+
| 3. HEAD (Detection) | (Anchor-Free, Decoupled)
| (Prédit BBox + Classe)
+---------------------+
|
▼
(Sortie: [BBox], [Classes], [Masques])
| Composant | Rôle (Description) | YOLOv8 |
|---|---|---|
| Backbone (Échine) | Le "corps" du réseau (CNN). Il "regarde" l'image et l'extrait en "features" (caractéristiques) à différentes échelles. | Basé sur CSPDarknet (de v5) mais remplace les modules C3 par des C2f (plus rapides). |
| Neck (Cou) | Le "mélangeur". Il prend les "features" de bas niveau (détails) et de haut niveau (sémantique) du Backbone et les *combine* (via PANet / FPN) pour que la Tête ait le meilleur des deux mondes. | PANet (Path Aggregation Network). |
| Head (Tête) | Le "prédicteur". Il prend les features "riches" du Neck et fait les prédictions finales (Boîtes, Classes, Masques). | Anchor-Free et "Decoupled" (têtes séparées pour BBox et Classe). |
YOLOv8 n'est pas *un* modèle, c'est un framework qui gère 5 tâches de Computer Vision, en utilisant la même architecture de base.
| Tâche | Suffixe Modèle | Description (Ce qu'il fait) | Sortie |
|---|---|---|---|
| Detect (Détection) | yolov8n.pt | Trouve la Bounding Box (BBox) [x, y, w, h] et la Classe (ex: "chien") d'un objet. | Boîtes + Classes |
| Segment (Segmentation) | yolov8n-seg.pt | Similaire à "Detect", mais prédit aussi le Masque (la forme exacte au pixel près) de l'objet. | Boîtes + Classes + Masques |
| Classify (Classification) | yolov8n-cls.pt | Dit ce qu'il y a dans l'image (ex: "chien"). Ne dit pas où (pas de BBox). | Classes (pour l'image entière) |
| Pose (Estimation de Pose) | yolov8n-pose.pt | Détecte un objet (ex: "personne") et prédit ses Points Clés (ex: "coude", "genou"). | Boîtes + Classes + Points Clés |
| Track (Tracking) | (Pas un modèle, un mode) | Applique un algorithme (ex: BoT-SORT) aux résultats (Detect/Pose) pour assigner un ID unique à un objet à travers plusieurs frames (vidéo). | Boîtes + Classes + IDs de Tracking |
Exemple (yolo CLI)
# 1. Tâche: DETECT $ yolo task=detect mode=predict model=yolov8n.pt source=image.jpg # 2. Tâche: SEGMENT # (Notez l'utilisation du modèle "-seg") $ yolo task=segment mode=predict model=yolov8n-seg.pt source=image.jpg # 3. Tâche: TRACK (sur une vidéo) $ yolo task=detect mode=predict model=yolov8n.pt source=video.mp4 track
pip install ultralytics)L'installation de YOLOv8 est gérée par pip. Le package officiel est ultralytics.
1. Installation (Python 3.8+)
# (Créez un venv d'abord !) $ python3 -m venv venv $ source venv/bin/activate # 1. Installation de base (CPU) (venv) $ pip install ultralytics # 2. (Optionnel) Pour le support GPU (NVIDIA) # (Assurez-vous que CUDA (ex: 11.8) est installé !) (venv) $ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 (venv) $ pip install ultralytics
2. Vérification
L'installation vous donne deux choses :
- La commande
yolo(CLI). - La librairie
ultralytics(Python).
# 1. Vérifier la CLI $ yolo check # (Affiche la configuration, si le GPU est détecté, etc.) # 2. Vérifier le Python $ python >>> from ultralytics import YOLO >>> (Pas d'erreur = OK)
YOLOv8 propose 5 tailles de modèles ("plugins"), de "Nano" (n) à "Extra Large" (x). Le choix est un compromis (trade-off) :
yolov8n.pt(Nano) : Ultra-rapide, faible précision (mAP). Idéal pour CPU, Raspberry Pi, mobile.yolov8x.pt(Large/Extra) : Très lent, haute précision (mAP). Idéal pour le "batch processing" sur un gros GPU.yolov8m.pt(Medium) : Le "bon compromis" pour un GPU (ex: NVIDIA RTX 3060).
Tableau Comparatif (Tâche: Détection, Dataset: COCO)
| Modèle | Taille (MB) | mAP@50-95 (Précision) | Vitesse (CPU, ms) | Vitesse (GPU A100, ms) |
|---|---|---|---|---|
yolov8n.pt | 6.3 MB | 37.3 | ~80 ms | ~0.99 ms |
yolov8s.pt | 22.5 MB | 44.9 | ~130 ms | ~1.20 ms |
yolov8m.pt | 50.2 MB | 50.2 | ~280 ms | ~1.83 ms |
yolov8l.pt | 87.7 MB | 52.9 | ~500 ms | ~2.77 ms |
yolov8x.pt | 137.6 MB | 53.9 | ~950 ms | ~4.38 ms |
mAP (mean Average Precision) : Le "score" de précision (plus c'est haut, mieux c'est).
Vitesse (FPS) : FPS = 1000 / (Temps en ms).
Ex: yolov8n sur GPU A100 -> 1000 / 0.99 = 1010 FPS (Temps réel massif).
Ex: yolov8m sur CPU -> 1000 / 280 = 3.5 FPS (Pas temps réel).
Le mode predict (ou detect) de la CLI yolo est le moyen le plus simple de tester un modèle.
Arguments Clés (CLI)
| Argument | Description |
|---|---|
task | Ce qu'on veut faire : detect, segment, classify, pose. (detect est le défaut). |
model (ou m) | Le chemin vers le modèle (.pt). S'il n'existe pas, YOLO le télécharge. |
source (ou s) | La source : une image (img.jpg), une vidéo (vid.mp4), un dossier (./images/), un flux (0 pour webcam). |
conf | Seuil de confiance (ex: 0.25 = 25%). N'affiche que les détections > 25%. |
save | (Booléen) Sauvegarde l'image/vidéo (avec les boîtes dessinées) dans ./runs/detect/predict/. |
show | (Booléen) Affiche le résultat dans une fenêtre "live" (OpenCV). |
save_txt | (Booléen) Sauvegarde les BBox dans un fichier .txt (au format YOLO). |
Exemples de Commandes
# 1. Détection simple sur une image, sauvegarde le résultat $ yolo predict model=yolov8n.pt source="bus.jpg" save # 2. Détection sur une vidéo, affiche le live, confiance à 50% $ yolo predict model=yolov8m.pt source="video.mp4" show conf=0.5 # 3. Segmentation sur une webcam (source 0) $ yolo task=segment predict model=yolov8s-seg.pt source=0 show # 4. Tracking sur un flux RTSP (caméra IP) $ yolo task=detect predict model=yolov8n.pt source="rtsp://..." track
Pour intégrer YOLO dans une application (ex: FastAPI, Flask), on utilise l'API Python YOLO().
Traitement des results
La méthode model(source) (ou model.predict()) renvoie une liste d'objets Results (un par image/frame).
L'objet Results contient les prédictions dans des attributs (ex: .boxes, .masks, .keypoints).
Exemple (Détection)
import cv2 # (Nécessite 'pip install opencv-python')
from ultralytics import YOLO
# 1. Charger le modèle
model = YOLO("yolov8n.pt") # (Télécharge si non-trouvé)
# 2. Charger la source (image)
image_path = "bus.jpg"
image = cv2.imread(image_path)
# 3. Lancer l'inférence
# (stream=True est meilleur pour la vidéo/générateurs)
results = model(image)
# 4. Itérer sur les résultats (ici, 1 seul résultat)
for res in results:
# 'res.names' est le dict {0: 'person', 1: 'bicycle', ...}
class_names = res.names
# 'res.boxes' contient les Bounding Boxes
for box in res.boxes:
# --- Accès aux données ---
# (Les .data[0] sont des Tensors PyTorch, on les convertit)
# Coordonnées (x1, y1, x2, y2)
x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int)
# Confiance
conf = box.conf[0].cpu().numpy()
# Classe (ID)
cls_id = int(box.cls[0].cpu().numpy())
cls_name = class_names[cls_id]
# 5. Dessiner sur l'image (avec OpenCV)
if conf > 0.5:
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(image, f"{cls_name} {conf:.2f}", (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 6. Sauvegarder/Afficher
cv2.imwrite("result.jpg", image)
data.yaml) & LabelsPour entraîner YOLO sur vos *propres* objets, vous devez formater vos données (le "dataset") d'une manière très spécifique.
1. Le Fichier data.yaml (Le "Manifeste")
C'est le fichier principal. Il dit à YOLO où trouver les images et ce que représentent les classes.
# /home/user/projets/mon_dataset/data.yaml # 1. Chemins (relatifs au fichier .yaml, ou absolus) path: /home/user/projets/mon_dataset train: images/train # -> /home/user/projets/mon_dataset/images/train val: images/val # -> /home/user/projets/mon_dataset/images/val test: images/test # (Optionnel) # 2. Noms des classes (L'ORDRE EST CRUCIAL) # (Ici, 'chat' est l'ID 0, 'chien' est l'ID 1) names: 0: chat 1: chien
2. Le Format des Labels (.txt)
Pour chaque image (ex: img1.jpg), il doit y avoir un fichier .txt (img1.txt) avec le *même nom* dans le dossier labels/.
Structure : images/train/img1.jpg <-> labels/train/img1.txt
Chaque ligne du .txt est un objet, au format (normalisé 0-1) :
[classe_id] [x_centre] [y_centre] [largeur] [hauteur]
Exemple (img1.txt)
# (Contenu de img1.txt) # (L'image contient 1 chien et 1 chat) # Un chien (classe_id 1) au centre (0.5, 0.5), 30% de large, 50% de haut 1 0.50 0.50 0.30 0.50 # Un chat (classe_id 0) en haut à gauche (0.2, 0.2), 10% de large, 15% de haut 0 0.20 0.20 0.10 0.15
Outil "Plugin" : Personne n'écrit ces fichiers à la main. On utilise un outil d'annotation (ex: Roboflow, CVAT, LabelImg) qui génère ces .txt et le data.yaml pour vous.
L'entraînement (Training) est le processus de "Transfer Learning". On ne part pas de zéro. On part d'un modèle pré-entraîné (ex: yolov8n.pt, entraîné sur COCO) et on le "spécialise" (fine-tune) sur nos propres données (ex: "chats" et "chiens").
CLI vs Python
1. Entraînement (CLI)
Le plus simple pour démarrer.
$ yolo task=detect \
mode=train \
model=yolov8n.pt \ # (Le "poids" de départ)
data=data.yaml \ # (Notre dataset)
epochs=100 \ # (Combien de fois voir le dataset)
imgsz=640 \ # (Taille d'image)
batch=16 \ # (Nb images par batch GPU)
name=mon_super_modele # (Nom du dossier de sortie)
2. Entraînement (Python)
Identique, mais en code. Permet l'intégration (ex: notebook Jupyter).
from ultralytics import YOLO
# 1. Charger le modèle de départ
model = YOLO('yolov8n.pt')
# 2. Lancer l'entraînement
results = model.train(
data='data.yaml',
epochs=100,
imgsz=640,
batch=16,
name='mon_super_modele'
)
# 3. (Optionnel) Valider le modèle
results = model.val()
Sortie (Le Dossier runs/detect/mon_super_modele)
L'entraînement génère un dossier contenant :
weights/: Les modèles !
-best.pt: (Le meilleur mAP). C'est celui-ci qu'on utilise en production.
-last.pt: Le dernier (pour reprendre l'entraînement).- Graphiques (
.png) :results.png(courbes mAP, loss...),confusion_matrix.png.
.pt -> ONNX / TensorRT)Le fichier .pt (PyTorch) est parfait pour l'entraînement, mais il est *mauvais* pour la production. Il dépend de Python et PyTorch.
Pour la production (ex: en C++, C#, ou Python optimisé), on *exporte* le modèle dans un format "agnostique" (interopérable).
| Format | Description | Cas d'usage |
|---|---|---|
ONNX (.onnx) | Le standard d'échange. (Open Neural Network Exchange). ( pip install onnx) | Le format "universel". (Ex: pour l'inférence en C# (ML.NET), ou comme étape vers TensorRT). |
TensorRT (.engine) | (NVIDIA) Le format le plus *rapide* pour les GPUs NVIDIA (Jetson, Serveurs). ( pip install tensorrt) | Production haute performance (C++ / Python) sur GPU NVIDIA. |
OpenVINO | (Intel) L'équivalent de TensorRT, mais optimisé pour les CPUs Intel. | Production sur CPU Intel. |
CoreML | (Apple) Le format natif pour iOS / macOS. | Applications mobiles (Swift). |
Exemple (CLI)
# 1. Exporter le modèle 'best.pt' au format ONNX $ yolo export model=runs/detect/mon_super_modele/weights/best.pt format=onnx # (Crée 'best.onnx') # 2. Exporter en TensorRT (NVIDIA), en FP16 (plus rapide, moins précis) $ yolo export model=best.pt format=engine half=True # (Crée 'best.engine')
YOLOv8 est le moteur, mais l'écosystème (les "addons") est ce qui le rend utilisable en production.
Addons Incontournables (Plugins)
- Roboflow (Annotation & Augmentation) Le "SaaS" n°1 pour gérer les datasets YOLO. Permet d'annoter (dessiner les boîtes), de générer le
data.yaml, et d'appliquer de l'augmentation (rotation, flou, ...) pour "gonfler" un petit dataset. - ClearML / MLflow / Weights & Biases (Experiment Tracking). Des "plugins" MLOps. Ils s'intègrent à
yolo trainpour sauvegarder *automatiquement* vos courbes (mAP, loss), hyperparamètres, et modèles. Indispensable pour comparer 100 entraînements.
Exemples de Projets
| Projet | Tâche YOLOv8 | Défis |
|---|---|---|
| Comptage de personnes (Magasin) | Detect + Track | Occlusion (personnes cachées), gestion des ID (ne pas compter 2x). |
| Contrôle Qualité (Industrie) | Segment (ou Detect) | Trouver des défauts (ex: "rayure") sur une ligne de production. (Nécessite un dataset customisé de haute qualité). |
| Analyse Sportive (Fitness) | Pose | Suivre les "keypoints" (genoux, coudes) pour compter des "reps" (squats, pompes). |
| Lecture de Plaques (ANPR) | Detect (2 étapes) | Modèle 1 (trouve plaque), Modèle 2 (trouve chiffre/lettre). |
| Agriculture (Comptage de fruits) | Detect | Suivi de la maturité, comptage pour la récolte. |
