对python制作自己的数据集实例讲解


Posted in Python onDecember 12, 2018

一、数据集介绍

点击打开链接17_Category_Flower 是一个不同种类鲜花的图像数据,包含 17 不同种类的鲜花,每类 80 张该类鲜花的图片,鲜花种类是英国地区常见鲜花。下载数据后解压文件,然后将不同的花剪切到对应的文件夹,如下图所示:

对python制作自己的数据集实例讲解

每个文件夹下面有80个图片文件。

二、使用的工具

首先是在tensorflow框架下,然后介绍一下用到的两个库,一个是os,一个是PIL。PIL(Python Imaging Library)是 Python 中最常用的图像处理库,而Image类又是 PIL库中一个非常重要的类,通过这个类来创建实例可以有直接载入图像文件,读取处理过的图像和通过抓取的方法得到的图像这三种方法。

三、代码实现

我们是通过TFRecords来创建数据集的,TFRecords其实是一种二进制文件,虽然它不如其他格式好理解,但是它能更好的利用内存,更方便复制和移动,并且不需要单独的标签文件(label)。

1、制作TFRecords文件

import os
import tensorflow as tf
from PIL import Image # 注意Image,后面会用到
import matplotlib.pyplot as plt
import numpy as np
 
cwd = 'D:\PyCharm Community Edition 2017.2.3\Work\google_net\jpg\\'
classes = {'daffodil', 'snowdrop', 'lilyvalley', 'bluebell', 'crocus', 'iris', 'tigerlily', 'tulip', 'fritiuary',
  'sunflower', 'daisy', 'coltsfoot', 'dandelion', 'cowslip', 'buttercup', 'windflower', 'pansy'} # 花为 设定 17 类
writer = tf.python_io.TFRecordWriter("flower_train.tfrecords") # 要生成的文件
 
for index, name in enumerate(classes):
 class_path = cwd + name + '\\'
 for img_name in os.listdir(class_path):
 img_path = class_path + img_name # 每一个图片的地址
 img = Image.open(img_path)
 img = img.resize((224, 224))
 img_raw = img.tobytes() # 将图片转化为二进制格式
 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]))
 })) # example对象对label和image数据进行封装
 writer.write(example.SerializeToString()) # 序列化为字符串
writer.close()

对python制作自己的数据集实例讲解

首先将文件移动到对应的路径:

D:\PyCharm Community Edition 2017.2.3\Work\google_net\jpg

然后对每个文件下的图片进行读写和相应的大小惊醒改变,具体过程是使用tf.train.Example来定义我们要填入的数据格式,其中label即为标签,也就是最外层的文件夹名字,img_raw为易经理二进制化的图片。然后使用tf.python_io.TFRecordWriter来写入。基本的,一个Example中包含Features,Features里包含Feature(这里没s)的字典。最后,Feature里包含有一个 FloatList, 或者ByteList,或者Int64List。就这样,我们把相关的信息都存到了一个文件中,所以前面才说不用单独的label文件。而且读取也很方便。

执行完以上代码就会出现如下图所示的TF文件

对python制作自己的数据集实例讲解

2、读取TFRECORD文件

制作完文件后,将该文件读入到数据流中,具体代码如下:

def read_and_decode(filename): # 读入dog_train.tfrecords
 filename_queue = tf.train.string_input_producer([filename]) # 生成一个queue队列
 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),
     }) # 将image数据和label取出来
 
 img = tf.decode_raw(features['img_raw'], tf.uint8)
 img = tf.reshape(img, [224, 224, 3]) # reshape为128*128的3通道图片
 img = tf.cast(img, tf.float32) * (1. / 255) - 0.5 # 在流中抛出img张量
 label = tf.cast(features['label'], tf.int32) # 在流中抛出label张量
 return img, label

注意,feature的属性“label”和“img_raw”名称要和制作时统一 ,返回的img数据和label数据一一对应。

3、显示tfrecord格式的图片

为了知道TF 文件的具体内容,或者是怕图片对应的label出错,可以将数据流以图片的形式读出来并保存以便查看,具体的代码如下:

filename_queue = tf.train.string_input_producer(["flower_train.tfrecords"]) # 读入流中
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),
     }) # 取出包含image和label的feature对象
image = tf.decode_raw(features['img_raw'], tf.uint8)
image = tf.reshape(image, [224, 224, 3])
label = tf.cast(features['label'], tf.int32)
label = tf.one_hot(label, 17, 1, 0)
with tf.Session() as sess: # 开始一个会话
 init_op = tf.initialize_all_variables()
 sess.run(init_op)
 coord = tf.train.Coordinator()
 threads = tf.train.start_queue_runners(coord=coord)
 for i in range(100):
 example, l = sess.run([image, label]) # 在会话中取出image和label
 img = Image.fromarray(example, 'RGB') # 这里Image是之前提到的
 img.save(cwd + str(i) + '_''Label_' + str(l) + '.jpg') # 存下图片
 print(example, l)
 coord.request_stop()
 coord.join(threads)

执行以上代码后,当前项目对应的文件夹下会生成100张图片,还有对应的label,如下图所示:

对python制作自己的数据集实例讲解

在这里我们可以看到,前80个图片文件的label是1,后20个图片的label是2。 由此可见,我们一开始制作tfrecord文件时,图片分类正确。

完整代码如下:

import os
import tensorflow as tf
from PIL import Image # 注意Image,后面会用到
import matplotlib.pyplot as plt
import numpy as np
 
cwd = 'D:\PyCharm Community Edition 2017.2.3\Work\google_net\jpg\\'
classes = {'daffodil', 'snowdrop', 'lilyvalley', 'bluebell', 'crocus', 'iris', 'tigerlily', 'tulip', 'fritiuary',
  'sunflower', 'daisy', 'coltsfoot', 'dandelion', 'cowslip', 'buttercup', 'windflower', 'pansy'} # 花为 设定 17 类
writer = tf.python_io.TFRecordWriter("flower_train.tfrecords") # 要生成的文件
 
for index, name in enumerate(classes):
 class_path = cwd + name + '\\'
 for img_name in os.listdir(class_path):
 img_path = class_path + img_name # 每一个图片的地址
 img = Image.open(img_path)
 img = img.resize((224, 224))
 img_raw = img.tobytes() # 将图片转化为二进制格式
 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]))
 })) # example对象对label和image数据进行封装
 writer.write(example.SerializeToString()) # 序列化为字符串
writer.close()
 
 
def read_and_decode(filename): # 读入dog_train.tfrecords
 filename_queue = tf.train.string_input_producer([filename]) # 生成一个queue队列
 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),
     }) # 将image数据和label取出来
 
 img = tf.decode_raw(features['img_raw'], tf.uint8)
 img = tf.reshape(img, [224, 224, 3]) # reshape为128*128的3通道图片
 img = tf.cast(img, tf.float32) * (1. / 255) - 0.5 # 在流中抛出img张量
 label = tf.cast(features['label'], tf.int32) # 在流中抛出label张量
 return img, label
 
 
filename_queue = tf.train.string_input_producer(["flower_train.tfrecords"]) # 读入流中
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),
     }) # 取出包含image和label的feature对象
image = tf.decode_raw(features['img_raw'], tf.uint8)
image = tf.reshape(image, [224, 224, 3])
label = tf.cast(features['label'], tf.int32)
label = tf.one_hot(label, 17, 1, 0)
with tf.Session() as sess: # 开始一个会话
 init_op = tf.initialize_all_variables()
 sess.run(init_op)
 coord = tf.train.Coordinator()
 threads = tf.train.start_queue_runners(coord=coord)
 for i in range(100):
 example, l = sess.run([image, label]) # 在会话中取出image和label
 img = Image.fromarray(example, 'RGB') # 这里Image是之前提到的
 img.save(cwd + str(i) + '_''Label_' + str(l) + '.jpg') # 存下图片
 print(example, l)
 coord.request_stop()
 coord.join(threads)

本人也是刚刚学习深度学习,能力有限,不足之处请见谅,欢迎大牛一起讨论,共同进步!

以上这篇对python制作自己的数据集实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的ini文件操作类分享
Nov 20 Python
numpy找出array中的最大值,最小值实例
Apr 03 Python
python 字符串和整数的转换方法
Jun 25 Python
python绘制中国大陆人口热力图
Nov 07 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
Python API自动化框架总结
Nov 12 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
Mar 13 Python
python3 简单实现组合设计模式
Jul 02 Python
Python操作Elasticsearch处理timeout超时
Jul 17 Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 Python
python3中确保枚举值代码分析
Dec 02 Python
python实现简单倒计时功能
Apr 21 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 #Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 #Python
对python数据切割归并算法的实例讲解
Dec 12 #Python
python实现文本界面网络聊天室
Dec 12 #Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
Dec 12 #Python
python实现简单多人聊天室
Dec 11 #Python
在python中利用KNN实现对iris进行分类的方法
Dec 11 #Python
You might like
PHP版微信公众平台红包API
2015/04/02 PHP
轻松实现php文件上传功能
2017/02/17 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
php实现简易计算器
2020/08/28 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
javascript中join方法实例讲解
2019/02/21 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
Django 登陆验证码和中间件的实现
2018/08/17 Python
Python列表与元组的异同详解
2019/07/02 Python
简单介绍django提供的加密算法
2019/12/18 Python
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
财务管理个人自荐书范文
2013/11/24 职场文书
室内设计专业个人的自我评价
2013/12/18 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
装修施工安全责任书
2014/07/24 职场文书
学生会辞职信
2015/03/02 职场文书
公司档案管理制度
2015/08/05 职场文书
团结友爱主题班会
2015/08/13 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
只用Python就可以制作的简单词云
2021/06/07 Python