paddlepaddle訓練網絡的基本流程二(進階Paddle-detection框架)

包含項目結構、整體訓練流程、訓練調用細節

目的僅爲梳理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函數返回訓練數據。

 訓練時互相調用的關係、位置大概就是這樣,先有大致印象,具體參照完整代碼理解更佳。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章