前面把怎麼建立tfrecord講完了,等於了解dataset的儲存格式,接著就要來看data_generator.py
是怎麼把tfrecord處理成模型訓練可用的data。
在直接進入講data_generator.py之前,先回憶之前train.py是怎麼呼叫的吧。
在train.py裡面,在開啟一張tensor graph之後,294-310行呼叫了data_generator.py
裡面的class,然後回傳了一個object存進dataset這個變數。
讓我們開始吧。
datasts/data_generator.py
首先comments的部分,說明了這是一個套裝程式,用來提供segmentation task的data與label。
並且說明他們目前有3個實作好的dataset可以直接呼叫使用。
import的package,需要額外了解的應該只有52行的collections跟56行的input_preprocess.py。
59行是用namedtuple去宣告關於dataset的資訊,原因是tuple一經宣告即不可改動,所以很適合儲存不需要「頻繁更動」的資料,而且使用namedtuple的話,他會變得跟dictionary一樣可以用key name去取得資料。
60-69行的意思是,宣告一個tuple叫DatasetDescriptor
,然後他有三個欄位分別是:
splits_to_sizes
:放資料集各種分類的資料數量num_classes
:資料集裡面的分類的總數ignore_label
:label中作為background,不會參與更新參數計算的label value。
於是接下來的71-80、82-91、93-100行,都是用宣告好的namedtuple,去一一輸入3個資料集的特性,像是82行的PASCAL_VOC,他原始的資料集有1464個資料,存在split為train
的tfrecord裡,然後他還有另外建立一個有augmentation過的tfrecord。
這邊就延伸出兩種實作方式:一種是事先把資料處理好,然後存在另外的tfrecord裡,這會比較省時間;另一種是把原始資料集載入後,用程式把資料集擴展或處理,這樣則是比較省空間。
再來是把不同資料集的資訊欄,用dictionary整理起來,當今天呼叫的dataset是ade20k
時,就將_ADE20K_INFORMATION
這個tuple的資訊拿來使用。
像163行這裡,如果使用這個的dataset_name沒有支援的話,就會直接報錯,因此,如果想要接續拓展這個project支援的資料集的話,就按照他的格式新增吧。
109行的是tfrecord的file pattern,%s
這裡就是資料集不同split的,然後後面-
就是一個橫槓,接著*
是代表不論什麼符號都可以的意思。
這裡的file pattern取決於在build_DATASET_data.py時,output_filename
是怎麼設定的,而在Deeplab裡面是這樣設計的。
今天先這樣。