赞
踩
接触Tensorflow一个月以来,总算有点感觉。最近一边查文档一边自己摸索,利用Tensorflow构建了自己的图片数据集TFrecords。接下来,我将步骤及用到的相关知识一一记录下来,望大家指点。
用到的原始数据形式截图如下:(用的是fgvc-aircraft-2013b数据集)
制作这个数据集我分成了两步:
第一步:将图片按照给定txt里面的标签复制到指定文件夹中;
第二步:将指定文件夹里的图片制作成Tfrecord格式。
第一步先贴代码:
- # -*- coding:utf-8 -*-
- import shutil
- import os.path
-
- data_label_dir = "./data/images_variant_trainval.txt"
- f = open(data_label_dir,'r')
- s = f.readlines()
- i = 1
- dict = {}
- for line in s:
- dict[line[:7]] = line[8:-1]
- print(dict)
- for key,value in dict.items():
- dir = "./images_variant_trainval/%s/" % (value)
- if not os.path.exists(dir):
- print("目录 ""%s"" 不存在!自动创建该目录..." % dir)
- os.makedirs(dir)
- jpgfile = "./data/images/%s" % (key + '.jpg')
- newfile = "./images_variant_trainval/%s/%s" % (value, key + '.jpg')
- shutil.copyfile(jpgfile,newfile)
- i += 1
- while (i%10000) == 0:
- print("程序正在运行中...")
- f.close()
接下来逐行解释:
第一部分:
- # -*- coding:utf-8 -*-
- import shutil
- import os.path
第一行代码:
# -*- coding:utf-8 -*-
PY文件当中是不支持中文的,即使你输入的注释是中文也不行,为了解决这个问题,就需要把文件编码类型改为UTF-8的类型,输入这个代码就可以让PY源文件里面有中文了。
建议你写代码之前都把这句话加上,因为不管是注释还是弹出消息提示,免不了的要输入中文,所以这个基本是必须的。
(具体参考:点击打开链接)
第二行代码:
- import shutil
- import os.path
shutil 名字来源于 shell utilities,有学习或了解过Linux的人应该都对 shell 不陌生,可以借此来记忆模块的名称。该模块拥有许多文件(夹)操作的功能,包括复制、移动、重命名、删除等等。(具体参考:点击打开链接)
os模块包含普遍的操作系统功能。本文用它是为了查找文件路径。(具体参考:点击打开链接)
第二部分:
- data_label_dir = "./data/images_variant_trainval.txt"
- f = open(data_label_dir,'r')
- s = f.readlines()
- i = 1
- dict = {}
- for line in s:
- dict[line[:7]] = line[8:-1]
- print(dict)
第一行代码:
data_label_dir = "./data/images_variant_trainval.txt"
将txt地址传给参数data_label_dir。该文件中含有图片的名称和对应的标签,其txt文件部分如图所示:(前者为图片名称,后者为标签)
第二行代码:
f = open(data_label_dir,'r')
以只读方式打开文件。(关于文件打开方式详见:点击打开链接)
第三行代码:
s = f.readlines()
该方法每次读出一行内容。(关于Python中read()、readline()和readlines()三者间的区别和用法参考:点击打开链接)
剩余代码:
- dict = {}
- for line in s:
- dict[line[:7]] = line[8:-1]
- print(dict)
建立空字典。对于txt文件中的每一行建立键值对。dict[line[:7]] = line[8:-1]表示提取图片名称为键,对应型号为值。空格算一个字符,从左往右数,第一个字符为1;从右往左数,第一个字符为-1。
结果如图所示:
第三部分:
- for key,value in dict.items():
- dir = "./images_variant_trainval/%s/" % (value)
- if not os.path.exists(dir):
- print("目录 ""%s"" 不存在!自动创建该目录..." % dir)
- os.makedirs(dir)
第一行代码:读取字典中的键值对。
第二行代码:以值(飞机型号)为文件名传递给参数dir。
剩余代码:如果该地址不存在,则创建该地址的文件夹。
结果如图所示:
碰到的问题:在text中有两个飞机型号为F-16A/B,F/A-18,反斜杠"\"是DOS和Windows系统里代表文件目录的符号,不能在文件名里使用,而出现斜杠"/"时,系统会等同为反斜杠"\"。如果一定要用斜杠作文件名的话,只能用全角符号里的斜杠,在把中文输入法里的月牙点成满月里就可以用了。但是我试过之后在后续查找时又出现了问题,因此就没改,创建了子文件夹。
第四部分:
- jpgfile = "./data/images/%s" % (key + '.jpg')
- newfile = "./images_variant_trainval/%s/%s" % (value, key + '.jpg')
- shutil.copyfile(jpgfile,newfile)
- i += 1
- while (i%10000) == 0:
- print("程序正在运行中...")
- f.close()
第一二行代码:将旧文件地址传给参数jpgfile,将新文件夹地址传给newfile。
第三行代码:将旧文件夹中的图片复制给新文件夹中。
第四五六行代码:每完成10000张图片的复制,输出”程序正在运行中”,以提示程序正在运行
剩余代码:关闭文件。
关于将图片数据集制作成TFrecords格式详见文章《Tensorflow之构建自己的图片数据集TFrecords(二)》点击打开链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。