Pourquoi choisir YOLO pour un assistant visuel
Dans les écoles spécialisées, les étudiants malvoyants renconrtent des difficultés pour lire le tableau ou les manuels scolaires. Un assistant basé sur YOLO permet de détecter en temps réel les zones de texte, graphiques et objets importants, puis de les restituer vocalement ou visuellement. Les dernières versions de YOLO offrent des performances suffisantes pour fonctionner sur du matériel grand public.
Sélection du modèle et préparation des données
Critères de choix du modèle
YOLOv8n est préféré pour sa latence réduite (moins de 500ms). Dans ce contexte spécifique, seules 5 catégories principales sont nécessaires :
- Blocs de texte
- Zones graphiques
- Visages
- Mains
- Objets pédagogiques
Annotation des données
Utilisation de labelImg pour annoter 800-1200 images couvrant différentes distances de lecture. Exemple de script de vérification :
def verifier_annotations(repertoire):
erreurs = []
for fichier in os.listdir(repertoire):
if fichier.endswith('.txt'):
with open(os.path.join(repertoire, fichier)) as f:
for ligne in f:
valeurs = ligne.strip().split()
if len(valeurs) != 5:
erreurs.append(fichier)
return erreurs
Entraînement du modèle
Configuraton recommandée pour data.yaml :
chemin: ./donnees
train: images/entrainement
val: images/validation
nc: 5
noms: ["bloc_texte", "graphique", "visage", "main", "objet"]
Paramètres d'entraînement critiques :
- Taille d'image : 640px minimum
- Taux d'apprentissage : 0.005 à 0.008
- Patience : 30 epochs
Post-traitement et interface utilisateur
Filtrage des résultats
Adaptation des seuils de confiance par catégorie :
seuils = {
"bloc_texte": 0.15,
"graphique": 0.15,
"visage": 0.3,
"main": 0.3,
"objet": 0.25
}
Priorisation des éléments
Algorithme de tri des détections :
def trier_detections(detections):
priorites = {"bloc_texte":0, "graphique":1, "objet":2, "visage":3, "main":4}
return sorted(detections, key=lambda x: (priorites[x.classe], -x.surface, x.position_y))
Optimisation pour matériel embarqué
Conversion en ONNX et quantificatino INT8 :
from onnxruntime.quantization import quantize_static
quantize_static(
"modele.onnx",
"modele_quantifie.onnx",
calibration_data_reader=lecteur_calibration
)
Problèmes courants et solutions :
- Perte de FPS : Quantification et réduction de la résolution
- Sauts de détection : Désactivation de l'autofocus
- Surdétection : Ajustement du seuil NMS