Instrucciones de la API de detección de objetos TensorFlow


Traducción del tutorial de la API de detección de objetos TensorFlow - Capacitación y evaluación del detector de objetos personalizado .

Todos sabemos conducir un automóvil, es bastante fácil, ¿verdad? Pero, ¿qué harás si alguien te pide que subas al avión? Así es, leerás las instrucciones. Del mismo modo, el siguiente manual lo ayudará a configurar su API y disfrutar de un vuelo agradable.

En primer lugar, clone el repositorio por referencia . Espero que ya tengas instalado TensorFlow .

git clone github.com/tensorflow/models.git

En el aprendizaje automático, generalmente entrenamos y probamos un modelo usando un archivo CSV. Pero en este caso, actuamos de acuerdo con el esquema que se muestra en la figura:



Antes de continuar, detengámonos en la estructura de directorios que usaremos.

  • datos / - Esto contendrá registros y archivos CSV.
  • images / - Aquí hay un conjunto de datos para entrenar a nuestro modelo.
  • formación / - Aquí guardamos el modelo entrenado.
  • eval / - Esto almacenará los resultados de la evaluación del modelo.

Paso 1: guardar imágenes en CSV


Aquí todo es bastante simple. No profundizaremos en esta tarea, solo daré algunos enlaces útiles.

Nuestra tarea es etiquetar la imagen y crear archivos train.CSV y test.CSV.

  • Con la herramienta labelImg, marque la imagen. Cómo hacer esto, mira aquí .
  • Convierta XML a CSV, como se muestra aquí .

Hay muchas formas de crear archivos CSV, más o menos adecuados para trabajar con cada conjunto de datos específico.

Como parte de nuestro proyecto, intentaremos lograr la detección de ganglios pulmonares utilizando el conjunto de datos LUNA . Las coordenadas de los nodos ya se conocían y, por lo tanto, la creación de archivos CSV no fue difícil. Para encontrar los nodos, utilizamos las 6 coordenadas que se muestran a continuación:



Debe corregir solo el nombre de los nodules clase (nodos), todo lo demás permanecerá sin cambios. Una vez que los objetos marcados se presentan en forma de números, puede proceder a la creación de TFRecords.

Paso 2: crea TFRecords


La API de detección de objetos TensorFlow no acepta entradas para entrenar el modelo en formato CSV, por lo que debe crear TFRecords utilizando este archivo.

 """ Usage: # From tensorflow/models/ # Create train data: python generate_tfrecord.py --csv_input=data/train_labels.csv --output_path=train.record # Create test data: python generate_tfrecord.py --csv_input=data/test_labels.csv --output_path=test.record """ from __future__ import division from __future__ import print_function from __future__ import absolute_import import os import io import pandas as pd import tensorflow as tf from PIL import Image from object_detection.utils import dataset_util from collections import namedtuple, OrderedDict flags = tf.app.flags flags.DEFINE_string('csv_input', '', 'Path to the CSV input') flags.DEFINE_string('output_path', '', 'Path to output TFRecord') FLAGS = flags.FLAGS # TO-DO replace this with label map def class_text_to_int(row_label): if row_label == 'raccoon': return 1 else: None def split(df, group): data = namedtuple('data', ['filename', 'object']) gb = df.groupby(group) return [data(filename, gb.get_group(x)) for filename, x in zip(gb.groups.keys(), gb.groups)] def create_tf_example(group, path): with tf.gfile.GFile(os.path.join(path, '{}'.format(group.filename)), 'rb') as fid: encoded_jpg = fid.read() encoded_jpg_io = io.BytesIO(encoded_jpg) image = Image.open(encoded_jpg_io) width, height = image.size filename = group.filename.encode('utf8') image_format = b'jpg' xmins = [] xmaxs = [] ymins = [] ymaxs = [] classes_text = [] classes = [] for index, row in group.object.iterrows(): xmins.append(row['xmin'] / width) xmaxs.append(row['xmax'] / width) ymins.append(row['ymin'] / height) ymaxs.append(row['ymax'] / height) classes_text.append(row['class'].encode('utf8')) classes.append(class_text_to_int(row['class'])) tf_example = tf.train.Example(features=tf.train.Features(feature={ 'image/height': dataset_util.int64_feature(height), 'image/width': dataset_util.int64_feature(width), 'image/filename': dataset_util.bytes_feature(filename), 'image/source_id': dataset_util.bytes_feature(filename), 'image/encoded': dataset_util.bytes_feature(encoded_jpg), 'image/format': dataset_util.bytes_feature(image_format), 'image/object/bbox/xmin': dataset_util.float_list_feature(xmins), 'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs), 'image/object/bbox/ymin': dataset_util.float_list_feature(ymins), 'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs), 'image/object/class/text': dataset_util.bytes_list_feature(classes_text), 'image/object/class/label': dataset_util.int64_list_feature(classes), })) return tf_example def main(_): writer = tf.python_io.TFRecordWriter(FLAGS.output_path) path = os.path.join(os.getcwd(), 'images') examples = pd.read_csv(FLAGS.csv_input) grouped = split(examples, 'filename') for group in grouped: tf_example = create_tf_example(group, path) writer.write(tf_example.SerializeToString()) writer.close() output_path = os.path.join(os.getcwd(), FLAGS.output_path) print('Successfully created the TFRecords: {}'.format(output_path)) if __name__ == '__main__': tf.app.run() 

Después de descargar el archivo, realice un pequeño cambio: en la línea 31, en lugar de la palabra raccoon ponga su propia marca. En el ejemplo dado, estos son nodules , nodos. Si su modelo necesita definir varios tipos de objetos, cree clases adicionales.

Nota La numeración de las etiquetas debe comenzar desde uno, no desde cero. Por ejemplo, si usa tres tipos de objetos, se les debe asignar los valores 1, 2 y 3, respectivamente.

Use el siguiente código para crear el archivo train.record :

 python generate_tfRecord.py --CSV_input=data/train.CSV --output_path=data/train.record 

Use el siguiente código para crear el archivo test.record :

 python generate_tfrecord.py — CSV_input=data/test.CSV — output_path=data/test.record 

Paso 3: entrenamiento modelo


Una vez que se crean los archivos que necesitamos, estamos casi listos para comenzar a aprender.

  1. Seleccione el modelo a enseñar. Debe encontrar un compromiso entre velocidad y precisión: cuanto mayor sea la velocidad, menor será la precisión de la determinación y viceversa. Aquí, sd_mobilenet_v1_coco usa como ejemplo.
  2. Después de decidir con qué modelo trabajará, descargue el archivo de configuración apropiado . En este ejemplo, esto es ssd_mobilenet_v1_coco.config .
  3. Cree un archivo object-detect.pbtxt que tenga este aspecto:

     item { id: 1 name: 'nodule' } 

    Dale al nodule nombre diferente. Si hay varias clases, aumente el valor de id e ingrese nuevos nombres.

Es hora de configurar el archivo de configuración, haciendo los siguientes ajustes.

Cambie el número de clases de acuerdo a sus requerimientos.

 #before num_classes: 90 #After num_classes: 1 

Si la potencia de su GPU es insuficiente, baje el valor del batch_size del batch_size .

 batch_size: 24 

Especifique la ruta al modelo ssd_mobilenet_v1_coco que hemos descargado anteriormente.

 #before fine_tune_checkpoint: "PATH_TO_BE_CONFIGURED/model.ckpt" #after fine_tune_checkpoint: "ssd_mobilenet_v1_coco/model.ckpt" 

Especifique la ruta al archivo train.record .

 #before train_input_reader: { tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/mscoco_train.record" } label_map_path: "PATH_TO_BE_CONFIGURED/mscoco_label_map.pbtxt" } #after train_input_reader: { tf_record_input_reader { input_path: "data/train.record" } label_map_path: "data/object-detection.pbtxt" } 

Especifique la ruta al archivo test.record.

 #before eval_input_reader: { tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/mscoco_val.record" } label_map_path: "PATH_TO_BE_CONFIGURED/mscoco_label_map.pbtxt" shuffle: false num_readers: 1} #after eval_input_reader: { tf_record_input_reader { input_path: "data/test.record" } label_map_path: "data/object-detection.pbtxt" shuffle: false num_readers: 1} 

Ahora copie las carpetas de datos / e imágenes / a las carpetas de modelos / investigación / detección de objetos . Si se le solicita que combine carpetas, acéptelo.

Además, necesitaremos el archivo train.py ubicado en el directorio de detección de objetos / .

 cd models/research/object-detection 

Cree la carpeta de entrenamiento / en la carpeta / detección de objetos . Está en formación / salvaremos nuestro modelo. Copie ssd_mobilenet_v1_coco.config en el archivo de entrenamiento / configuración. El entrenamiento se realiza usando el comando:

 python train.py --logtostderr \ --train_dir=training/ \ --pipeline_config_path=training/ssd_mobilenet_v1_coco.config 

Si todo va según el plan, verá cómo cambia la función de pérdida en cada etapa.

Paso 4: Evaluación del modelo


Finalmente, evaluamos el modelo almacenado en el directorio training / . Para hacer esto, ejecute el archivo eval.py e ingrese el siguiente comando:

 python eval.py \ --logtostderr \ --pipeline_config_path=training/ssd_mobilenet_v1_coco.config \ --checkpoint_dir=training/ \ --eval_dir=eval/ 

Los resultados de la verificación se reflejarán en la carpeta eval / . Se pueden visualizar con TensorBoard.

 #To visualize the eval results tensorboard --logdir=eval/ #TO visualize the training results tensorboard --logdir=training/ 

Abra el enlace a través de un navegador. En la pestaña Imágenes , verá los resultados del modelo:



Eso es todo, ha configurado correctamente la API de detección de objetos TensorFlow.

Uno de los errores más comunes:

No module named deployment on object_detection/train.py

Se resuelve usando el comando:

 # From tensorflow/models/research/ export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim 

Puede leer sobre las formas de cambiar los parámetros Faster-RCNN / SSD aquí .

Gracias por su atencion!

Source: https://habr.com/ru/post/es422353/


All Articles