7.16. Conclusion¶
Ce chapitre a parcouru les composants du module ml auxquels une application OpenMV fait appel lorsqu’une étape d’inférence fait partie du pipeline :
Concepts – ce qu’est un réseau de neurones en termes arithmétiques (une pile d’opérateurs entraînables qui transforme un tenseur en un autre tenseur), ce que l’apprentissage automatique a changé par rapport au traitement d’image classique (l’algorithme de synthèse écrit par un humain a disparu, remplacé par des poids appris à partir de données étiquetées), et la démo hello qui exécutait un détecteur de visages en quelques lignes de Python.
Le module ml – l’objet
ml.Modelet ses propriétés permettant d’inspecter les tenseurs d’entrée et de sortie, les chemins de fichiers de modèle qu’il accepte, et l’emplacement de ces fichiers : une partition ROMFS en lecture seule pour une exécution directement depuis la mémoire flash, ou tout autre système de fichiers MicroPython lorsque le modèle peut être copié en RAM au moment du chargement.Le pipeline d’inférence – les trois étapes que
predict()exécute en séquence (prétraitement, dispatch du moteur, post-traitement), le gestionnaireNormalizationde la première étape, le gestionnaire de post-traitement de la troisième étape, et l’arithmétique de quantification qui relie les tenseurs entiers exécutés par la caméra aux nombres à valeurs réelles sur lesquels le réseau a été entraîné.Les moteurs d’inférence – TFLM (l’interpréteur d’opérateurs exécuté par la plupart des caméras), CMSIS-NN (la bibliothèque de noyaux SIMD sous-jacente sur Cortex-M), et les NPU (l’Ethos-U55 d’Arm sur l’AE3 couplé au compilateur hors ligne Vela, le Neural-ART de ST sur le N6 couplé à STAI et STEdgeAI). Le moteur est déterminé par la caméra ; le script ne le choisit pas.
Le décodage de la sortie – les post-traitements qui transforment les tenseurs de sortie bruts en boîtes, points clés ou listes par classe, la classe
NMSqui fusionne les candidats qui se chevauchent, la présentation détaillée de YOLOv8 qui montre comment accélérer le décodage en appliquant un seuil avant la déquantification, et le protocole pour écrire un décodeur personnalisé lorsque le catalogue ne couvre pas un modèle.
7.16.1. Ce qui est désormais accessible¶
Trois choses pour lesquelles ce chapitre prépare :
Charger un modèle entraîné et l’exécuter. Tout ce qui se trouve dans
/rom/fonctionne sans préparation supplémentaire ; tout ce qui est fourni de l’extérieur sous forme de fichier.tflitecompatible fonctionne une fois que l’outil hors ligne propre à la caméra cible (Vela pour l’AE3, STEdgeAI pour le N6) a produit la bonne disposition.Décoder n’importe quel tenseur de sortie. Lorsque l’architecture figure au catalogue, le choix du bon post-traitement est mécanique :
YoloV8pour un modèle YOLOv8,BlazeFacepour BlazeFace, et ainsi de suite. Lorsque ce n’est pas le cas, le protocole writing-your-own couvre le contrat à respecter et la présentation détaillée de YOLOv8 constitue la référence la plus claire à reproduire.Raisonner sur les performances. Un modèle qui s’exécute à 30 FPS sur un NPU peut tourner à 3 FPS sur un Cortex-M7 ; le rapport dépend de la part du réseau que la caméra peut décharger du CPU. La quantification, le placement en ROMFS, la compilation pour NPU et la couverture des opérateurs du moteur cible sont les quatre leviers, et le chapitre a traité chacun d’eux.
7.16.2. Le ML se combine avec le reste de la caméra¶
Une inférence s’exécute rarement de manière isolée. Le module image capture et prétraite la trame, le module ml exécute le réseau, et ulab.numpy effectue tout travail numérique pour lequel ni l’un ni l’autre ne dispose d’une fonction intégrée. Un script de détection typique combine les trois : capturer avec csi, ajuster éventuellement la trame avec image, exécuter predict(), post-traiter le résultat avec le bon module parmi ml.postprocessing, et faire appel à ulab.numpy pour tout calcul personnalisé que l’application souhaite ajouter aux boîtes renvoyées par le post-traitement. Les trois modules partagent le même modèle mémoire ; les frontières entre eux se font sans copie autant que possible.