分類好了圖片,接下來製作成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()
文件中每一個圖片都對應一個標籤。(具體詳見點擊打開鏈接)