未验证 提交 ac358bfe 编写于 作者: F Feng Ni 提交者: GitHub

[Dygraph] add ResNet-vd, ResNet-34, ResNeXt-101 (#2071)

* add configs and modelzoo

* remove trainreader of batchsize 2

* add vd r34 x101

* fix typo

* add vd r34 x101

* add resnet dcn, clean code

* fix x101 width in py2

* add faster mask rcnn dcn configs and modelzoo

* fix dcn modelzoo

* clean dcn configs code
上级 3d13ead6
### Deformable ConvNets v2
| 骨架网络 | 网络类型 | 卷积 | 每张GPU图片个数 | 学习率策略 |推理时间(fps)| Box AP | Mask AP | 下载 | 配置文件 |
| :------------------- | :------------- | :-----: |:--------: | :-----: | :-----------: |:----: | :-----: | :----------------------------------------------------------: | :----: |
| ResNet50-FPN | Faster | c3-c5 | 2 | 1x | - | 41.3 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_dcn_r50_fpn_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/dygraph/configs/dcn/faster_rcnn_dcn_r50_fpn_1x_coco.yml) |
| ResNet50-vd-FPN | Faster | c3-c5 | 2 | 2x | - | 42.4 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_dcn_r50_vd_fpn_2x.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/dygraph/configs/dcn/faster_rcnn_dcn_r50_vd_fpn_2x.yml) |
| ResNet101-vd-FPN | Faster | c3-c5 | 2 | 1x | - | 44.1 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_dcn_r101_vd_fpn_1x.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/dygraph/configs/dcn/faster_rcnn_dcn_r101_vd_fpn_1x.yml) |
| ResNeXt101-vd-FPN | Faster | c3-c5 | 1 | 1x | - | 45.2 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_dcn_x101_vd_64x4d_fpn_1x.pdparams) |[配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/dygraph/configs/dcn/faster_rcnn_dcn_x101_vd_64x4d_fpn_1x.yml) |
| ResNet50-FPN | Mask | c3-c5 | 1 | 1x | - | 41.9 | 37.3 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/mask_rcnn_dcn_r50_fpn_1x.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/dygraph/configs/dcn/mask_rcnn_dcn_r50_fpn_1x.yml) |
| ResNet50-vd-FPN | Mask | c3-c5 | 1 | 2x | - | 42.9 | 38.0 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/mask_rcnn_dcn_r50_vd_fpn_2x.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/dygraph/configs/dcn/mask_rcnn_dcn_r50_vd_fpn_2x.yml) |
| ResNet101-vd-FPN | Mask | c3-c5 | 1 | 1x | - | 44.6 | 39.2 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/mask_rcnn_dcn_r101_vd_fpn_1x.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/dygraph/configs/dcn/mask_rcnn_dcn_r101_vd_fpn_1x.yml) |
| ResNeXt101-vd-FPN | Mask | c3-c5 | 1 | 1x | - | 46.2 | 40.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/mask_rcnn_dcn_x101_vd_64x4d_fpn_1x.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/dygraph/configs/dcn/mask_rcnn_dcn_x101_vd_64x4d_fpn_1x.yml) |
**注意事项:**
- Deformable卷积网络v2(dcn_v2)参考自论文[Deformable ConvNets v2](https://arxiv.org/abs/1811.11168).
- `c3-c5`意思是在resnet模块的3到5阶段增加`dcn`.
## Citations
```
@inproceedings{dai2017deformable,
title={Deformable Convolutional Networks},
author={Dai, Jifeng and Qi, Haozhi and Xiong, Yuwen and Li, Yi and Zhang, Guodong and Hu, Han and Wei, Yichen},
booktitle={Proceedings of the IEEE international conference on computer vision},
year={2017}
}
@article{zhu2018deformable,
title={Deformable ConvNets v2: More Deformable, Better Results},
author={Zhu, Xizhou and Hu, Han and Lin, Stephen and Dai, Jifeng},
journal={arXiv preprint arXiv:1811.11168},
year={2018}
}
```
_BASE_: [
'faster_rcnn_dcn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_pretrained.tar
weights: output/faster_rcnn_dcn_r101_fpn_1x_coco/model_final
ResNet:
# index 0 stands for res2
depth: 101
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
dcn_v2_stages: [1,2,3]
epoch: 12
LearningRate:
base_lr: 0.02
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.1
steps: 1000
TrainReader:
batch_size: 2
_BASE_: [
'../datasets/coco_detection.yml',
'../runtime.yml',
'../faster_rcnn/_base_/optimizer_1x.yml',
'../faster_rcnn/_base_/faster_rcnn_r50_fpn.yml',
'../faster_rcnn/_base_/faster_fpn_reader.yml',
]
weights: output/faster_rcnn_dcn_r50_fpn_1x_coco/model_final
ResNet:
depth: 50
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
dcn_v2_stages: [1,2,3]
epoch: 12
LearningRate:
base_lr: 0.02
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.1
steps: 1000
TrainReader:
batch_size: 2
_BASE_: [
'faster_rcnn_dcn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_pretrained.tar
weights: output/faster_rcnn_dcn_r50_vd_fpn_2x_coco/model_final
ResNet:
# index 0 stands for res2
depth: 50
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
dcn_v2_stages: [1,2,3]
epoch: 24
LearningRate:
base_lr: 0.02
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [16, 22]
- !LinearWarmup
start_factor: 0.1
steps: 1000
TrainReader:
batch_size: 2
_BASE_: [
'faster_rcnn_dcn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNeXt101_vd_64x4d_pretrained.tar
weights: output/faster_rcnn_dcn_x101_vd_64x4d_fpn_1x_coco/model_final.pdparams
ResNet:
# for ResNeXt: groups, base_width, base_channels
depth: 101
groups: 64
base_width: 4
base_channels: 64
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
dcn_v2_stages: [1,2,3]
epoch: 12
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.1
steps: 1000
_BASE_: [
'mask_rcnn_dcn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_pretrained.tar
weights: output/mask_rcnn_dcn_r101_fpn_1x_coco/model_final.pdparams
ResNet:
# index 0 stands for res2
depth: 101
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
dcn_v2_stages: [1,2,3]
epoch: 12
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.1
steps: 1000
_BASE_: [
'../datasets/coco_instance.yml',
'../runtime.yml',
'../mask_rcnn/_base_/optimizer_1x.yml',
'../mask_rcnn/_base_/mask_rcnn_r50_fpn.yml',
'../mask_rcnn/_base_/mask_fpn_reader.yml',
]
weights: output/mask_rcnn_dcn_r50_fpn_1x_coco/model_final
ResNet:
depth: 50
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
dcn_v2_stages: [1,2,3]
epoch: 12
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.1
steps: 1000
_BASE_: [
'mask_rcnn_dcn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_pretrained.tar
weights: output/mask_rcnn_dcn_r50_vd_fpn_2x_coco/model_final
ResNet:
# index 0 stands for res2
depth: 50
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
dcn_v2_stages: [1,2,3]
epoch: 24
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [16, 22]
- !LinearWarmup
start_factor: 0.1
steps: 1000
_BASE_: [
'mask_rcnn_dcn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNeXt101_vd_64x4d_pretrained.tar
weights: output/mask_rcnn_dcn_x101_vd_64x4d_fpn_1x_coco/model_final.pdparams
ResNet:
# for ResNeXt: groups, base_width, base_channels
depth: 101
variant: d
groups: 64
base_width: 4
base_channels: 64
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
dcn_v2_stages: [1,2,3]
epoch: 12
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.1
steps: 1000
...@@ -4,8 +4,11 @@ ...@@ -4,8 +4,11 @@
| 骨架网络 | 网络类型 | 每张GPU图片个数 | 学习率策略 |推理时间(fps) | Box AP | Mask AP | 下载 | 配置文件 | | 骨架网络 | 网络类型 | 每张GPU图片个数 | 学习率策略 |推理时间(fps) | Box AP | Mask AP | 下载 | 配置文件 |
| :------------------- | :------------- | :-----: | :-----: | :------------: | :-----: | :-----: | :-----------------------------------------------------: | :-----: | | :------------------- | :------------- | :-----: | :-----: | :------------: | :-----: | :-----: | :-----------------------------------------------------: | :-----: |
| ResNet50 | Faster | 1 | 1x | ---- | 35.1 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_r50_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/dygraph/configs/faster_rcnn_r50_1x_coco.yml) | | ResNet50 | Faster | 1 | 1x | ---- | 35.1 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_r50_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/dygraph/configs/faster_rcnn/faster_rcnn_r50_1x_coco.yml) |
| ResNet50-FPN | Faster | 1 | 1x | ---- | 37.0 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_r50_fpn_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/dygraph/configs/faster_rcnn_r50_fpn_1x_coco.yml) | | ResNet50-FPN | Faster | 1 | 1x | ---- | 37.0 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_r50_fpn_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/dygraph/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.yml) |
| ResNet34-FPN | Faster | 2 | 1x | ---- | 36.7 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_r34_fpn_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/dygraph/configs/faster_rcnn/faster_rcnn_r34_fpn_1x_coco.yml) |
| ResNet101 | Faster | 1 | 1x | ---- | 38.3 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_r101_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/dygraph/configs/faster_rcnn/faster_rcnn_r101_1x_coco.yml) |
| ResNet101-FPN | Faster | 1 | 1x | ---- | 38.7 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_r101_fpn_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/dygraph/configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.yml) |
## Citations ## Citations
``` ```
......
_BASE_: [
'faster_rcnn_r50_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_pretrained.tar
weights: output/faster_rcnn_r101_1x_coco/model_final
ResNet:
# index 0 stands for res2
depth: 101
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
_BASE_: [
'faster_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_pretrained.tar
weights: output/faster_rcnn_r101_fpn_1x_coco/model_final
ResNet:
# index 0 stands for res2
depth: 101
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
_BASE_: [
'faster_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_pretrained.tar
weights: output/faster_rcnn_r101_fpn_2x_coco/model_final
ResNet:
# index 0 stands for res2
depth: 101
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
epoch: 24
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [16, 22]
- !LinearWarmup
start_factor: 0.3333333333333333
steps: 500
_BASE_: [
'faster_rcnn_r50_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_vd_pretrained.tar
weights: output/faster_rcnn_r101_vd_1x_coco/model_final
ResNet:
# index 0 stands for res2
depth: 101
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
epoch: 12
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.3333333333333333
steps: 1000
_BASE_: [
'faster_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_vd_pretrained.tar
weights: output/faster_rcnn_r101_vd_fpn_1x_coco/model_final.pdparams
ResNet:
# index 0 stands for res2
depth: 101
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
epoch: 12
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.3333333333333333
steps: 1000
_BASE_: [
'faster_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet34_pretrained.tar
weights: output/faster_rcnn_r34_fpn_1x_coco/model_final
ResNet:
# index 0 stands for res2
depth: 34
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
FPN:
in_channels: [64, 128, 256, 512]
out_channel: 256
min_level: 0
max_level: 4
spatial_scale: [0.25, 0.125, 0.0625, 0.03125]
LearningRate:
base_lr: 0.02
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.1
steps: 1000
TrainReader:
batch_size: 2
_BASE_: [
'faster_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet34_vd_pretrained.tar
weights: output/faster_rcnn_r34_vd_fpn_1x_coco/model_final
ResNet:
# index 0 stands for res2
depth: 34
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
FPN:
in_channels: [64, 128, 256, 512]
out_channel: 256
min_level: 0
max_level: 4
spatial_scale: [0.25, 0.125, 0.0625, 0.03125]
LearningRate:
base_lr: 0.02
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.1
steps: 1000
TrainReader:
batch_size: 2
_BASE_: [
'faster_rcnn_r50_1x_coco.yml',
]
weights: output/faster_rcnn_r50_2x_coco/model_final
epoch: 24
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [16, 22]
- !LinearWarmup
start_factor: 0.3333333333333333
steps: 500
_BASE_: [
'faster_rcnn_r50_fpn_1x_coco.yml',
]
weights: output/faster_rcnn_r50_fpn_2x_coco/model_final
epoch: 24
LearningRate:
base_lr: 0.02
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [16, 22]
- !LinearWarmup
start_factor: 0.3333333333333333
steps: 500
TrainReader:
batch_size: 2
_BASE_: [
'faster_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_pretrained.tar
weights: output/faster_rcnn_r50_vd_fpn_2x_coco/model_final
ResNet:
# index 0 stands for res2
depth: 50
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
epoch: 24
LearningRate:
base_lr: 0.02
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [16, 22]
- !LinearWarmup
start_factor: 0.3333333333333333
steps: 500
TrainReader:
batch_size: 2
_BASE_: [
'faster_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNeXt101_vd_64x4d_pretrained.tar
weights: output/faster_rcnn_x101_vd_64x4d_fpn_1x_coco/model_final.pdparams
ResNet:
# for ResNeXt: groups, base_width, base_channels
depth: 101
groups: 64
base_width: 4
base_channels: 64
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
epoch: 12
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.1
steps: 1000
_BASE_: [
'faster_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNeXt101_vd_64x4d_pretrained.tar
weights: output/faster_rcnn_x101_vd_64x4d_fpn_2x_coco/model_final.pdparams
ResNet:
# for ResNeXt: groups, base_width, base_channels
depth: 101
groups: 64
base_width: 4
base_channels: 64
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
epoch: 24
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [16, 22]
- !LinearWarmup
start_factor: 0.1
steps: 1000
_BASE_: [
'mask_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_pretrained.tar
weights: output/mask_rcnn_r101_fpn_1x_coco/model_final.pdparams
ResNet:
# index 0 stands for res2
depth: 101
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
_BASE_: [
'mask_rcnn_r50_1x_coco.yml',
]
weights: output/mask_rcnn_r50_2x_coco/model_final
epoch: 24
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [16, 22]
- !LinearWarmup
start_factor: 0.3333333333333333
steps: 500
_BASE_: [
'mask_rcnn_r50_fpn_1x_coco.yml',
]
weights: output/mask_rcnn_r50_fpn_2x_coco/model_final
epoch: 24
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [16, 22]
- !LinearWarmup
start_factor: 0.3333333333333333
steps: 500
_BASE_: [
'mask_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_pretrained.tar
weights: output/mask_rcnn_r50_vd_fpn_2x_coco/model_final
ResNet:
# index 0 stands for res2
depth: 50
variant: d
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
epoch: 24
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [16, 22]
- !LinearWarmup
start_factor: 0.3333333333333333
steps: 500
_BASE_: [
'mask_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNeXt101_vd_64x4d_pretrained.tar
weights: output/mask_rcnn_x101_vd_64x4d_fpn_1x_coco/model_final.pdparams
ResNet:
# for ResNeXt: groups, base_width, base_channels
depth: 101
variant: d
groups: 64
base_width: 4
base_channels: 64
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
epoch: 12
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [8, 11]
- !LinearWarmup
start_factor: 0.1
steps: 1000
_BASE_: [
'mask_rcnn_r50_fpn_1x_coco.yml',
]
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNeXt101_vd_64x4d_pretrained.tar
weights: output/mask_rcnn_x101_vd_64x4d_fpn_2x_coco/model_final.pdparams
ResNet:
# for ResNeXt: groups, base_width, base_channels
depth: 101
variant: d
groups: 64
base_width: 4
base_channels: 64
norm_type: bn
freeze_at: 0
return_idx: [0,1,2,3]
num_stages: 4
epoch: 24
LearningRate:
base_lr: 0.01
schedulers:
- !PiecewiseDecay
gamma: 0.1
milestones: [16, 22]
- !LinearWarmup
start_factor: 0.1
steps: 1000
...@@ -41,6 +41,17 @@ class NameAdapter(object): ...@@ -41,6 +41,17 @@ class NameAdapter(object):
shortcut_name = name + "_branch1" shortcut_name = name + "_branch1"
return conv_name1, conv_name2, conv_name3, shortcut_name return conv_name1, conv_name2, conv_name3, shortcut_name
def fix_basicblock_name(self, name):
if self.model_type == 'SEResNeXt':
conv_name1 = 'conv' + name + '_x1'
conv_name2 = 'conv' + name + '_x2'
shortcut_name = name
else:
conv_name1 = name + "_branch2a"
conv_name2 = name + "_branch2b"
shortcut_name = name + "_branch1"
return conv_name1, conv_name2, shortcut_name
def fix_layer_warp_name(self, stage_num, count, i): def fix_layer_warp_name(self, stage_num, count, i):
name = 'res' + str(stage_num) name = 'res' + str(stage_num)
if count > 10 and stage_num == 4: if count > 10 and stage_num == 4:
......
...@@ -12,16 +12,12 @@ ...@@ -12,16 +12,12 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import numpy as np import math
from paddle import ParamAttr
import paddle import paddle
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2D, BatchNorm from paddle import ParamAttr
from paddle.nn import MaxPool2D
from ppdet.core.workspace import register, serializable from ppdet.core.workspace import register, serializable
from paddle.regularizer import L2Decay from paddle.regularizer import L2Decay
from .name_adapter import NameAdapter from .name_adapter import NameAdapter
from numbers import Integral from numbers import Integral
...@@ -29,6 +25,14 @@ from ppdet.modeling.layers import DeformableConvV2 ...@@ -29,6 +25,14 @@ from ppdet.modeling.layers import DeformableConvV2
__all__ = ['ResNet', 'Res5Head'] __all__ = ['ResNet', 'Res5Head']
ResNet_cfg = {
18: [2, 2, 2, 2],
34: [3, 4, 6, 3],
50: [3, 4, 6, 3],
101: [3, 4, 23, 3],
152: [3, 8, 36, 3],
}
class ConvNormLayer(nn.Layer): class ConvNormLayer(nn.Layer):
def __init__(self, def __init__(self,
...@@ -37,6 +41,7 @@ class ConvNormLayer(nn.Layer): ...@@ -37,6 +41,7 @@ class ConvNormLayer(nn.Layer):
filter_size, filter_size,
stride, stride,
name_adapter, name_adapter,
groups=1,
act=None, act=None,
norm_type='bn', norm_type='bn',
norm_decay=0., norm_decay=0.,
...@@ -50,13 +55,13 @@ class ConvNormLayer(nn.Layer): ...@@ -50,13 +55,13 @@ class ConvNormLayer(nn.Layer):
self.act = act self.act = act
if not dcn_v2: if not dcn_v2:
self.conv = Conv2D( self.conv = nn.Conv2D(
in_channels=ch_in, in_channels=ch_in,
out_channels=ch_out, out_channels=ch_out,
kernel_size=filter_size, kernel_size=filter_size,
stride=stride, stride=stride,
padding=(filter_size - 1) // 2, padding=(filter_size - 1) // 2,
groups=1, groups=groups,
weight_attr=ParamAttr( weight_attr=ParamAttr(
learning_rate=lr, name=name + "_weights"), learning_rate=lr, name=name + "_weights"),
bias_attr=False) bias_attr=False)
...@@ -67,7 +72,7 @@ class ConvNormLayer(nn.Layer): ...@@ -67,7 +72,7 @@ class ConvNormLayer(nn.Layer):
kernel_size=filter_size, kernel_size=filter_size,
stride=stride, stride=stride,
padding=(filter_size - 1) // 2, padding=(filter_size - 1) // 2,
groups=1, groups=groups,
weight_attr=ParamAttr( weight_attr=ParamAttr(
learning_rate=lr, name=name + '_weights'), learning_rate=lr, name=name + '_weights'),
bias_attr=False, bias_attr=False,
...@@ -87,9 +92,13 @@ class ConvNormLayer(nn.Layer): ...@@ -87,9 +92,13 @@ class ConvNormLayer(nn.Layer):
trainable=False if freeze_norm else True) trainable=False if freeze_norm else True)
global_stats = True if freeze_norm else False global_stats = True if freeze_norm else False
self.norm = BatchNorm( if norm_type == 'sync_bn':
self.norm = nn.SyncBatchNorm(
ch_out, weight_attr=param_attr, bias_attr=bias_attr)
else:
self.norm = nn.BatchNorm(
ch_out, ch_out,
act=act, act=None,
param_attr=param_attr, param_attr=param_attr,
bias_attr=bias_attr, bias_attr=bias_attr,
use_global_stats=global_stats, use_global_stats=global_stats,
...@@ -103,8 +112,104 @@ class ConvNormLayer(nn.Layer): ...@@ -103,8 +112,104 @@ class ConvNormLayer(nn.Layer):
def forward(self, inputs): def forward(self, inputs):
out = self.conv(inputs) out = self.conv(inputs)
if self.norm_type == 'bn': if self.norm_type in ['bn', 'sync_bn']:
out = self.norm(out) out = self.norm(out)
if self.act:
out = getattr(F, self.act)(out)
return out
class BasicBlock(nn.Layer):
def __init__(self,
ch_in,
ch_out,
stride,
shortcut,
name_adapter,
name,
variant='b',
lr=1.0,
norm_type='bn',
norm_decay=0.,
freeze_norm=True,
dcn_v2=False):
super(BasicBlock, self).__init__()
assert dcn_v2 is False, "Not implemented yet."
conv_name1, conv_name2, shortcut_name = name_adapter.fix_basicblock_name(
name)
self.shortcut = shortcut
if not shortcut:
if variant == 'd' and stride == 2:
self.short = nn.Sequential()
self.short.add_sublayer(
'pool',
nn.AvgPool2D(
kernel_size=2, stride=2, padding=0, ceil_mode=True))
self.short.add_sublayer(
'conv',
ConvNormLayer(
ch_in=ch_in,
ch_out=ch_out,
filter_size=1,
stride=1,
name_adapter=name_adapter,
norm_type=norm_type,
norm_decay=norm_decay,
freeze_norm=freeze_norm,
lr=lr,
name=shortcut_name))
else:
self.short = ConvNormLayer(
ch_in=ch_in,
ch_out=ch_out,
filter_size=1,
stride=stride,
name_adapter=name_adapter,
norm_type=norm_type,
norm_decay=norm_decay,
freeze_norm=freeze_norm,
lr=lr,
name=shortcut_name)
self.branch2a = ConvNormLayer(
ch_in=ch_in,
ch_out=ch_out,
filter_size=3,
stride=stride,
name_adapter=name_adapter,
act='relu',
norm_type=norm_type,
norm_decay=norm_decay,
freeze_norm=freeze_norm,
lr=lr,
name=conv_name1)
self.branch2b = ConvNormLayer(
ch_in=ch_out,
ch_out=ch_out,
filter_size=3,
stride=1,
name_adapter=name_adapter,
act=None,
norm_type=norm_type,
norm_decay=norm_decay,
freeze_norm=freeze_norm,
lr=lr,
name=conv_name2)
def forward(self, inputs):
out = self.branch2a(inputs)
out = self.branch2b(out)
if self.shortcut:
short = inputs
else:
short = self.short(inputs)
out = paddle.add(x=out, y=short)
out = F.relu(out)
return out return out
...@@ -117,6 +222,9 @@ class BottleNeck(nn.Layer): ...@@ -117,6 +222,9 @@ class BottleNeck(nn.Layer):
name_adapter, name_adapter,
name, name,
variant='b', variant='b',
groups=1,
base_width=4,
base_channels=64,
lr=1.0, lr=1.0,
norm_type='bn', norm_type='bn',
norm_decay=0., norm_decay=0.,
...@@ -128,11 +236,39 @@ class BottleNeck(nn.Layer): ...@@ -128,11 +236,39 @@ class BottleNeck(nn.Layer):
else: else:
stride1, stride2 = 1, stride stride1, stride2 = 1, stride
# ResNeXt
if groups == 1:
width = ch_out
else:
width = int(
math.floor(ch_out * (base_width * 1.0 / base_channels)) *
groups)
conv_name1, conv_name2, conv_name3, \ conv_name1, conv_name2, conv_name3, \
shortcut_name = name_adapter.fix_bottleneck_name(name) shortcut_name = name_adapter.fix_bottleneck_name(name)
self.shortcut = shortcut self.shortcut = shortcut
if not shortcut: if not shortcut:
if variant == 'd' and stride == 2:
self.short = nn.Sequential()
self.short.add_sublayer(
'pool',
nn.AvgPool2D(
kernel_size=2, stride=2, padding=0, ceil_mode=True))
self.short.add_sublayer(
'conv',
ConvNormLayer(
ch_in=ch_in,
ch_out=ch_out * 4,
filter_size=1,
stride=1,
name_adapter=name_adapter,
norm_type=norm_type,
norm_decay=norm_decay,
freeze_norm=freeze_norm,
lr=lr,
name=shortcut_name))
else:
self.short = ConvNormLayer( self.short = ConvNormLayer(
ch_in=ch_in, ch_in=ch_in,
ch_out=ch_out * 4, ch_out=ch_out * 4,
...@@ -147,10 +283,11 @@ class BottleNeck(nn.Layer): ...@@ -147,10 +283,11 @@ class BottleNeck(nn.Layer):
self.branch2a = ConvNormLayer( self.branch2a = ConvNormLayer(
ch_in=ch_in, ch_in=ch_in,
ch_out=ch_out, ch_out=width,
filter_size=1, filter_size=1,
stride=stride1, stride=stride1,
name_adapter=name_adapter, name_adapter=name_adapter,
groups=1,
act='relu', act='relu',
norm_type=norm_type, norm_type=norm_type,
norm_decay=norm_decay, norm_decay=norm_decay,
...@@ -159,11 +296,12 @@ class BottleNeck(nn.Layer): ...@@ -159,11 +296,12 @@ class BottleNeck(nn.Layer):
name=conv_name1) name=conv_name1)
self.branch2b = ConvNormLayer( self.branch2b = ConvNormLayer(
ch_in=ch_out, ch_in=width,
ch_out=ch_out, ch_out=width,
filter_size=3, filter_size=3,
stride=stride2, stride=stride2,
name_adapter=name_adapter, name_adapter=name_adapter,
groups=groups,
act='relu', act='relu',
norm_type=norm_type, norm_type=norm_type,
norm_decay=norm_decay, norm_decay=norm_decay,
...@@ -173,11 +311,12 @@ class BottleNeck(nn.Layer): ...@@ -173,11 +311,12 @@ class BottleNeck(nn.Layer):
name=conv_name2) name=conv_name2)
self.branch2c = ConvNormLayer( self.branch2c = ConvNormLayer(
ch_in=ch_out, ch_in=width,
ch_out=ch_out * 4, ch_out=ch_out * 4,
filter_size=1, filter_size=1,
stride=1, stride=1,
name_adapter=name_adapter, name_adapter=name_adapter,
groups=1,
norm_type=norm_type, norm_type=norm_type,
norm_decay=norm_decay, norm_decay=norm_decay,
freeze_norm=freeze_norm, freeze_norm=freeze_norm,
...@@ -202,11 +341,16 @@ class BottleNeck(nn.Layer): ...@@ -202,11 +341,16 @@ class BottleNeck(nn.Layer):
class Blocks(nn.Layer): class Blocks(nn.Layer):
def __init__(self, def __init__(self,
depth,
ch_in, ch_in,
ch_out, ch_out,
count, count,
name_adapter, name_adapter,
stage_num, stage_num,
variant='b',
groups=1,
base_width=-1,
base_channels=-1,
lr=1.0, lr=1.0,
norm_type='bn', norm_type='bn',
norm_decay=0., norm_decay=0.,
...@@ -217,7 +361,7 @@ class Blocks(nn.Layer): ...@@ -217,7 +361,7 @@ class Blocks(nn.Layer):
self.blocks = [] self.blocks = []
for i in range(count): for i in range(count):
conv_name = name_adapter.fix_layer_warp_name(stage_num, count, i) conv_name = name_adapter.fix_layer_warp_name(stage_num, count, i)
if depth >= 50:
block = self.add_sublayer( block = self.add_sublayer(
conv_name, conv_name,
BottleNeck( BottleNeck(
...@@ -227,7 +371,27 @@ class Blocks(nn.Layer): ...@@ -227,7 +371,27 @@ class Blocks(nn.Layer):
shortcut=False if i == 0 else True, shortcut=False if i == 0 else True,
name_adapter=name_adapter, name_adapter=name_adapter,
name=conv_name, name=conv_name,
variant=name_adapter.variant, variant=variant,
groups=groups,
base_width=base_width,
base_channels=base_channels,
lr=lr,
norm_type=norm_type,
norm_decay=norm_decay,
freeze_norm=freeze_norm,
dcn_v2=dcn_v2))
else:
ch_in = ch_in // 4 if i > 0 else ch_in
block = self.add_sublayer(
conv_name,
BasicBlock(
ch_in=ch_in if i == 0 else ch_out,
ch_out=ch_out,
stride=2 if i == 0 and stage_num != 2 else 1,
shortcut=False if i == 0 else True,
name_adapter=name_adapter,
name=conv_name,
variant=variant,
lr=lr, lr=lr,
norm_type=norm_type, norm_type=norm_type,
norm_decay=norm_decay, norm_decay=norm_decay,
...@@ -242,16 +406,18 @@ class Blocks(nn.Layer): ...@@ -242,16 +406,18 @@ class Blocks(nn.Layer):
return block_out return block_out
ResNet_cfg = {50: [3, 4, 6, 3], 101: [3, 4, 23, 3], 152: [3, 8, 36, 3]}
@register @register
@serializable @serializable
class ResNet(nn.Layer): class ResNet(nn.Layer):
__shared__ = ['norm_type']
def __init__(self, def __init__(self,
depth=50, depth=50,
variant='b', variant='b',
lr_mult=1., lr_mult_list=[1.0, 1.0, 1.0, 1.0],
groups=1,
base_width=-1,
base_channels=-1,
norm_type='bn', norm_type='bn',
norm_decay=0, norm_decay=0,
freeze_norm=True, freeze_norm=True,
...@@ -260,6 +426,8 @@ class ResNet(nn.Layer): ...@@ -260,6 +426,8 @@ class ResNet(nn.Layer):
dcn_v2_stages=[-1], dcn_v2_stages=[-1],
num_stages=4): num_stages=4):
super(ResNet, self).__init__() super(ResNet, self).__init__()
self._model_type = 'ResNet' if groups == 1 else 'ResNeXt'
assert num_stages >= 1 and num_stages <= 4
self.depth = depth self.depth = depth
self.variant = variant self.variant = variant
self.norm_type = norm_type self.norm_type = norm_type
...@@ -274,6 +442,11 @@ class ResNet(nn.Layer): ...@@ -274,6 +442,11 @@ class ResNet(nn.Layer):
'is {}'.format(max(return_idx), num_stages) 'is {}'.format(max(return_idx), num_stages)
self.return_idx = return_idx self.return_idx = return_idx
self.num_stages = num_stages self.num_stages = num_stages
assert len(lr_mult_list) == 4, \
"lr_mult_list length must be 4 but got {}".format(len(lr_mult_list))
if isinstance(dcn_v2_stages, Integral):
dcn_v2_stages = [dcn_v2_stages]
assert max(dcn_v2_stages) < num_stages
if isinstance(dcn_v2_stages, Integral): if isinstance(dcn_v2_stages, Integral):
dcn_v2_stages = [dcn_v2_stages] dcn_v2_stages = [dcn_v2_stages]
...@@ -302,30 +475,38 @@ class ResNet(nn.Layer): ...@@ -302,30 +475,38 @@ class ResNet(nn.Layer):
filter_size=k, filter_size=k,
stride=s, stride=s,
name_adapter=na, name_adapter=na,
groups=1,
act='relu', act='relu',
norm_type=norm_type, norm_type=norm_type,
norm_decay=norm_decay, norm_decay=norm_decay,
freeze_norm=freeze_norm, freeze_norm=freeze_norm,
lr=lr_mult, lr=1.0,
name=_name)) name=_name))
self.pool = MaxPool2D(kernel_size=3, stride=2, padding=1) self.pool = nn.MaxPool2D(kernel_size=3, stride=2, padding=1)
ch_in_list = [64, 256, 512, 1024] ch_in_list = [64, 256, 512, 1024]
ch_out_list = [64, 128, 256, 512] ch_out_list = [64, 128, 256, 512]
self.res_layers = [] self.res_layers = []
for i in range(num_stages): for i in range(num_stages):
lr_mult = lr_mult_list[i]
stage_num = i + 2 stage_num = i + 2
res_name = "res{}".format(stage_num) res_name = "res{}".format(stage_num)
res_layer = self.add_sublayer( res_layer = self.add_sublayer(
res_name, res_name,
Blocks( Blocks(
ch_in_list[i], depth,
ch_in_list[i] // 4
if i > 0 and depth < 50 else ch_in_list[i],
ch_out_list[i], ch_out_list[i],
count=block_nums[i], count=block_nums[i],
name_adapter=na, name_adapter=na,
stage_num=stage_num, stage_num=stage_num,
variant=variant,
groups=groups,
base_width=base_width,
base_channels=base_channels,
lr=lr_mult, lr=lr_mult,
norm_type=norm_type, norm_type=norm_type,
norm_decay=norm_decay, norm_decay=norm_decay,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册