Sélectionner une page

Implémenter la reconnaissance d’objets en Live Stream

La solution est construite avec TensorFlow, un système informatique pratique et flexible.

Introduction

La reconnaissance d’images est très largement utilisée dans l’apprentissage automatique. Il existe de nombreuses approches et solutions différentes, mais aucune d’entre elles ne correspond vraiment a du live streaming sur la reconnaissance image. Nous avions besoin d’une solution entièrement locale s’exécutant sur un ordinateur minuscule pour fournir les résultats de reconnaissance à un service cloud. Cet article décrit notre approche pour construire une solution de reconnaissance d’objets avec TensorFlow.

YOLO

YOLO est un système de détection d’objets en temps réel à la pointe de la technologie. Sur le site officiel, vous trouverez les SSD300, SSD500, YOLOv2 et Tiny YOLO qui ont été formés sur deux ensembles de données différents VOC 2007+2012 et COCO trainval. Vous pouvez également trouver d’autres variantes de configurations et d’ensembles de données d’entraînement sur Internet, par exemple YOLO9k.

Grâce à la large gamme de variantes disponibles, il est possible de choisir la version la plus adaptée à vos besoins. Par exemple, Tiny YOLO est la plus petite variante qui peut fonctionner rapidement même sur les smartphones ou Raspberry Pi. Nous avons aimé cette variante et l’avons utilisée dans notre projet.

DarkNet et TensorFlow

Le modèle YOLO a été développé pour le cadre DarkNet. Ce cadre présentait des inconvénients pour nous. Il stocke les données entraînées (poids) dans un format qui peut être reconnu de différentes façons sur différentes plateformes. Ce problème peut être une pierre d’achoppement parce qu’habituellement vous voudriez former le modèle sur le matériel « rapide et furieux » et l’utiliser n’importe où ailleurs.

DarkNet est écrit en C et n’a pas d’autre interface de programmation, donc si vous avez besoin d’utiliser un autre langage de programmation en raison des spécifications de la plate-forme ou de vos propres préférences, vous devez faire plus de travail pour l’intégrer. De plus, il n’est distribué que sous forme de code source et le processus de compilation sur certaines plates-formes peut être pénible.

D’autre part, nous avons TensorFlow, un système informatique pratique et flexible. Il est transférable et peut être utilisé sur la plupart des plateformes. TensorFlow fournit une API pour Python, C+++, Java, Go et autres langages de programmation supportés par la communauté. Le framework avec la configuration par défaut peut être installé d’un seul clic, mais si vous avez besoin de plus (par exemple, le support d’instructions de processeur spécifiques), il peut être facilement compilé à partir du source avec l’autodestection matérielle.

Exécuter TensorFlow sur un GPU est également très simple. Tout ce dont vous avez besoin est NVIDIA CUDA et tensorflow-gpu, un package spécial avec support GPU. Le grand avantage de TensorFlow est son évolutivité. Il peut utiliser plusieurs GPU pour augmenter les performances ainsi que le clustering pour le calcul distribué.

Nous décidons de prendre le meilleur des deux mondes et d’adapter le modèle YOLO pour TensorFlow.

YOLO adaptatif pour TensorFlow

Notre tâche consistait donc à transférer le modèle YOLO à TensorFlow. Nous voulions éviter toute dépendance envers des tiers et utiliser YOLO directement avec TensorFlow.

Au début, nous avions besoin de porter la définition du modèle. La seule façon d’y parvenir est de répéter la définition du modèle couche par couche. Heureusement pour nous, il existe de nombreux convertisseurs open source qui peuvent le faire. La solution la plus adaptée à nos besoins est DarkFlow. Il fait fonctionner DarkNet à l’intérieur, mais nous n’avons pas vraiment besoin de cette partie.

Au lieu de cela, nous avons ajouté une fonction simple à DarkFlow qui nous a permis de sauvegarder les points de contrôle TensorFlow avec un méta-graphe, dont l’essentiel peut être trouvé ici. Cela peut être fait manuellement, mais si vous voulez essayer différents modèles, il est beaucoup plus facile de le convertir plutôt que de le répéter manuellement.

Le modèle YOLO que nous avons choisi a une taille d’entrée stricte : 608×608 pixels. Nous avions besoin d’une sorte d’interface qui puisse prendre une image, la normaliser et l’alimenter dans un réseau neuronal. Alors on en a écrit un. Il utilise TensorFlow pour la normalisation car il fonctionne beaucoup plus rapidement que les autres solutions que nous avons essayées (Python natif, numpy, openCV)

La dernière couche du modèle YOLO renvoie des caractéristiques qui doivent ensuite être transformées en quelque chose de lisible par l’homme. Nous avons ajouté quelques opérations après la dernière couche pour obtenir des boîtes de délimitation.

Finalement, nous avons écrit un module Python qui peut restaurer un modèle à partir d’un fichier, normaliser les données d’entrée, et post-traiter les caractéristiques du modèle pour obtenir les cases de délimitation pour les classes prédites.

Apprentissage du modèle

Nous avons décidé d’utiliser un modèle préformé pour nos besoins. Les données formées sont disponibles sur le site officiel de YOLO. Notre tâche suivante était d’importer les poids DarkNet dans TensorFlow. Cela a été fait comme suit :

  • Lire les informations sur les couches dans le fichier de configuration de DarkNet
  • Lire les données entraînées à partir du fichier  DarkNet selon la définition de la couche.
  • Préparer la couche TensorFlow à partir des informations de la couche DarkNet
  • Ajouter des biais au nouveau calque
  • Répéter pour chaque couche

 

Architecture du modèle et flux de données

A chaque itération, un classificateur fait une prédiction du type d’objet qui se trouve dans la fenêtre. Il effectue des milliers de prédictions par image. En raison de ce processus de glissement, il fonctionne assez lentement.Le plus grand avantage du modèle YOLO est l’origine de son nom – You Only Look Once. Ce modèle divise une image en une grille de cellules. Chaque cellule tente de prédire les cases limitrophes avec les scores de confiance pour ces cases et les probabilités de classe. Ensuite, le score de confiance de la case de délimitation individuelle est multiplié par une carte de probabilité de classe pour obtenir un score final de détection de classe. Vous pouvez découvrir l’ensemble des cas d’application à travers notre vidéo IABRACADABRA en collaboration avec OONA cabinet conseil digital !

 

Share This