Entrene la detección de objetos Tensorflow en el propio conjunto de datos

Después de pasar un par de días tratando de lograr esta tarea, me gustaría compartir mi experiencia sobre cómo respondí la pregunta:

¿Cómo uso TS Object Detection para entrenar usando mi propio conjunto de datos?

Esto supone que el módulo ya está instalado. Por favor, consulte su documentación si no.

Renuncia

Esta respuesta no pretende ser la forma correcta o única de entrenar el módulo de detección de objetos. Esto es simplemente porque comparto mi experiencia y lo que funcionó para mí. Estoy abierto a sugerencias y aprender más sobre esto ya que todavía soy nuevo en ML en general.

TL; DR

  1. Cree su propio conjunto de datos de formato VOC PASCAL
  2. Generar TFRecords a partir de él
  3. Configurar una tubería
  4. Visualizar

Cada sección de esta respuesta consiste en una edición correspondiente (ver a continuación). Después de leer cada sección, lea su edición también para aclaraciones. Se agregaron correcciones y sugerencias para cada sección.

Herramientas utilizadas

LabelImg : una herramienta para crear anotaciones de formato PASCAL VOC.

1. Cree su propio conjunto de datos PASCAL VOC

PD: para simplificar, la convención de nomenclatura de mi respuesta sigue a la de Pascal VOC 2012

Una ojeada al conjunto de datos de mayo de 2012 , notará que la carpeta tiene la siguiente estructura

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

Por el momento, se hicieron enmiendas a las siguientes carpetas:

Anotaciones : aquí se colocarán todos los archivos XML correspondientes a las imágenes. Utilice la herramienta sugerida arriba para crear las anotaciones. No se preocupe por las tags y ya que serán ignoradas por los binarios de entrenamiento y evaluación.

JPEGImages : Ubicación de sus imágenes reales. Asegúrese de que sean de tipo JPEG porque eso es lo que actualmente se admite para crear TFRecords utilizando su script proporcionado.

ImageSets-> Main : esto simplemente consiste en archivos de texto. Para cada clase, existe un train.txt , trainval.txt y val.txt correspondientes . A continuación se muestra una muestra de los contenidos de aeroplane_train.txt en la carpeta VOC 2012

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

La estructura es básicamente un nombre de imagen seguido por un booleano que dice si el objeto correspondiente existe en esa imagen o no. Tomemos como ejemplo la imagen 2008_000008 no consiste en un avión, por lo tanto, marcado con un -1, pero la imagen 2008_000033lo hace.

Escribí un pequeño script de Python para generar estos archivos de texto. Simplemente itere a través de los nombres de las imágenes y asigne un 1 o -1 al lado de ellos para la existencia del objeto. Añadí algo de aleatoriedad entre mis archivos de texto al mezclar los nombres de las imágenes.

Los archivos {classname} _val.txt consisten en los conjuntos de datos de validación de prueba . Piense en esto como los datos de prueba durante el entrenamiento. Desea dividir su conjunto de datos en entrenamiento y validación. Más información se puede encontrar aquí . El formato de estos archivos es similar al del entrenamiento.

En este punto, la estructura de su carpeta debe ser

+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 Generación de mapa de tags

Con el conjunto de datos preparado, debemos crear los mapas de tags correspondientes. Navegue a models / object_detection / data y abra pascal_label_map.pbtxt .

Este archivo consta de un JSON que asigna una ID y un nombre a cada elemento. Haga enmiendas a este archivo para reflejar sus objetos deseados.


2. Genera TFRecords

Si miras en su código especialmente esta línea , agarran explícitamente el tren de avión únicamente. Para las mentes curiosas, aquí está el por qué . Cambie este nombre de archivo a cualquiera de su archivo de texto de tren de clase.

Asegúrese de que VOCdevkit esté dentro de los modelos / detección_de_objetos, entonces puede continuar y generar los registros TF .

Por favor revisa su código primero si encuentras algún problema. Es autoexplicativo y está bien documentado.


3. Configuración de tubería

Las instrucciones deben ser auto explicativas para cubrir este segmento. Las configuraciones de muestra se pueden encontrar en object_detection / samples / configs .

Para aquellos que buscan entrenarse desde cero como yo lo hice, solo asegúrense de eliminar los nodos de from_detection_checkpoint fine_tune_checkpoint y from_detection_checkpoint . Aquí está mi archivo de configuración para referencia.

A partir de ahora puede continuar con el tutorial y ejecutar el proceso de capacitación.


4. Visualiza

Asegúrese de ejecutar la evaluación en paralelo a la capacitación para poder visualizar el proceso de aprendizaje. Para citar a Jonathan Huang

la mejor manera es simplemente ejecutar el binario de eval.py. Normalmente ejecutamos este binario en paralelo a la capacitación, apuntándolo al directorio que contiene el punto de control que se está entrenando. El binario eval.py escribirá los registros en un eval_dir que usted especifique, que luego podrá señalar con Tensorboard.

Desea ver que el mAP se ha “levantado” en las primeras horas, y luego desea ver cuándo converge. Es difícil decir sin mirar estos gráficos cuántos pasos necesita.


EDIT I ​​(28 de julio de 17):

Nunca esperé que mi respuesta recibiera tanta atención, así que decidí regresar y revisarla.

Herramientas

Para mis compañeros usuarios de Apple, podrían usar RectLabel para anotaciones.

Pascal VOC

Después de cavar, finalmente me di cuenta de que trainval.txt es en realidad la unión de datasets de capacitación y validación.

Por favor, mira su kit de desarrollo oficial para entender el formato aún mejor.

Generación de mapas de tags

En el momento de escribir, ID 0 representa none_of_the_above . Se recomienda que sus identificaciones comiencen desde 1.

Visualizar

Después de ejecutar su evaluación y dirigir el tensorboard a su directorio Eval, le mostrará el mAP de cada categoría junto con el rendimiento de cada categoría. Esto es bueno, pero me gusta ver mis datos de entrenamiento también en paralelo con Eval.

Para hacer esto, ejecute tensorboard en un puerto diferente y apúntelo a su directorio de trenes

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

Escribí una publicación de blog en Medium sobre mi experiencia y sobre cómo entrené un detector de objetos (en particular, es un detector de mapache) con Tensorflow en mi propio conjunto de datos. Esto también puede ser útil para otros y es complementario a la respuesta de eshirima.