Détection d'objets de Tensorflow de Train sur son propre ensemble de données

après avoir passé quelques jours à essayer d'accomplir cette tâche, je voudrais partager mon expérience de la façon dont je suis allé à répondre à la question:

comment utiliser TS Object Detection pour m'entraîner en utilisant mon propre ensemble de données?

24
demandé sur Ultraviolet 2017-07-07 17:22:50

2 réponses

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

clause de non-responsabilité

cette réponse n'est pas censée être la droite ou seulement façon 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 plus sur ceci parce que je suis encore nouveau à ML en général.

TL; DR

  1. Créer votre propre PASCAL VOC format de données
  2. Générer TFRecords
  3. configurer un pipeline
  4. Visualiser

chaque section de cette réponse se compose d'une édition correspondante (voir ci-dessous). Après avoir lu chaque section, s'il vous plaît lire son édition comme bien pour des précisions. Des Corrections et des conseils ont été ajoutés pour chaque section.

outils utilisés

LabelImg : a tool for creating PASCAL VOC format annotations.

1. Créez votre propre ensemble de données PASCAL VOC

PS: pour la simplicité, la convention de nommage des dossiers de ma réponse suit celui de Pascal VOC 2012

un coup d'oeil dans le mai 2012 ensemble de données , vous noterez le dossier comme ayant 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 : c'est où les fichiers XML correspondants de toutes les images seront placés. Utilisez l'outil suggéré ci-dessus pour créer les annotations. Ne vous inquiétez pas des étiquettes <truncated> et <difficulty> car elles seront ignorées par les binaires de formation et d'évaluation.

JPEGImages : localisation de vos images actuelles. Assurez-vous qu'ils sont de type JPEG parce que c'est ce qui est actuellement pris en charge afin de créer des TFRecords en utilisant leur script fourni.

ImageSets - > Main : il s'agit simplement de fichiers texte. Pour chaque classe, il existe un train correspondant .txt , trainval.txt et val.txt . Vous trouverez ci-dessous un échantillon du contenu du .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 essentiellement nom d'image suivi d'un booléen dire si le correspondant objet existe dans cette image, ou pas. Prenons par exemple l'image 2008_000008 ne se compose pas d'un avion donc marqué d'un -1 mais l'image 2008_000033 le fait.

j'ai écrit un petit script Python pour générer ces fichiers texte. Itérez simplement les noms d'image et assignez un 1 ou -1 à côté d'eux pour l'existence d'objet. J'ai ajouté du caractère aléatoire dans Mes fichiers texte en mélangeant les noms des images.

Le {classname}_val.les fichiers txt se composent des ensembles de données de validation testing . Pensez à cela comme aux données d'essai pendant l'entraînement. Vous voulez 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 point, votre structure de dossier 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 la Génération de l'étiquette de la carte

avec l'ensemble de données préparé, nous devons créer les cartes d'étiquette correspondantes. Accédez à modèles/object_detection/données et ouvrir pascal_label_map.pbtxt .

ce fichier se compose d'un JSON qui attribue une ID et un nom à chaque élément. Apporter des modifications à ce dossier afin de tenir compte vos objets souhaités.


2. Générer Des TFRecords

si vous regardez dans leur code en particulier cette" ligne "15191350920 , ils attrapent explicitement le avie_train.txt . Pour curios minds, voici pourquoi . Changez le nom de ce fichier pour n'importe lequel de vos fichiers texte de class train.

assurez-vous VOCdevkit est à l'intérieur de models/object_detection alors vous pouvez aller de l'avant et générer les TFRecords .

veuillez passer en revue leur code si vous rencontrez des problèmes. Il est auto-explicatif et bien documenté.


3. Configuration Du Pipeline

Le instructions doivent être explicites pour couvrir ce segment. Les exemples de configuration se trouvent dans object_detection/samples/configs .

pour ceux qui cherchent à s'entraîner à partir de zéro comme je l'ai fait, assurez-vous juste d'enlever les noeuds fine_tune_checkpoint et from_detection_checkpoint . Voici ce que mon fichier de config ressemblait à des fins de référence.

a Partir de là vous pouvez continuer avec le tutoriel et exécuter le processus de formation.


4. Visualisez

assurez-vous d'exécuter la fonction eval en parallèle à la formation, afin d'être en mesure de visualiser le processus d'apprentissage. Pour citer Jonathan Huang

la meilleure façon est d'exécuter le eval.py binaire. Nous sommes généralement d'exécuter ce binaire en parallèle à la formation, la pointant vers la détention d'annuaire le point de contrôle qui est formé. Les eval.py le binaire écrira se connecte à un eval_dir que vous spécifiez et que vous pouvez ensuite pointer vers avec Tensorboard.

Vous voulez voir que la carte a "enlevé" dans les premières heures, et puis vous voulez voir quand elle converge. C'est difficile à dire sans en regardant ces parcelles combien de pas vous avez besoin.


EDIT I (28 juillet '17):

Je ne m'attendais pas à ce que ma réponse obtienne autant d'attention, alors j'ai décidé de revenir et de la revoir.

Outils

pour mes collègues utilisateurs de Apple, vous pouvez en fait utiliser RectLabel pour les annotations.

Pascal VOC

après avoir creusé autour, j'ai finalement réalisé ce train .txt est en fait l'union des ensembles de données de formation et de validation.

s'il vous Plaît regarder à leur "15192150920 officielle" kit de développement pour comprendre le format même mieux.

Étiquette "Génération De Carte 1519160920"

au moment où j'écris, ID 0 représente none_of_the_above . Il est recommandé que vos identifiants commencent à 1.

visualisez

après avoir exécuté votre évaluation et dirigé tensorboard à votre répertoire Eval, il vous montrera la carte de chaque catégorie ainsi que la performance de chaque catégorie. C'est bon, mais j'aime voir ma formation données en parallèle avec Eval.

pour ce faire, exécutez tensorboard sur un port différent et le point à votre répertoire de train

tensorboard --logdir=${PATH_TO_TRAIN} --port=${DESIRED_NUMBER}
42
répondu eshirima 2017-09-30 20:27:00

j'ai écrit un post de blog sur le médium au sujet de mon expérience ainsi sur la façon dont j'ai formé un détecteur d'objet (en particulier, c'est un détecteur de raton laveur) avec Tensorflow sur mon propre ensemble de données. Cela pourrait également être utile pour d'autres et est complémentaire à la réponse d'eshirima.

13
répondu Dat Tran 2017-07-28 08:58:54