使用Detectron預訓練權重輸出 *e2e_mask_rcnn-R-101-FPN_2x* 的示例python
從Detectron輸出的相關示例git
使用Detectron預訓練權重輸出 *e2e_keypoint_rcnn-R-50-FPN_s1x*的示例github
這個代碼是按照Detectron的安裝架構來實現的,僅支持部分功能性,你能夠經過點擊此連接來獲取更多相關信息。json
經過這個代碼,你能夠……網絡
根據草圖訓練模型;架構
經過使用Detectron中獲得預訓練權重(*.pk)來進行推斷;函數
這個儲存器最先是建在jwyang/faster-rcnn.pytorch上的,可是通過屢次的修改,這個結構已經變了不少了並且如今更相似於Detectron。爲了直接從正式的預訓練權重文件中從新獲得結果,我刻意將全部東西弄得和Detectron的運行方法類似或者一致了。工具
這個工具備如下特徵:學習
這個徹底是Pytorch代碼,固然了,也有一些CUDA代碼。測試
它支持多圖像的批處理加工訓練。
它支持多GPUs 訓練。
它支持三種合併方法,可是須要注意的是隻有roi align能被改進去匹配 Caffe2的安裝。因此,儘管去用就行了。
它能夠高效利用內存。對於數據的批處理,這兒有兩種可選擇的技術去減小顯存使用量:1)根據類別分組:同批次的一組圖像是有類似的類別比率 2)根據類別剪裁:剪裁圖像太長了。 類別分組是在Detectron運行,因此用來默認,類別剪裁是來自jwyang/faster-rcnn.pytorch,因此它不能用來默認。
除此以外,我提供一個定製化的模型nn.DataParallel ,它可以使不一樣批次混亂的型號出如今不一樣的繪圖處理器上。你能夠在My nn.DataParallel 這節找到更多關於這個的詳細內容。
支持的網絡模型
主要架構:
ResNet series: ResNet50_conv4_body, ResNet50_conv5_body, ResNet101_Conv4_Body, ResNet101_Conv5_Body, ResNet152_Conv5_Body
FPN: fpn_ResNet50_conv5_body, fpn_ResNet50_conv5_P2only_body, fpn_ResNet101_conv5_body,fpn_ResNet101_conv5_P2only_body, fpn_ResNet152_conv5_body, fpn_ResNet152_conv5_P2only_body
ResNeXt也被運行了可是尚未測試。
Box head: ResNet_roi_conv5_head, roi_2mlp_head
Mask head: mask_rcnn_fcn_head_v0upshare, mask_rcnn_fcn_head_v0up, mask_rcnn_fcn_head_v1up4convs, mask_rcnn_fcn_head_v1up
Keypoints head: roi_pose_head_v1convX
注意:這個命名和那個用在Detectron的是類似的。只是刪掉前置的add_,若是有的話。
支持的數據集
如今只有COCO是被支持的。可是,整個數據集庫運行幾乎是和 Detectron的是同樣的,因此用Detectron支持添加更多的數據集是很簡單的。
配置選擇
架構單一明確的配置文件是放在configs下的。 通常的配置文件lib/core/config.py裏全部的選項都基本是和Detectron相同的默認值。因此把架構單一的configs轉化到Detectron是很是輕鬆的。
怎樣把配置文件從Detectron轉化出來
1. 刪除 MODEL.NUM_CLASSES 。在JsonDataset初賦值過程當中被設置。
2. 刪除 TRAIN.WEIGHTS,TRAIN.DATASETS 和TEST.DATASETS。
3. 在模型類型的選擇中,
(好比: MODEL.CONV_BODY,FAST_RCNN.ROI_BOX_HEAD ……) 若是在數串中存在 add_,則將其刪除。
4. 若是想給模型加載更多的ImageNet 預訓練權重,添加指向預訓練權重文件的RESNETS.IMAGENET_PRETRAINED_WEIGHTS 。若是沒有就把MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS設置成 False
更多的細節
一些選項是不能使用的由於相關的功能性尚未實現。可是有一些不能被使用的緣由是我用不一樣方法安裝了程序。
這裏有一些沒有影響但值得注意的選項:
SOLVER.LR_POLICY, SOLVER.MAX_ITER, SOLVER.STEPS,SOLVER.LRS :就目前狀況,訓練指令被這些命令行參數控制:
--epochs:要訓練多少 epochs 。一個 epoch意味着要遍歷整個訓練集而且將默認值設爲6。
--lr_decay_epochs:每一epochs都是衰減學習率的。 衰減是發生在每一個 epoch的開始。 Epoch 是 以0索引開始的,默認值是 [4, 5]。
要得到更多地命令行參數,請參考python train_net.py --help
SOLVER.WARM_UP_ITERS, SOLVER.WARM_UP_FACTOR, SOLVER.WARM_UP_METHOD: 在紙上作預熱訓練Accurate,Large Minibatch SGD:在一小時內訓練 ImageNet 是不能被運行的。
OUTPUT_DIR :使用命令行參數來代替--output_base_dir 去明確化輸出目錄。
當更多地選項被提供:
MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS = True:是否載入 ImageNet的預訓練權重。
RESNETS.IMAGENET_PRETRAINED_WEIGHTS = '':預訓練網絡的權重文件路徑。若是是以 '/' 開始的,那它就是一個絕對路徑。不然就會被看成是一個和ROOT_DIR相關的路徑。
TRAIN.ASPECT_CROPPING = False, TRAIN.ASPECT_HI = 2,TRAIN.ASPECT_LO = 0.:根據類別選項的剪裁去限制圖像類別比率範圍的選項。
RPN.OUT_DIM_AS_IN_DIM = True,RPN.OUT_DIM = 512 ,RPN.CLS_ACTIVATION = 'sigmoid' :RPN的正式運行有相同的輸入和輸出特徵通道,它們使用sigmoid做爲激活函數做爲對fg/bg class類的輸出預測,在jwyang's implementation,它把輸出路徑數字肯定爲512並且使用softmax爲激活函數。
個人nn.DataParallel
TBA
開始
克隆這個倉庫:
git clone https://github.com/roytseng-tw/mask-rcnn.pytorch.git
命令
在 python3下測試。
python安裝包
pytorch==0.3.1 (cuda80, cudnn7.1.2)
torchvision==0.2.0
numpy
scipy
opencv
pyyaml
pycocotools— COCO數據集專用,也能夠經過 pip安裝。
tensorboardX —能夠在Tensorboard上記錄losses。
一個 NVIDAI GPU 和 CUDA 8.0 或者更高。一些操做只有gpu 安裝。
注意:不一樣版本的 Pytorch安裝包有不一樣的顯存使用量。
編寫
編寫CUDA代碼:
cd lib # please change to this directory
sh make.sh
若是你在使用 Volta GPU, 在lib/mask.sh 文件中取消註釋這一句而且記住在上面這行後打上一個反斜槓。CUDA_PATH 路徑默認爲/usr/loca/cuda 。若是你想要在不一樣路徑下使用CUDA庫,根據實際狀況改變這行語句。
這條語句將會編譯你須要的全部模塊,包括NMS、 ROI_Pooing、ROI_Crop 和 ROI_Align模塊。 (事實上GPU NMS模塊從未被使用過...)
特別注意的是,若是你使用CUDA_VISIBLE_DEVICES 來設置GPU,確保在編譯代碼的時候至少有一個GPU可見。
數據準備
在repo下建立一個數據文件夾,
cd {repo_root}
mkdir data
COCO:下載coco圖片數據 以及從coco網站上得到的註釋
確保根據下面的文件結構將文件放置好:
coco
├── 註釋
| ├── instances_minival2014.json
│ ├── instances_train2014.json
│ ├── instances_train2017.json
│ ├── instances_val2014.json
│ ├── instances_val2017.json
│ ├── instances_valminusminival2014.json
│ ├── person_keypoints_train2014.json
│ ├── person_keypoints_train2017.json
│ ├── person_keypoints_val2014.json
│ └── person_keypoints_val2017.json
└── 圖片
├── train2014
├── train2017
├── val2014
└── val2017
下載instances_minival2014.json和instances_valminusminival2014.json的連接
隨便將數據集放在任意想放的地方,而後將數據集軟鏈接到data/ 文件夾下:
ln -s path/to/coco data/coco
推薦將圖片輸入SSD網絡來使訓練效果更加好。
根據個人經驗來看, COCO2014針對相關的圖片數據有一些不一樣尺寸(h,w)的掩碼註釋。可能 instances_minival2014.jsoninstances_valminusminival2014.json 包含了錯誤的掩碼註釋。然而COCO2017 數據集並無這個問題.。聽說 COCO train2017數據集 與 (COCO train 2014 + COCO minival 2014)至關 ,而且 COCO test 2017數據集 與COCO valminusminival 2014數據集至關。 所以,使用 COCO 2017 訓練-驗證切分集來重作結果是能夠的。
預訓練模型
我使用ImageNet數據在 Caffe中爲骨幹網絡預訓練權重。
ResNet50,ResNet101,ResNet152
VGG16 (vgg骨幹網絡如今尚未完成)
下載它們並把它們放在 {repo_root}/data/pretrained_model路徑下。
你可使用下面的命令行語句將它們所有下載下來:
- 額外須要的安裝包:argparse_color_formater, colorama
python tools/download_imagenet_weights.py
注: Caffe的預訓練權重比Pytorch 預訓練的效果要稍好一些。咱們使用Caffe 預訓練上面連接的模型來重作結果。順便提一點,Detectron(一個開源目標檢測庫)也使用Caffe預訓練獲得的權重。
若是你想用pytorch預訓練模型,請記住將圖片數據從BGR矩陣轉化爲RGB矩陣,而且也用pytorch預訓練模型過程當中相同的數據處理方法(去均值以及標準化)。
訓練
基於res50骨幹網絡從頭開始訓練mask-rcnn網絡
python tools/train_net.py --dataset coco2017 --cfg configs/e2e_mask_rcnn_R-50-C4.yml --use_tfboard --bs {batch_size} --nw {num_workers}
使用 --bs 來將默認的批處理規模 (例如8)改變爲適合你GPU的合適值。相似地還有--nw(數據加載線程在config.py中默認爲4)。
使用 —use_tfboard 在Tensorboard上展現損失函數的對數值。
在每一個訓練期結束的時候,經過徹底相同的設置對訓練效果進行歸納性展現。
python tools/train_net.py --dataset coco2017 --cfg configs/e2e_mask_rcnn_R-50-C4.yml --resume --load_ckpt {path/to/the/checkpoint} --bs {batch_size}
w/ 和 w/o --resume的區別:若是規定了--resume,優化器狀態將會被從 checkpoint文件中加載下來,不然將不會加載。
訓練 keypoint-rcnn網絡
python tools/train_net.py --dataset keypoints_coco2017 ...
Detectron預訓練權重的調整
python train_net.py --dataset coco2017 --cfg cfgs/e2e_mask_rcnn_R-50-C4.yml --load_detectron {path/to/detectron/weight} --bs {batch_size}
注:優化器狀態 (SGD的動量) 沒有被加載(或被實現)。
推斷結果
python tools/infer_simple.py --dataset coco --cfg cfgs/e2e_mask_rcnn_R-50-C4.yml --load_detectron {path/to/detectron/weight} --image_dir {dir/of/input/images} --output_dir {dir/to/save/visualizations}
--output_dir 默認爲infer_outputs。
衡量標準
keypoint_rcnn
e2e_keypoint_rcnn_R-50-FPN
訓練命令行: python tools/train_net.py --dataset keypoints_coco2017 --cfg configs/e2e_keypoint_rcnn_R-50-FPN.yaml --bs 8
以8張圖片爲一個批訓練集,將數據集訓練6個週期,從第5個和第6個訓練週期開始後學習率以0.1倍速衰減。每一個週期迭代 (113198 / 8) (向下取整)= 14149次。
數據集: keypoints_coco_2017_val
任務:框定盒
任務:關鍵點
表格中的值爲Detectron e2e_keypoint_rcnn_R-50-FPN_1x網絡獲得的AP值,該網絡以16張圖片爲批訓練集迭代訓練90000次,在第60000次和第80000次迭代開始後學習率以0.1倍速衰減。
可視化
從頭開始基於coco_train_2017數據訓練 e2e_mask_rcnn_R-50_C4 網絡,以4張圖片爲一批進行處理,訓練了1 個訓練週期:
Github原址 https://github.com/roytseng-tw/Detectron.pytorch/blob/master/README.md