Détection de panneaux de signalisation avec Caffe

 

Introduction

De nos jours, nous cherchons de plus en plus à rendre les systèmes électroniques et informatiques autonome et intelligent dans le but de concevoir des robots compagnons, des caméras intelligentes ou des véhicules sans conducteurs par exemple. Ce travail est souvent lourd et complexe mais l'apparition des premiers réseaux de neurones ont permis d'apporter de nouvelles solutions et possibilités à ces problématiques d'autonomie et d'intelligence. Parmi celle-ci, nous nous somme intéressés à la détection de panneaux de signalisation, utile pour les véhicules autonomes, à l'aide d'un Framework nommé Caffe.

Caffe est un système de deep learning rapide et modulable développé par le Centre de Vision et d’apprentissage de Berkeley (BVLC) en Californie avec la contribution de sa communauté. Il peut s’exécuter à la fois sur CPU et sur GPU en ne changeant qu’un seul paramètre. Il est capable de traiter plus de 60 millions d’images par jour pour un seul GPU NVIDIA K40, ce qui veut dire 1ms/image pour la déduction et 4ms/image pour l’apprentissage. Dans ce projet, nous nous servons de Caffe pour faire l'apprentissage des panneaux de signalisation au réseau de neurones, puis de la détection et caractérisation de ses panneaux sur différentes images.

 

Preparation

Pour faire l'apprentissage de nos panneaux de signalisation, nous avons tout d'abord besoin de préparer nos données. Pour ce faire, nous avons besoin de créer deux dossier, un nommée "train" par exemple où nous placerons nos images d'entraînement et l'autre "val" où nous mettrons nos images de validations. Chaque image doit avoir l'extension ".JPEG" pour être utilisé par les scripts de Caffe que nous utiliserons ultérieurement. Pour changer rapidement l'extension de vos images, vous pouvez utiliser certaines commandes dans un terminal couplée avec des expressions régulières pour changer toutes les extension en une seule commande sans modifier le nom de l'image.

Ex : rename 's/ppm/JPEG/' *        // renomme ppm par JPEG pour tous les fichiers du dossier courant

Une fois nos fichiers avec la bonne extension, il faut les lister dans un fichier train.txt pour les images d'entraînement et dans un fichier val.txt pour les images de validation. Pour éviter d'avoir à écrire à la main tous les noms d'images dans ces deux fichiers, il existe des commandes qui le font automatiquement.

Fichier listant toutes les images d'entrainement

Fichier listant toutes les images de validation

Pour éviter d'avoir à trop modifier les scripts de Caffe, placez ces deux fichiers dans le dossier data/ilsvrc12 de la racine de Caffe. Maintenant nos données sont prêtes, mais ils nous faudra modifier quelque peu certains scripts avant de lancer l'entraînement.

 

Entraînement

Pour commencer, il nous faut lancer le script "create_imagenet.sh" dans le dossier "examples/imagenet" à la racine de Caffe. Mais pour que l'execution fonctionne sans erreur, nous devons modifier quelques lignes de ce script comme suit :

- à la ligne "TRAIN_DATA_ROOT=" remplacer le chemin d'accès par celui où se trouve vos images d'entrainement

- à la ligne "VAL_DATA_ROOT=" remplacer le chemin d'accès par celui où se trouve vos images de validation

- à la ligne "RESIZE=" remplacer false par true pour que Caffe redimensionne automatiquement vos images

Modification du script

Enregistrer et exécuter le script. Les dossiers "examples/imagenet/ilsvrc12_train_leveldb" et "examples/imagenet/ilsvrc12_val_leveldb" seront créés à la suite de ce script. Si ces deux dossiers existaient déjà avant l'exécution de "create_imagenet.sh", le script retournera une erreur, il vous suffira donc de supprimer ces dossier et de relancer l'exécution.

Ensuite, il faut lancer le script "make_imagenet_mean.sh" qui créera un fichier "imagenet_mean.binaryproto" dans le dossier data/ilsvrc12 à la racine de Caffe. La phase de préparation est ainsi terminé, il ne reste plus qu'à lancer la commande suivante pour lancer l'entraînement du réseau de neuronnes :

./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt

Execution de l'entraînement

Pour des raisons encore inconnues, notre exécution reste figée à l'itération 0...

 

Détection

Une fois le réseau entraîné, ils nous ai possible de détecter et différencier les différents panneaux de signalisation. Pour ce faire, il suffit de suivre ce tutoriel "http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb" ou le précédent rapport remis.