我尝试将1750 * 1750的图像输入到Tensorflow中,但在使用tf.image.decode_jpeg()函数将图像转换为张量后,我不知道如何标记和输入这些数据。
目前我的代码是这样的:
import tensorflow as tfimport numpy as npimport imageflowimport os, globsess = tf.InteractiveSession()def read_jpeg(filename_queue): reader = tf.WholeFileReader() key, value = reader.read(filename_queue) my_img = tf.image.decode_jpeg(value) my_img.set_shape([1750, 1750, 1]) print(value) return my_img#####################################################def read_image_data(): jpeg_files = [] images_tensor = [] i = 1 WORKING_PATH = "/Users/Zanhuang/Desktop/NNP/DATA" jpeg_files_path = glob.glob(os.path.join(WORKING_PATH, '*.jpeg')) for filename in jpeg_files_path: print(i) i += 1 jpeg_files.append(filename) filename_queue = tf.train.string_input_producer(jpeg_files) mlist = [read_jpeg(filename_queue) for _ in range(len(jpeg_files))] init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) images_tensor = tf.convert_to_tensor(images_tensor) sess.close()
正如我之前所说,我需要输入并标记这些数据。我看过CIFAR-10教程文件,但他们将标签存储在一个文件中,而我计划不采用这种方式。
我是Tensorflow的新手,请尽可能详细地回答我的问题。
谢谢!
回答:
根据你的需求,有几种不同的方法可以考虑。
-
如果你只是想对任意JPEG文件进行推理(即不需要标签),那么你可以参考classify_image.py的例子,它将JPEG图像输入到预训练的Inception网络中:
github.com/tensorflow/models/blob/master/tutorials/image/imagenet/classify_image.py
-
如果你确实想在一个小型的自定义JPEG图像数据集上训练(或微调)模型,那么可以参考这个例子,了解如何在一个小型JPEG图像集上训练模型。
github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/image_retraining/retrain.py
-
如果你确实想在一个大型的自定义JPEG图像数据集上训练(或微调)模型,那么读取许多单独的JPEG文件将非常低效,并且会大大减慢训练速度。
我建议你按照inception/模型库中描述的程序,将一个目录中的JPEG图像转换为包含序列化JPEG图像的分片RecordIO文件。
github.com/tensorflow/models/blob/master/research/inception/inception/data/build_image_data.py
运行转换脚本的说明在这里可以找到:
运行转换后,你可以使用/复制inception/模型使用的图像预处理流程。
github.com/tensorflow/models/blob/master/research/inception/inception/image_processing.py