对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内置函数之filter map reduce介绍
Nov 30 Python
Python下载懒人图库JavaScript特效
May 28 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
python实现图片筛选程序
Oct 24 Python
Python 利用高德地图api实现经纬度与地址的批量转换
Aug 14 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
Mar 19 Python
django配置app中的静态文件步骤
Mar 27 Python
python实现简易版学生成绩管理系统
Jun 22 Python
python两个list[]相加的实现方法
Sep 23 Python
python 生成器需注意的小问题
Sep 29 Python
python开发一款翻译工具
Oct 10 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
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
php格式文件打开的四种方法
2018/02/24 PHP
php+js实现裁剪任意形状图片
2018/10/31 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
2017/05/02 Javascript
vue组件初学_弹射小球(实例讲解)
2017/09/06 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
iview在vue-cli3如何按需加载的方法
2018/10/31 Javascript
npm qs模块使用详解
2020/02/07 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
[01:46]TI4西雅图DOTA2前线报道 中国选手抱团调时差
2014/07/08 DOTA
python3.5 email实现发送邮件功能
2018/05/22 Python
django框架自定义用户表操作示例
2018/08/07 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
使用python模拟高斯分布例子
2019/12/09 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
竞选班长演讲稿
2013/12/30 职场文书
六一亲子活动总结
2014/07/01 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
开网店计划分析
2019/07/30 职场文书
JS如何实现基于websocket的多端桥接平台
2021/05/14 Javascript