1. 程式人生 > >深度學習之TFRecord資料集讀、寫的製作、讀取及驗證 具體操作過程

深度學習之TFRecord資料集讀、寫的製作、讀取及驗證 具體操作過程

如題,TensorFlow官方為我們提供了資料讀取的標準格式:TFRecord,本文主要闡述了該資料格式的製作、讀取及驗證三個具體操作過程。

簡要介紹:tfrecord資料檔案是一種將影象資料和標籤統一儲存的二進位制檔案,能更好的利用記憶體,在tensorflow中快速的複製,移動,讀取,儲存等。tfrecord檔案包含了tf.train.Example 協議緩衝區(protocol buffer,協議緩衝區包含了特徵 Features)。你可以寫一段程式碼獲取你的資料, 將資料填入到Example協議緩衝區(protocol buffer),將協議緩衝區序列化為一個字串,並且通過tf.python_io.TFRecordWriter class寫入到TFRecords檔案。

我們很容易就能在網上找到相關的一大堆程式碼(比如看這裡),所以一些基本的操作這裡就先不講。這裡是我的程式碼

其實在實際執行過程中,最容易出現問題的地方就是陣列之間shape的轉換,甚至沒有之一,形如(__,__,__),下面詳細說

要點:

1.影象大小、解析度、位深之間的關係

以BMP影象為例說明計算方法:
  1、大小=解析度*位深/8;
  2、解析度=寬*高(如:1024*768,640*480);
  3、位深:如24位,16位,8位;
  4、/8計算的是位元組數。

    特別地,在製作資料集時,若同時存在不同位深的影象時,最好先統一化,利用PS即可

2.讀取tfrecord格式到圖片時,根據之前儲存的原圖片的通道數(一般channels=3或1),選擇'RGB'或者'L'

 example, l = sess.run([image,label])#在會話中取出image和label
 img=Image.fromarray(example, 'L')

 #這裡特別注意'L'的選擇

函式原型PIL.Image.fromarray(objmode=None),關於此處mode的選擇官方的說法如下

3.經過如下操作,resize()並不改變影象的channels,example物件封裝後channels=3的原始圖片格式已經變成(width*height*channels,  )

img=Image.open(img_path)
img= img.resize((128,128))
img_raw=img.tobytes()#將圖片轉化為二進位制格式
example = tf.train.Example(features=tf.train.Features(feature={
            "label": tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),
            'img_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw]))
        })) #example物件對label和image資料進行封裝
writer.write(example.SerializeToString())  #序列化為字串

此時再進行讀取時,下面程式碼顯然會出錯

image = tf.decode_raw(features['img_raw'], tf.uint8)
print(image)
image = tf.reshape(image, [128, 128])#
#這裡顯然無法將128*128*3的物件reshape成128*128
4. 多標籤分配問題:按classes資料夾首字母的先後順序依次分配0,1,2......