現有的數據讀取器是怎麼工作的呢?
Detectron2包含一個建好的數據讀取管道,很容易明白其工作原理,也方便自己重寫一個數據讀取器。
Detectron2提供兩個函數,build_detection_{train,test}_loader
從給定的config文件中創建數據讀取器,下面是它的原理:
-
輸入數據集名稱,如"coco_2017_train",以一個輕量級的,標準的統一接口將數據讀取爲list[dict]。此時數據實際上還沒有開始被模型使用,圖片還沒有讀到內存中,隨機的數據增強也沒做。可以從之前的dataset教程中查看數據集的相關使用。
-
list中的每個字典對象都是mapper函數映射而來。
- 用戶可以通過指定build_detection_{train,test}_loader中的mapper參數來標準化mapping函數,,默認的mapper是DatasetMapper。
- 輸出格式沒有限制,只要能被數據消費者使用,這裏的消費者一般指模型。
- mapper的作用是將每一個輕量、標準的數據表示方式轉化成模型可以識別的格式,比如,讀取圖像,隨機做增強。默認mapper的輸出解釋如下:
-
mapper的輸出是batch形式,通常是一個list。
-
一個batch的數據是數據讀取器的輸出,典型的,是model.forward()的輸入。
寫數據讀取器
在現有數據讀取器上實現一個新的mapper通常是我們需要的。
如果你想做些不一樣的,比如用自己的數據或者不同的batch邏輯,可以自己寫數據讀取器。數據讀取器是一個簡單的迭代器,只要組織成模型需要的輸入形式,可以使用任何你喜歡的工具。
使用一般的數據讀取器
如果用的是DefaultTrainer,可以重寫build_{train,test}__loader方法來使用自己的數據讀取器。參見densepose的例子。
如果自己寫訓練邏輯,可以簡單的使用自己的數據讀取器。