Skip to content

Commit 831a431

Browse files
authored
add ConvNext and CSPResNet YOLOX (PaddlePaddle#6271)
* add convnext crn yolox * update readme doc * fix yolox readme params flops, test=document_fix
1 parent fe804f9 commit 831a431

File tree

5 files changed

+143
-18
lines changed

5 files changed

+143
-18
lines changed

configs/yolox/README.md

+30-14
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,25 @@
1010
## 模型库
1111
### YOLOX on COCO
1212

13-
| 网络网络 | 输入尺寸 | 图片数/GPU | 学习率策略 | 模型推理耗时(ms) | mAP<sup>val<br>0.5:0.95 | mAP<sup>val<br>0.5 | 下载链接 | 配置文件 |
14-
| :------------- | :------- | :-------: | :------: | :---------: | :-----------: | :-----------: |:-------------: | :-----: |
15-
| YOLOX-nano | 416 | 8 | 300e | 2.3 | 26.1 | 42.0 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_nano_300e_coco.pdparams) | [配置文件](./yolox_nano_300e_coco.yml) |
16-
| YOLOX-tiny | 416 | 8 | 300e | 2.8 | 32.9 | 50.4 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_tiny_300e_coco.pdparams) | [配置文件](./yolox_tiny_300e_coco.yml) |
17-
| YOLOX-s | 640 | 8 | 300e | 3.0 | 40.4 | 59.6 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_s_300e_coco.pdparams) | [配置文件](./yolox_s_300e_coco.yml) |
18-
| YOLOX-m | 640 | 8 | 300e | 5.8 | 46.9 | 65.7| [下载链接](https://paddledet.bj.bcebos.com/models/yolox_m_300e_coco.pdparams) | [配置文件](./yolox_m_300e_coco.yml) |
19-
| YOLOX-l | 640 | 8 | 300e | 9.3 | 50.1 | 68.8 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_l_300e_coco.pdparams) | [配置文件](./yolox_l_300e_coco.yml) |
20-
| YOLOX-x | 640 | 8 | 300e | 16.6 | 51.8 | 70.6 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_x_300e_coco.pdparams) | [配置文件](./yolox_x_300e_coco.yml) |
13+
| 网络网络 | 输入尺寸 | 图片数/GPU | 学习率策略 | 模型推理耗时(ms) | mAP<sup>val<br>0.5:0.95 | mAP<sup>val<br>0.5 | Params(M) | FLOPs(G) | 下载链接 | 配置文件 |
14+
| :------------- | :------- | :-------: | :------: | :------------: | :---------------------: | :----------------: |:---------: | :------: |:---------------: |:-----: |
15+
| YOLOX-nano | 416 | 8 | 300e | 2.3 | 26.1 | 42.0 | 0.91 | 1.08 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_nano_300e_coco.pdparams) | [配置文件](./yolox_nano_300e_coco.yml) |
16+
| YOLOX-tiny | 416 | 8 | 300e | 2.8 | 32.9 | 50.4 | 5.06 | 6.45 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_tiny_300e_coco.pdparams) | [配置文件](./yolox_tiny_300e_coco.yml) |
17+
| YOLOX-s | 640 | 8 | 300e | 3.0 | 40.4 | 59.6 | 9.0 | 26.8 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_s_300e_coco.pdparams) | [配置文件](./yolox_s_300e_coco.yml) |
18+
| YOLOX-m | 640 | 8 | 300e | 5.8 | 46.9 | 65.7 | 25.3 | 73.8 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_m_300e_coco.pdparams) | [配置文件](./yolox_m_300e_coco.yml) |
19+
| YOLOX-l | 640 | 8 | 300e | 9.3 | 50.1 | 68.8 | 54.2 | 155.6 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_l_300e_coco.pdparams) | [配置文件](./yolox_l_300e_coco.yml) |
20+
| YOLOX-x | 640 | 8 | 300e | 16.6 | **51.8** | **70.6** | 99.1 | 281.9 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_x_300e_coco.pdparams) | [配置文件](./yolox_x_300e_coco.yml) |
2121

2222

23-
| 网络网络 | 输入尺寸 | 图片数/GPU | 学习率策略 | 模型推理耗时(ms) | mAP<sup>val<br>0.5:0.95 | mAP<sup>val<br>0.5 | 下载链接 | 配置文件 |
24-
| :------------- | :------- | :-------: | :------: | :---------: | :-----------: | :-----------: |:-------------: | :-----: |
25-
| YOLOXv2-tiny | 416 | 8 | 300e | 1.9 | 32.4 | 50.2 | [下载链接](https://paddledet.bj.bcebos.com/models/yoloxv2_tiny_300e_coco.pdparams) | [配置文件](./yoloxv2_tiny_300e_coco.yml) |
23+
| 网络网络 | 输入尺寸 | 图片数/GPU | 学习率策略 | 模型推理耗时(ms) | mAP<sup>val<br>0.5:0.95 | mAP<sup>val<br>0.5 | Params(M) | FLOPs(G) | 下载链接 | 配置文件 |
24+
| :------------- | :------- | :-------: | :------: | :------------: | :---------------------: | :----------------: |:---------: | :------: |:---------------: |:-----: |
25+
| YOLOXv2-tiny | 416 | 8 | 300e | 1.9 | 32.4 | 50.2 | 5.03 | 6.33 | [下载链接](https://paddledet.bj.bcebos.com/models/yoloxv2_tiny_300e_coco.pdparams) | [配置文件](./yoloxv2_tiny_300e_coco.yml) |
26+
| YOLOX-crn-s | 640 | 8 | 300e | 3.0 | 40.4 | 59.6 | 7.7 | 24.69 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_crn_s_300e_coco.pdparams) | [配置文件](./yolox_crn_s_300e_coco.yml) |
27+
| YOLOX-ConvNeXt-s| 640 | 8 | 36e | - | **44.6** | **65.3** | 36.2 | 27.52 | [下载链接](https://paddledet.bj.bcebos.com/models/yolox_convnext_s_36e_coco.pdparams) | [配置文件](./yolox_convnext_s_36e_coco.yml) |
2628

2729

2830
**注意:**
29-
- YOLOX模型训练使用COCO train2017作为训练集,YOLOXv2表示使用与YOLOv5 releases v6.0之后版本相同的主干网络;
31+
- YOLOX模型训练使用COCO train2017作为训练集,YOLOXv2表示使用与YOLOv5 releases v6.0之后版本相同的主干网络,YOLOX-crn表示使用与PPYOLOE相同的主干网络CSPResNet,YOLOX-ConvNeXt表示使用ConvNeXt作为主干网络
3032
- YOLOX模型训练过程中默认使用8 GPUs进行混合精度训练,默认每卡batch_size为8,默认lr为0.01为8卡总batch_size=64的设置,如果**GPU卡数**或者每卡**batch size**发生了改变,你需要按照公式 **lr<sub>new</sub> = lr<sub>default</sub> * (batch_size<sub>new</sub> * GPU_number<sub>new</sub>) / (batch_size<sub>default</sub> * GPU_number<sub>default</sub>)** 调整学习率;
3133
- 为保持高mAP的同时提高推理速度,可以将[yolox_cspdarknet.yml](_base_/yolox_cspdarknet.yml)中的`nms_top_k`修改为`1000`,将`keep_top_k`修改为`100`,将`score_threshold`修改为`0.01`,mAP会下降约0.1~0.2%;
3234
- 为快速的demo演示效果,可以将[yolox_cspdarknet.yml](_base_/yolox_cspdarknet.yml)中的`score_threshold`修改为`0.25`,将`nms_threshold`修改为`0.45`,但mAP会下降较多;
@@ -153,15 +155,29 @@ python tools/export_model.py -c configs/yolox/yolox_s_300e_coco.yml -o weights=h
153155
python deploy/python/infer.py --model_dir=output_inference/yolox_s_300e_coco --image_file=demo/000000014439_640x640.jpg --device=gpu --run_benchmark=True
154156

155157
# tensorRT-FP32测速
156-
python deploy/python/infer.py --model_dir=output_inference/yolox_s_300e_coco --image_file=demo/000000014439_640x640.jpg --device=gpu --run_benchmark=True --trt_max_shape=640 --trt_min_shape=640 --trt_opt_shape=640 --run_mode=trt_fp32
158+
python deploy/python/infer.py --model_dir=output_inference/yolox_s_300e_coco --image_file=demo/000000014439_640x640.jpg --device=gpu --run_benchmark=True --run_mode=trt_fp32
157159

158160
# tensorRT-FP16测速
159-
python deploy/python/infer.py --model_dir=output_inference/yolox_s_300e_coco --image_file=demo/000000014439_640x640.jpg --device=gpu --run_benchmark=True --trt_max_shape=640 --trt_min_shape=640 --trt_opt_shape=640 --run_mode=trt_fp16
161+
python deploy/python/infer.py --model_dir=output_inference/yolox_s_300e_coco --image_file=demo/000000014439_640x640.jpg --device=gpu --run_benchmark=True --run_mode=trt_fp16
160162
```
161163
**注意:**
162164
- 导出模型时指定`-o exclude_nms=True`仅作为测速时用,这样导出的模型其推理部署预测的结果不是最终检出框的结果。
163165
- [模型库](#模型库)中的速度测试结果为**tensorRT-FP16**测速后的最快速度,为**不包含数据预处理和模型输出后处理(NMS)**的耗时。
164166

167+
## FAQ
168+
169+
<details>
170+
<summary>如何计算模型参数量</summary>
171+
可以将以下代码插入:[trainer.py](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/ppdet/engine/trainer.py#L154) 来计算参数量。
172+
```python
173+
params = sum([
174+
p.numel() for n, p in self.model.named_parameters()
175+
if all([x not in n for x in ['_mean', '_variance']])
176+
]) # exclude BatchNorm running status
177+
print('Params: ', params)
178+
```
179+
</details>
180+
165181

166182
## Citations
167183
```
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
_BASE_: [
2+
'./yolox_cspdarknet.yml',
3+
]
4+
5+
YOLOX:
6+
backbone: ConvNeXt
7+
neck: YOLOCSPPAN
8+
head: YOLOXHead
9+
size_stride: 32
10+
size_range: [15, 25] # multi-scale range [480*480 ~ 800*800]
11+
12+
ConvNeXt:
13+
arch: 'tiny'
14+
drop_path_rate: 0.4
15+
layer_scale_init_value: 1.0
16+
return_idx: [1, 2, 3]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
_BASE_: [
2+
'../datasets/coco_detection.yml',
3+
'../runtime.yml',
4+
'./_base_/yolox_convnext.yml',
5+
'./_base_/yolox_reader.yml'
6+
]
7+
depth_mult: 0.33
8+
width_mult: 0.50
9+
10+
log_iter: 100
11+
snapshot_epoch: 5
12+
weights: output/yolox_convnext_s_36e_coco/model_final
13+
pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/convnext_tiny_1k_224_ema.pdparams
14+
15+
16+
TrainReader:
17+
batch_size: 8
18+
mosaic_epoch: 30
19+
20+
21+
YOLOXHead:
22+
l1_epoch: 20
23+
nms:
24+
name: MultiClassNMS
25+
nms_top_k: 10000
26+
keep_top_k: 1000
27+
score_threshold: 0.001
28+
nms_threshold: 0.65
29+
30+
31+
epoch: 36
32+
LearningRate:
33+
base_lr: 0.0002
34+
schedulers:
35+
- !PiecewiseDecay
36+
gamma: 0.1
37+
milestones: [36]
38+
use_warmup: false
39+
40+
OptimizerBuilder:
41+
regularizer: false
42+
optimizer:
43+
type: AdamW
44+
weight_decay: 0.0005
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
_BASE_: [
2+
'../datasets/coco_detection.yml',
3+
'../runtime.yml',
4+
'./_base_/optimizer_300e.yml',
5+
'./_base_/yolox_cspdarknet.yml',
6+
'./_base_/yolox_reader.yml'
7+
]
8+
depth_mult: 0.33
9+
width_mult: 0.50
10+
11+
log_iter: 100
12+
snapshot_epoch: 10
13+
weights: output/yolox_crn_s_300e_coco/model_final
14+
15+
YOLOX:
16+
backbone: CSPResNet
17+
neck: YOLOCSPPAN
18+
head: YOLOXHead
19+
size_stride: 32
20+
size_range: [15, 25] # multi-scale range [480*480 ~ 800*800]
21+
22+
CSPResNet:
23+
layers: [3, 6, 6, 3]
24+
channels: [64, 128, 256, 512, 1024]
25+
return_idx: [1, 2, 3]
26+
use_large_stem: True

ppdet/modeling/backbones/convnext.py

+27-4
Original file line numberDiff line numberDiff line change
@@ -131,18 +131,41 @@ class ConvNeXt(nn.Layer):
131131
layer_scale_init_value (float): Init value for Layer Scale. Default: 1e-6.
132132
"""
133133

134+
arch_settings = {
135+
'tiny': {
136+
'depths': [3, 3, 9, 3],
137+
'dims': [96, 192, 384, 768]
138+
},
139+
'small': {
140+
'depths': [3, 3, 27, 3],
141+
'dims': [96, 192, 384, 768]
142+
},
143+
'base': {
144+
'depths': [3, 3, 27, 3],
145+
'dims': [128, 256, 512, 1024]
146+
},
147+
'large': {
148+
'depths': [3, 3, 27, 3],
149+
'dims': [192, 384, 768, 1536]
150+
},
151+
'xlarge': {
152+
'depths': [3, 3, 27, 3],
153+
'dims': [256, 512, 1024, 2048]
154+
},
155+
}
156+
134157
def __init__(
135158
self,
159+
arch='tiny',
136160
in_chans=3,
137-
depths=[3, 3, 9, 3],
138-
dims=[96, 192, 384, 768],
139161
drop_path_rate=0.,
140162
layer_scale_init_value=1e-6,
141163
return_idx=[1, 2, 3],
142164
norm_output=True,
143165
pretrained=None, ):
144166
super().__init__()
145-
167+
depths = self.arch_settings[arch]['depths']
168+
dims = self.arch_settings[arch]['dims']
146169
self.downsample_layers = nn.LayerList(
147170
) # stem and 3 intermediate downsampling conv layers
148171
stem = nn.Sequential(
@@ -164,7 +187,7 @@ def __init__(
164187
dp_rates = [x for x in np.linspace(0, drop_path_rate, sum(depths))]
165188
cur = 0
166189
for i in range(4):
167-
stage = nn.Sequential(*[
190+
stage = nn.Sequential(* [
168191
Block(
169192
dim=dims[i],
170193
drop_path=dp_rates[cur + j],

0 commit comments

Comments
 (0)