上次開頭提到處理dataset,把tfrecord用tf.data
的method載入後,緊接著是要剖析與處理tfrecord。
前面已把parse tfrecord的程式講到一半,剖析的前半段是:
首先將一個原始的example從tfrecord中取出,接著定義此example具有哪些feature,然後用tf.parse_single_example
將example根據feature解析回來。
接著再利用tf.decode
_png_or_jpg,將影像解析回array。
接著繼續講parse後半部、還有preprocess的部分。
開始吧。
datasets/data_generator.py
(cont.)
249-254行宣告了一個dictionary,具體用途不清楚,只是把key name用common的變數命名,然後把剖析好的data、data name、data的高和寬都放入。
我在打的時候突然懂了,就是一個sample,一個樣本,或者一個資料點,把接下來處理資料點會需要用到的東西都蒐集到這個dict裡,然後回傳。
256-267行是為了那種不需要準備label的tfrecord所做的判斷。
從tfrecord剖析完的一筆example,被整理成一個叫做sample的dict,回傳出去,這樣的操作被記錄了下來,等於是整個dataset都會被這樣處理。
接著是328行的preprocess。
preprocess這個method要處理的也是一筆example,只是是經過剖析的整理的資料,所以他的parameter是寫sample。
所以,在寫這些method時,操作的對象,都是以一筆example或sample為單位的。
首先將data與label從sample這個dict取出來。
看到這裡我了解為什麼key name要用common另外撰寫了,這樣不同的method可以共用key name,如果要修改名稱很方便耶。
接下來286-299行是要將data與label進行前處理,不過估計是因為前處理要做的事情蠻多的,所以他把他寫到另外一份程式去了。這裡就是將要處理的data與label與參數放入,然後得到原始丟入的data與處理過的data與label取而代之。
接著要去看到底做了哪些前處理,所以就去找input_preprocess.py吧。
預告一下:
*input_preprocess.py
這份程式開頭就從core/
資料夾引入了backbone(feature_extractor)與一些preprocess的工具。
然後只有preprocess_image_and_label
這個method,但是使用到的preprocess_utils
總共有6種:有resize的、還有加入一些padding的、隨機截部分的影像作為data、翻轉等等。