Détection d'objets en temps réel avec YOLO12-M : Guide pratique pour un modèle léger de 40 Mo sur COCO

Architecture et avantages de YOLO12-M

YOLO12-M se distingue par son empreinte mémoire minimael d'environ 40 Mo, tout en conservant une capacité de détection robuste sur les 80 classes du jeu de données COCO. Contrairement aux réseaux de neurones convolutifs volumineux qui exigent des infrastructures matérielles coûteuses, cette itération intègre des mécanismes d'attention optimisés permettant une exécution fluide sur des GPU grand public. Cette approche garantit un équilibre optimal entre la latence d'inférence et la précision spatiale, facilitant ainsi le déploiement sur des dispositifs périphériques ou des serveurs à ressources limitées.

Configuration de l'environnement

Prérequis matériels et logiciels

Avant d'initialiser le pipeline, vérifiez la compatibilité de votre système :

  • Accélérateur graphique : NVIDIA RTX 3060 ou supérieur (minimum 8 Go de VRAM).
  • Système d'exploitation : Distribution Linux basée sur Debian (Ubuntu 20.04+ recommandé).
  • Runtime Python : Version 3.9 ou ultérieure.
  • Toolkit CUDA : Version 11.8+ pour l'accélération matérielle.

Installation des dépendances

Exécutez les commandes suivantes dans votre terminal pour isoler l'environnement et installer les bibliothèques requises :

# Initialisation de l'environnement virtuel
python3 -m venv env_yolo12
source env_yolo12/bin/activate

# Installation de PyTorch avec support CUDA 11.8
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118

# Installation du framework Ultralytics et des utilitaires visuels
pip install ultralytics opencv-python-headless

# Validation de l'installation
python -c "import torch; print(f'Backend CUDA disponible: {torch.cuda.is_available()}')"

Inférence sur image unique

Pour effectuer une prédiction sur une image statique, le framework Ultralytics propose une API haut niveau qui gère automatiquement le prétraitement et le post-traitement des tenseurs.

from ultralytics import YOLO
import cv2

# Chargement des poids pré-entraînés
detector = YOLO("yolo12m.pt")

# Exécution de l'inférence
predictions = detector("sample_scene.jpg")

# Affichage et export des résultats
for result in predictions:
    result.show()
    result.save("annotated_scene.jpg")
    
print("Pipeline d'inférence terminé avec succès.")

Lors de la première exécution, le fichier de poids yolo12m.pt est téléchargé automatiquement. Les sorties console détailleront les classes identifiées ainsi que leurs scores de confiance respectifs.

Traitement de flux vidéo et traitement par lots

Flux vidéo en direct

L'exploitation de YOLO12-M pour l'analyse de flux vidéo nécessite une boucle de capture optimisée pour minimiser la latence entre l'acquisition de la trame et le rendu des boîtes englobantes.

import cv2
from ultralytics import YOLO

net = YOLO("yolo12m.pt")
stream = cv2.VideoCapture(0)

while stream.isOpened():
    success, frame = stream.read()
    if not success:
        break
    
    # Prédiction sur la trame courante
    preds = net(frame, verbose=False)
    visual = preds[0].plot()
    
    cv2.imshow("Live Object Tracking", visual)
    
    # Interruption via la touche 'q'
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

stream.release()
cv2.destroyAllWindows()

Parcours de répertoire pour images multiples

Pour l'analyse de grands volumes de données statiques, l'itération sur un répertoire local permet d'automatiser l'export des annotations.

import os
from ultralytics import YOLO
from pathlib import Path

predictor = YOLO("yolo12m.pt")
src_dir = Path("raw_dataset")
dst_dir = Path("processed_dataset")
dst_dir.mkdir(parents=True, exist_ok=True)

# Itération sur les fichiers JPEG
for img_file in src_dir.glob("*.[jJ][pP][gG]"):
    res = predictor(img_file)
    output_path = dst_dir / f"out_{img_file.name}"
    res[0].save(output_path)
    print(f"Traitement terminé pour: {img_file.name}")

Ajustement des hyperparamètres et filtrage

Optimisation des seuils

La modification des seuils de confiance et d'Intersection over Union (IoU) permet d'adapter le comportement du modèle aux spécificités de votre cas d'usage.

from ultralytics import YOLO

mdl = YOLO("yolo12m.pt")

# Configuration personnalisée de l'inférence
tuned_preds = mdl(
    "complex_scene.jpg",
    conf=0.45,    # Relèvement du seuil de confiance pour éliminer les faux positifs
    iou=0.60,     # Ajustement de la suppression des non-maxima (NMS)
    imgsz=512     # Redimensionnement de l'entrée pour accélérer le traitement
)

tuned_preds[0].save("tuned_output.jpg")

Ciblage de classes spécifiques

Si l'application ne nécessite que la détection d'entités particulières, le filtrage par identifiant de classe réduit la charge de post-traitement.

# Isolation des piétons (0) et des véhicules automobiles (2)
filtered_preds = mdl("street_view.jpg", classes=[0, 2])

Cas d'usage industriels

Système de vidéosurveillance intelligente

Dans un contexte de sécurité, le modèle peut être configuré pour déclencher des alertes lors de l'intrusion de personnes dans une zone surveillée, en échantillonnant les trames pour préserver les ressources.

import cv2
from ultralytics import YOLO
from datetime import datetime

security_model = YOLO("yolo12m.pt")
cam = cv2.VideoCapture(0)
frame_idx = 0

while cam.isOpened():
    ret, frame = cam.read()
    if not ret: 
        break
    
    # Échantillonnage : analyse toutes les 15 trames
    if frame_idx % 15 == 0:
        res = security_model(frame, classes=[0], verbose=False)
        
        if len(res[0].boxes) > 0:
            ts = datetime.now().strftime("%Y%m%d_%H%M%S")
            print(f"[ALERTE] Présence humaine détectée à {ts}")
            cv2.imwrite(f"security_breach_{ts}.png", frame)
            
    frame_idx += 1

cam.release()

Inventaire automatisé dans le commerce de détail

Le comptage d'objets sur des étagères peut être automatisé en agrégeant les occurrences de chaque classe détectée dans l'image.

from ultralytics import YOLO
from collections import Counter

retail_model = YOLO("yolo12m.pt")

def tally_shelf_items(image_path):
    preds = retail_model(image_path)
    
    # Extraction des labels pour chaque boîte englobante
    labels = [retail_model.names[int(box.cls)] for box in preds[0].boxes]
    inventory = Counter(labels)
    
    print("Rapport d'inventaire :")
    for item, qty in inventory.items():
        print(f"-> {item} : {qty} unités")
        
    return inventory

tally_shelf_items("shelf_display.jpg")

Résolution des problèmes courants

Amélioration du débit d'inférence

Si le framerate est insuffisant, l'activation de la précision mixte ou la réduction de la résolution d'entrée peuvent améliorer significativement le débit.

# Inférence en demi-précision (FP16)
fast_preds = mdl("frame.jpg", half=True)

# Réduction de la résolution spatiale
low_res_preds = mdl("frame.jpg", imgsz=320)

Gestion de la mémoire VRAM

En cas d'erreur CUDA out of memory, il est nécessaire de restreindre la taille des lots ou de basculer sur une exécution CPU pour les tâches non critiques.

# Forcer une taille de lot unitaire
safe_preds = mdl("heavy_image.jpg", batch=1)

# Bascule sur le processeur central
cpu_fallback_model = YOLO("yolo12m.pt", device="cpu")

Détection de petits objets

Les artefacts de petite taille nécessitent une résolution d'entrée plus élevée et l'activation de l'augmentation de données lors du test (TTA) pour maximiser le rappel.

# Augmentation de la résolution et activation du Test-Time Augmentation
small_obj_preds = mdl("wide_angle.jpg", imgsz=1280, augment=True, conf=0.15)

Étiquettes: YOLO12 Computer Vision PyTorch ultralytics OpenCV

Publié le 30 juin à 22h29