对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 ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
wxPython中listbox用法实例详解
Jun 01 Python
Python判断某个用户对某个文件的权限
Oct 13 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
利用Python将数值型特征进行离散化操作的方法
Nov 06 Python
Python自定义一个类实现字典dict功能的方法
Jan 19 Python
python数据归一化及三种方法详解
Aug 06 Python
python数据处理之如何选取csv文件中某几行的数据
Sep 02 Python
pytorch实现seq2seq时对loss进行mask的方式
Feb 18 Python
python爬取招聘要求等信息实例
Nov 20 Python
python playwrigh框架入门安装使用
Jul 23 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
珊瑚虫IP库浅析
2007/02/15 PHP
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
js tab 选项卡
2009/04/26 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
基于bootstrap-datetimepicker.js不支持IE8的快速解决方法
2016/11/07 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
Python上下文管理器和with块详解
2017/09/09 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
自学python用什么系统好
2020/06/23 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
公司员工的自我评价范例
2013/11/01 职场文书
医学专业毕业生个人的求职信
2013/12/04 职场文书
招标承诺书
2014/08/30 职场文书
干部考核工作总结
2015/08/12 职场文书
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android