Place de stationnement accrochée avec masque R-CNN et Python | par Adam Geitgey

 Place de stationnement accrochée avec masque R-CNN et Python | par Adam Geitgey


Non seulement nous obtenons les voitures identifiées, mais nous obtenons des choses comme les feux de circulation et les gens aussi. Et hilarant, il a identifié l’un des arbres comme une «plante en pot».

Pour chaque objet détecté dans l’image, nous récupérons quatre choses du modèle R-CNN Mask:

  1. Le type d’objet qui a été détecté (comme un entier). Le modèle Coco pré-formé sait comment détecter 80 différents objets communs comme les voitures et les camions. Voici une liste complète d’entre eux.
  2. Un score de confiance de la détection d’objets. Plus le nombre est élevé, plus le modèle est certain qu’il a correctement identifié l’objet.
  3. La boîte de délimitation de l’objet dans l’image, donnée sous forme d’emplacements de pixels x / y.
  4. Un «masque» bitmap qui indique quels pixels dans la boîte de délimitation font partie de l’objet et lesquels ne le sont pas. Avec les données du masque, nous pouvons également déterminer le contour de l’objet.

Voici le code Python pour détecter les boîtes de délimitation des voitures en utilisant le modèle pré-formé à partir de l’implémentation R-CNN Mask de Matterport avec OpenCV:

Lorsque vous exécutez ce script, vous obtiendrez une image à l’écran avec une boîte autour de chaque voiture détectée, comme ceci:

Chaque voiture détectée a une boîte verte autour de lui.

Et vous obtiendrez également les coordonnées de pixels de chaque voiture détectée imprimée dans la console, comme ceci:

Cars found in frame of video:
Car: (492 871 551 961)
Car: (450 819 509 913)
Car: (411 774 470 856)

Avec tout cela, nous avons réussi à détecter les voitures dans une image. À l’étape suivante!

Nous connaissons l’emplacement des pixels de chaque voiture dans notre image. Et en regardant plusieurs cadres de vidéo successivement, nous pouvons facilement déterminer quelles voitures n’ont pas bougé et supposer que ces zones sont des places de stationnement. Mais comment détecter quand une voiture quitte un parking?

Le problème est que les boîtes de délimitation des voitures dans notre image se chevauchent partiellement:

Même pour les voitures dans différentes espaces de stationnement, les boîtes de délimitation de chaque voiture se chevauchent un peu.

Donc, si nous supposons que chacune de ces boîtes de délimitation représente une place de stationnement, il est possible que la boîte puisse être partiellement occupée par une voiture même lorsque l’espace est vide. Nous avons besoin d’un moyen de mesurer combien deux objets se chevauchent afin que nous puissions cocher des cases «principalement vides».

La mesure que nous utiliserons est appelée Intersection sur l’union ou Iou. IOU calculé en trouvant la quantité de pixels où deux objets se chevauchent et le divisant par la quantité de pixels couverts par les deux objets, comme ceci:

Cela nous donnera une mesure de la quantité de boîte de délimitation d’une voiture qui chevauche la boîte de limite d’une place de parking. Avec cela, nous pouvons facilement déterminer si une voiture est dans un parking ou non. Si la mesure IOU est faible, comme 0,15, cela signifie que la voiture n’occupe pas vraiment une grande partie de l’espace de stationnement. Mais si la mesure est élevée, comme 0,6, cela signifie que la voiture occupe la majorité de l’espace de stationnement afin que nous puissions être sûrs que l’espace est occupé.

Étant donné que l’IOU est une mesure si courante dans la vision par ordinateur, les bibliothèques que vous utilisez en ont déjà une implémentation. Et en fait, la bibliothèque R-CNN Mask Mask Mask l’inclut comme une fonction appelée mrcnn.utils.compute_overlaps()afin que nous puissions simplement utiliser ce funciton.

En supposant que nous avons une liste de boîtes de délimitation représentant des aires de stationnement à notre image, en vérifiant si les voitures détectées sont à l’intérieur de ces boîtes de délimitation sont aussi simples que d’ajouter une ligne ou deux de code:

Le résultat ressemble à ceci:

(
(1. 0.07040032 0. 0.)
(0.07040032 1. 0.07673165 0.)
(0. 0. 0.02332112 0.)
)

Dans ce tableau 2D, chaque ligne représente l’une des boîtes de délimitation de l’espace de stationnement. De même, chaque colonne représente combien cet espace de stationnement a été chevauché par l’une des voitures détectées. Un score de 1,0 signifie que la voiture occupe complètement l’espace et un score faible comme 0,02 signifie que la voiture touche l’espace mais n’occupe pas la majeure partie de la zone.

Pour trouver des places de stationnement inoccupées, nous avons juste besoin de vérifier chaque ligne dans ce tableau. Si tous les chiffres sont nuls ou vraiment petits, cela signifie que rien n’occupe cet espace et donc il doit être gratuit!

Mais gardez à l’esprit que la détection d’objets ne fonctionne pas toujours parfaitement avec la vidéo en direct. Même si le masque R-CNN est très précis, il peut parfois manquer une voiture ou deux dans un seul cadre de vidéo. Donc, avant de signaler une place de parking gratuite, nous devons nous assurer qu’elle reste gratuite pendant un petit moment – peut-être 5 ou 10 cadres séquentiels de vidéo. Cela empêchera le système de détecter mal les espaces de stationnement ouverts simplement parce que la détection d’objets avait un hoquet temporaire sur un cadre de vidéo. Mais dès que nous voyons que nous avons au moins un espace de stationnement gratuit pour plusieurs cadres séquentiellement de vidéo, nous sommes prêts à envoyer un texte!

La dernière étape de notre pipeline consiste à envoyer une alerte SMS lorsque nous remarquons qu’un parking a été gratuit pour plusieurs cadres de vidéo.

L’envoi d’un SMS de Python est très simple en utilisant Twilio. Twilio est une API populaire qui vous permet d’envoyer un message SMS à partir de essentiellement n’importe quel langage de programmation avec quelques lignes de code. Bien sûr, si vous préférez utiliser un autre fournisseur SMS de service, vous pouvez l’utiliser à la place. Je n’ai aucune participation dans Twilio. C’est juste la première chose à venir à l’esprit.

Pour utiliser Twilio, inscrivez-vous pour un compte de procèscréez un numéro de téléphone Twilio et obtenez vos informations d’identification de compte. Ensuite, vous devez installer la bibliothèque client Twilio Python:

pip3 install twilio

Avec cela installé, il s’agit du code entier pour envoyer un message SMS dans Python (remplacez simplement les valeurs par les détails de votre compte):

Pour ajouter des capacités d’envoi de SMS à notre script, nous pouvons simplement déposer ce code. Mais nous devons faire attention à ne pas continuer à nous envoyer des messages texte sur chaque tradition de nouvelle vidéo où un espace de stationnement gratuit est toujours gratuit. Nous devrons donc avoir un drapeau à suivre si nous avons déjà envoyé un SMS et nous assurer que nous n’en envoyons pas un autre tant qu’un certain temps s’est écoulé ou jusqu’à ce qu’une place de stationnement différente soit détectée pour être ouverte.

Amenons chaque étape de notre pipeline en un seul script python. Voici le code complet:

Pour exécuter ce code, vous devrez d’abord installer Python 3.6+, Masque Matterport R-CNN et Opencv.

J’ai délibérément gardé le code aussi nu que possible. Par exemple, cela suppose que les voitures sont présentes dans le premier cadre de vidéo sont les voitures garées. Essayez de jouer avec et de voir si vous pouvez améliorer sa fiabilité.

N’ayez pas peur d’adapter le code pour travailler dans différents scénarios. Juste en modifiant les ID d’objet que le modèle recherche, vous pouvez transformer le code en quelque chose d’autre. Par exemple, imaginez que vous avez travaillé dans une station de ski. Avec quelques ajustements, vous pouvez transformer ce script en un système qui détecte automatiquement les pensionnaires qui sautent d’une rampe et crée des bobines de surbrillance de sauts de snowboard frais. Ou si vous travaillez sur une réserve de jeu, vous pouvez transformer cela en un système qui compte les zèbres vues dans la nature. La seule limite est votre imagination. Amusez-vous!



Source link

Related post