Tensorflow之構建自己的圖片數據集TFrecords(二)

    分類好了圖片,接下來製作成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)

    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()

    文件中每一個圖片都對應一個標籤。(具體詳見點擊打開鏈接










    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章