neural network examples descargar course tensorflow

network - ¿Cómo convierto un directorio de imágenes jpeg a archivos TFRecords en tensorflow?



tensorflow neural network (4)

Tengo datos de entrenamiento que son un directorio de imágenes jpeg y un archivo de texto correspondiente que contiene el nombre del archivo y la etiqueta de categoría asociada. Estoy tratando de convertir estos datos de entrenamiento en un archivo tfrecords como se describe en la documentación de tensorflow. He pasado bastante tiempo tratando de hacer que esto funcione, pero no hay ejemplos en tensorflow que demuestren cómo usar cualquiera de los lectores para leer en archivos jpeg y agregarlos a un archivo tfrecord usando tfrecordwriter.


El modelo de inicio de Tensorflow tiene un archivo build_image_data.py que puede lograr lo mismo con la suposición de que cada subdirectorio representa una etiqueta.


Espero que esto ayude:

filename_queue = tf.train.string_input_producer([''/Users/HANEL/Desktop/tf.png'']) # list of files to read reader = tf.WholeFileReader() key, value = reader.read(filename_queue) my_img = tf.image.decode_png(value) # use decode_png or decode_jpeg decoder based on your files. init_op = tf.initialize_all_variables() with tf.Session() as sess: sess.run(init_op) # Start populating the filename queue. coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) for i in range(1): #length of your filename list image = my_img.eval() #here is your image Tensor :) print(image.shape) Image.show(Image.fromarray(np.asarray(image))) coord.request_stop() coord.join(threads)

Para obtener todas las imágenes como una matriz de tensores, use el siguiente ejemplo de código.

Repo de Github de ImageFlow

Actualizar:

En la respuesta anterior, le dije cómo leer una imagen en formato TF, pero no guardarla en TFRecords. Para eso deberías usar:

def _int64_feature(value): return tf.train.Feature(int64_list=tf.train.Int64List(value=[value])) def _bytes_feature(value): return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) # images and labels array as input def convert_to(images, labels, name): num_examples = labels.shape[0] if images.shape[0] != num_examples: raise ValueError("Images size %d does not match label size %d." % (images.shape[0], num_examples)) rows = images.shape[1] cols = images.shape[2] depth = images.shape[3] filename = os.path.join(FLAGS.directory, name + ''.tfrecords'') print(''Writing'', filename) writer = tf.python_io.TFRecordWriter(filename) for index in range(num_examples): image_raw = images[index].tostring() example = tf.train.Example(features=tf.train.Features(feature={ ''height'': _int64_feature(rows), ''width'': _int64_feature(cols), ''depth'': _int64_feature(depth), ''label'': _int64_feature(int(labels[index])), ''image_raw'': _bytes_feature(image_raw)})) writer.write(example.SerializeToString())

Más información here

Y lees los datos de esta manera:

# Remember to generate a file name queue of you ''train.TFRecord'' file path def read_and_decode(filename_queue): reader = tf.TFRecordReader() _, serialized_example = reader.read(filename_queue) features = tf.parse_single_example( serialized_example, dense_keys=[''image_raw'', ''label''], # Defaults are not specified since both keys are required. dense_types=[tf.string, tf.int64]) # Convert from a scalar string tensor (whose single string has image = tf.decode_raw(features[''image_raw''], tf.uint8) image = tf.reshape(image, [my_cifar.n_input]) image.set_shape([my_cifar.n_input]) # OPTIONAL: Could reshape into a 28x28 image and apply distortions # here. Since we are not applying any distortions in this # example, and the next step expects the image to be flattened # into a vector, we don''t bother. # Convert from [0, 255] -> [-0.5, 0.5] floats. image = tf.cast(image, tf.float32) image = tf.cast(image, tf.float32) * (1. / 255) - 0.5 # Convert label from a scalar uint8 tensor to an int32 scalar. label = tf.cast(features[''label''], tf.int32) return image, label


Tenga en cuenta que las imágenes se guardarán en TFRecord como tensores sin comprimir, posiblemente aumentando el tamaño en un factor de aproximadamente 5. Eso está desperdiciando espacio de almacenamiento, y es probable que sea bastante lento debido a la cantidad de datos que deben leerse.

Es mucho mejor simplemente guardar el nombre de archivo en el TFRecord y leer el archivo a pedido. La nueva API de Dataset funciona bien, y la documentación tiene este ejemplo:

# Reads an image from a file, decodes it into a dense tensor, and resizes it # to a fixed shape. def _parse_function(filename, label): image_string = tf.read_file(filename) image_decoded = tf.image.decode_jpeg(image_string) image_resized = tf.image.resize_images(image_decoded, [28, 28]) return image_resized, label # A vector of filenames. filenames = tf.constant(["/var/data/image1.jpg", "/var/data/image2.jpg", ...]) # `labels[i]` is the label for the image in `filenames[i]. labels = tf.constant([0, 37, ...]) dataset = tf.data.Dataset.from_tensor_slices((filenames, labels)) dataset = dataset.map(_parse_function)


Tengo el mismo problema, también.

Así que aquí es cómo obtengo los archivos tfrecords de mis propios archivos jpeg

Editar: agregue sol 1 - una manera mejor y más rápida

(Recomendado) Solución 1:

Desde tensorflow official github: Cómo construir un nuevo Dataset para Retraining , use el script oficial de python build_image_data.py directamente y bazel es una mejor idea.

Aquí está la instrucción:

Para ejecutar build_image_data.py , puede ejecutar la siguiente línea de comando:

# location to where to save the TFRecord data. OUTPUT_DIRECTORY=$HOME/my-custom-data/ # build the preprocessing script. bazel build inception/build_image_data # convert the data. bazel-bin/inception/build_image_data / --train_directory="${TRAIN_DIR}" / --validation_directory="${VALIDATION_DIR}" / --output_directory="${OUTPUT_DIRECTORY}" / --labels_file="${LABELS_FILE}" / --train_shards=128 / --validation_shards=24 / --num_threads=8

donde el $OUTPUT_DIRECTORY es la ubicación de los TFRecords TFRecords . El $LABELS_FILE será un archivo de texto leído por el script que proporciona una lista de todas las etiquetas.

entonces, debería hacer el truco.

PD. bazel, que está hecho por Google, convierte el código en makefile.

Solución 2:

En primer lugar, hago referencia a las instrucciones de @capitalistpug y verifico el archivo de script de shell

(archivo de script de shell provisto por Google: download_and_preprocess_flowers.sh )

En segundo lugar, también descubrí un mini tutorial de entrenamiento de inception-v3 por NVIDIA

( ENTRENAMIENTO DE VELOCIDAD oficial de NVIDIA CON FLUJO DE TENSOR ACELERADO POR GPU )

Tenga cuidado , los siguientes pasos deben ser ejecutados en el entorno Bazel WORKSAPCE

para que el archivo de compilación Bazel pueda ejecutarse con éxito

Primer paso , comente la parte de descargar el conjunto de datos de imagenet que ya descargué

y el resto de la parte que no necesito de download_and_preprocess_flowers.sh

Segundo paso , cambiar el directorio a Tensorflow / modelos / inicio

donde está el entorno de Bazel y está construido por Bazel antes

$ cd tensorflow/models/inception

Opcional: si no está construido antes, escriba el siguiente código en cmd

$ bazel build inception/download_and_preprocess_flowers

Necesitas descubrir el contenido en la siguiente imagen

Y el último paso , escribe el siguiente código:

$ bazel-bin/inception/download_and_preprocess_flowers $Your/own/image/data/path

Luego, comenzará a invocar build_image_data.py y a crear el archivo tfrecords.