一. 准备原始数据
首先,我们需要准备训练的原始数据,本次训练为图像分类识别,因而一开始,笔者从网上随机的下载了Dog的四种类别:husky,jiwawa,poodle,qiutian。每种类别30种,一共120张图片。在训练之前,需要做的就是进行图像的预处理,即将这些大小不一的原始图片转换成我们训练需要的shape。
下载的原始图片分别放到同一文件的不同文件夹下,如:
二. 编程实现
该部分包括:制作Tfrecords,读取Tfrecords数据获得iamge和label,打印验证并保存生成的图片。
-
-
- import os
- import tensorflow as tf
- from PIL import Image
-
-
- orig_picture = 'E:/train_test/train_data/generate_sample/'
-
-
- gen_picture = 'E:/Re_train/image_data/inputdata/'
-
-
- classes = {'husky','jiwawa','poodle','qiutian'}
-
-
- num_samples = 120
-
-
- def create_record():
- writer = tf.python_io.TFRecordWriter("dog_train.tfrecords")
- for index, name in enumerate(classes):
- class_path = orig_picture +"/"+ name+"/"
- for img_name in os.listdir(class_path):
- img_path = class_path + img_name
- img = Image.open(img_path)
- img = img.resize((64, 64))
- img_raw = img.tobytes()
- print (index,img_raw)
- example = tf.train.Example(
- features=tf.train.Features(feature={
- "label": tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),
- 'img_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw]))
- }))
- writer.write(example.SerializeToString())
- writer.close()
-
-
- def read_and_decode(filename):
-
- filename_queue = tf.train.string_input_producer([filename])
-
- reader = tf.TFRecordReader()
-
- _, serialized_example = reader.read(filename_queue)
-
-
- features = tf.parse_single_example(
- serialized_example,
- features={
- 'label': tf.FixedLenFeature([], tf.int64),
- 'img_raw': tf.FixedLenFeature([], tf.string)
- })
- label = features['label']
- img = features['img_raw']
- img = tf.decode_raw(img, tf.uint8)
- img = tf.reshape(img, [64, 64, 3])
-
- label = tf.cast(label, tf.int32)
- return img, label
-
-
- if __name__ == '__main__':
- create_record()
- batch = read_and_decode('dog_train.tfrecords')
- init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
-
- with tf.Session() as sess:
- sess.run(init_op)
- coord=tf.train.Coordinator()
- threads= tf.train.start_queue_runners(coord=coord)
-
- for i in range(num_samples):
- example, lab = sess.run(batch)
- img=Image.fromarray(example, 'RGB')
- img.save(gen_picture+'/'+str(i)+'samples'+str(lab)+'.jpg')
- print(example, lab)
- coord.request_stop()
- coord.join(threads)
- sess.close()
-
-
运行程序,得到的结果都保存在gen_picture文件中。一方面,我们可以通过生成图片的命名,验证label是否与图片对应;另一方面,我们将生成的120张图片按照图片命名中的label,分别放到四个不同的文件夹下,作为后续操作的inputdata数据,如下:
此处生成的四类图片husky,jiwawa,poodle,qiutian;其shape = 64 x 64,大小一致,一共120张