TensorFLow能夠識別的影像檔,可以通過numpy,使用tf.Variable或者tf.placeholder載入進tensorflow;也可以通過內建函數(tf.read)讀取,當影像檔過多時,一般使用pipeline通過隊列的方法進行讀取。下面我們介紹兩種產生tensorflow的映像格式的方法,供給tensorflow的graph的輸入與輸出。
1
import cv2import numpy as npimport h5pyheight = 460width = 345with h5py.File('make3d_dataset_f460.mat','r') as f:images = f['images'][:] image_num = len(images)data = np.zeros((image_num, height, width, 3), np.uint8)data = images.transpose((0,3,2,1))
先產生影像檔的路徑:ls *.jpg> list.txt
import cv2import numpy as npimage_path = './'list_file = 'list.txt'height = 48width = 48image_name_list = [] # read imagewith open(image_path + list_file) as fid:image_name_list = [x.strip() for x in fid.readlines()]image_num = len(image_name_list)data = np.zeros((image_num, height, width, 3), np.uint8)for idx in range(image_num):img = cv2.imread(image_name_list[idx])img = cv2.resize(img, (height, width))data[idx, :, :, :] = img
2 Tensorflow內建函數讀取
def get_image(image_path): """Reads the jpg image from image_path. Returns the image as a tf.float32 tensor Args: image_path: tf.string tensor Reuturn: the decoded jpeg image casted to float32 """ return tf.image.convert_image_dtype( tf.image.decode_jpeg( tf.read_file(image_path), channels=3), dtype=tf.uint8)
pipeline讀取方法
# Example on how to use the tensorflow input pipelines. The explanation can be found here ischlag.github.io.import tensorflow as tfimport randomfrom tensorflow.python.framework import opsfrom tensorflow.python.framework import dtypesdataset_path = "/path/to/your/dataset/mnist/"test_labels_file = "test-labels.csv"train_labels_file = "train-labels.csv"test_set_size = 5IMAGE_HEIGHT = 28IMAGE_WIDTH = 28NUM_CHANNELS = 3BATCH_SIZE = 5def encode_label(label): return int(label)def read_label_file(file): f = open(file, "r") filepaths = [] labels = [] for line in f: filepath, label = line.split(",") filepaths.append(filepath) labels.append(encode_label(label)) return filepaths, labels# reading labels and file pathtrain_filepaths, train_labels = read_label_file(dataset_path + train_labels_file)test_filepaths, test_labels = read_label_file(dataset_path + test_labels_file)# transform relative path into full pathtrain_filepaths = [ dataset_path + fp for fp in train_filepaths]test_filepaths = [ dataset_path + fp for fp in test_filepaths]# for this example we will create or own test partitionall_filepaths = train_filepaths + test_filepathsall_labels = train_labels + test_labelsall_filepaths = all_filepaths[:20]all_labels = all_labels[:20]# convert string into tensorsall_images = ops.convert_to_tensor(all_filepaths, dtype=dtypes.string)all_labels = ops.convert_to_tensor(all_labels, dtype=dtypes.int32)# create a partition vectorpartitions = [0] * len(all_filepaths)partitions[:test_set_size] = [1] * test_set_sizerandom.shuffle(partitions)# partition our data into a test and train set according to our partition vectortrain_images, test_images = tf.dynamic_partition(all_images, partitions, 2)train_labels, test_labels = tf.dynamic_partition(all_labels, partitions, 2)# create input queuestrain_input_queue = tf.train.slice_input_producer( [train_images, train_labels], shuffle=False)test_input_queue = tf.train.slice_input_producer( [test_images, test_labels], shuffle=False)# process path and string tensor into an image and a labelfile_content = tf.read_file(train_input_queue[0])train_image = tf.image.decode_jpeg(file_content, channels=NUM_CHANNELS)train_label = train_input_queue[1]file_content = tf.read_file(test_input_queue[0])test_image = tf.image.decode_jpeg(file_content, channels=NUM_CHANNELS)test_label = test_input_queue[1]# define tensor shapetrain_image.set_shape([IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS])test_image.set_shape([IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS])# collect batches of images before processingtrain_image_batch, train_label_batch = tf.train.batch( [train_image, train_label], batch_size=BATCH_SIZE #,num_threads=1 )test_image_batch, test_label_batch = tf.train.batch( [test_image, test_label], batch_size=BATCH_SIZE #,num_threads=1 )print "input pipeline ready"with tf.Session() as sess: # initialize the variables sess.run(tf.initialize_all_variables()) # initialize the queue threads to start to shovel data coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) print "from the train set:" for i in range(20): print sess.run(train_label_batch) print "from the test set:" for i in range(10): print sess.run(test_label_batch) # stop our queue threads and properly close the session coord.request_stop() coord.join(threads) sess.close()
參考資料
[1] http://ischlag.github.io/2016/06/19/tensorflow-input-pipeline-example/
[2] https://indico.io/blog/tensorflow-data-inputs-part1-placeholders-protobufs-queues/