tensorflow tf-slim

tensorflow - ¿Cómo obtener archivos mal clasificados en eval_image_classifier.py de TF-Slim?



(2)

En un nivel alto, debes hacer 3 cosas:

1) Obtenga su nombre de archivo del cargador de datos. Si está utilizando un conjunto de datos tf-slim de tfrecords, es probable que los nombres de archivo no estén almacenados en el archivo tfrec, por lo que puede que no tenga suerte allí. Sin embargo, si está consumiendo archivos de imágenes directamente del sistema de archivos con tf.WholeFileReader, puede obtener el tensor de nombres de archivo donde forma su lote:

def load_data(): train_image_names = ... # list of filenames filename_queue = tf.train.string_input_producer(train_image_names) reader = tf.WholeFileReader() image_filename, image_file = reader.read(filename_queue) image = tf.image.decode_jpeg(image_file, channels=3) .... # load your labels from somewhere return image_filename, image, label # in your eval code image_fn, image, label = load_data() filenames, images, labels = tf.train.batch( [image_fn, image, label], batch_size=32, num_threads=2, capacity=100, allow_smaller_final_batch=True)

2) Enmascare el tensor de su nombre de archivo con su resultado después de hacer la inferencia:

logits = my_network(images) preds = tf.argmax(logits, 1) mislabeled = tf.not_equal(preds, labels) mislabeled_filenames = tf.boolean_mask(filenames, mislabeled)

3) Pon todo esto en tu eval_op:

eval_op = tf.Print(eval_op, [mislabeled_filenames]) slim.evaluation.evaluate_once( .... # other options eval_op=eval_op, .... # other options)

No tengo una configuración para probar esto, desafortunadamente. ¡Déjame saber si funciona!

Estoy usando un script que viene con TF-Slim para validar mi modelo entrenado. Funciona bien, pero me gustaría obtener una lista de los archivos mal clasificados.

El script hace uso de https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/slim/python/slim/evaluation.py pero incluso allí no puedo encontrar ninguna opción para imprimir los archivos mal clasificados.

¿Cómo puedo lograr eso?


shadow chris me indicó la dirección correcta, así que comparto mi solución para que funcione con un conjunto de datos de registros TF.

Para mejor entender, relaciono mi código con el ejemplo floral de TF-Slim.

1) Modifique su secuencia de comandos de conjunto de datos para almacenar una característica de nombre de archivo en los registros TF.

keys_to_features = { ''image/encoded'': tf.FixedLenFeature((), tf.string, default_value=''''), ''image/format'': tf.FixedLenFeature((), tf.string, default_value=''png''), ''image/class/label'': tf.FixedLenFeature( [], tf.int64, default_value=tf.zeros([], dtype=tf.int64)), ''image/filename'': tf.FixedLenFeature((), tf.string, default_value=''''), } items_to_handlers = { ''image'': slim.tfexample_decoder.Image(), ''label'': slim.tfexample_decoder.Tensor(''image/class/label''), ''filename'': slim.tfexample_decoder.Tensor(''image/filename''), }

2) Agregue el parámetro de nombre de archivo a la función image_to_tfexample data util

Debería verse así:

def image_to_tfexample(image_data, image_format, height, width, class_id, filename): return tf.train.Example(features=tf.train.Features(feature={ ''image/encoded'': bytes_feature(image_data), ''image/format'': bytes_feature(image_format), ''image/class/label'': int64_feature(class_id), ''image/height'': int64_feature(height), ''image/width'': int64_feature(width), ''image/filename'': bytes_feature(filename) }))

3) Modificar la descarga y la secuencia de comandos de conversión para guardar los nombres de archivo

Alimente su registro TF con el nombre del archivo.

example = dataset_utils.image_to_tfexample( image_data, ''jpg'', height, width, class_id, filenames[i])

4) En su mapa de evaluación clasifica incorrectamente imgs a nombre de archivo

Me estoy refiriendo a eval_image_classifier.py .

Recupere nombres de archivo con tf.train.batch:

images, labels, filenames = tf.train.batch( [image, label, filename], batch_size=FLAGS.batch_size, num_threads=FLAGS.num_preprocessing_threads, capacity=5 * FLAGS.batch_size)

Obtener imgs mal clasificados y asignarlos a nombres de archivos:

predictions = tf.argmax(logits, 1) labels = tf.squeeze(labels) mislabeled = tf.not_equal(predictions, labels) mislabeled_filenames = tf.boolean_mask(filenames, mislabeled)

Impresión:

eval_op = tf.Print(eval_op, [mislabeled_filenames]) slim.evaluation.evaluate_once( .... # other options eval_op=eval_op, .... # other options)