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()
檔案中每一個圖片都對應一個標籤。(具體詳見點選開啟連結)