您的位置:首页 > 其它

Tensorflow之构建自己的图片数据集TFrecords(二)

2018-03-17 11:16 579 查看

    分类好了图片,接下来制作成Tfrecord格式。

    先贴代码:

import tensorflow as tf
from PIL import Image
import os

cwd = os.getcwd()
root = cwd+"./images_variant_trainval"
TFwriter = tf.python_io.TFRecordWriter("./images_variant_trainval.tfrecords")class_names = []
class_list = open('./variants.txt', "r")
for line in class_list.readlines():
line = line.strip()
class_names.append(line)
class_list.close()
class_names_to_id = dict(zip(class_names, range(len(class_names))))

for className in os.listdir(root):
classPath = root + "/" + className + "/"
for key,value in class_names_to_id.items():
if className == key:
className = value
label = int(className)

for parent, dirnames, filenames in os.walk(classPath):
for filename in filenames:
imgPath = classPath+"/"+filename
print(imgPath)
img = Image.open(imgPath)
print(img.size,img.mode)
imgRaw = img.tobytes()
example = tf.train.Example(features=tf.train.Features(feature={
"label": tf.train.Feature(int64_list=tf.train.Int64List(value=[label])),
"img":tf.train.Feature(bytes_list = tf.train.BytesList(value=[imgRaw]))
}))
TFwriter.write(example.SerializeToString())

TFwriter.close()
第一部分:
import tensorflow as tf
from PIL import Image
import os
    PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。(具体参考:点击打开链接

第二部分:

cwd = os.getcwd()
root = cwd+"./images_variant_trainval"
TFwriter = tf.python_io.TFRecordWriter("./images_variant_trainval.tfrecords")
    os.getcwd() 方法用于返回当前工作目录。将绝对目录传递给root。(具体参考:点击打开链接

    tf.python_io.TFRecordWriter作用在于创建一个TFRecordWriter对象,这个对象就负责写记录到指定的文件中去,在此处指定文件夹为"./images_variant_trainval.tfrecords"

第三部分:

class_names = []
class_list = open('./variants.txt', "r")
for line in class_list.readlines():
line = line.strip()
class_names.append(line)
class_list.close()
class_names_to_id = dict(zip(class_names, range(len(class_names))))
    创建class_names空列表。

    以只读形式打开variants.txt文件文件。

    逐行读取该文件,利用空格分割标签,并将所有标签存入class_names列表中。

    关闭class_list。

    统计列表元素个数,按照排序,将class_names和其标签顺序关联起来,并形成字典,其效果部分如图所示:
第四部分:

for className in os.listdir(root):
classPath = root + "/" + className + "/"
for key,value in class_names_to_id.items():
if className == key:
className = value
label = int(className)
[p]    os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。 它不包括 '.' 和'..' ,即使它在文件夹中。只支持在 Unix, Windows 下使用。(具体参考:点击打开链接)    
        建立类别目录存入classPath参数中。
        遍历class_names_to_id中每一个键值对,如果在root中的文件名与其键相等,就将该键对应的值赋给这个文件名。这样做是为了后续制作标签,在python中制作标签只能是整形,不能是其他形式,而原名称中含有“-”和字母等非整形数据,因此需要改成整形数据。

    最后将className赋给label。第五部分:

for parent, dirnames, filenames in os.walk(classPath):
for filename in filenames:
imgPath = classPath+"/"+filename
print(imgPath)
img = Image.open(imgPath)
print(img.size,img.mode)
imgRaw = img.tobytes()
example = tf.train.Example(features=tf.train.Features(feature={
"label": tf.train.Feature(int64_list=tf.train.Int64List(value=[label])),
"img":tf.train.Feature(bytes_list = tf.train.BytesList(value=[imgRaw]))
}))
TFwriter.write(example.SerializeToString())

TFwriter.close()
    python中os.walk是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。(具体详见:点击打开链接)    遍历filenames中每一个文件名(即每张图片的名字),将其赋给参数imgPath,并打印出结果。
    打开imgPath的图片,输出图片大小及模式。(关于这部分知识具体详见点击打开链接)其结果如图所示。

    img.tobytes表示将图片转换成字符串格式。    接下来就是制作TFRecord最关键的部分,即以下代码:
example = tf.train.Example(features=tf.train.Features(feature={
"label": tf.train.Feature(int64_list=tf.train.Int64List(value=[label])),
"img":tf.train.Feature(bytes_list = tf.train.BytesList(value=[imgRaw]))
}))
TFwriter.write(example.SerializeToString())

TFwriter.close()
    文件中每一个图片都对应一个标签。(具体详见点击打开链接






[/p]




    

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: