#思路是生成一个txt文件,然后用txt文件来标记label
import os
import glob
import scipy.misc as misc
from PIL import Image
import numpy as np
import tensorflow as tf
path = "/data0/user/data/fenlei/datadir"
class BatchDatset:
batch_offset = 0
epochs_completed = 0
# 初始化路径
def __init__(self, image_options, path):
self.image_options = {'resize': True, 'resize_size': IMAGE_SIZE}
self.path = "/data0/user/data/fenlei/datadir"
#
def _read_images(self):
self.__channels = True
self.all_path = []
self.solupath = []
self.label = []
# 得到模型下所有的数据绝对路径
directories = [x[0] for x in os.walk(self.path)]
# directories[0]代表的是主文件路劲,[1:]代表的是子文件夹路径
self.label = []
num = 0
for label, directory in enumerate(directories[1:]):
class_num = [os.path.join(label) for label in os.listdir(directory)]
self.all_path = [os.path.join(directory, label) for label in class_num]
self.solupath.extend(self.all_path)
for i, j in enumerate(self.all_path):
self.label.append(num)
num += 1
self.images = np.array([self._transform(img) for img in self.solupath])
return self.images, np.array(self.label)
# 将读片转化为3通道的数据
def _transform(self, filename):
image = misc.imread(filename)
if len(image.shape) < 3:
image = np.array([image for i in range(3)])
else:
image = image
return np.array(image)
def data_batch(self):
img, lab = self._read_images()
dataset = tf.data.Dataset.from_tensor_slices((img, lab))
def parse(img,lab):
# img = tf.read_file(img)
# img = tf.convert_to_tensor(img)
img = tf.image.resize_images(img,[64,64])
return img,lab
dataset = dataset.map(parse).repeat().batch(128).shuffle(512)
iterator = dataset.make_one_shot_iterator()
data, lab = iterator.get_next()
return data, lab
if __name__=='__main__':
IMAGE_SIZE=32
path ="/data0/user/data/fenlei/datadir"
image_options = {'resize': True, 'resize_size': IMAGE_SIZE}
aa=BatchDatset(image_options, path)
# data, lab = aa.data_batch()
data, lab = aa.data_batch()
# print(type(data))
with tf.Session() as sess:
for i in range(100):
# data, lab = aa.data_batch()
data1, lab1= sess.run([data,lab])
print(data1.shape,lab1.shape)
这里还有一段代码可以参考一下
#可以直接从本地中将图片读取进来
import tensorflow as tf
import os
# 根目录
path=r'/data0/shenzheng/data/fenlei/data_test/'
# 设置图像类别,高度,宽度和通道数等数值
NUM_CLASS = 2
IMAGE_HEIGHT = 28
IMAGE_WIDTH = 28
IMAGE_CHANNELS = 3 # 彩色=3,灰白=1
def read_iamge(Root_path, batch_size):
imagepaths = []
labels = []
label = 0
#os.walk(Root_path).__next__()[1]返回目录下所有文件夹的名字
classes = sorted(os.walk(Root_path).__next__()[1])
for c in classes:
c_dir = os.path.join(Root_path, c)
walk = os.walk(c_dir).__next__()[2]
for sample in walk:
if sample.endswith('.jpg') and sample.endswith('.jpeg'):
print('1')
imagepaths.append(os.path.join(c_dir, sample))
labels.append(label)
label += 1
print(imagepaths)
# 将iamgepaths 和 labels 转换为tf可以处理的格式
imagepaths = tf.convert_to_tensor(imagepaths, tf.string)
labels = tf.convert_to_tensor(labels, tf.int32)
# 建立 Queue
imagepath, label = tf.train.slice_input_producer([imagepaths, labels], shuffle=True)
# 读取图片,并进行解码
image = tf.read_file(imagepath)
image = tf.image.decode_jpeg(image, channels=IMAGE_CHANNELS)
# 对图片进行裁剪和正则化(将数值[0,255]转化为[-1,1])
image = tf.image.resize_images(image, size=[IMAGE_HEIGHT, IMAGE_WIDTH])
image = image * 1.0 / 127.5 - 1.0
# 创建 batch
X, Y = tf.train.batch([image, label], batch_size=batch_size, num_threads=4, capacity=batch_size * 8)
return X,Y
img,lab=read_iamge(path,128)
print(img.shape,lab.shape)