包含項目結構、整體訓練流程、訓練調用細節
目的僅為梳理paddle在目標檢測方面的訓練流程以及調用細節,詳見官方文檔及代碼
Paddle-detection框架
首先,觀察整個項目的目錄結構:
靜態圖選擇配置模型在configs中,支持數據類型在dataset中,所有模型具體代碼在ppdet中,數據加載處理部分在ppdet/data中,slim是模型蒸餾壓縮,tools是常用的訓練文件(包含train.py,eval.py,infer.py等),
dygraph即動態圖部分,配置比上述靜態圖簡單的多,與pytorch類似不做過多介紹。
pdpd配置文件:
Paddle-detection里面采用比較靈活的config設置,要記住非常多的設置都是在config里調整的,一套config設置聯系了訓練文件、模型、模型的結構、數據集、評估等系統。
從自動化和靜態分析的原則出發,PaddleDetection采用了一種用戶友好、 易於維護和擴展的配置設計。利用Python的反射機制,
PaddleDection的配置系統從Python類的構造函數抽取多種信息 - 如參數名、初始值、參數注釋、數據類型(如果給出type hint)- 來作為配置規則。 這種設計便於設計的模塊化,提升可測試性及擴展性。
簡單地說就是類上方有裝飾器函數,類內有__inject__等定義具體的配置參數。
目標檢測的完整流程:
1.准備數據
2.模型選擇(選擇、修改config文件)
3.訓練
4.評估和推理
5.模型壓縮以及部署
1.數據相關
數據配置部分都在config目錄中每個模型的配置文件中reader項,包括(TrainReader,EvalReader,TestReader)
具體如何准備訓練數據參照官方文檔:(支持coco\voc\自定義)
2.模型選擇(選擇、修改config文件)
一級文件夾代表可用模型,二級代表不同配置(例如backbone不同)
參照模型庫中每個模型的具體參數(推理時間、准確率等),選擇合適的模型
常改的參數包括:max_iters、num_classes、LearningRate、dataset路徑、batch-size
3.開始訓練
python tools/train.py -c configs/yolov3_mobilenet_v1_roadsign.yml -o use_gpu=true --eval
利用tools/train.py啟動訓練,參數帶上configs文件等
多卡使用tools/train_multi_machine.py訓練
python -m paddle.distributed.launch \
--selected_gpus 0,1,2,3,4,5,6,7 \
tools/train_multi_machine.py \
-c configs/yolov3_mobilenet_v1_roadsign.yml
4.評估推理
利用tools/eval.py以及infer.py進行評估以及推理
5.模型壓縮以及部署
壓縮部分在slim文件夾里,包含剪枝、蒸餾、量化等操作,加速模型推理。
部署部分參考PaddleDetection預測部署文檔,支持服務端、移動端、嵌入式多種方式,支持python\c++部署
使用tools/export_serving_model.py
導出模型時,即可使用PaddleServing部署方式直接部署。
訓練時調用細節(以ppyolo模型為例)
首先從訓練文件train.py找起
加載全局配置文件,解析傳入的ppyolo.yml,配置各種運行環境。
構建program,獲取模型結構,損失函數、優化器等
初始化以及編譯program
創建reader
執行訓練
再從模型文件yolo.py找起
位於ppdet\modeling\architectures\yolo.py
定義了yolov3的結構,主要分為backbone、yolo_head、yolo_loss幾部分,可參考ppyolo的結構圖:
每個模型中包含build、build_inputs函數,在訓練時主要調用這兩個函數。
build_inputs是定義模型輸入的函數,在這里可以認為是feed_var
build函數主要是定義如何從inputs獲得outputs的過程,中間經歷了什么算子。一般是inputs通過backbone、neck、head得到loss,backbone定義在ppdet/modeling/backbones中,
neck即類fpn操作也是在ppdet/modeling/backbones中,head存在ppdt/modeling/anchor_heads中。整個modeling的目錄定義了非常全的結構:
再從數據配置找起:
在train.py中定義的train_reader,調用了ppdet/data/reader中的create_reader函數
此函數中實例化一個reader對象,reader類中包含了各種對於數據的處理(獲取參數、數據增強、預加載、返回batch等等)。
config文件中對於數據集的數據增強
對照reader類中transforms屬性,
最后調用_reader函數返回訓練數據。
訓練時互相調用的關系、位置大概就是這樣,先有大致印象,具體參照完整代碼理解更佳。