制作自己的图像数据

本文介绍如何将图像数据集转换为TensorFlow可用的TFRecord格式,并实现数据的批处理加载,提高训练效率。
部署运行你感兴趣的模型镜像

利用图像数据制作能够输入Tensorflow的数据格式

文件夹格式:

ROOT_FOLDER
|

 ------ SUBFOLDER(CLASS 0)

|         |
          --- image1.jpg            
|         |
            .....           
|         | 
 ------SUBFOLDER(CLASS 1)

|         |  
         --- image1.jpg

|         |
......

### 思路:

在我们学习Tensorflow时,一般是直接导入mnist的数据,而对于我们具有的几类图像,该如何导入数据用于卷积神经网络呢?

在Tensorflow中可以先把数据保存为TFrecord格式,最后再读取。不仅节省了时间,增加了效率,而且节省了内存。

# 首先将图片数据保存为TFrecord格式

import os
import numpy as np
import tensorflow as tf
from PIL import Image
# 可以更改的参数

height = 512 # 需要输出图片高度
weight = 512 # 需要输出图片宽度
channel = 3 # 图片模式
batch_size = 32
Data_Path = "Imgdata/"
# 辅助函数
def _int64_feature(value):
    return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
def _bytes_feature(value):
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
# 生成TFRecord
def convert(data_path):
    # 先读取出所有的文件夹 并生成相对应的标签
    image_paths = []
    labels = []
    label = 0
    classes = list(os.walk(data_path))[0][1] #os.walk() 返回一个三元组,(起始路径,起始路径下的文件夹,非目录文件的名字) 
    for c in classes:
        image_path_tmp = []
        labels_tmp = []
        c_dir = os.path.join(data_path, c) # 获取文件夹的绝对路径
        walk = list(os.walk(c_dir))[0][2] # 获取所有的文件
        for sample in walk:
            if sample.endswith('.jpg') or sample.endswith('.jpeg'):
                image_path_tmp.append(os.path.join(c_dir, sample))
                labels_tmp.append(label)
        image_paths.append(image_path_tmp)
        labels.append(labels_tmp)
        label += 1  
    # 获取到了所有文件下的数据 (这里不用shuffle 后面读取的时候生成batch时可以打散)
    # 开始读取数据
    for i in range(len(image_paths)):
        out_file = '/model/output_%d.tfrecords'%i # 输出文件名
        writer = tf.python_io.TFRecordWriter(out_file)
        for k, image_path in enumerate(image_paths[i]):
            img = Image.open(image_path) # 读数据
            img = img.resize((height, weight)) # resize
            image_raw = img.tobytes() # 将图像矩阵转化为bytes
            # 将一个样例转化为Example Protocol Buffer,并将所有信息写入这个数据结构
            example = tf.train.Example(features=tf.train.Features(feature={
                        'label':_int64_feature(labels[i][k]),
                        'image_raw':_bytes_feature(image_raw)
                    }))
        writer.write(example.SerializeToString())
        writer.close()            

测试

convert(Data_Path)

每个类别可以生成一个TFRecord文件

# 开始读取并生成batch
def READ(model_path):
    # file = tf.train.match_filenames_once("E:\\PythonMachineLearning\\CARclassification\\data\\output_*")
    # 上面这一句可以自动匹配所有的tfrecord文件,但是在测试时一直出错,所以这里我手动输入 
    # 还可以利用os.walk()来获取。
    file_list = list(os.walk(model_path))[0][2]
    file = [os.path.join(model_path, file_list[i]) for i in len(file_list)] # 最终是一个list
#     file = ['/model/output_0.tfrecords', '/model/output_1.tfrecords']
    # 创建输入队列
    file_name_queue = tf.train.string_input_producer(file, shuffle=True) # 随机打散
    # 读取并解析一个样本
    reader = tf.TFRecordReader()
    _, serialized_example = reader.read(file_name_queue)
    features = tf.parse_single_example(serialized_example, features={
            'image_raw': tf.FixedLenFeature([], tf.string),
            'label': tf.FixedLenFeature([], tf.int64)
        })
    image = tf.decode_raw(features['image_raw'], tf.uint8)
    image = tf.reshape(image, [512, 512, 3])
    img = tf.cast(image, tf.float32) * (1/255) - 0.5  # 将数据值约束在 -0.5-0.5
    label = tf.cast(features['label'], tf.float32) # 都要为float32 与tensorflow对应

    # 将处理后的图像和标签数据整理成batch tf.train.shuffle_train

    min_after_dequeue = 30
    batch_size = 32
    capacity = 1000 + 3 * batch_size
    image_batch, label_batch = tf.train.shuffle_batch([img, label], batch_size=batch_size, capacity=capacity,
                                                      min_after_dequeue=min_after_dequeue)
    return image_batch, label_batch
#  注意 在测试时:需要开启多线程

with tf.Session() as sess:
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    for _ in range(max_iter): # 迭代次数
        batch_x, batch_y = sess.run([batch_img, batch_l])
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-20-e83c91f4a613> in <module>()
      4     coord = tf.train.Coordinator()
      5     threads = tf.train.start_queue_runners(sess=sess, coord=coord)
----> 6     for _ in range(max_iter): # 迭代次数
      7         batch_x, batch_y = sess.run([batch_img, batch_l])


NameError: name 'max_iter' is not defined

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

制作自己的图像分类数据集可以按照以下步骤进行: 1. 确定分类的类别:首先确定你想要分类的类别,比如猫、狗、汽车、飞机等等。确保类别之间有明确的区分度。 2. 收集图像数据:使用各种方法收集与类别相关的图像数据。你可以在互联网上搜索并下载图像,或者使用自己的相机拍摄。确保每个类别都有足够的图像数量,并且图像质量要尽可能高。 3. 数据标注:对收集到的图像进行标注,即给每个图像打上对应的类别标签。你可以手动为每个图像添加标签,或者使用专门的图像标注工具来辅助完成这一过程。 4. 数据预处理:对图像进行预处理,使其适合模型训练。常见的预处理操作包括调整图像大小、裁剪、旋转、调整亮度和对比度等。 5. 数据划分:将数据集划分为训练集、验证集和测试集。通常,大部分数据用于训练模型,一小部分用于验证模型的性能,最后一部分用于评估模型在未见过的数据上的表现。 6. 数据增强:为了增加数据的多样性和泛化能力,可以采用数据增强技术对图像进行扩充。例如,可以进行随机裁剪、旋转、翻转、缩放等操作。 7. 数据格式转换:将图像数据转换为适合模型训练的格式,如JPEG、PNG或TFRecord等。 8. 模型训练:使用收集到的图像数据集和相应的标签,训练图像分类模型。你可以选择使用深度学习框架(如TensorFlow、PyTorch)来构建和训练模型。 以上是制作自己的图像分类数据集的基本步骤。随着经验的积累,你可以进一步探索更复杂的技术和方法来提高数据集的质量和模型的准确性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值