(image du jeu Euro Truck Simulator 2)
Origine du projet
Ce projet à démarré dans le cadre d’un stage réalisé à l’Universitat Rovira i Virgili, à Tarragone, dans le but de participer à éclairer les chercheurs sur des sujets de recherche en lien avec l’automobile, l’intelligence artificielle, et les questions de sécurité (aspect global, confidentialité, consentement), et de pouvoir démontrer qu’avec peu de moyens, on peut parvenir a mettre en place un système ALPR (Automatic License Plate Recognition) portable, ce qui est de plus en plus accessible avec l’augmentation des capacités de calcul, dans du hardware de petite taille et peu energivore. Je pense ici en premier au Raspberry Pi, qui a été le matériel fourni lors de ce stage (version 4) pour conduire la réalisation de ce prototype. Avec un écran tactile, une batterie portable et une caméra, vous avez ce qu’il vous faut pour avoir votre système de détection automatique de plaques d’immatriculation ! Ce ne sera cependant pas le moyen le plus performant de mettre en place ce genre de dispositif, mais l’idée est de montrer que c’est possible d’avoir une application de base.
Comment ça fonctionne ?
Modèles de détection, ML/IA
Pour detecter nos plaques d’immatriculation, j’ai choisi de me tourner vers YOLO , un modèle d’intelligence artificielle spécialisé dans la CV (Computer Vision), qui permet de faire de la détection d’une région particulière dans une image, et de faire de la classification, par exemple dans notre cas, detecter la région de la plaque et l’associer à sa classe (license-plate). Cependant, il existe de multiples version de YOLO. Nous décidons alors de focaliser notre attention sur deux versions en particulier : YOLOv8 développé par Ultralytics , et YOLOv4-Tiny qui est plus léger et rapide à entrainer, mais surtout rapide en inférence, ce qui aura une grande importance pour notre projet de détection en temps réél sur un Raspberry Pi 4, à la puissance limitée. Il sera cependant moins précis que le modèle YOLOv8.
Avec des ressources limitées, on peut entrainer ces modèles à l’aide de Google Colab en combinaison avec Roboflow, acteur spécialisé dans la CV. Avec une version d’essai gratuite pour une semaine, on peut avoir accès a des datasets privés et de qualité, que l’on pourra exporter pour l’entrainement sur Google Colab à l’aide des notebooks existants pour ces modèles.
Cependant, nous prenons en considération le framework utilisé: PyTorch pour notre utilisation avec YOLOv8, que l’on destinera plus particulièrement à des ordinateurs modernes, par exemple avec cartes graphiques dédiées… et on utilisera le framework Darknet, écrit en C et C++, qui sera encore mieux adapté à notre utilisation sur une petite carte comme le Raspberry Pi.
Donc on peut passer a l’entrainement des deux modèles, avec un même dataset.
Fonctionnement du code
Pour la partie code désormais, nous allons le segmenter en plusieurs scripts python :
- Un script qui permettra de réaliser la detection et l’OCR des plaques, avec le modèle YOLOv8 et le framework PyTorch
- Un script qui fera la même chose mais avec le modèle plus léger YOLOv4-Tiny et le framework Darknet
- Un script de realtime qui permettra de faire des inférences en temps réél avec la caméra du Raspberry Pi (raspberry pi uniquement)
- Un script de preprocessing de l’image, ce qui permettra dans certaines situations d’obtenir un résultat différent pour l’OCR
YOLOv8 Batch processing Détection et Reconnaissance
- Le script lit les images depuis un dossier,
data/input
. Si l’option de prétraitement est activée, les images sont traitées avant la détection. - Le modèle YOLOv8 préentraîné (yolov8n, sur le dataset MS-COCO) détecte les véhicules dans chaque image. Pour chaque véhicule détecté, une sous-image est créée pour la détection des plaques.
- Le second modèle YOLOv8, celui que j’ai entrainé pour la détection de plaques est appliqué sur chaque sous-image pour détecter les plaques d’immatriculation. La région (définie par un rectangle) de la plque est identifiée et les coordonnées permettront l’annotation.
- EasyOCR est utilisé pour lire le texte des plaques détectées. Le texte reconnu est annoté sur l’image de sortie.
- Les images annotées sont sauvegardées, ainsi que les sous-images des plaques détectées, respectivement dans les dossiers
data/output
etdata/cropped
.
- Le script lit les images depuis un dossier,
YOLOv4-Tiny
Le fonctionnement est globalement le même, la différence majeure concerne les étapes de détection : elle ne détecte pas de véhicules et se concentre immédiatement sur la détection de plaques. Cela réduit la précision, mais permet de rendre moins lourd la detection de plusieurs images sur des ordinateurs moins puissants.
Realtime processing
Pour le fonctionnement en temps réél, on utilise la librairie picamera2 qui nous permet d’utiliser le module de camera du Raspberry Pi facilement, en combinaison avec opencv pour l’annotation des images en temps réél. Pour la partie OCR, cette fois-ci on n’utilise pas EasyOCR mais pytesseract, une implémentation python de tesseract-ocr qui est beaucoup plus léger pour le rapsberry pi qui ne bénéficie pas d’accélération GPU. Avec cette configuration, on peut réussir a obtenir maximum 5-6 images par secondes pour la détection en temps réél, avec des framedrop a 1-2 IPS lors des inférences + annotations. J’ai ajouté la possibilité d’utiliser le multi-threading, mais je n’ai pas réussi à l’implémenter correctement, et pose des problèmes pour l’annotation. Les images disparraissent très vite, les détections se font correctement tout de même. En situation réelle avec des véhicules en mouvement, la détection des plaques est suffisante (lors des tests, plus de 70% des detections étaient correctes), le principal problème réside dans l’OCR en temps réél. Il faut avoir une image suffisamment stable et un vehicule bien centré pour obtenir une detection de texte intéréssante. Le fait que le RaspberryPi n’a pas de GPU dédié rend cette partie lourde, et l’utilisation de pytesseract ne permet pas d’avoir des résultats très précis. Néanmoins, une fonctionnalité d’export utilisable avec l’argument
--export
permet d’enregistrer les detections de plaques, ce qui permet événtuellement de procéder à des vérifications humaines, ou d’utiliser un OCR après la récupération des plaques.
L’initialisation des modèles est différente: pour YOLOv8, comme mentionné, on utilise ultralytics, mais ce module peut apporter son lot de problèmes, notamment en rapport avec le multi-threading. Il force également l’installation de torch==2.4.0
si installé indépendamment du fichier requirements.txt
ce qui pose problème avec l’architecture ARM du RaspberryPi.
Si vous souhaitez plus d’informations ou tester vous même rendez vous sur mon repo GitHub
les images sur lesquelles le prototype est testé proviennent du site spécialisé platesmania.com
👉 Les résultats de détection de plaques dans les versions sans détection des véhicules sont moins précis. Il peut arriver qu’il confonde le rectangle de la plaque avec d’autres formes similaires, comme des panneaux de signalisation. 😐
Demo !
Cette démo a été développée à l’aide de Gradio, un framework utile pour les applications d’IA/ML. Elle diffère dans le fonctionnement : pas de batch processing, une seule image a la fois, et pas de possibilité de faire du temps réél. Il y a la possibilité de tester tous les moteurs d’OCR en même temps. Elle implémente des fonctionnalités non présentes dans le projet de base développé lors de mon stage, a savoir l’utilisation d’autres OCR que EasyOCR et pytesseract.Les OCR en supplément sont paddleOCR, autant voir plus précis que EasyOCR, keras-ocr et trocr. Notez que pour avoir de meilleurs résultats, il est préférable que la plaque d’immatriculation soit centrée et que l’image ne soit pas penchée. Une bonne résolution d’image permettra d’améliorer également les résultats.
Vous avez ici un petit embedding d’une démo de mon space Huggingface (pas de de GPU donc les inférences peuvent prendre un peu de temps !)
👉DEMO AVEC GPU DISPONIBLE ICI (TEMPORAIRE) l’OCR de keras-ocr n’est pas disponible sur cette version