1. 程式人生 > >Tensorflow之構建自己的圖片資料集TFrecords(二)

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

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

    檔案中每一個圖片都對應一個標籤。(具體詳見點選開啟連結