tensorflow从本地读取数据

#思路是生成一个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)

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值