web-dev-qa-db-fra.com

Former la détection d'objet Tensorflow sur son propre jeu de données

Après avoir passé quelques jours à essayer d’accomplir cette tâche, je voudrais partager mon expérience de la manière dont j’ai répondu à la question:

Comment utiliser détection d'objet TS pour s'entraîner à l'aide de mon propre jeu de données?

25
eshirima

Cela suppose que le module est déjà installé. Veuillez vous référer à leur documentation sinon.

Clause de non-responsabilité

Cette réponse n'est pas censée être le moyen right ​​ou only de former le module de détection d'objet. C’est simplement que je partage mon expérience et ce qui a fonctionné pour moi. Je suis ouvert aux suggestions et à en apprendre davantage à ce sujet car je suis encore novice en ML.

TL; DR

  1. Créez votre propre jeu de données au format Pascal VOC
  2. Générer des TFRecords
  3. Configurer un pipeline
  4. Visualiser

Chaque section de cette réponse consiste en une édition correspondante (voir ci-dessous). Après avoir lu chaque section, veuillez lire son édition également pour des éclaircissements. Des corrections et des astuces ont été ajoutées pour chaque section.

Outils utilisés

LabelImg : Un outil pour créer des annotations au format Pascal VOC.

1. Créez votre propre jeu de données Pascal VOC

PS: Pour simplifier, la convention de nommage des dossiers de ma réponse suit celle de Pascal VOC 2012

Un coup d'œil sur jeu de données de mai 2012 , vous remarquerez que le dossier a la structure suivante

+VOCdevkit +VOC2012 +Annotations +ImageSets +Action +Layout +Main +Segmentation +JPEGImages +SegmentationClass +SegmentationObject

Pour le moment, des modifications ont été apportées aux dossiers suivants:

Annotations: tous les fichiers XML correspondants des images y seront placés. Utilisez l'outil suggéré ci-dessus pour créer le annotations. Ne vous inquiétez pas pour les balises <truncated> Et <difficulty> Car elles seront ignorées par les binaires training et eval.

JPEGImages: Emplacement de vos images réelles. Assurez-vous qu’ils sont de type JPEG car c’est ce qui est actuellement pris en charge pour créer des TFRecords en utilisant le script fourni.

ImageSets-> Main: Il s'agit simplement de fichiers texte. Pour chaque classe, il existe un train.txt, trainval.txt ​​et val.txt ​​correspondant. Vous trouverez ci-dessous un exemple du contenu de aeroplane_train.txt ​​dans le dossier VOC 2012.

2008_000008 -1
2008_000015 -1
2008_000019 -1
2008_000023 -1
2008_000028 -1
2008_000033  1

La structure est fondamentalement le nom de l'image suivi d'un booléen indiquant si l'objet correspondant existe ou non dans cette image. Prenons l'exemple de l'image 2008_000008 ne se compose pas d'un avion et est donc marqué d'un - 1 mais de l'image 2008_0000.

J'ai écrit un petit script Python pour générer ces fichiers texte. Il vous suffit de parcourir les noms d'images et d'attribuer un 1 ou -1 à ceux-ci pour l'existence d'un objet. J'ai ajouté un peu de hasard à mes fichiers texte en mélanger les noms d'image.

Les fichiers {classname} _val.txt ​​se composent du essai ensembles de données de validation. Pensez à cela comme les données de test pendant l'entraînement. Vous souhaitez diviser votre ensemble de données en formation et validation. Plus d'informations peuvent être trouvées ici . Le format de ces fichiers est similaire à celui de la formation.

À ce stade, votre structure de dossiers devrait être

+VOCdevkit +VOC2012 +Annotations --(for each image, generated annotation) +ImageSets +Main --(for each class, generated *classname*_train.txt and *classname*_val.txt) +JPEGImages --(a bunch of JPEG images)


1.1 Générer une carte d'étiquettes

Avec le jeu de données préparé, nous devons créer les cartes d'étiquettes correspondantes. Naviguez jusqu'à modèles/object_detection/data et ouvrez Pascal_label_map.pbtxt.

Ce fichier consiste en un JSON attribuant un ID et un nom à chaque élément. Apportez des modifications à ce fichier pour refléter vos objets souhaités.


2. Générer des TFRecords

Si vous examinez leur code en particulier this line , ils récupèrent explicitement le aeroplane_train.txt ​​uniquement. Pour les esprits curieux, voici pourquoi . Changez ce nom de fichier en n'importe lequel de vos fichiers texte de train de classe.

Assurez-vous que VOCdevkit ​​est à l'intérieur de modèles/object_detection alors vous pouvez continuer et générer les TFRecords .

Veuillez consulter leur code en premier si vous rencontrez des problèmes. C'est explicite et bien documenté.


3. Configuration du pipeline

Le instructions devrait être explicite pour couvrir ce segment. Des exemples de configuration peuvent être trouvés dans object_detection/samples/configs .

Pour ceux qui cherchent à s'entraîner à partir de rien comme moi, assurez-vous simplement de supprimer les nœuds fine_tune_checkpoint Et from_detection_checkpoint. Voici à quoi ressemblait mon fichier de configuration.

À partir de là, vous pouvez continuer avec le tutoriel et lancer le processus de formation.


4. Visualiser

Veillez à exécuter eval parallèlement à la formation afin de pouvoir visualiser le processus d'apprentissage. Pour citer Jonathan Huang

le meilleur moyen consiste simplement à exécuter le fichier binaire eval.py. Nous exécutons généralement ce binaire en parallèle de la formation, en le pointant vers le répertoire contenant le point de contrôle en cours de formation. Le fichier binaire eval.py écrit les journaux dans un eval_dir Que vous spécifiez et que vous pouvez ensuite pointer avec Tensorboard.

Vous voulez voir que le mAP a "décollé" au cours des premières heures, puis vous voulez voir quand il converge. Il est difficile de dire sans regarder ces graphiques le nombre d'étapes dont vous avez besoin.


EDIT I ​​(28 juillet '17):

Je ne m'attendais pas à ce que ma réponse reçoive autant d'attention, alors j'ai décidé de revenir et de l'examiner.

Outils

Pour les autres utilisateurs Apple), vous pouvez utiliser RectLabel pour les annotations.

Pascal VOC

Après avoir fouillé, j'ai finalement compris que trainval.txt ​​est en réalité l'union des ensembles de données de formation et de validation.

S'il vous plaît regardez leur kit de développement officiel pour comprendre le format encore mieux.

Génération de mappes d'étiquettes

Au moment de mon écriture, l'ID 0 représente none_of_the_above. Il est recommandé de commencer vos identifiants à partir de 1.

Visualize

Après avoir exécuté votre évaluation et dirigé tensorboard vers votre répertoire Eval, il vous montrera le mAP de chaque catégorie ainsi que les performances de chaque catégorie. C'est bien, mais j'aime bien voir mes données d'entraînement parallèlement à Eval.

Pour ce faire, exécutez tensorboard sur un autre port et dirigez-le vers votre répertoire de train.

tensorboard --logdir=${PATH_TO_TRAIN} --port=${DESIRED_NUMBER}
48
eshirima

J'ai écrit un article de blog sur le support sur mon expérience et sur la façon dont j'ai formé un détecteur d'objet (en particulier, un détecteur de raton laveur) avec Tensorflow sur mon propre jeu de données. Cela pourrait aussi être utile pour d'autres et est complémentaire à la réponse de eshirima.

16
Dat Tran