detectron2配置與部署

1、配置文件

Detectron2提供了一個基於鍵值的配置系統,該系統可用於獲取標準的常見行爲。

Detectron2的配置系統使用YAML和yacs。除了訪問和更新配置的基本操作外,我們還提供以下額外功能:

  1. 該配置可以具有字段,該字段將首先加載基本配置。如果存在任何衝突,則基本配置中的值將在子配置中被覆蓋。我們爲標準模型架構提供了一些基本配置。_BASE_:base.yaml

  2. 我們提供配置版本控制,以實現向後兼容。如果您的配置文件使用config行這樣的版本進行版本控制,即使將來我們更改某些密鑰,detectron2仍會識別該文件。VERSION:2

配置文件是一種非常有限的語言。我們不希望Detectron2中的所有功能都可以通過配置使用。如果您需要的配置空間不可用,請使用detectron2的API編寫代碼。

1.1、基本用法

CfgNode這裏顯示了該對象的一些基本用法。請參閱文檔中的更多內容

from detectron2.config import get_cfg
cfg = get_cfg()    # obtain detectron2's default config
cfg.xxx = yyy      # add new configs for your own custom components
cfg.merge_from_file("my_cfg.yaml")   # load values from a file

cfg.merge_from_list(["MODEL.WEIGHTS", "weights.pth"])   # can also load values from a list of str
print(cfg.dump())  # print formatted configs

detectron2中的許多內置工具都接受命令行配置覆蓋:命令行中提供的鍵值對將覆蓋配置文件中的現有值。例如,demo.py可以與

./demo.py --config-file config.yaml [--other-options] \
  --opts MODEL.WEIGHTS /path/to/weights INPUT.MIN_SIZE_TEST 1000

要查看detectron2中可用配置的列表及其含義,請查看“ 配置參考”

1.2、配置最佳實踐

  1. 將您編寫的配置視爲“代碼”:避免複製或複製它們;用於_BASE_在配置之間共享公用部分。

  2. 使您編寫的配置保持簡單:不要包含不會影響實驗設置的鍵。

  3. 在您的配置(或基本配置)中保留一個版本號,例如,以便向後兼容。讀取沒有版本號的配置時,我們會打印警告。官方配置不包含版本號,因爲它們始終是最新的。VERSION:2

2、部署方式

2.1、Caffe2部署

我們目前支持通過ONNX將detectron2模型轉換爲Caffe2格式。轉換後的Caffe2模型可以在Python或C ++中運行而無需detectron2依賴性。它具有針對CPU和移動設備推理優化的運行時,但不適用於GPU推理。

Caffe2轉換需要PyTorch≥1.4和ONNX≥1.6。

2.2、覆蓋範圍

它支持3種最常見的元體系結構:GeneralizedRCNN,,RetinaNet和 PanopticFPN,以及這3種元體系結構下的大多數官方模型。

只要用戶的自定義擴展名不包含Caffe2中不可用的控制流或運算符(例如,可變形卷積),就支持這些體系結構下的用戶自定義擴展名(通過註冊添加)。例如,開箱即用通常支持自定義主幹和頭部。

2.3、用法

轉換API記錄在API文檔中。我們提供了一個工具,caffe2_converter.py作爲使用這些API轉換標準模型的示例。

要轉換經過COCO培訓的官方Mask R-CNN,請先 準備COCO數據集,然後從Model Zoo中選擇模型,然後運行:

cd tools/deploy/ && ./caffe2_converter.py --config-file ../../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \
	--output ./caffe2_model --run-eval \
	MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl \
	MODEL.DEVICE cpu

注意:

  1. 轉換需要有效的樣本輸入和權重來跟蹤模型。這就是腳本需要數據集的原因。您可以修改腳本以其他方式獲取樣本輸入。

  2. 帶有--run-eval標誌,它將評估轉換後的模型以驗證其準確性。由於不同實現之間的數值精度,精度通常與PyTorch略有不同(在0.1 AP內)。如果轉換不支持您的自定義模型,建議始終驗證準確性。

轉換後的模型位於指定caffe2_model/目錄中。部署需要兩個文件model.pb ,model_init.pb其中包含網絡結構和網絡參數。然後可以使用Caffe2的API將這些文件加載​​到C ++或Python中。

該腳本生成model.svg包含網絡可視化文件。您也可以加載model.pb到諸如netron之類的工具以使其可視化。

2.4、在C ++ / Python中使用模型

該模型可以用C ++加載。給出了一個示例caffe2_mask_rcnn.cpp,該示例使用進行CPU / GPU推理COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x。

C ++示例需要使用以下代碼構建:

  • 內置caffe2的PyTorch

  • gflags,glog,opencv

  • 符合您caffe2版本的protobuf標頭

  • 如果caffe2是使用MKL構建的,則爲MKL標頭

以下可以在官方detectron2 docker內部編譯示例:

sudo apt update && sudo apt install libgflags-dev libgoogle-glog-dev libopencv-dev
pip install mkl-include
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-cpp-3.6.1.tar.gz
tar xf protobuf-cpp-3.6.1.tar.gz
export CPATH=$(readlink -f ./protobuf-3.6.1/src/):$HOME/.local/include
export CMAKE_PREFIX_PATH=$HOME/.local/lib/python3.6/site-packages/torch/
mkdir build && cd build
cmake -DTORCH_CUDA_ARCH_LIST=$TORCH_CUDA_ARCH_LIST .. && make

# To run:
./caffe2_mask_rcnn --predict_net=./model.pb --init_net=./model_init.pb --input=input.jpg

注意:

  • 所有轉換的模型(.pb文件)都採用兩個輸入張量:“ data”是一個NCHW圖像,“ im_info”是一個Nx3張量,每個圖像由(高度,寬度,1.0)組成(形狀可能是“ data”)由於填充而比“ im_info”中的大)。

  • 轉換後的模型不包含將原始圖層輸出轉換爲格式化的預測的後處理操作。該示例僅從未經後期處理的最終層生成原始輸出(28x28蒙版),因爲在實際部署中,應用程序通常需要自定義的輕量級後期處理(例如,通常無需爲每個檢測到的對象使用全圖像蒙版) )。

我們還在Caffe2Model .__ call__方法中爲轉換後的模型提供了python包裝器 。此方法的接口與模型pytorch版本相同,並且在內部應用預處理/後處理代碼以匹配格式。它們可以作爲實際部署中的預處理的參考。

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