Surveillance Parking


 

GAUDIOZ Alexandre | ZAID EL KHIL Damien

 


Sommaire

  1. Présentation du projet

    1. Contexte

  2. Cahier des charges

    1. Objectifs

    2. Ressources données

  3. Recherches effectuées

    1. Caméra et orientation

    2. Bibliothèques nécessaires

  4. Expérimentations

    1. Traitement d’image

    2. Système miniature

    3. Première version du programme

    4. Deuxième version du programme

  5. Application plus poussée

    1. Vitesse d’acquisition

    2. Analyse temporelle

    3. Deuxième version du programme

  6. Conclusion

    1. Améliorations envisageables

    2. Apports


Présentation du projet

Contexte

Notre projet « ParkWatcher » cherche à s’inscrire dans les nouveaux procédés de surveillance, partiellement ou entièrement automatisés. Basé sur un programme existant et popularisé ces dernière années, OpenCV. Notre projet consiste à traiter les images provenant d’une caméra de surveillance orientée sur un parking afin d’optimiser les nombre de véhicules pouvant y stationner en signalant tout manquement aux règles qui régissent les parkings privés et à établir des statistiques.

 

En effet, la démocratisation des véhicules particuliers pousse les institutions publiques et privées à aménager des endroits prévus pour accueillir ces derniers. Toutefois, le nombre croissant de véhicules utilisés au quotidien implique une difficulté à assurer la pérennité de ces endroits. Ces derniers temps, les parkings technologiquement équipés pullulent car nous sommes dans une optique de stockage de données afin de mieux répondre aux attentes des consommateurs, mais certains parkings ne peuvent pas s’offrir ce luxe car ils nécessitent une configuration adaptée à la lecture de plaques, à la disposition de capteurs inductifs, indiquant, avec un témoin lumineux, la disponibilité des places. C’est pour ces mêmes raisons que ces parkings sont généralement des parkings couverts.

exemple de technologie indiquant la disponibilité d’une place
Figure 1 : Exemple de technologie indiquant la disponibilité d’une place.

Mais qu’en est t il des parkings ouverts ? Le dispositif que nous avons développé est une alternative à ces infrastructures onéreuses, rendant le contrôle et l’acquisition de données plus accessibles.


Cahier des charges

Objectifs

Certains objectifs nous ont été imposés :

  1. Identification des véhicules : Détecter les différents éléments apparaissant sur le retour image de la caméra de surveillance et les identifier dans le but de les filtrer (dans notre cas, identification des véhicules et des piétons).
  2. Délimitation des places de stationnement et définition de leurs états : Identifier les places de stationnement, distinguer la disponibilité de l’emplacement, observer si un véhicule est bien ou mal stationné.
  3. Statistiques : à l’aide des relevés, établir des statistiques tels que : le temps de stationnement moyen, le nombre d’emplacements disponibles ou encore l’heure d’affluence.
  4. Affichage : Créer une interface propre, agréable, où ls statistiques et les informations sont clairement visibles et accessibles à tous les utilisateurs.
Carte heuristique détaillant les objectifs
Figure 2 : Carte heuristique détaillant les objectifs.

Ressources données

Pour mieux comprendre la suite, il est nécessaire de faire une brève présentation de ce qu’est OpenCV : OpenCV est une bibliothèque employée dans le traitement d’images. Elle est grandement appréciée car permet le traitement d’image en temps réel et est sous licence libre (BSD).

 

Afin de gagner du temps, un programme python nous a été fourni. Ce code permet d’utiliser le réseau de neurone généré par OpenCV afin de reconnaître des éléments appartenant à la base de donnée « Darknet ». Chaque élément à un identifiant propre qui lui est attribué; cet identifiant est contenu dans un “ClassId(XX)”, XX étant l’identifiant. Pour le projet nous nous sommes limités à reconnaître les personnes et les voitures, les autres véhicules n’étant pas censés circuler sur le campus et les autres objets ne présentant pas d’intérêt notable. Cette sélection est aisément modifiable.

Correspondance d’un élément avec un ClassID
Figure 3 : Correspondance d’un élément avec un ClassID.

Le programme affiche en sortie l’image ou la vidéo traitée, avec les éléments graphiques générés par OpenCV (les éléments tels que les visages, les ordinateurs, chiens, chats, voitures sont encadrés et leur nature est indiquée en haut du susdit cadre via un texte).

Exemple d’image que peut récupérer le programme de base OpenCV / Darknet à la fin de son exécution.
Figure 4 : Exemple d’image que peut récupérer le programme de base OpenCV / Darknet à la fin de son exécution.

En terme de matériel physique, il a été mis à notre disposition une Raspberry Pi 3 ainsi qu’une webcam. La Raspberry Pi 3 étant sous Raspbian, une distribution Linux, le python s’est imposé comme langage de programmation le plus adapté à nos besoins.


Recherches effectuées

Caméra et orientation

Nous avons effectué plusieurs tests pour déterminer quelle prise de vue est la plus adaptée au projet, et aux vues des méthodes présentées dans la partie « Expérimentations », la vue de dessus est un choix logique. Elle nous permet de biens distinguer les véhicules, et de bien les situer dans l’espace, à la différence d’une prise de vue oblique ou ras du sol.

 

Une webcam Logitech C170 nous a été fourni, sa résolution est suffisante pour le bon fonctionnement du projet.

Bibliothèques nécessaires

Après quelques recherches, nous avons établi une liste des bibliothèques nécessitant une importation dans notre programme python. Ainsi on y retrouve “time” et “datetime” qui servent à gérer le temps, que ce soit pour indiquer la date et l’heure actuelle ou pour calculer des intervalles de temps, déterminants la durée de stationnement d’un véhicule. Il y a aussi “numpy” qui est une extension du langage python permet d’effectuer certains types de calculs, “cv2” qui n’est autre que OpenCV, “matplotlib” qui apporte de nombreuses fonctionnalités au niveau de l’interface graphique et “collections” qui nous a aidé à gérer les couleurs.

Bibliothèques importées dans le programme principal final.
Figure 5 : Bibliothèques importées dans le programme principal final.

Expérimentations

Traitement d’images

 

Une fois l’image proprement récupérée et les véhicules reconnus, il a fallu identifier les places de parkings. Nous avons décidé de mettre un point à coordonnées X Y au centre des stationnements et de développer un algorithme qui aura comme seules coordonnées celles du point. Deux méthodes se sont présentées à nous : d’une part le mode manuel, qui consiste à entrer à la main les coordonnées des différentes places et d’autre part la détection de lignes par traitement d’image.

 

Le mode manuel consiste à entrer dans le programme la valeur de X et de Y à partir d’une image témoin (voir figure XX). Dans le programme, il se présente comme ceci : “TabPlaceXY = np.array([[100,257],[300,257],[500,257],…])” avec entre chaques crochets, le point [X,Y] du centre de la place. L’avantage de cette méthode est qu’elle est très simple à mettre en oeuvre et qu’elle est légère à compiler, ce qui n’est pas négligeable car OpenCV rend le programme lourd à compiler, que qui ralenti le nombre d’image par secondes. En revanche, si la caméra subit un mouvement, le programme devient caduc et une intervention est nécessaire pour modifier les coordonnées des points.

 

La détection de lignes est une méthode très intéressante, elle consiste à analyser l’image pour en extraire les lignes qui la compose, à partir de là, les places pourraient êtres identifiées automatiquement et actualisées en cas d’un mouvement de caméra; de plus, connaissant la taille moyenne d’une place de parking, l’algorithme pourrait s’adapter à tout parking, quelle que soit la hauteur de la caméra. Pour ce faire, nous avons utilisé la transformée de Hough qui repère les différences de contraste entre 2 pixels et si ces différences se perpétue à des endroits suffisamment proches, le programme en déduit qu’une ligne s’y trouve. OpenCV intègre la transformée de Hough, et nous permet de l’appeler comme suit: “cv2.HoughLinesp(edges,1,np.pi/180,100,minLineLenght,maxLineGap)”. Nous avons appris à nos dépens que pour utiliser cette méthode, une image très propre est nécessaire, nous l’avons donc expérimentée sur des images fictives (parking avec asphalt homogènement noir et lignes blanches parfaites) mais n’avons réussis à le porter sur système réel.

Transformée de Hough sur système réel.
Figure 6 : Transformée de Hough sur système réel.
Transformée de Hough sur une image parfaite.
Figure 7 : Transformée de Hough sur une image parfaite (Exemple 1).
Transformée de Hough sur image parfaite.
Figure 8 : Transformée de Hough sur une image parfaite (Exemple 2).

La méthode manuelle a donc été utilisée.

 

Ensuite, il a suffit de récupérer le barycentre du rectangle encadrant les véhicules (qui nous est donné par OpenCV) puis d’établir sa position par rapport au centre d’une place et ainsi, de voir dans quelle zone il se situe et donc, dans quelle zone le véhicule se situe.

Système miniature

Parking miniature.
Figure 9 : Parking miniature.

Suite au besoin évident de tester le programme, un environnement simulé était nécessaire. Un parking miniature a alors été réalisé avec des voiture miniatures. OpenCV nous a renvoyé le ClassId « 62 », autrement dit il voyait les voitures miniatures comme étant des téléphones portables; nous y avons remédié en traitant dans le programme, les téléphones portables comme des voitures; a noter que cela ne se produit pas uniquement avec les voitures miniatures mais avec toute voiture vue à la verticale.

 

À partir de ce modèle, nous avons réalisé différents cas de figures, mettant en évidence les qualités et les défauts du programme.

 

Les premières expérimentations ne furent pas probantes, en effet, les voitures n’étaient pas reconnues, du moins pas toutes, et pas tout le temps. Il nous fallu du temps pour s’apercevoir que le problème ne venait pas de notre programme mais de la luminosité. Ne pouvant bénéficier de la lumière naturelle en de bonnes conditions, nous avons utilisé un éclairage artificiel, à l’aide de nos smartphones comme visible sur la Figure 9. Le problème était résolu.

Première version du programme

Ayant une méthode d’approche et des ressources suffisantes, un premier programme a pu être conçu. En un premier temps les informations concernant l’état des places apparaissaient dans un terminal puis nous les avons intégrées au retour image pour plus de visibilité et de simplicité d’utilisation.

Situations dans lesquelles la première version du programme fonctionne bien.
Figure 10 : Situations dans lesquelles la première version du programme fonctionne bien.

On peut remarquer que dans ces 4 différentes situations, le programme fonctionne correctement, certes, l’interface graphique n’est pas très attrayante et reste peu lisible mais on peut y remarquer certaines fonctionnalités :

  1. Les véhicules sont reconnus et encadrés (L’affichage de la nature de l’objet « cell phone » est due à l’amalgame que fait OpenCV des voitures en vue aérienne comme expliqué précédemment).
  2. Les places sont numérotées et affichent un code couleur : Jaune lorsque la place est disponible, Vert lorsque la place est occupée et Rouge lorsque la place est prise par un véhicule mal stationné.
  3. Des informations sont disposées à gauche : Nombre de places disponibles, de véhicules, de véhicules mal stationnés, de véhicules bien stationnés et une mention « LA CIRCULATION EST PERTURBÉE » fait son apparition lorsqu’un véhicule n’est pas assez rentré dans sa place, comme visible sur le troisième cas de figure.
Erreur si un véhicule stationne entre 2 places.
Figure 11 : Erreur si un véhicule stationne entre 2 places.

La première erreur rencontrée (visible sur la Figure 11) est facilement rectifiable. En effet, un seul véhicule est détecté mais à l’écran apparaît « VEHICULE(S) MAL STATIONNE(S) = 2 », cela vient simplement du fait que le programme travail avec les places et non avec les véhicules, autrement dit, le programme regarde si la place est occupée par un véhicule et non pas si le véhicule occupe une place. Nous avons donc changé l’ordre dans lequel travail le programme (visible sur Figure 12).

Algorigramme de la deuxième version du programme.
Figure 12 : Algorigramme de la deuxième version du programme.
Erreur si un véhicule se stationne à l'horizontale.
Figure 13 : Erreur si un véhicule se stationne perpendiculairement.

La deuxième erreur rencontrée (visible sur la Figure 12) est due a notre manque de méfiance. Si un véhicule se positionne au milieu de la place, mais perpendiculairement, son barycentre est dans la zone de véhicule bien stationné. Pour y remédier, nous avons établi que si la largeur du véhicule est supérieure à sa longueur, il est reconnu par le logiciel comme étant mal stationné.


Application plus poussée

Vitesse d’acquisition

Jusque là, seul des photos étaient traitées, la Raspberry Pi 3 peut exécuter le programme mais pas sans peines, la carte chauffe, parfois se coupe et met jusqu’à 1 minute pour afficher le résultat. Dans le but de traiter des images en temps réel et en continu, un environnement plus stable et plus performant était nécessaire. Pour avoir un temps d’exécution plus raisonnable nous avons transféré le programme sur une machine Linux.

Type d’ordinateur Raspberry Pi 3 Machine Linux
Fréquence processeur 1,2 GHz 2,4 GHz
Temps d’exécution 50 secondes 2 secondes

Le temps d’exécution fut grandement réduit et les risques de surchauffes quasiment nulles. Pour que le retour vidéo soit totalement fluide il faudrait que l’ordinateur utilisé puisse afficher environ 24 images par secondes, soit environ 50 fois plus que la machine utilisée. Il n’aurait pas raisonnable d’utiliser une telle machine pour le projet car l’intérêt est moindre : en l’espace de 2 secondes, il n’y a pas d’événement impactant pouvant se produire sur un parking.

Analyse Temporelle

Afin de répondre pleinement au cahier des charges, il nous a fallu introduire une référence de temps dans notre programme. Ainsi certaines fonctionnalités peuvent être ajoutées, telles que le temps de stationnement de chaque véhicule, individuellement, le temps moyen de stationnement des véhicules, l’heure d’affluence ainsi qu’un affichage de la date sur l’interface pour avoir un repère temporel en cas d’enregistrement des vidéos de surveillance.

Deuxième version du programme

La deuxième version du programme intègre : la correction des bugs constatés après les tests sur la première version, une nouvelle interface plus claire, plus fonctionnelle et les nouvelles fonctionnalités rendues possibles grâce à la considération du temps.

Deuxième version du programme (Capture d'écran 1).
Figure 14 : Deuxième version du programme (Capture d’écran 1).
Deuxième version du programme (Capture d'écran 2).
Figure 15 : Deuxième version du programme (Capture d’écran 2).

L’interface a été entièrement repensée, rendant les informations bien plus lisibles et attrayantes. Hélas, appliqué à un système réel, le programme ne fonctionne pas correctement, on voit, par exemple que l’état de la place 4 est différent entre la Figure 14 et la Figure 15 alors que le véhicule n’a pas bougé. Malheureusement le programme a été intégralement développé sur le système miniature, ces dysfonctionnements n’ont pas étés anticipés et se sont révélés lors des tests tardifs avec des vidéos de surveillance. Les paramètres changeants entre le système miniature et le système réel sont : la caméra, l’échelle, le nombre de véhicules (bien plus important). Nous supposons donc que le problème est lié à un de ces paramètres.


Conclusion

Améliorations envisageables

En un premier temps, il faudrait corriger ce dysfonctionnement lorsque l’on travail sur un système réel. Ensuite, certaines améliorations pourrait être apportées :

  1. La transformée de Hough : trop complexe pour que l’on puisse l’utiliser correctement, il serait très plaisant de l’incorporer au programme principal.
  2. Base de données : les statistiques s’accumulant tout les jours, il pourrait être intéressant de les retrouver dans une base de données.

Apports

Ce projet nous a appris a travailler en autonomie, tout en renforçant nos connaissances du langage python et du traitement d’image.

 

 

Nous tenons à adresser nos remerciements à Mr Bazeille Stéphane et Mr Rebert Martin pour nous avoir suivi tout au long du projet en nous donnant des conseils avisés.