2018年11月19日 星期一

[AI] ILSVRC12 數據集轉成適用於 AlexNet 的 TFRecord 格式

ILSVRC12 數據集包含 1000 個種類, 共約140GB. 剛開始實驗時, 選10種就好, 之後再依照硬體能力增加. 進行 AI 辨識前, 先將其轉成 tensor-flow 的資料格式,  實作步驟如下:
(1) 下載資料集
(2) 將 Trainning Set 全部解開, 放在 All 目錄
(3) 將要使用的類別複製到 Train 目錄下
(4) 將 Train 目錄的圖檔轉成 TFRecord 格式
(5) 將 TFRecord 格式恢復為圖型, 檢查是否有誤
(6) 辨識前將圖型縮放至適當大小


(1) 下載 LSVRC12 Dataset [1]

資料集下載網址:

Trainning Set:
www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train.tar

Validation Set:
www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_val.tar

Training Set Bounding Boxes ( xml 檔內含關於每個 Trainning Set 照片的規格描述) :
www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_bbox_train_v2.tar.gz

Validation Set Bounding Boxes ( xml 檔內含關於每個 Validation Set 照片的規格描述) :
www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_bbox_val_v3.tgz

Test Set:
www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tar
 
其他:
www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train_t3.tar

www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_bbox_train_dogs.tar.gz

www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_bbox_test_dogs.zip


(2) 解壓縮 Trainning Set 全部檔案

ILSVRC2012_img_train.tar 解壓縮至目錄 ILSVRC2012_img_train, 會看到許多 tar 檔, 每個 tar 檔代表一個類別, 共有 1000 個:



編輯 ILSVRC2012_Extract.py 的變數:
  • source_dataset_path : 剛剛解壓縮後放一堆 tar 檔的目錄
  • target_dataset_path : 解開所有圖檔的全部目錄
執行 ILSVRC2012_Extract.py, 將檔案全部解開至 target 目錄下, 此時圖檔已全部解開,原本的 tar 檔可刪除, 以節省硬碟空間.


(3) 將要使用的類別複製到 Train 目錄

另建一個 Train 目錄, 將要訓練的類別目錄複製到 Train 目錄. 仿照 CIFAR-10, 剛開始選10種就好,免得因為硬體物不夠力, 程式跑太久, 無法很快知道程式是否正確.



(4) 將 Train 目錄的圖檔轉成 TFRecord 格式

參考 [2] 寫的  ILSVRC2012_tfRec_Make.py 程式, 這裡為了除錯追蹤, 增加一個 filename 屬性. 先編輯變數:
  • dataset_path : 剛剛複製過去的 Train 目錄
  • tfrecord_file : TFRecord 檔案的位置.
執行 ILSVRC2012_tfRec_Make.py , 製造出 tfreccord 檔案. 這裡使用 skimage 的 io.imread(), 亦可使用 opencv 來進行讀取的動作.

(5) 將 TFRecord 格式恢復為圖型, 檢查是否有誤

編輯 ILSVRC2012_tfRec_Read.py 的變數:
  • tfrecord_file : TFRecord 檔案的位置, 跟步驟(4)的檔案相同
執行 ILSVRC2012_tfRec_Read.py ,顯示幾個圖檔看看.這裡要注意的, 如果剛剛步驟(4)使用opencv讀取檔案, 這裡用 io.imshow(), 可能造成顏色錯誤, 這是 colormap 預設為 jet 的關係 [3], 改用 opencv來顯示就會正常. 為避免困擾, 所以剛剛用 skimage 來讀取圖檔.
 

(6) 辨識前將圖型縮放至適當大小

因每個辨識方法的預設影像大小皆不同, 待辨識程式中再說明.







參考資料:

[1] https://pastebin.com/LQtWKpbH
[2] https://dotblogs.com.tw/shaynling/2017/11/20/150241
[3] https://stackoverflow.com/questions/27518291/loading-a-picture-with-sci-kit-image-displays-wrong-colours-in-image


沒有留言:

張貼留言