diff --git a/configs/faster_rcnn_r34_fpn_1x.yml b/configs/faster_rcnn_r34_fpn_1x.yml new file mode 100644 index 0000000000000000000000000000000000000000..b97dc33d5d0ededf5036017e3e04a2bacf96f7bc --- /dev/null +++ b/configs/faster_rcnn_r34_fpn_1x.yml @@ -0,0 +1,106 @@ +architecture: FasterRCNN +max_iters: 90000 +use_gpu: true +snapshot_iter: 10000 +log_smooth_window: 20 +save_dir: output +pretrain_weights: ResNet34_pretrained +metric: COCO +weights: output/faster_rcnn_r34_fpn_1x/model_final +num_classes: 81 + +FasterRCNN: + backbone: ResNet + fpn: FPN + rpn_head: FPNRPNHead + roi_extractor: FPNRoIAlign + bbox_head: BBoxHead + bbox_assigner: BBoxAssigner + +ResNet: + norm_type: bn + norm_decay: 0. + depth: 34 + feature_maps: [2, 3, 4, 5] + freeze_at: 2 + +FPN: + min_level: 2 + max_level: 6 + num_chan: 256 + spatial_scale: [0.03125, 0.0625, 0.125, 0.25] + +FPNRPNHead: + anchor_generator: + anchor_sizes: [32, 64, 128, 256, 512] + aspect_ratios: [0.5, 1.0, 2.0] + stride: [16.0, 16.0] + variance: [1.0, 1.0, 1.0, 1.0] + anchor_start_size: 32 + min_level: 2 + max_level: 6 + num_chan: 256 + rpn_target_assign: + rpn_batch_size_per_im: 256 + rpn_fg_fraction: 0.5 + rpn_positive_overlap: 0.7 + rpn_negative_overlap: 0.3 + rpn_straddle_thresh: 0.0 + train_proposal: + min_size: 0.0 + nms_thresh: 0.7 + pre_nms_top_n: 2000 + post_nms_top_n: 2000 + test_proposal: + min_size: 0.0 + nms_thresh: 0.7 + pre_nms_top_n: 1000 + post_nms_top_n: 1000 + +FPNRoIAlign: + canconical_level: 4 + canonical_size: 224 + min_level: 2 + max_level: 5 + box_resolution: 7 + sampling_ratio: 2 + +BBoxAssigner: + batch_size_per_im: 512 + bbox_reg_weights: [0.1, 0.1, 0.2, 0.2] + bg_thresh_lo: 0.0 + bg_thresh_hi: 0.5 + fg_fraction: 0.25 + fg_thresh: 0.5 + +BBoxHead: + head: TwoFCHead + nms: + keep_top_k: 100 + nms_threshold: 0.5 + score_threshold: 0.05 + +TwoFCHead: + mlp_dim: 1024 + +LearningRate: + base_lr: 0.02 + schedulers: + - !PiecewiseDecay + gamma: 0.1 + milestones: [60000, 80000] + - !LinearWarmup + start_factor: 0.1 + steps: 1000 + +OptimizerBuilder: + optimizer: + momentum: 0.9 + type: Momentum + regularizer: + factor: 0.0001 + type: L2 + +_READER_: 'faster_fpn_reader.yml' +TrainReader: + batch_size: 2 diff --git a/configs/faster_rcnn_r34_vd_fpn_1x.yml b/configs/faster_rcnn_r34_vd_fpn_1x.yml new file mode 100644 index 0000000000000000000000000000000000000000..68e061c62f65ea74a35f761bde31aeaa38baf848 --- /dev/null +++ b/configs/faster_rcnn_r34_vd_fpn_1x.yml @@ -0,0 +1,107 @@ +architecture: FasterRCNN +max_iters: 90000 +use_gpu: true +snapshot_iter: 10000 +log_smooth_window: 20 +save_dir: output +pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet34_vd_pretrained.tar +metric: COCO +weights: output/faster_rcnn_r34_fpn_1x/model_final +num_classes: 81 + +FasterRCNN: + backbone: ResNet + fpn: FPN + rpn_head: FPNRPNHead + roi_extractor: FPNRoIAlign + bbox_head: BBoxHead + bbox_assigner: BBoxAssigner + +ResNet: + norm_type: bn + norm_decay: 0. + depth: 34 + feature_maps: [2, 3, 4, 5] + freeze_at: 2 + variant: d + +FPN: + min_level: 2 + max_level: 6 + num_chan: 256 + spatial_scale: [0.03125, 0.0625, 0.125, 0.25] + +FPNRPNHead: + anchor_generator: + anchor_sizes: [32, 64, 128, 256, 512] + aspect_ratios: [0.5, 1.0, 2.0] + stride: [16.0, 16.0] + variance: [1.0, 1.0, 1.0, 1.0] + anchor_start_size: 32 + min_level: 2 + max_level: 6 + num_chan: 256 + rpn_target_assign: + rpn_batch_size_per_im: 256 + rpn_fg_fraction: 0.5 + rpn_positive_overlap: 0.7 + rpn_negative_overlap: 0.3 + rpn_straddle_thresh: 0.0 + train_proposal: + min_size: 0.0 + nms_thresh: 0.7 + pre_nms_top_n: 2000 + post_nms_top_n: 2000 + test_proposal: + min_size: 0.0 + nms_thresh: 0.7 + pre_nms_top_n: 1000 + post_nms_top_n: 1000 + +FPNRoIAlign: + canconical_level: 4 + canonical_size: 224 + min_level: 2 + max_level: 5 + box_resolution: 7 + sampling_ratio: 2 + +BBoxAssigner: + batch_size_per_im: 512 + bbox_reg_weights: [0.1, 0.1, 0.2, 0.2] + bg_thresh_lo: 0.0 + bg_thresh_hi: 0.5 + fg_fraction: 0.25 + fg_thresh: 0.5 + +BBoxHead: + head: TwoFCHead + nms: + keep_top_k: 100 + nms_threshold: 0.5 + score_threshold: 0.05 + +TwoFCHead: + mlp_dim: 1024 + +LearningRate: + base_lr: 0.02 + schedulers: + - !PiecewiseDecay + gamma: 0.1 + milestones: [60000, 80000] + - !LinearWarmup + start_factor: 0.1 + steps: 1000 + +OptimizerBuilder: + optimizer: + momentum: 0.9 + type: Momentum + regularizer: + factor: 0.0001 + type: L2 + +_READER_: 'faster_fpn_reader.yml' +TrainReader: + batch_size: 2 diff --git a/configs/htc/README.md b/configs/htc/README.md index e34b1b233f0b5cb8982d1210bb30a676877b2c6a..19bc16a37fc7104bc176d3e6715e90b3a705d5a7 100644 --- a/configs/htc/README.md +++ b/configs/htc/README.md @@ -23,4 +23,4 @@ The results on COCO 2017val are shown in the below table. (results on test-dev a | Backbone | Lr schd | Inf time (fps) | box AP | mask AP | Download | |:---------:|:-------:|:--------------:|:------:|:-------:|:--------:| - | R-50-FPN | 1x | 11 | 42.2 | 36.5 | [model](https://paddlemodels.bj.bcebos.com/object_detection/htc_r50_fpn_1x.pdparams ) | + | R-50-FPN | 1x | 11 | 42.7 | 36.8 | [model](https://paddlemodels.bj.bcebos.com/object_detection/htc_r50_fpn_1x.pdparams ) | diff --git a/configs/htc/htc_r50_fpn_1x.yml b/configs/htc/htc_r50_fpn_1x.yml index 0601704ce735d4fa1ad9335f731b0defcef3b65d..56c0e1607bc00668165c4b67044fc7493cadba1b 100644 --- a/configs/htc/htc_r50_fpn_1x.yml +++ b/configs/htc/htc_r50_fpn_1x.yml @@ -1,6 +1,6 @@ architecture: HybridTaskCascade use_gpu: true -max_iters: 100000 +max_iters: 180000 snapshot_iter: 10000 log_smooth_window: 50 save_dir: output @@ -110,12 +110,13 @@ LearningRate: schedulers: - !PiecewiseDecay gamma: 0.1 - milestones: [60000, 80000] + milestones: [120000, 160000] - !LinearWarmup start_factor: 0.1 steps: 1000 OptimizerBuilder: + clip_grad_by_norm: 35.0 optimizer: momentum: 0.9 type: Momentum @@ -124,8 +125,9 @@ OptimizerBuilder: type: L2 TrainReader: - batch_size: 2 + batch_size: 1 worker_num: 2 + shuffle: true dataset: !COCODataSet dataset_dir: dataset/coco diff --git a/configs/mobile/cascade_rcnn_mobilenetv3_fpn_640.yml b/configs/mobile/cascade_rcnn_mobilenetv3_fpn_640.yml index 54e7a7f3e4afc223a86a8bcdc778e604b240b2ce..cfd650c56dfebb5b9ddf27eb95d5d16670444405 100644 --- a/configs/mobile/cascade_rcnn_mobilenetv3_fpn_640.yml +++ b/configs/mobile/cascade_rcnn_mobilenetv3_fpn_640.yml @@ -95,7 +95,7 @@ CascadeTwoFCHead: mlp_dim: 128 LearningRate: - base_lr: 0.01 + base_lr: 0.02 schedulers: - !CosineDecay max_iters: 500000 diff --git a/configs/ppyolo/README.md b/configs/ppyolo/README.md index 4f481ba0711d85b8491b88c4955f7a9cecc627d8..11837a1b60ec4173549a4d5aed758dde6a6b006f 100644 --- a/configs/ppyolo/README.md +++ b/configs/ppyolo/README.md @@ -11,7 +11,7 @@ English | [简体中文](README_cn.md) ## Introduction -[PP-YOLO](https://arxiv.org/abs/2007.12099) is a optimized model based on YOLOv3 in PaddleDetection,whose performance(mAP on COCO) and inference spped are better than [YOLOv4](https://arxiv.org/abs/2004.10934),PaddlePaddle 1.8.4(will release in mid-August 202) or [Daily Version](https://www.paddlepaddle.org.cn/documentation/docs/zh/install/Tables.html#whl-dev) is required to run this PP-YOLO。 +[PP-YOLO](https://arxiv.org/abs/2007.12099) is a optimized model based on YOLOv3 in PaddleDetection,whose performance(mAP on COCO) and inference spped are better than [YOLOv4](https://arxiv.org/abs/2004.10934),PaddlePaddle 1.8.4(available on pip now) or [Daily Version](https://www.paddlepaddle.org.cn/documentation/docs/zh/install/Tables.html#whl-dev) is required to run this PP-YOLO。 PP-YOLO reached mmAP(IoU=0.5:0.95) as 45.9% on COCO test-dev2017 dataset, and inference speed of FP32 on single V100 is 72.9 FPS, inference speed of FP16 with TensorRT on single V100 is 155.6 FPS. @@ -36,24 +36,24 @@ PP-YOLO improved performance and speed of YOLOv3 with following methods: ### PP-YOLO -| Model | GPU number | images/GPU | backbone | input shape | Box APtest | V100 FP32(FPS) | V100 TensorRT FP16(FPS) | download | config | -|:------------------------:|:----------:|:----------:|:----------:| :----------:| :-------------------: | :------------: | :---------------------: | :------: | :-----: | -| YOLOv4(AlexyAB) | - | - | CSPDarknet | 608 | 43.5 | 62 | 105.5 | [model](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | -| YOLOv4(AlexyAB) | - | - | CSPDarknet | 512 | 43.0 | 83 | 138.4 | [model](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | -| YOLOv4(AlexyAB) | - | - | CSPDarknet | 416 | 41.2 | 96 | 164.0 | [model](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | -| YOLOv4(AlexyAB) | - | - | CSPDarknet | 320 | 38.0 | 123 | 199.0 | [model](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | -| PP-YOLO | 8 | 24 | ResNet50vd | 608 | 45.2 | 72.9 | 155.6 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | -| PP-YOLO | 8 | 24 | ResNet50vd | 512 | 44.4 | 89.9 | 188.4 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | -| PP-YOLO | 8 | 24 | ResNet50vd | 416 | 42.5 | 109.1 | 215.4 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | -| PP-YOLO | 8 | 24 | ResNet50vd | 320 | 39.3 | 132.2 | 242.2 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | -| PP-YOLO_2x | 8 | 24 | ResNet50vd | 608 | 45.9 | 72.9 | 155.6 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_2x.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_2x.yml) | -| PP-YOLO_2x | 8 | 24 | ResNet50vd | 512 | 45.0 | 89.9 | 188.4 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_2x.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_2x.yml) | -| PP-YOLO_2x | 8 | 24 | ResNet50vd | 416 | 43.2 | 109.1 | 215.4 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_2x.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_2x.yml) | -| PP-YOLO_2x | 8 | 24 | ResNet50vd | 320 | 40.1 | 132.2 | 242.2 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_2x.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_2x.yml) | +| Model | GPU number | images/GPU | backbone | input shape | Box APval | Box APtest | V100 FP32(FPS) | V100 TensorRT FP16(FPS) | download | config | +|:------------------------:|:----------:|:----------:|:----------:| :----------:| :------------------: | :-------------------: | :------------: | :---------------------: | :------: | :-----: | +| YOLOv4(AlexyAB) | - | - | CSPDarknet | 608 | - | 43.5 | 62 | 105.5 | [model](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | +| YOLOv4(AlexyAB) | - | - | CSPDarknet | 512 | - | 43.0 | 83 | 138.4 | [model](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | +| YOLOv4(AlexyAB) | - | - | CSPDarknet | 416 | - | 41.2 | 96 | 164.0 | [model](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | +| YOLOv4(AlexyAB) | - | - | CSPDarknet | 320 | - | 38.0 | 123 | 199.0 | [model](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | +| PP-YOLO | 8 | 24 | ResNet50vd | 608 | 44.8 | 45.2 | 72.9 | 155.6 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| PP-YOLO | 8 | 24 | ResNet50vd | 512 | 43.9 | 44.4 | 89.9 | 188.4 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| PP-YOLO | 8 | 24 | ResNet50vd | 416 | 42.1 | 42.5 | 109.1 | 215.4 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| PP-YOLO | 8 | 24 | ResNet50vd | 320 | 38.9 | 39.3 | 132.2 | 242.2 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| PP-YOLO_2x | 8 | 24 | ResNet50vd | 608 | 45.3 | 45.9 | 72.9 | 155.6 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_2x.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_2x.yml) | +| PP-YOLO_2x | 8 | 24 | ResNet50vd | 512 | 44.4 | 45.0 | 89.9 | 188.4 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_2x.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_2x.yml) | +| PP-YOLO_2x | 8 | 24 | ResNet50vd | 416 | 42.7 | 43.2 | 109.1 | 215.4 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_2x.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_2x.yml) | +| PP-YOLO_2x | 8 | 24 | ResNet50vd | 320 | 39.5 | 40.1 | 132.2 | 242.2 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_2x.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_2x.yml) | **Notes:** -- PP-YOLO is trained on COCO train2017 datast and evaluated on test-dev2017 dataset,Box APtest is evaluation results of `mAP(IoU=0.5:0.95)`. +- PP-YOLO is trained on COCO train2017 datast and evaluated on val2017 & test-dev2017 dataset,Box APtest is evaluation results of `mAP(IoU=0.5:0.95)`. - PP-YOLO used 8 GPUs for training and mini-batch size as 24 on each GPU, if GPU number and mini-batch size is changed, learning rate and iteration times should be adjusted according [FAQ](../../docs/FAQ.md). - PP-YOLO inference speed is tesed on single Tesla V100 with batch size as 1, CUDA 10.2, CUDNN 7.5.1, TensorRT 5.1.2.2 in TensorRT mode. - PP-YOLO FP32 inference speed testing uses inference model exported by `tools/export_model.py` and benchmarked by running `depoly/python/infer.py` with `--run_benchmark`. All testing results do not contains the time cost of data reading and post-processing(NMS), which is same as [YOLOv4(AlexyAB)](https://github.com/AlexeyAB/darknet) in testing method. @@ -61,16 +61,16 @@ PP-YOLO improved performance and speed of YOLOv3 with following methods: - YOLOv4(AlexyAB) performance and inference speed is copy from single Tesla V100 testing results in [YOLOv4 github repo](https://github.com/AlexeyAB/darknet), Tesla V100 TensorRT FP16 inference speed is testing with tkDNN configuration and TensorRT 5.1.2.2 on single Tesla V100 based on [AlexyAB/darknet repo](https://github.com/AlexeyAB/darknet). - Download and configuration of YOLOv4(AlexyAB) is reproduced model of YOLOv4 in PaddleDetection, whose evaluation performance is same as YOLOv4(AlexyAB), and finetune training is supported in PaddleDetection currently, reproducing by training from backbone pretrain weights is on working, see [PaddleDetection YOLOv4](../yolov4/README.md) for details. -### PP-YOLO tiny +### PP-YOLO for mobile -| Model | GPU number | images/GPU | backbone | input shape | Box AP50val | V100 FP32(FPS) | V100 TensorRT FP16(FPS) | download | config | -|:------------------------:|:----------:|:----------:|:----------:| :----------:| :--------------------: | :------------: | :---------------------: | :------: | :-----: | -| PP-YOLO tiny | 4 | 32 | ResNet18vd | 416 | 47.0 | 401.6 | 724.6 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_tiny.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_tiny.yml) | -| PP-YOLO tiny | 4 | 32 | ResNet18vd | 320 | 43.7 | 478.5 | 791.3 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_tiny.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_tiny.yml) | +| Model | GPU number | images/GPU | backbone | input shape | Box AP50val | Box AP50test | V100 FP32(FPS) | V100 TensorRT FP16(FPS) | download | config | +|:------------------------:|:----------:|:----------:|:----------:| :----------:| :--------------------: | :---------------------: | :------------: | :---------------------: | :------: | :-----: | +| PP-YOLO_r18vd | 4 | 32 | ResNet18vd | 416 | 47.0 | 47.7 | 401.6 | 724.6 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_r18vd.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_r18vd.yml) | +| PP-YOLO_r18vd | 4 | 32 | ResNet18vd | 320 | 43.7 | 44.4 | 478.5 | 791.3 | [model](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_r18vd.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_r18vd.yml) | -- PP-YOLO tiny is trained on COCO train2017 datast and evaluated on val2017 dataset,Box AP50val is evaluation results of `mAP(IoU=0.5)`. -- PP-YOLO tiny used 4 GPUs for training and mini-batch size as 32 on each GPU, if GPU number and mini-batch size is changed, learning rate and iteration times should be adjusted according [FAQ](../../docs/FAQ.md). -- PP-YOLO tiny inference speeding testing environment and configuration is same as PP-YOLO above. +- PP-YOLO_r18vd is trained on COCO train2017 datast and evaluated on val2017 & test-dev2017 dataset,Box AP50val is evaluation results of `mAP(IoU=0.5)`. +- PP-YOLO_r18vd used 4 GPUs for training and mini-batch size as 32 on each GPU, if GPU number and mini-batch size is changed, learning rate and iteration times should be adjusted according [FAQ](../../docs/FAQ.md). +- PP-YOLO_r18vd inference speeding testing environment and configuration is same as PP-YOLO above. ## Getting Start @@ -165,7 +165,8 @@ Optimizing method and ablation experiments of PP-YOLO compared with YOLOv3. | G | F + Matrix NMS | 43.5 | - | 43.90 | 44.71 | 74.8 | | H | G + CoordConv | 44.0 | - | 43.93 | 44.76 | 74.1 | | I | H + SPP | 44.3 | 45.2 | 44.93 | 45.12 | 72.9 | -| J | I + Better ImageNet Pretrain | 44.6 | 45.2 | 44.93 | 45.12 | 72.9 | +| J | I + Better ImageNet Pretrain | 44.8 | 45.2 | 44.93 | 45.12 | 72.9 | +| K | J + 2x Scheduler | 45.3 | 45.9 | 44.93 | 45.12 | 72.9 | **Notes:** diff --git a/configs/ppyolo/README_cn.md b/configs/ppyolo/README_cn.md index 2d3deceb2a8dd1d782d72da331e8293a6ab5ddeb..2c81cd9d6379dcdba11d33095c450c6211f275d1 100644 --- a/configs/ppyolo/README_cn.md +++ b/configs/ppyolo/README_cn.md @@ -11,7 +11,7 @@ ## 简介 -[PP-YOLO](https://arxiv.org/abs/2007.12099)是PaddleDetection优化和改进的YOLOv3的模型,其精度(COCO数据集mAP)和推理速度均优于[YOLOv4](https://arxiv.org/abs/2004.10934)模型,要求使用PaddlePaddle 1.8.4(2020年8月中旬发布)或适当的[develop版本](https://www.paddlepaddle.org.cn/documentation/docs/zh/install/Tables.html#whl-dev)。 +[PP-YOLO](https://arxiv.org/abs/2007.12099)是PaddleDetection优化和改进的YOLOv3的模型,其精度(COCO数据集mAP)和推理速度均优于[YOLOv4](https://arxiv.org/abs/2004.10934)模型,要求使用PaddlePaddle 1.8.4(可使用pip安装) 或适当的[develop版本](https://www.paddlepaddle.org.cn/documentation/docs/zh/install/Tables.html#whl-dev)。 PP-YOLO在[COCO](http://cocodataset.org) test-dev2017数据集上精度达到45.9%,在单卡V100上FP32推理速度为72.9 FPS, V100上开启TensorRT下FP16推理速度为155.6 FPS。 @@ -36,24 +36,24 @@ PP-YOLO从如下方面优化和提升YOLOv3模型的精度和速度: ### PP-YOLO模型 -| 模型 | GPU个数 | 每GPU图片个数 | 骨干网络 | 输入尺寸 | Box APtest | V100 FP32(FPS) | V100 TensorRT FP16(FPS) | 模型下载 | 配置文件 | -|:------------------------:|:-------:|:-------------:|:----------:| :-------:| :-------------------: | :------------: | :---------------------: | :------: | :------: | -| YOLOv4(AlexyAB) | - | - | CSPDarknet | 608 | 43.5 | 62 | 105.5 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | -| YOLOv4(AlexyAB) | - | - | CSPDarknet | 512 | 43.0 | 83 | 138.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | -| YOLOv4(AlexyAB) | - | - | CSPDarknet | 416 | 41.2 | 96 | 164.0 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | -| YOLOv4(AlexyAB) | - | - | CSPDarknet | 320 | 38.0 | 123 | 199.0 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | -| PP-YOLO | 8 | 24 | ResNet50vd | 608 | 45.2 | 72.9 | 155.6 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | -| PP-YOLO | 8 | 24 | ResNet50vd | 512 | 44.4 | 89.9 | 188.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | -| PP-YOLO | 8 | 24 | ResNet50vd | 416 | 42.5 | 109.1 | 215.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | -| PP-YOLO | 8 | 24 | ResNet50vd | 320 | 39.3 | 132.2 | 242.2 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | -| PP-YOLO_2x | 8 | 24 | ResNet50vd | 608 | 45.9 | 72.9 | 155.6 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | -| PP-YOLO_2x | 8 | 24 | ResNet50vd | 512 | 45.0 | 89.9 | 188.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | -| PP-YOLO_2x | 8 | 24 | ResNet50vd | 416 | 43.2 | 109.1 | 215.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | -| PP-YOLO_2x | 8 | 24 | ResNet50vd | 320 | 40.1 | 132.2 | 242.2 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| 模型 | GPU个数 | 每GPU图片个数 | 骨干网络 | 输入尺寸 | Box APval | Box APtest | V100 FP32(FPS) | V100 TensorRT FP16(FPS) | 模型下载 | 配置文件 | +|:------------------------:|:-------:|:-------------:|:----------:| :-------:| :------------------: | :-------------------: | :------------: | :---------------------: | :------: | :------: | +| YOLOv4(AlexyAB) | - | - | CSPDarknet | 608 | - | 43.5 | 62 | 105.5 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | +| YOLOv4(AlexyAB) | - | - | CSPDarknet | 512 | - | 43.0 | 83 | 138.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | +| YOLOv4(AlexyAB) | - | - | CSPDarknet | 416 | - | 41.2 | 96 | 164.0 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | +| YOLOv4(AlexyAB) | - | - | CSPDarknet | 320 | - | 38.0 | 123 | 199.0 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov4_cspdarknet.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/yolov4/yolov4_csdarknet.yml) | +| PP-YOLO | 8 | 24 | ResNet50vd | 608 | 44.8 | 45.2 | 72.9 | 155.6 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| PP-YOLO | 8 | 24 | ResNet50vd | 512 | 43.9 | 44.4 | 89.9 | 188.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| PP-YOLO | 8 | 24 | ResNet50vd | 416 | 42.1 | 42.5 | 109.1 | 215.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| PP-YOLO | 8 | 24 | ResNet50vd | 320 | 38.9 | 39.3 | 132.2 | 242.2 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| PP-YOLO_2x | 8 | 24 | ResNet50vd | 608 | 45.3 | 45.9 | 72.9 | 155.6 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| PP-YOLO_2x | 8 | 24 | ResNet50vd | 512 | 44.4 | 45.0 | 89.9 | 188.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| PP-YOLO_2x | 8 | 24 | ResNet50vd | 416 | 42.7 | 43.2 | 109.1 | 215.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | +| PP-YOLO_2x | 8 | 24 | ResNet50vd | 320 | 39.5 | 40.1 | 132.2 | 242.2 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo.yml) | **注意:** -- PP-YOLO模型使用COCO数据集中train2017作为训练集,使用test-dev2017作为测试集,Box APtest为`mAP(IoU=0.5:0.95)`评估结果。 +- PP-YOLO模型使用COCO数据集中train2017作为训练集,使用val2017和test-dev2017作为测试集,Box APtest为`mAP(IoU=0.5:0.95)`评估结果。 - PP-YOLO模型训练过程中使用8 GPUs,每GPU batch size为24进行训练,如训练GPU数和batch size不使用上述配置,须参考[FAQ](../../docs/FAQ.md)调整学习率和迭代次数。 - PP-YOLO模型推理速度测试采用单卡V100,batch size=1进行测试,使用CUDA 10.2, CUDNN 7.5.1,TensorRT推理速度测试使用TensorRT 5.1.2.2。 - PP-YOLO模型FP32的推理速度测试数据为使用`tools/export_model.py`脚本导出模型后,使用`deploy/python/infer.py`脚本中的`--run_benchnark`参数使用Paddle预测库进行推理速度benchmark测试结果, 且测试的均为不包含数据预处理和模型输出后处理(NMS)的数据(与[YOLOv4(AlexyAB)](https://github.com/AlexeyAB/darknet)测试方法一致)。 @@ -62,16 +62,16 @@ PP-YOLO从如下方面优化和提升YOLOv3模型的精度和速度: - PP-YOLO模型推理速度测试采用单卡V100,batch size=1进行测试,使用CUDA 10.2, CUDNN 7.5.1,TensorRT推理速度测试使用TensorRT 5.1.2.2。 - YOLOv4(AlexyAB)行`模型下载`和`配置文件`为PaddleDetection复现的YOLOv4模型,目前评估精度已对齐,支持finetune,训练精度对齐中,可参见[PaddleDetection YOLOv4 模型](../yolov4/README.md) -### PP-YOLO tiny模型 +### PP-YOLO 移动端模型 -| 模型 | GPU个数 | 每GPU图片个数 | 骨干网络 | 输入尺寸 | Box AP50val | V100 FP32(FPS) | V100 TensorRT FP16(FPS) | 模型下载 | 配置文件 | -|:------------------------:|:-------:|:-------------:|:----------:| :-------:| :------------------: | :------------: | :---------------------: | :------: | :------: | -| PP-YOLO tiny | 4 | 32 | ResNet18vd | 416 | 47.0 | 401.6 | 724.6 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_tiny.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_tiny.yml) | -| PP-YOLO tiny | 4 | 32 | ResNet18vd | 320 | 43.7 | 478.5 | 791.3 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_tiny.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_tiny.yml) | +| 模型 | GPU个数 | 每GPU图片个数 | 骨干网络 | 输入尺寸 | Box AP50val | Box AP50test | V100 FP32(FPS) | V100 TensorRT FP16(FPS) | 模型下载 | 配置文件 | +|:------------------------:|:-------:|:-------------:|:----------:| :-------:| :--------------------: | :---------------------: |------------: | :---------------------: | :------: | :------: | +| PP-YOLO_r18vd | 4 | 32 | ResNet18vd | 416 | 47.0 | 47.7 | 401.6 | 724.6 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_r18vd.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_r18vd.yml) | +| PP-YOLO_r18vd | 4 | 32 | ResNet18vd | 320 | 43.7 | 44.4 | 478.5 | 791.3 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/ppyolo_r18vd.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ppyolo/ppyolo_r18vd.yml) | -- PP-YOLO tiny模型使用COCO数据集中train2017作为训练集,使用val2017作为测试集,Box AP50val为`mAP(IoU=0.5)`评估结果。 -- PP-YOLO tiny模型训练过程中使用4GPU,每GPU batch size为32进行训练,如训练GPU数和batch size不使用上述配置,须参考[FAQ](../../docs/FAQ.md)调整学习率和迭代次数。 -- PP-YOLO tiny模型推理速度测试环境配置和测试方法与PP-YOLO模型一致。 +- PP-YOLO_r18vd 模型使用COCO数据集中train2017作为训练集,使用val2017和test-dev2017作为测试集,Box AP50val为`mAP(IoU=0.5)`评估结果。 +- PP-YOLO_r18vd 模型训练过程中使用4GPU,每GPU batch size为32进行训练,如训练GPU数和batch size不使用上述配置,须参考[FAQ](../../docs/FAQ.md)调整学习率和迭代次数。 +- PP-YOLO_r18vd 模型推理速度测试环境配置和测试方法与PP-YOLO模型一致。 ## 使用说明 @@ -149,7 +149,7 @@ CUDA_VISIBLE_DEVICES=0 python deploy/python/infer.py --model_dir=output/ppyolo - ## 未来工作 1. 发布PP-YOLO-tiny模型 -2. 发布更多骨干网络的PP-YOLO及PP-YOLO-tiny模型 +2. 发布更多骨干网络的PP-YOLO模型 ## 附录 @@ -166,7 +166,8 @@ PP-YOLO模型相对于YOLOv3模型优化项消融实验数据如下表所示。 | G | F + Matrix NMS | 43.5 | - | 43.90 | 44.71 | 74.8 | | H | G + CoordConv | 44.0 | - | 43.93 | 44.76 | 74.1 | | I | H + SPP | 44.3 | 45.2 | 44.93 | 45.12 | 72.9 | -| J | I + Better ImageNet Pretrain | 44.6 | 45.2 | 44.93 | 45.12 | 72.9 | +| J | I + Better ImageNet Pretrain | 44.8 | 45.2 | 44.93 | 45.12 | 72.9 | +| K | J + 2x Scheduler | 45.3 | 45.9 | 44.93 | 45.12 | 72.9 | **注意:** diff --git a/configs/ppyolo/ppyolo_tiny.yml b/configs/ppyolo/ppyolo_r18vd.yml similarity index 100% rename from configs/ppyolo/ppyolo_tiny.yml rename to configs/ppyolo/ppyolo_r18vd.yml diff --git a/configs/rcnn_enhance/README.md b/configs/rcnn_enhance/README.md index e788400a509b5b2311f7126d8c8c2a89a9ce377a..4b75d8327be33cbf62719d96ac210b0b2c0d98e8 100644 --- a/configs/rcnn_enhance/README.md +++ b/configs/rcnn_enhance/README.md @@ -35,3 +35,6 @@ | ResNet50-vd-FPN-Dcnv2 | Faster | 2 | 3x | 61.425 | 41.6 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_dcn_r50_vd_fpn_3x_server_side.tar) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/rcnn_enhance/faster_rcnn_dcn_r50_vd_fpn_3x_server_side.yml) | | ResNet50-vd-FPN-Dcnv2 | Cascade Faster | 2 | 3x | 20.001 | 47.8 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.tar) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/rcnn_enhance/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.yml) | | ResNet101-vd-FPN-Dcnv2 | Cascade Faster | 2 | 3x | 19.523 | 49.4 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/cascade_rcnn_dcn_r101_vd_fpn_3x_server_side.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/rcnn_enhance/cascade_rcnn_dcn_r101_vd_fpn_3x_server_side.yml) | + + +**注**:generic文件夹下面的配置文件对应的预训练模型均只支持预测,不支持训练与评估。 diff --git a/configs/rcnn_enhance/README_en.md b/configs/rcnn_enhance/README_en.md index 6018c387d886890ca1298a1cbfe703664f9c2a3b..f70cc9422b627051d315866e48cfe6ca0af7c244 100644 --- a/configs/rcnn_enhance/README_en.md +++ b/configs/rcnn_enhance/README_en.md @@ -39,3 +39,6 @@ And the following figure shows `mAP-Speed` curves for some common detectors. | ResNet50-vd-FPN-Dcnv2 | Faster | 2 | 3x | 61.425 | 41.6 | - | [model](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_dcn_r50_vd_fpn_3x_server_side.tar) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/rcnn_enhance/faster_rcnn_dcn_r50_vd_fpn_3x_server_side.yml) | | ResNet50-vd-FPN-Dcnv2 | Cascade Faster | 2 | 3x | 20.001 | 47.8 | - | [model](https://paddlemodels.bj.bcebos.com/object_detection/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.tar) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/rcnn_enhance/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.yml) | | ResNet101-vd-FPN-Dcnv2 | Cascade Faster | 2 | 3x | 19.523 | 49.4 | - | [model](https://paddlemodels.bj.bcebos.com/object_detection/cascade_rcnn_dcn_r101_vd_fpn_3x_server_side.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/rcnn_enhance/cascade_rcnn_dcn_r101_vd_fpn_3x_server_side.yml) | + + +**Attention**: Pretrained models whose congigurations are in the directory `generic` just support inference but do not support training and evaluation as now. diff --git a/configs/rcnn_enhance/generic/cascade_rcnn_dcn_r50_vd_fpn_gen_server_side.yml b/configs/rcnn_enhance/generic/cascade_rcnn_dcn_r50_vd_fpn_gen_server_side.yml index ae47f941f44f0a0c3f5f2a667b7b73a3a86d676d..e93524d81da31383e8b055fa052c54586525d1c9 100644 --- a/configs/rcnn_enhance/generic/cascade_rcnn_dcn_r50_vd_fpn_gen_server_side.yml +++ b/configs/rcnn_enhance/generic/cascade_rcnn_dcn_r50_vd_fpn_gen_server_side.yml @@ -109,7 +109,7 @@ OptimizerBuilder: type: Momentum regularizer: factor: 0.0001 - type: L + type: L2 TrainReader: inputs_def: diff --git a/configs/ssd/ssd_mobilenet_v1_voc.yml b/configs/ssd/ssd_mobilenet_v1_voc.yml index ec3c5a21c9c29f3fc81da276749259295f10bc7f..5fcbbf230d8e21ec9c2a66dc379707686cf506f7 100644 --- a/configs/ssd/ssd_mobilenet_v1_voc.yml +++ b/configs/ssd/ssd_mobilenet_v1_voc.yml @@ -134,7 +134,7 @@ TestReader: interp: 1 max_size: 0 target_size: 300 - use_cv2: false + use_cv2: true - !Permute {} - !NormalizeImage is_scale: false diff --git a/configs/ssd/ssd_vgg16_300.yml b/configs/ssd/ssd_vgg16_300.yml index aaacf022dcd61619ef4c4654b3ac1ebeb971bcd9..3c94c7d93e898f962579627008d467045736e621 100644 --- a/configs/ssd/ssd_vgg16_300.yml +++ b/configs/ssd/ssd_vgg16_300.yml @@ -140,7 +140,7 @@ TestReader: interp: 1 max_size: 0 target_size: 300 - use_cv2: false + use_cv2: true - !Permute to_bgr: false - !NormalizeImage diff --git a/configs/ssd/ssd_vgg16_300_voc.yml b/configs/ssd/ssd_vgg16_300_voc.yml index b748966887cc58187da06327e5bce737b858cc89..58570954da3cc188ae7805d2e7d6f77d5451f042 100644 --- a/configs/ssd/ssd_vgg16_300_voc.yml +++ b/configs/ssd/ssd_vgg16_300_voc.yml @@ -140,7 +140,7 @@ TestReader: interp: 1 max_size: 0 target_size: 300 - use_cv2: false + use_cv2: true - !Permute to_bgr: false - !NormalizeImage diff --git a/configs/ssd/ssd_vgg16_512.yml b/configs/ssd/ssd_vgg16_512.yml index 1ddea55706141a694de02cdc1da2f72af41531cf..4a36eecfb251cabc384893046b4d4fc2b6006f83 100644 --- a/configs/ssd/ssd_vgg16_512.yml +++ b/configs/ssd/ssd_vgg16_512.yml @@ -142,7 +142,7 @@ TestReader: interp: 1 max_size: 0 target_size: 512 - use_cv2: false + use_cv2: true - !Permute to_bgr: false - !NormalizeImage diff --git a/configs/ssd/ssd_vgg16_512_voc.yml b/configs/ssd/ssd_vgg16_512_voc.yml index 35fd19094e366e882e0dd1dd92397f2b2e526c0e..7cc5cd8c6438aab92c284b2b09c5e73c68f970b9 100644 --- a/configs/ssd/ssd_vgg16_512_voc.yml +++ b/configs/ssd/ssd_vgg16_512_voc.yml @@ -144,7 +144,7 @@ TestReader: interp: 1 max_size: 0 target_size: 512 - use_cv2: false + use_cv2: true - !Permute to_bgr: false - !NormalizeImage diff --git a/configs/ssd/ssdlite_ghostnet.yml b/configs/ssd/ssdlite_ghostnet.yml new file mode 100644 index 0000000000000000000000000000000000000000..fc0d35ddb30761fba2fa0288662045eb3bc88e03 --- /dev/null +++ b/configs/ssd/ssdlite_ghostnet.yml @@ -0,0 +1,162 @@ +architecture: SSD +use_gpu: true +max_iters: 400000 +snapshot_iter: 20000 +log_smooth_window: 20 +log_iter: 20 +metric: COCO +pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/GhostNet_x1_3_ssld_pretrained.tar +save_dir: output +weights: output/ssdlite_ghostnet/model_final +# 80(label_class) + 1(background) +num_classes: 81 + +SSD: + backbone: GhostNet + multi_box_head: SSDLiteMultiBoxHead + output_decoder: + background_label: 0 + keep_top_k: 200 + nms_eta: 1.0 + nms_threshold: 0.45 + nms_top_k: 400 + score_threshold: 0.01 + + +GhostNet: + scale: 1.3 + extra_block_filters: [[256, 512], [128, 256], [128, 256], [64, 128]] + feature_maps: [5, 7, 8, 9, 10, 11] + conv_decay: 0.00004 + lr_mult_list: [0.25, 0.25, 0.5, 0.5, 0.75] + +SSDLiteMultiBoxHead: + aspect_ratios: [[2.], [2., 3.], [2., 3.], [2., 3.], [2., 3.], [2., 3.]] + base_size: 320 + steps: [16, 32, 64, 107, 160, 320] + flip: true + clip: true + max_ratio: 95 + min_ratio: 20 + offset: 0.5 + conv_decay: 0.00004 + +LearningRate: + base_lr: 0.2 + schedulers: + - !CosineDecay + max_iters: 400000 + - !LinearWarmup + start_factor: 0.33333 + steps: 2000 + +OptimizerBuilder: + optimizer: + momentum: 0.9 + type: Momentum + regularizer: + factor: 0.0005 + type: L2 + +TrainReader: + inputs_def: + image_shape: [3, 320, 320] + fields: ['image', 'gt_bbox', 'gt_class'] + dataset: + !COCODataSet + dataset_dir: dataset/coco + anno_path: annotations/instances_train2017.json + image_dir: train2017 + sample_transforms: + - !DecodeImage + to_rgb: true + - !RandomDistort + brightness_lower: 0.875 + brightness_upper: 1.125 + is_order: true + - !RandomExpand + fill_value: [123.675, 116.28, 103.53] + - !RandomCrop + allow_no_crop: false + - !NormalizeBox {} + - !ResizeImage + interp: 1 + target_size: 320 + use_cv2: false + - !RandomFlipImage + is_normalized: false + - !NormalizeImage + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + is_scale: true + is_channel_first: false + - !Permute + to_bgr: false + channel_first: true + batch_size: 64 + shuffle: true + drop_last: true + # Number of working threads/processes. To speed up, can be set to 16 or 32 etc. + worker_num: 8 + # Size of shared memory used in result queue. After increasing `worker_num`, need expand `memsize`. + memsize: 8G + # Buffer size for multi threads/processes.one instance in buffer is one batch data. + # To speed up, can be set to 64 or 128 etc. + bufsize: 32 + use_process: true + + +EvalReader: + inputs_def: + image_shape: [3, 320, 320] + fields: ['image', 'gt_bbox', 'gt_class', 'im_shape', 'im_id'] + dataset: + !COCODataSet + dataset_dir: dataset/coco + anno_path: annotations/instances_val2017.json + image_dir: val2017 + sample_transforms: + - !DecodeImage + to_rgb: true + - !NormalizeBox {} + - !ResizeImage + interp: 1 + target_size: 320 + use_cv2: false + - !NormalizeImage + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + is_scale: true + is_channel_first: false + - !Permute + to_bgr: false + channel_first: True + batch_size: 8 + worker_num: 8 + bufsize: 32 + use_process: false + +TestReader: + inputs_def: + image_shape: [3,320,320] + fields: ['image', 'im_id', 'im_shape'] + dataset: + !ImageFolder + anno_path: annotations/instances_val2017.json + sample_transforms: + - !DecodeImage + to_rgb: true + - !ResizeImage + interp: 1 + max_size: 0 + target_size: 320 + use_cv2: true + - !NormalizeImage + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + is_scale: true + is_channel_first: false + - !Permute + to_bgr: false + channel_first: True + batch_size: 1 diff --git a/configs/ssd/ssdlite_mobilenet_v1.yml b/configs/ssd/ssdlite_mobilenet_v1.yml index 3624a3f6bdcf4eec860a1264d423a72d68a8773b..6d6254cfd661ef301af4057d27fa0f15575f09c3 100644 --- a/configs/ssd/ssdlite_mobilenet_v1.yml +++ b/configs/ssd/ssdlite_mobilenet_v1.yml @@ -147,7 +147,7 @@ TestReader: interp: 1 max_size: 0 target_size: 300 - use_cv2: false + use_cv2: true - !NormalizeImage mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] diff --git a/configs/ssd/ssdlite_mobilenet_v3_large.yml b/configs/ssd/ssdlite_mobilenet_v3_large.yml index 85cda27f6b1b80b23d5a70529512378884e99751..1bee6ff18ebe3b08f81b6e68c925c6fae7e9f1d9 100644 --- a/configs/ssd/ssdlite_mobilenet_v3_large.yml +++ b/configs/ssd/ssdlite_mobilenet_v3_large.yml @@ -151,7 +151,7 @@ TestReader: interp: 1 max_size: 0 target_size: 320 - use_cv2: false + use_cv2: true - !NormalizeImage mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] diff --git a/configs/ssd/ssdlite_mobilenet_v3_large_fpn.yml b/configs/ssd/ssdlite_mobilenet_v3_large_fpn.yml index f168785dd3abbaad91e3076b2ebcde8919b79e20..3d2c7603bdf8464278c457375a789f44e6ea17ce 100644 --- a/configs/ssd/ssdlite_mobilenet_v3_large_fpn.yml +++ b/configs/ssd/ssdlite_mobilenet_v3_large_fpn.yml @@ -158,7 +158,7 @@ TestReader: interp: 1 max_size: 0 target_size: 320 - use_cv2: false + use_cv2: true - !NormalizeImage mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] diff --git a/configs/ssd/ssdlite_mobilenet_v3_small.yml b/configs/ssd/ssdlite_mobilenet_v3_small.yml index d09f96702830545a99de41fe00962f4bd515a0db..65695cc30c07d6c4b2b7c01e5e0dd309c82aad8c 100644 --- a/configs/ssd/ssdlite_mobilenet_v3_small.yml +++ b/configs/ssd/ssdlite_mobilenet_v3_small.yml @@ -151,7 +151,7 @@ TestReader: interp: 1 max_size: 0 target_size: 320 - use_cv2: false + use_cv2: true - !NormalizeImage mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] diff --git a/configs/ssd/ssdlite_mobilenet_v3_small_fpn.yml b/configs/ssd/ssdlite_mobilenet_v3_small_fpn.yml index 1d8182aa24021fb384a2430e0b269654d2ba89bb..40bdb8461bccc233b3de8056a93cd6b5444badb2 100644 --- a/configs/ssd/ssdlite_mobilenet_v3_small_fpn.yml +++ b/configs/ssd/ssdlite_mobilenet_v3_small_fpn.yml @@ -158,7 +158,7 @@ TestReader: interp: 1 max_size: 0 target_size: 320 - use_cv2: false + use_cv2: true - !NormalizeImage mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] diff --git a/deploy/README.md b/deploy/README.md index cdf95c42da37b209381470525e11ac0cab7e82f6..09654788f6b1037d708e7843ec14e426573ec4a6 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -5,7 +5,7 @@ ## 模型导出 训练得到一个满足要求的模型后,如果想要将该模型接入到C++服务器端预测库或移动端预测库,需要通过`tools/export_model.py`导出该模型。 -- [导出教程](../docs/advanced_tutorials/deploy/EXPORT_MODEL.md) +- [导出教程](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/advanced_tutorials/deploy/EXPORT_MODEL.md) 模型导出后, 目录结构如下(以`yolov3_darknet`为例): ``` @@ -18,6 +18,6 @@ yolov3_darknet # 模型目录 预测时,该目录所在的路径会作为程序的输入参数。 ## 预测部署 -- [1. Python预测(支持 Linux 和 Windows)](./python/) -- [2. C++预测(支持 Linux 和 Windows)](./cpp/) +- [1. Python预测(支持 Linux 和 Windows)](https://github.com/PaddlePaddle/PaddleDetection/blob/master/deploy/python) +- [2. C++预测(支持 Linux 和 Windows)](https://github.com/PaddlePaddle/PaddleDetection/blob/master/deploy/cpp) - [3. 移动端部署参考Paddle-Lite文档](https://paddle-lite.readthedocs.io/zh/latest/) diff --git a/deploy/cpp/README.md b/deploy/cpp/README.md index d7e55d1a7bf061f00a85255bde8de84b8e5dc66b..c7c5e50ff68c1ebe92b1fdcd5aef84309f101353 100644 --- a/deploy/cpp/README.md +++ b/deploy/cpp/README.md @@ -52,7 +52,7 @@ deploy/cpp ## 3.编译部署 ### 3.1 导出模型 -请确认您已经基于`PaddleDetection`的[export_model.py](../../tools/export_model.py)导出您的模型,并妥善保存到合适的位置。导出模型细节请参考 [导出模型教程](../../docs/advanced_tutorials/deploy/EXPORT_MODEL.md)。 +请确认您已经基于`PaddleDetection`的[export_model.py](https://github.com/PaddlePaddle/PaddleDetection/blob/master/tools/export_model.py)导出您的模型,并妥善保存到合适的位置。导出模型细节请参考 [导出模型教程](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/advanced_tutorials/deploy/EXPORT_MODEL.md)。 模型导出后, 目录结构如下(以`yolov3_darknet`为例): ``` @@ -67,5 +67,5 @@ yolov3_darknet # 模型目录 ### 3.2 编译 仅支持在`Windows`和`Linux`平台编译和使用 -- [Linux 编译指南](./docs/linux_build.md) -- [Windows编译指南(使用Visual Studio 2019)](./docs/windows_vs2019_build.md) +- [Linux 编译指南](https://github.com/PaddlePaddle/PaddleDetection/blob/master/deploy/cpp/docs/linux_build.md) +- [Windows编译指南(使用Visual Studio 2019)](https://github.com/PaddlePaddle/PaddleDetection/blob/master/deploy/cpp/docs/windows_vs2019_build.md) diff --git a/deploy/cpp/docs/linux_build.md b/deploy/cpp/docs/linux_build.md index 1ff2e158c8c1a374e1a142db70aad4799a592249..f7ed83cab390ff5045825575a6019d2201f744ff 100644 --- a/deploy/cpp/docs/linux_build.md +++ b/deploy/cpp/docs/linux_build.md @@ -91,11 +91,12 @@ make 编译成功后,预测入口程序为`build/main`其主要命令参数说明如下: | 参数 | 说明 | | ---- | ---- | -| model_dir | 导出的预测模型所在路径 | -| image_path | 要预测的图片文件路径 | -| video_path | 要预测的视频文件路径 | -| use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0)| -| gpu_id | 指定进行推理的GPU device id(默认值为0)| +| --model_dir | 导出的预测模型所在路径 | +| --image_path | 要预测的图片文件路径 | +| --video_path | 要预测的视频文件路径 | +| --camera_id | Option | 用来预测的摄像头ID,默认为-1(表示不使用摄像头预测)| +| --use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0)| +| --gpu_id | 指定进行推理的GPU device id(默认值为0)| | --run_mode |使用GPU时,默认为fluid, 可选(fluid/trt_fp32/trt_fp16)| **注意**: 如果同时设置了`video_path`和`image_path`,程序仅预测`video_path`。 @@ -107,7 +108,7 @@ make ./build/main --model_dir=/root/projects/models/yolov3_darknet --image_path=/root/projects/images/test.jpeg ``` -图片文件`可视化预测结果`会保存在当前目录下`output.jpeg`文件中。 +图片文件`可视化预测结果`会保存在当前目录下`output.jpg`文件中。 `样例二`: diff --git a/deploy/cpp/docs/windows_vs2019_build.md b/deploy/cpp/docs/windows_vs2019_build.md index cb7dcfc9759c102484b5de069eaa393aa66f0cea..111ae50e321bbd70f445e5bb22464b4b0ad8f606 100644 --- a/deploy/cpp/docs/windows_vs2019_build.md +++ b/deploy/cpp/docs/windows_vs2019_build.md @@ -67,7 +67,7 @@ fluid_inference | 参数名 | 含义 | | ---- | ---- | | *CUDA_LIB | CUDA的库路径 | -| CUDNN_LIB | CUDNN的库路径 | +| *CUDNN_LIB | CUDNN的库路径 | | OPENCV_DIR | OpenCV的安装路径, | | PADDLE_DIR | Paddle预测库的路径 | @@ -95,6 +95,7 @@ cd D:\projects\PaddleDetection\deploy\cpp\out\build\x64-Release | model_dir | 导出的预测模型所在路径 | | image_path | 要预测的图片文件路径 | | video_path | 要预测的视频文件路径 | +| use_camera | 是否预测摄像头 | | use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0)| | gpu_id | 指定进行推理的GPU device id(默认值为0)| @@ -107,7 +108,7 @@ cd D:\projects\PaddleDetection\deploy\cpp\out\build\x64-Release .\main --model_dir=D:\\models\\yolov3_darknet --image_path=D:\\images\\test.jpeg ``` -图片文件`可视化预测结果`会保存在当前目录下`output.jpeg`文件中。 +图片文件`可视化预测结果`会保存在当前目录下`output.jpg`文件中。 `样例二`: diff --git a/deploy/cpp/src/main.cc b/deploy/cpp/src/main.cc index 96fa3058eeb5f0e22ec0d9c25ff14c04bddf3960..ea41031c894d1f6326e06dfb302db9ff7b25bebd 100644 --- a/deploy/cpp/src/main.cc +++ b/deploy/cpp/src/main.cc @@ -41,9 +41,11 @@ DEFINE_string(model_dir, "", "Path of inference model"); DEFINE_string(image_path, "", "Path of input image"); DEFINE_string(video_path, "", "Path of input video"); DEFINE_bool(use_gpu, false, "Infering with GPU or CPU"); +DEFINE_bool(use_camera, false, "Use camera or not"); DEFINE_string(run_mode, "fluid", "Mode of running(fluid/trt_fp32/trt_fp16)"); DEFINE_int32(gpu_id, 0, "Device id of GPU to execute"); DEFINE_string(output_dir, "output", "Path of saved image or video"); +DEFINE_int32(camera_id, -1, "Device id of camera to predict"); std::string generate_save_path(const std::string& save_dir, const std::string& file_path) { @@ -65,7 +67,11 @@ void PredictVideo(const std::string& video_path, PaddleDetection::ObjectDetector* det) { // Open video cv::VideoCapture capture; - capture.open(video_path.c_str()); + if (FLAGS_camera_id != -1){ + capture.open(FLAGS_camera_id); + }else{ + capture.open(video_path.c_str()); + } if (!capture.isOpened()) { printf("can not open video : %s\n", video_path.c_str()); return; @@ -168,7 +174,7 @@ int main(int argc, char** argv) { FLAGS_run_mode, FLAGS_gpu_id); // Do inference on input video or image if (det.GetSuccessInit()) { - if (!FLAGS_video_path.empty()) { + if (!FLAGS_video_path.empty() || FLAGS_use_camera != -1) { PredictVideo(FLAGS_video_path, &det); } else if (!FLAGS_image_path.empty()) { PredictImage(FLAGS_image_path, &det); diff --git a/deploy/python/README.md b/deploy/python/README.md index 9c810ae1de2c21db787ec0a9055b455f886b496c..b8b3b87be13dec4279f90e4ed04bab09842de3a9 100644 --- a/deploy/python/README.md +++ b/deploy/python/README.md @@ -3,7 +3,7 @@ Python预测可以使用`tools/infer.py`,此种方式依赖PaddleDetection源码;也可以使用本篇教程预测方式,先将模型导出,使用一个独立的文件进行预测。 -本篇教程使用AnalysisPredictor对[导出模型](../../docs/advanced_tutorials/deploy/EXPORT_MODEL.md)进行高性能预测。 +本篇教程使用AnalysisPredictor对[导出模型](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/advanced_tutorials/deploy/EXPORT_MODEL.md)进行高性能预测。 在PaddlePaddle中预测引擎和训练引擎底层有着不同的优化方法, 下面列出了两种不同的预测方式。Executor同时支持训练和预测,AnalysisPredictor则专门针对推理进行了优化,是基于[C++预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/native_infer.html)的Python接口,该引擎可以对模型进行多项图优化,减少不必要的内存拷贝。如果用户在部署已训练模型的过程中对性能有较高的要求,我们提供了独立于PaddleDetection的预测脚本,方便用户直接集成部署。 @@ -18,7 +18,7 @@ Python预测可以使用`tools/infer.py`,此种方式依赖PaddleDetection源 ## 1. 导出预测模型 -PaddleDetection在训练过程包括网络的前向和优化器相关参数,而在部署过程中,我们只需要前向参数,具体参考:[导出模型](../../docs/advanced_tutorials/deploy/EXPORT_MODEL.md) +PaddleDetection在训练过程包括网络的前向和优化器相关参数,而在部署过程中,我们只需要前向参数,具体参考:[导出模型](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/advanced_tutorials/deploy/EXPORT_MODEL.md) 导出后目录下,包括`__model__`,`__params__`和`infer_cfg.yml`三个文件。 @@ -42,8 +42,9 @@ python deploy/python/infer.py --model_dir=/path/to/models --image_file=/path/to/ | 参数 | 是否必须|含义 | |-------|-------|----------| | --model_dir | Yes|上述导出的模型路径 | -| --image_file | Yes |需要预测的图片 | -| --video_file | Yes |需要预测的视频 | +| --image_file | Option |需要预测的图片 | +| --video_file | Option |需要预测的视频 | +| --camera_id | Option | 用来预测的摄像头ID,默认为-1(表示不使用摄像头预测,可设置为:0 - (摄像头数目-1) ),预测过程中在可视化界面按`q`退出输出预测结果到:output/output.mp4| | --use_gpu |No|是否GPU,默认为False| | --run_mode |No|使用GPU时,默认为fluid, 可选(fluid/trt_fp32/trt_fp16)| | --threshold |No|预测得分的阈值,默认为0.5| diff --git a/deploy/python/infer.py b/deploy/python/infer.py index 0b2d5bdff276f760af98263a8a130474c8b30893..9c9d934be73d465cb91b59c4d05fe3331eb88277 100644 --- a/deploy/python/infer.py +++ b/deploy/python/infer.py @@ -566,15 +566,19 @@ def predict_image(): output_dir=FLAGS.output_dir) -def predict_video(): +def predict_video(camera_id): detector = Detector( FLAGS.model_dir, use_gpu=FLAGS.use_gpu, run_mode=FLAGS.run_mode) - capture = cv2.VideoCapture(FLAGS.video_file) + if camera_id != -1: + capture = cv2.VideoCapture(camera_id) + video_name = 'output.mp4' + else: + capture = cv2.VideoCapture(FLAGS.video_file) + video_name = os.path.split(FLAGS.video_file)[-1] fps = 30 width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)) fourcc = cv2.VideoWriter_fourcc(*'mp4v') - video_name = os.path.split(FLAGS.video_file)[-1] if not os.path.exists(FLAGS.output_dir): os.makedirs(FLAGS.output_dir) out_path = os.path.join(FLAGS.output_dir, video_name) @@ -594,6 +598,10 @@ def predict_video(): mask_resolution=detector.config.mask_resolution) im = np.array(im) writer.write(im) + if camera_id != -1: + cv2.imshow('Mask Detection', im) + if cv2.waitKey(1) & 0xFF == ord('q'): + break writer.release() @@ -617,6 +625,11 @@ if __name__ == '__main__': "--image_file", type=str, default='', help="Path of image file.") parser.add_argument( "--video_file", type=str, default='', help="Path of video file.") + parser.add_argument( + "--camera_id", + type=int, + default=-1, + help="device id of camera to predict.") parser.add_argument( "--run_mode", type=str, @@ -647,5 +660,5 @@ if __name__ == '__main__': assert "Cannot predict image and video at the same time" if FLAGS.image_file != '': predict_image() - if FLAGS.video_file != '': - predict_video() + if FLAGS.video_file != '' or FLAGS.camera_id != -1: + predict_video(FLAGS.camera_id) diff --git a/docs/MODEL_ZOO.md b/docs/MODEL_ZOO.md index 59b0ee03031bccf198ff13f09a2bbba57a13f4e5..2198db54a680db2322382ac99a9b2a5e8cac6939 100644 --- a/docs/MODEL_ZOO.md +++ b/docs/MODEL_ZOO.md @@ -41,6 +41,8 @@ The backbone models pretrained on ImageNet are available. All backbone models ar | ResNet50 | Mask | 1 | 1x | 11.615 | 36.5 | 32.2 | [model](https://paddlemodels.bj.bcebos.com/object_detection/mask_rcnn_r50_1x.tar) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/mask_rcnn_r50_1x.yml) | | ResNet50 | Mask | 1 | 2x | 11.494 | 38.2 | 33.4 | [model](https://paddlemodels.bj.bcebos.com/object_detection/mask_rcnn_r50_2x.tar) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/mask_rcnn_r50_2x.yml) | | ResNet50-vd | Faster | 1 | 1x | 12.575 | 36.4 | - | [model](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_vd_1x.tar) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/faster_rcnn_r50_vd_1x.yml) | +| ResNet34-FPN | Faster | 2 | 1x | - | 36.7 | - | [model](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r34_fpn_1x.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/faster_rcnn_r34_fpn_1x.yml) | +| ResNet34-vd-FPN | Faster | 2 | 1x | - | 37.4 | - | [model](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r34_vd_fpn_1x.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/faster_rcnn_r34_vd_fpn_1x.yml) | | ResNet50-FPN | Faster | 2 | 1x | 22.273 | 37.2 | - | [model](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_fpn_1x.tar) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/faster_rcnn_r50_fpn_1x.yml) | | ResNet50-FPN | Faster | 2 | 2x | 22.297 | 37.7 | - | [model](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_fpn_2x.tar) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/faster_rcnn_r50_fpn_2x.yml) | | ResNet50-FPN | Mask | 1 | 1x | 15.184 | 37.9 | 34.2 | [model](https://paddlemodels.bj.bcebos.com/object_detection/mask_rcnn_r50_fpn_1x.tar) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/mask_rcnn_r50_fpn_1x.yml) | @@ -200,6 +202,7 @@ results of image size 608/416/320 above. Deformable conv is added on stage 5 of | MobileNet_v3 large | 320 | 64 | Cosine decay(40w) | - | 23.3 | [model](https://paddlemodels.bj.bcebos.com/object_detection/mobile_models/ssdlite_mobilenet_v3_large.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ssd/ssdlite_mobilenet_v3_large.yml) | | MobileNet_v3 small w/ FPN | 320 | 64 | Cosine decay(40w) | - | 18.9 | [model](https://paddlemodels.bj.bcebos.com/object_detection/mobile_models/ssdlite_mobilenet_v3_small_fpn.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ssd/ssdlite_mobilenet_v3_small_fpn.yml) | | MobileNet_v3 large w/ FPN | 320 | 64 | Cosine decay(40w) | - | 24.3 | [model](https://paddlemodels.bj.bcebos.com/object_detection/mobile_models/ssdlite_mobilenet_v3_large_fpn.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ssd/ssdlite_mobilenet_v3_large_fpn.yml) | +| GhostNet | 320 | 64 | Cosine decay(40w) | - | 23.3 | [model](htts://paddlemodels.bj.bcebos.com/object_detection/mobile_models/ssdlite_ghostnet.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ssd/ssdlite_ghostnet.yml) | **Notes:** `SSDLite` is trained in 8 GPU with total batch size as 512 and uses cosine decay strategy to train. diff --git a/docs/MODEL_ZOO_cn.md b/docs/MODEL_ZOO_cn.md index bf82ca010c4b6b709ffd587bd06c7700accda785..4454367b64178304f9374217d401d5de18c7e17c 100644 --- a/docs/MODEL_ZOO_cn.md +++ b/docs/MODEL_ZOO_cn.md @@ -38,6 +38,8 @@ Paddle提供基于ImageNet的骨架网络预训练模型。所有预训练模型 | ResNet50 | Mask | 1 | 1x | 11.615 | 36.5 | 32.2 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/mask_rcnn_r50_1x.tar) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/mask_rcnn_r50_1x.yml) | | ResNet50 | Mask | 1 | 2x | 11.494 | 38.2 | 33.4 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/mask_rcnn_r50_2x.tar) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/mask_rcnn_r50_2x.yml) | | ResNet50-vd | Faster | 1 | 1x | 12.575 | 36.4 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_vd_1x.tar) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/faster_rcnn_r50_vd_1x.yml) | +| ResNet34-FPN | Faster | 2 | 1x | - | 36.7 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r34_fpn_1x.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/faster_rcnn_r34_fpn_1x.yml) | +| ResNet34-vd-FPN | Faster | 2 | 1x | - | 37.4 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r34_vd_fpn_1x.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/faster_rcnn_r34_vd_fpn_1x.yml) | | ResNet50-FPN | Faster | 2 | 1x | 22.273 | 37.2 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_fpn_1x.tar) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/faster_rcnn_r50_fpn_1x.yml) | | ResNet50-FPN | Faster | 2 | 2x | 22.297 | 37.7 | - | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_fpn_2x.tar) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/faster_rcnn_r50_fpn_2x.yml) | | ResNet50-FPN | Mask | 1 | 1x | 15.184 | 37.9 | 34.2 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/mask_rcnn_r50_fpn_1x.tar) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/mask_rcnn_r50_fpn_1x.yml) | @@ -192,6 +194,7 @@ Paddle提供基于ImageNet的骨架网络预训练模型。所有预训练模型 | MobileNet_v3 large | 320 | 64 | Cosine decay(40w) | - | 23.3 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/mobile_models/ssdlite_mobilenet_v3_large.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ssd/ssdlite_mobilenet_v3_large.yml) | | MobileNet_v3 small w/ FPN | 320 | 64 | Cosine decay(40w) | - | 18.9 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/mobile_models/ssdlite_mobilenet_v3_small_fpn.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ssd/ssdlite_mobilenet_v3_small_fpn.yml) | | MobileNet_v3 large w/ FPN | 320 | 64 | Cosine decay(40w) | - | 24.3 | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/mobile_models/ssdlite_mobilenet_v3_large_fpn.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ssd/ssdlite_mobilenet_v3_large_fpn.yml) | +| GhostNet | 320 | 64 | Cosine decay(40w) | - | 23.3 | [下载链接](htts://paddlemodels.bj.bcebos.com/object_detection/mobile_models/ssdlite_ghostnet.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/ssd/ssdlite_ghostnet.yml) | **注意事项:** SSDLite模型使用学习率余弦衰减策略在8卡GPU下总batch size为512。 diff --git a/docs/advanced_tutorials/deploy/docs/windows_vs2015_build.md b/docs/advanced_tutorials/deploy/docs/windows_vs2015_build.md index c76bb0fb0d594d12f12963280ef39c8ad3e1420a..6182bf3114d73032340d7e25176ea85ed272245d 100644 --- a/docs/advanced_tutorials/deploy/docs/windows_vs2015_build.md +++ b/docs/advanced_tutorials/deploy/docs/windows_vs2015_build.md @@ -1,6 +1,6 @@ # Windows平台使用 Visual Studio 2015 编译指南 -本文档步骤,我们同时在`Visual Studio 2015` 和 `Visual Studio 2019 Community` 两个版本进行了测试,我们推荐使用[`Visual Studio 2019`直接编译`CMake`项目](./windows_vs2019_build.md)。 +本文档步骤,我们同时在`Visual Studio 2015` 和 `Visual Studio 2019 Community` 两个版本进行了测试,我们推荐使用[`Visual Studio 2019`直接编译`CMake`项目](https://github.com/PaddlePaddle/PaddleDetection/blob/master/deploy/cpp/docs/windows_vs2019_build.md)。 ## 前置条件 @@ -111,4 +111,4 @@ cd /d D:\projects\PaddleDetection\inference\build\release detection_demo.exe --conf=/path/to/your/conf --input_dir=/path/to/your/input/data/directory ``` -更详细说明请参考ReadMe文档: [预测和可视化部分](../README.md) +更详细说明请参考ReadMe文档: [预测和可视化部分](https://github.com/PaddlePaddle/PaddleDetection/blob/master/deploy/README.md) diff --git a/docs/tutorials/INSTALL_cn.md b/docs/tutorials/INSTALL_cn.md index 4e5eb3ef5f0e93751a085f1833701aad65ab40de..db61ccd7a7961b87926e8169ce886370a9f989d7 100644 --- a/docs/tutorials/INSTALL_cn.md +++ b/docs/tutorials/INSTALL_cn.md @@ -14,7 +14,7 @@ 这份文档介绍了如何安装PaddleDetection及其依赖项(包括PaddlePaddle),以及COCO和Pascal VOC数据集。 -PaddleDetection的相关信息,请参考[README.md](https://github.com/PaddlePaddle/PaddleDetection/blob/master/). +PaddleDetection的相关信息,请参考[README.md](https://github.com/PaddlePaddle/PaddleDetection/blob/master/README.md). ## PaddlePaddle diff --git a/ppdet/data/transform/operators.py b/ppdet/data/transform/operators.py index d18b42a5c9a899956efe02fd36afa2fd80adbd27..f1f8b1f709ce2a976514d0ef610686b9f5845299 100644 --- a/ppdet/data/transform/operators.py +++ b/ppdet/data/transform/operators.py @@ -2061,6 +2061,7 @@ class BboxXYXY2XYWH(BaseOperator): return sample +@register_op class Lighting(BaseOperator): """ Lighting the imagen by eigenvalues and eigenvectors diff --git a/ppdet/modeling/anchor_heads/yolo_head.py b/ppdet/modeling/anchor_heads/yolo_head.py index ad12a5db3a142871b50bafaf6e8afa1804eeeb54..91ac12ea98b9d82b5805b1befc4f4a6b5c24a4e9 100644 --- a/ppdet/modeling/anchor_heads/yolo_head.py +++ b/ppdet/modeling/anchor_heads/yolo_head.py @@ -77,6 +77,7 @@ class YOLOv3Head(object): downsample=[32, 16, 8], scale_x_y=1.0, clip_bbox=True): + check_version("1.8.4") self.conv_block_num = conv_block_num self.norm_decay = norm_decay self.num_classes = num_classes @@ -153,7 +154,6 @@ class YOLOv3Head(object): stride, padding, act='leaky', - is_test=True, name=None): conv = fluid.layers.conv2d( input=input, @@ -173,7 +173,6 @@ class YOLOv3Head(object): out = fluid.layers.batch_norm( input=conv, act=None, - is_test=is_test, param_attr=bn_param_attr, bias_attr=bn_bias_attr, moving_mean_name=bn_name + '.mean', @@ -183,7 +182,7 @@ class YOLOv3Head(object): out = fluid.layers.leaky_relu(x=out, alpha=0.1) return out - def _spp_module(self, input, is_test=True, name=""): + def _spp_module(self, input, name=""): output1 = input output2 = fluid.layers.pool2d( input=output1, @@ -230,17 +229,15 @@ class YOLOv3Head(object): filter_size=1, stride=1, padding=0, - is_test=is_test, name='{}.{}.0'.format(name, j)) if self.use_spp and is_first and j == 1: - conv = self._spp_module(conv, is_test=is_test, name="spp") + conv = self._spp_module(conv, name="spp") conv = self._conv_bn( conv, 512, filter_size=1, stride=1, padding=0, - is_test=is_test, name='{}.{}.spp.conv'.format(name, j)) conv = self._conv_bn( conv, @@ -248,7 +245,6 @@ class YOLOv3Head(object): filter_size=3, stride=1, padding=1, - is_test=is_test, name='{}.{}.1'.format(name, j)) if self.drop_block and j == 0 and not is_first: conv = DropBlock( @@ -270,7 +266,6 @@ class YOLOv3Head(object): filter_size=1, stride=1, padding=0, - is_test=is_test, name='{}.2'.format(name)) new_route = self._add_coord(route, is_test=is_test) tip = self._conv_bn( @@ -279,7 +274,6 @@ class YOLOv3Head(object): filter_size=3, stride=1, padding=1, - is_test=is_test, name='{}.tip'.format(name)) return route, tip @@ -370,7 +364,6 @@ class YOLOv3Head(object): filter_size=1, stride=1, padding=0, - is_test=(not is_train), name=self.prefix_name + "yolo_transition.{}".format(i)) # upsample route = self._upsample(route) diff --git a/ppdet/modeling/architectures/faceboxes.py b/ppdet/modeling/architectures/faceboxes.py index 6606173cca90fbc941de5e48ee37a87b1da4f478..2d8abe6b9b57d08427d340d3b708d73c682b43e3 100644 --- a/ppdet/modeling/architectures/faceboxes.py +++ b/ppdet/modeling/architectures/faceboxes.py @@ -56,7 +56,7 @@ class FaceBoxes(object): densities=[[4, 2, 1], [1], [1]], fixed_sizes=[[32., 64., 128.], [256.], [512.]], num_classes=2, - steps=[16., 32., 64.]): + steps=[8., 16., 32.]): super(FaceBoxes, self).__init__() self.backbone = backbone self.num_classes = num_classes @@ -117,7 +117,7 @@ class FaceBoxes(object): fixed_ratios=[1.], clip=False, offset=0.5, - steps=[self.steps[i]]) + steps=[self.steps[i]] * 2) num_boxes = box.shape[2] diff --git a/ppdet/modeling/architectures/ttfnet.py b/ppdet/modeling/architectures/ttfnet.py index 75ea43ddc57d09abfb1aaffa3a90b98937afec59..39df8cf3d500be7a6c1790314f077600e2d3a877 100644 --- a/ppdet/modeling/architectures/ttfnet.py +++ b/ppdet/modeling/architectures/ttfnet.py @@ -47,7 +47,7 @@ class TTFNet(object): self.ttf_head = ttf_head self.num_classes = num_classes - def build(self, feed_vars, mode='train'): + def build(self, feed_vars, mode='train', exclude_nms=False): im = feed_vars['image'] mixed_precision_enabled = mixed_precision_global_state() is not None @@ -128,5 +128,5 @@ class TTFNet(object): def eval(self, feed_vars): return self.build(feed_vars, mode='test') - def test(self, feed_vars): - return self.build(feed_vars, mode='test') + def test(self, feed_vars, exclude_nms=False): + return self.build(feed_vars, mode='test', exclude_nms=exclude_nms) diff --git a/ppdet/modeling/backbones/__init__.py b/ppdet/modeling/backbones/__init__.py index 30d1b9f50ebbfafeedb39819d4724b3a5e1621d6..a6d2eb18fad8e8099be4ce26562f4b8e33c73c92 100644 --- a/ppdet/modeling/backbones/__init__.py +++ b/ppdet/modeling/backbones/__init__.py @@ -34,6 +34,7 @@ from . import efficientnet from . import bifpn from . import cspdarknet from . import acfpn +from . import ghostnet from .resnet import * from .resnext import * @@ -55,3 +56,4 @@ from .efficientnet import * from .bifpn import * from .cspdarknet import * from .acfpn import * +from .ghostnet import * diff --git a/ppdet/modeling/backbones/ghostnet.py b/ppdet/modeling/backbones/ghostnet.py new file mode 100644 index 0000000000000000000000000000000000000000..b40ca84e36ab1d3d3dada24fe295dd4b0f9d5ada --- /dev/null +++ b/ppdet/modeling/backbones/ghostnet.py @@ -0,0 +1,361 @@ +# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math + +import paddle.fluid as fluid +from paddle.fluid.param_attr import ParamAttr +from paddle.fluid.regularizer import L2Decay + +from collections import OrderedDict + +from ppdet.core.workspace import register + +__all__ = ["GhostNet"] + + +@register +class GhostNet(object): + """ + scale (float): scaling factor for convolution groups proportion of GhostNet. + feature_maps (list): index of stages whose feature maps are returned. + conv_decay (float): weight decay for convolution layer weights. + extra_block_filters (list): number of filter for each extra block. + lr_mult_list (list): learning rate ratio of different blocks, lower learning rate ratio + is need for pretrained model got using distillation(default as + [1.0, 1.0, 1.0, 1.0, 1.0]). + """ + + def __init__( + self, + scale, + feature_maps=[5, 6, 7, 8, 9, 10], + conv_decay=0.00001, + extra_block_filters=[[256, 512], [128, 256], [128, 256], [64, 128]], + lr_mult_list=[1.0, 1.0, 1.0, 1.0, 1.0], + freeze_norm=False): + self.scale = scale + self.feature_maps = feature_maps + self.extra_block_filters = extra_block_filters + self.end_points = [] + self.block_stride = 0 + self.conv_decay = conv_decay + self.lr_mult_list = lr_mult_list + self.freeze_norm = freeze_norm + self.curr_stage = 0 + + self.cfgs = [ + # k, t, c, se, s + [3, 16, 16, 0, 1], + [3, 48, 24, 0, 2], + [3, 72, 24, 0, 1], + [5, 72, 40, 1, 2], + [5, 120, 40, 1, 1], + [3, 240, 80, 0, 2], + [3, 200, 80, 0, 1], + [3, 184, 80, 0, 1], + [3, 184, 80, 0, 1], + [3, 480, 112, 1, 1], + [3, 672, 112, 1, 1], + [5, 672, 160, 1, 2], + [5, 960, 160, 0, 1], + [5, 960, 160, 1, 1], + [5, 960, 160, 0, 1], + [5, 960, 160, 1, 1] + ] + + def _conv_bn_layer(self, + input, + num_filters, + filter_size, + stride=1, + groups=1, + act=None, + name=None): + lr_idx = self.curr_stage // 3 + lr_idx = min(lr_idx, len(self.lr_mult_list) - 1) + lr_mult = self.lr_mult_list[lr_idx] + norm_lr = 0. if self.freeze_norm else lr_mult + + x = fluid.layers.conv2d( + input=input, + num_filters=num_filters, + filter_size=filter_size, + stride=stride, + padding=(filter_size - 1) // 2, + groups=groups, + act=None, + param_attr=ParamAttr( + regularizer=L2Decay(self.conv_decay), + learning_rate=lr_mult, + initializer=fluid.initializer.MSRA(), + name=name + "_weights"), + bias_attr=False) + bn_name = name + "_bn" + x = fluid.layers.batch_norm( + input=x, + act=act, + param_attr=ParamAttr( + name=bn_name + "_scale", + learning_rate=norm_lr, + regularizer=L2Decay(0.0)), + bias_attr=ParamAttr( + name=bn_name + "_offset", + learning_rate=norm_lr, + regularizer=L2Decay(0.0)), + moving_mean_name=bn_name + "_mean", + moving_variance_name=name + "_variance") + return x + + def se_block(self, input, num_channels, reduction_ratio=4, name=None): + lr_idx = self.curr_stage // 3 + lr_idx = min(lr_idx, len(self.lr_mult_list) - 1) + lr_mult = self.lr_mult_list[lr_idx] + pool = fluid.layers.pool2d( + input=input, pool_type='avg', global_pooling=True, use_cudnn=False) + stdv = 1.0 / math.sqrt(pool.shape[1] * 1.0) + squeeze = fluid.layers.fc( + input=pool, + size=num_channels // reduction_ratio, + act='relu', + param_attr=ParamAttr( + learning_rate=lr_mult, + initializer=fluid.initializer.Uniform(-stdv, stdv), + name=name + '_1_weights'), + bias_attr=ParamAttr( + name=name + '_1_offset', learning_rate=lr_mult)) + stdv = 1.0 / math.sqrt(squeeze.shape[1] * 1.0) + excitation = fluid.layers.fc( + input=squeeze, + size=num_channels, + act=None, + param_attr=ParamAttr( + learning_rate=lr_mult, + initializer=fluid.initializer.Uniform(-stdv, stdv), + name=name + '_2_weights'), + bias_attr=ParamAttr( + name=name + '_2_offset', learning_rate=lr_mult)) + excitation = fluid.layers.clip(x=excitation, min=0, max=1) + se_scale = fluid.layers.elementwise_mul(x=input, y=excitation, axis=0) + return se_scale + + def depthwise_conv(self, + input, + output, + kernel_size, + stride=1, + relu=False, + name=None): + return self._conv_bn_layer( + input=input, + num_filters=output, + filter_size=kernel_size, + stride=stride, + groups=input.shape[1], + act="relu" if relu else None, + name=name + "_depthwise") + + def ghost_module(self, + input, + output, + kernel_size=1, + ratio=2, + dw_size=3, + stride=1, + relu=True, + name=None): + self.output = output + init_channels = int(math.ceil(output / ratio)) + new_channels = int(init_channels * (ratio - 1)) + primary_conv = self._conv_bn_layer( + input=input, + num_filters=init_channels, + filter_size=kernel_size, + stride=stride, + groups=1, + act="relu" if relu else None, + name=name + "_primary_conv") + cheap_operation = self._conv_bn_layer( + input=primary_conv, + num_filters=new_channels, + filter_size=dw_size, + stride=1, + groups=init_channels, + act="relu" if relu else None, + name=name + "_cheap_operation") + out = fluid.layers.concat([primary_conv, cheap_operation], axis=1) + return out + + def ghost_bottleneck(self, + input, + hidden_dim, + output, + kernel_size, + stride, + use_se, + name=None): + inp_channels = input.shape[1] + x = self.ghost_module( + input=input, + output=hidden_dim, + kernel_size=1, + stride=1, + relu=True, + name=name + "_ghost_module_1") + + if self.block_stride == 4 and stride == 2: + self.block_stride += 1 + if self.block_stride in self.feature_maps: + self.end_points.append(x) + + if stride == 2: + x = self.depthwise_conv( + input=x, + output=hidden_dim, + kernel_size=kernel_size, + stride=stride, + relu=False, + name=name + "_depthwise") + if use_se: + x = self.se_block( + input=x, num_channels=hidden_dim, name=name + "_se") + x = self.ghost_module( + input=x, + output=output, + kernel_size=1, + relu=False, + name=name + "_ghost_module_2") + if stride == 1 and inp_channels == output: + shortcut = input + else: + shortcut = self.depthwise_conv( + input=input, + output=inp_channels, + kernel_size=kernel_size, + stride=stride, + relu=False, + name=name + "_shortcut_depthwise") + shortcut = self._conv_bn_layer( + input=shortcut, + num_filters=output, + filter_size=1, + stride=1, + groups=1, + act=None, + name=name + "_shortcut_conv") + return fluid.layers.elementwise_add(x=x, y=shortcut, axis=-1) + + def _extra_block_dw(self, + input, + num_filters1, + num_filters2, + stride, + name=None): + pointwise_conv = self._conv_bn_layer( + input=input, + filter_size=1, + num_filters=int(num_filters1), + stride=1, + act='relu6', + name=name + "_extra1") + depthwise_conv = self._conv_bn_layer( + input=pointwise_conv, + filter_size=3, + num_filters=int(num_filters2), + stride=stride, + groups=int(num_filters1), + act='relu6', + name=name + "_extra2_dw") + normal_conv = self._conv_bn_layer( + input=depthwise_conv, + filter_size=1, + num_filters=int(num_filters2), + stride=1, + act='relu6', + name=name + "_extra2_sep") + return normal_conv + + def _make_divisible(self, v, divisor=8, min_value=None): + if min_value is None: + min_value = divisor + new_v = max(min_value, int(v + divisor / 2) // divisor * divisor) + if new_v < 0.9 * v: + new_v += divisor + return new_v + + def __call__(self, input): + # build first layer + output_channel = int(self._make_divisible(16 * self.scale, 4)) + x = self._conv_bn_layer( + input=input, + num_filters=output_channel, + filter_size=3, + stride=2, + groups=1, + act="relu", + name="conv1") + # build inverted residual blocks + idx = 0 + for k, exp_size, c, use_se, s in self.cfgs: + if s == 2: + self.block_stride += 1 + if self.block_stride in self.feature_maps: + self.end_points.append(x) + output_channel = int(self._make_divisible(c * self.scale, 4)) + hidden_channel = int(self._make_divisible(exp_size * self.scale, 4)) + x = self.ghost_bottleneck( + input=x, + hidden_dim=hidden_channel, + output=output_channel, + kernel_size=k, + stride=s, + use_se=use_se, + name="_ghostbottleneck_" + str(idx)) + idx += 1 + self.curr_stage += 1 + self.block_stride += 1 + if self.block_stride in self.feature_maps: + self.end_points.append(conv) + + # extra block + # check whether conv_extra is needed + if self.block_stride < max(self.feature_maps): + conv_extra = self._conv_bn_layer( + x, + num_filters=self._make_divisible(self.scale * self.cfgs[-1][1]), + filter_size=1, + stride=1, + groups=1, + act='relu6', + name='conv' + str(idx + 2)) + self.block_stride += 1 + if self.block_stride in self.feature_maps: + self.end_points.append(conv_extra) + idx += 1 + for block_filter in self.extra_block_filters: + conv_extra = self._extra_block_dw(conv_extra, block_filter[0], + block_filter[1], 2, + 'conv' + str(idx + 2)) + self.block_stride += 1 + if self.block_stride in self.feature_maps: + self.end_points.append(conv_extra) + idx += 1 + + return OrderedDict([('ghost_{}'.format(idx), feat) + for idx, feat in enumerate(self.end_points)]) + return res diff --git a/ppdet/modeling/losses/diou_loss_yolo.py b/ppdet/modeling/losses/diou_loss_yolo.py index c627c178e9df186b6e48997b8238884c94b69ba7..d85154d085e0f7873f86e87f031320db9f16b724 100644 --- a/ppdet/modeling/losses/diou_loss_yolo.py +++ b/ppdet/modeling/losses/diou_loss_yolo.py @@ -65,9 +65,10 @@ class DiouLossYolo(IouLoss): eps (float): the decimal to prevent the denominator eqaul zero ''' x1, y1, x2, y2 = self._bbox_transform( - x, y, w, h, anchors, downsample_ratio, batch_size, False) - x1g, y1g, x2g, y2g = self._bbox_transform( - tx, ty, tw, th, anchors, downsample_ratio, batch_size, True) + x, y, w, h, anchors, downsample_ratio, batch_size, False, 1.0, eps) + x1g, y1g, x2g, y2g = self._bbox_transform(tx, ty, tw, th, anchors, + downsample_ratio, batch_size, + True, 1.0, eps) #central coordinates cx = (x1 + x2) / 2 diff --git a/ppdet/modeling/losses/fcos_loss.py b/ppdet/modeling/losses/fcos_loss.py index b1a5e597bf91e184efab90dc683dcb9b64b8766a..e9b94378f39253349c64749c2842cb282c20a445 100644 --- a/ppdet/modeling/losses/fcos_loss.py +++ b/ppdet/modeling/losses/fcos_loss.py @@ -76,14 +76,14 @@ class FCOSLoss(object): Return: loss (Varialbes): location loss """ - plw = pred[:, 0] * positive_mask - pth = pred[:, 1] * positive_mask - prw = pred[:, 2] * positive_mask - pbh = pred[:, 3] * positive_mask - tlw = targets[:, 0] * positive_mask - tth = targets[:, 1] * positive_mask - trw = targets[:, 2] * positive_mask - tbh = targets[:, 3] * positive_mask + plw = fluid.layers.elementwise_mul(pred[:, 0], positive_mask, axis=0) + pth = fluid.layers.elementwise_mul(pred[:, 1], positive_mask, axis=0) + prw = fluid.layers.elementwise_mul(pred[:, 2], positive_mask, axis=0) + pbh = fluid.layers.elementwise_mul(pred[:, 3], positive_mask, axis=0) + tlw = fluid.layers.elementwise_mul(targets[:, 0], positive_mask, axis=0) + tth = fluid.layers.elementwise_mul(targets[:, 1], positive_mask, axis=0) + trw = fluid.layers.elementwise_mul(targets[:, 2], positive_mask, axis=0) + tbh = fluid.layers.elementwise_mul(targets[:, 3], positive_mask, axis=0) tlw.stop_gradient = True trw.stop_gradient = True tth.stop_gradient = True @@ -101,7 +101,7 @@ class FCOSLoss(object): area_inter = (ilw + irw) * (ith + ibh) ious = (area_inter + 1.0) / ( area_predict + area_target - area_inter + 1.0) - ious = ious * positive_mask + ious = fluid.layers.elementwise_mul(ious, positive_mask, axis=0) if self.iou_loss_type.lower() == "linear_iou": loss = 1.0 - ious elif self.iou_loss_type.lower() == "giou": @@ -187,16 +187,20 @@ class FCOSLoss(object): normalize_sum.stop_gradient = True normalize_sum = fluid.layers.reduce_sum(mask_positive_float * normalize_sum) + normalize_sum.stop_gradient = True cls_loss = fluid.layers.sigmoid_focal_loss( cls_logits_flatten, tag_labels_flatten, num_positive_int32) / num_positive_fp32 - reg_loss = self.__iou_loss( - bboxes_reg_flatten, tag_bboxes_flatten, mask_positive_float, - tag_center_flatten) * mask_positive_float / normalize_sum + reg_loss = self.__iou_loss(bboxes_reg_flatten, tag_bboxes_flatten, + mask_positive_float, tag_center_flatten) + reg_loss = fluid.layers.elementwise_mul( + reg_loss, mask_positive_float, axis=0) / normalize_sum ctn_loss = fluid.layers.sigmoid_cross_entropy_with_logits( x=centerness_flatten, label=tag_center_flatten) * mask_positive_float / num_positive_fp32 + ctn_loss = fluid.layers.elementwise_mul( + ctn_loss, mask_positive_float, axis=0) / normalize_sum loss_all = { "loss_centerness": fluid.layers.reduce_sum(ctn_loss), "loss_cls": fluid.layers.reduce_sum(cls_loss), diff --git a/ppdet/modeling/losses/iou_loss.py b/ppdet/modeling/losses/iou_loss.py index 624cd47c0760974a5af8c9011c113efa8133d9e0..590217000a0053f7f3c5ebc40e82caee73a274b1 100644 --- a/ppdet/modeling/losses/iou_loss.py +++ b/ppdet/modeling/losses/iou_loss.py @@ -229,10 +229,7 @@ class IouLoss(object): return x1, y1, x2, y2 def _create_tensor_from_numpy(self, numpy_array): - paddle_array = fluid.layers.create_parameter( - attr=ParamAttr(), - shape=numpy_array.shape, - dtype=numpy_array.dtype, - default_initializer=NumpyArrayInitializer(numpy_array)) - paddle_array.stop_gradient = True + paddle_array = fluid.layers.create_global_var( + shape=numpy_array.shape, value=0., dtype=numpy_array.dtype) + fluid.layers.assign(numpy_array, paddle_array) return paddle_array diff --git a/ppdet/modeling/ops.py b/ppdet/modeling/ops.py index 2f3033359561a6bf2d69ca809f1ea9d6894f0952..a288e5de97321c1fb8f0455b2918a7be660c0be3 100644 --- a/ppdet/modeling/ops.py +++ b/ppdet/modeling/ops.py @@ -125,7 +125,7 @@ def DeformConvNorm(input, initializer=None, bias_attr=False, name=None): - assert norm_type in ['bn', 'sync_bn', 'affine_channel'] + assert norm_type in ['bn', 'sync_bn', 'affine_channel', 'gn'] conv = DeformConv(input, num_filters, filter_size, stride, groups, dilation, lr_scale, initializer, bias_attr, name) diff --git a/ppdet/modeling/tests/test_architectures.py b/ppdet/modeling/tests/test_architectures.py index ab99f30887774fef9792d5c30d35280220ed4ed1..9d6b13a2ada9d0362129cb7a98afc12cb29b6305 100644 --- a/ppdet/modeling/tests/test_architectures.py +++ b/ppdet/modeling/tests/test_architectures.py @@ -72,7 +72,7 @@ class TestCascadeRCNN(TestFasterRCNN): @unittest.skipIf( - paddle.version.major < "2", + paddle.version.full_version < "1.8.4", "Paddle 2.0 should be used for YOLOv3 takes scale_x_y as inputs, " "disable this unittest for Paddle major version < 2") class TestYolov3(TestFasterRCNN): diff --git a/slim/README.md b/slim/README.md index 1ae220ca0dc995c36e181883bfd7a1433a3f5dcd..c60ebe61e253431d1e90e963028def23e4e08efe 100644 --- a/slim/README.md +++ b/slim/README.md @@ -21,7 +21,7 @@ ### 训练策略 -- 剪裁模型训练时使用[PaddleDetection模型库](https://paddledetection.readthedocs.io/zh/latest/MODEL_ZOO_cn.html)发布的模型权重作为预训练权重。 +- 剪裁模型训练时使用[PaddleDetection模型库](https://paddledetection.readthedocs.io/MODEL_ZOO_cn.html)发布的模型权重作为预训练权重。 - 剪裁训练使用模型默认配置,即除`pretrained_weights`外配置不变。 - 剪裁模型全部为基于敏感度的卷积通道剪裁。 - YOLOv3模型主要剪裁`yolo_head`部分,即剪裁参数如下。 diff --git a/slim/distillation/README.md b/slim/distillation/README.md index a928b83917370b5cb130278037fb9e2bcd393b09..b984b4c724023d33b6d8848b567e9911f00ae88b 100644 --- a/slim/distillation/README.md +++ b/slim/distillation/README.md @@ -10,7 +10,7 @@ - [检测库的常规训练方法](https://github.com/PaddlePaddle/PaddleDetection) - [PaddleSlim蒸馏API文档](https://paddlepaddle.github.io/PaddleSlim/api/single_distiller_api/) -已发布蒸馏模型见[压缩模型库](../README.md) +已发布蒸馏模型见[压缩模型库](https://github.com/PaddlePaddle/PaddleDetection/blob/master/slim/README.md) ## 安装PaddleSlim 可按照[PaddleSlim使用文档](https://paddlepaddle.github.io/PaddleSlim/)中的步骤安装PaddleSlim diff --git a/slim/extensions/distill_pruned_model/README.md b/slim/extensions/distill_pruned_model/README.md index e82129104f434aeb7c5cbce9c3cc8a5611566036..ddc90c5a9e8cb2998f77ddb5d11617e2c3597f0e 100644 --- a/slim/extensions/distill_pruned_model/README.md +++ b/slim/extensions/distill_pruned_model/README.md @@ -24,7 +24,7 @@ 通过`-c`选项指定待剪裁模型的配置文件的相对路径,更多可选配置文件请参考: [检测库配置文件](../../../configs)。 -蒸馏通道剪裁模型中,我们使用原模型全量权重来初始化待剪裁模型,已发布模型的权重可在[模型库](../../../docs/README.md)中获取。 +蒸馏通道剪裁模型中,我们使用原模型全量权重来初始化待剪裁模型,已发布模型的权重可在[模型库](../../../docs/MODEL_ZOO_cn.md)中获取。 通过`-o pretrain_weights`指定待剪裁模型的预训练权重,可以指定url或本地文件系统的路径。如下所示: diff --git a/slim/nas/README.md b/slim/nas/README.md index 59912dda1aff48c6ebc574111617e05ba9d2aef3..f571979f08cfaf2874d19fda856c9b4aa98d24fe 100644 --- a/slim/nas/README.md +++ b/slim/nas/README.md @@ -5,9 +5,9 @@ ## 概述 我们选取人脸检测的BlazeFace模型作为神经网络搜索示例,该示例使用[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) -辅助完成神经网络搜索实验,具体技术细节,请您参考[神经网络搜索策略](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/docs/tutorials/nas_demo.md)。
+辅助完成神经网络搜索实验,具体技术细节,请您参考[神经网络搜索策略](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/quick_start/nas_tutorial.md)。
基于PaddleSlim进行搜索实验过程中,搜索限制条件可以选择是浮点运算数(FLOPs)限制还是硬件延时(latency)限制,硬件延时限制需要提供延时表。本示例提供一份基于blazeface搜索空间的硬件延时表,名称是latency_855.txt(基于PaddleLite在骁龙855上测试的延时),可以直接用该表进行blazeface的硬件延时搜索实验。
-硬件延时表每个字段的含义可以参考:[硬件延时表说明](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/docs/table_latency.md) +硬件延时表每个字段的含义可以参考:[硬件延时表说明](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/api_cn/table_latency.md) ## 定义搜索空间 @@ -48,7 +48,7 @@ blaze_filters与double_blaze_filters字段请参考[blazenet.py](https://github. ## 开始搜索 首先需要安装PaddleSlim,请参考[安装教程](https://paddlepaddle.github.io/PaddleSlim/#_2)。 -然后进入 `slim/nas`目录中,修改blazeface.yml配置,配置文件中搜索配置字段含义请参考[NAS-API文档](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/docs/api/nas_api.md)
+然后进入 `slim/nas`目录中,修改blazeface.yml配置,配置文件中搜索配置字段含义请参考[NAS-API文档](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/api_cn/nas_api.rst)
配置文件blazeface.yml中的`Constraint`字段表示当前搜索实验的搜索限制条件实例:
- `ctype`:具体的限制条件,可以设置为flops或者latency,分别表示浮点运算数限制和硬件延时限制。 @@ -84,10 +84,10 @@ BlazeNet: - (2)训练、评估与预测: -启动完整的训练评估实验,可参考PaddleDetection的[训练、评估与预测流程](../../docs/tutorials/GETTING_STARTED_cn.md) +启动完整的训练评估实验,可参考PaddleDetection的[训练、评估与预测流程](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/tutorials/GETTING_STARTED_cn.md) ## 实验结果 -请参考[人脸检测模型库](../../configs/face_detection/README.md)中BlazeFace-NAS的实验结果。 +请参考[人脸检测模型库](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/featured_model/FACE_DETECTION.md)中BlazeFace-NAS的实验结果。 ## FAQ - 运行报错:`socket.error: [Errno 98] Address already in use`。 diff --git a/slim/prune/README.md b/slim/prune/README.md index 2b4eadc454b9a444a003d4df39e4f39600a70e14..f33954a99817d950547f381349cc77801f81c2bb 100644 --- a/slim/prune/README.md +++ b/slim/prune/README.md @@ -1,6 +1,6 @@ # 卷积层通道剪裁教程 -请确保已正确[安装PaddleDetection](../../docs/tutorials/INSTALL_cn.md)及其依赖。 +请确保已正确[安装PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/tutorials/INSTALL_cn.md)及其依赖。 该文档介绍如何使用[PaddleSlim](https://paddlepaddle.github.io/PaddleSlim)的卷积通道剪裁接口对检测库中的模型的卷积层的通道数进行剪裁。 @@ -8,15 +8,15 @@ 该教程中所示操作,如无特殊说明,均在`PaddleDetection/`路径下执行。 -已发布裁剪模型见[压缩模型库](../README.md) +已发布裁剪模型见[压缩模型库](https://github.com/PaddlePaddle/PaddleDetection/blob/master/slim/README.md) ## 1. 数据准备 -请参考检测库[数据下载](../../docs/tutorials/INSTALL_cn.md)文档准备数据。 +请参考检测库[数据下载](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/tutorials/INSTALL_cn.md)文档准备数据。 ## 2. 模型选择 -通过`-c`选项指定待裁剪模型的配置文件的相对路径,更多可选配置文件请参考: [检测库配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/release/0.1/configs) +通过`-c`选项指定待裁剪模型的配置文件的相对路径,更多可选配置文件请参考: [检测库配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs) 对于剪裁任务,原模型的权重不一定对剪裁后的模型训练的重训练有贡献,所以加载原模型的权重不是必需的步骤。 @@ -32,7 +32,7 @@ -o weights=output/yolov3_mobilenet_v1_voc/model_final ``` -官方已发布的模型请参考: [模型库](https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.1/docs/README.md) +官方已发布的模型请参考: [模型库](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/MODEL_ZOO_cn.md) ## 3. 确定待分析参数 @@ -49,7 +49,7 @@ python slim/prune/prune.py \ ## 4. 分析待剪裁参数敏感度 -可通过敏感度分析脚本分析待剪裁参数敏感度得到合适的剪裁率,敏感度分析工具见[敏感度分析](../sensitive/README.md)。 +可通过敏感度分析脚本分析待剪裁参数敏感度得到合适的剪裁率,敏感度分析工具见[敏感度分析](https://github.com/PaddlePaddle/PaddleDetection/blob/master/slim/sensitive/README.md)。 ## 5. 启动剪裁任务 @@ -97,16 +97,16 @@ python slim/prune/export_model.py \ **当前PaddleSlim的剪裁功能不支持剪裁循环体或条件判断语句块内的卷积层,请避免剪裁循环和判断语句块前的一个卷积和语句块内部的卷积。** -对于[faster_rcnn_r50](../../configs/faster_rcnn_r50_1x.yml)或[mask_rcnn_r50](../../configs/mask_rcnn_r50_1x.yml)网络,请剪裁卷积`res4f_branch2c`之前的卷积。 +对于[faster_rcnn_r50](https://github.com/PaddlePaddle/PaddleDetection/blob/master/configs/faster_rcnn_r50_1x.yml)或[mask_rcnn_r50](https://github.com/PaddlePaddle/PaddleDetection/blob/master/configs/mask_rcnn_r50_1x.yml)网络,请剪裁卷积`res4f_branch2c`之前的卷积。 -对[faster_rcnn_r50](../../configs/faster_rcnn_r50_1x.yml)剪裁示例如下: +对[faster_rcnn_r50](https://github.com/PaddlePaddle/PaddleDetection/blob/master/configs/faster_rcnn_r50_1x.yml)剪裁示例如下: ``` # demo for faster_rcnn_r50 python slim/prune/prune.py -c ./configs/faster_rcnn_r50_1x.yml --pruned_params "res4f_branch2b_weights,res4f_branch2a_weights" --pruned_ratios="0.3,0.4" --eval ``` -对[mask_rcnn_r50](../../configs/mask_rcnn_r50_1x.yml)剪裁示例如下: +对[mask_rcnn_r50](https://github.com/PaddlePaddle/PaddleDetection/blob/master/configs/mask_rcnn_r50_1x.yml)剪裁示例如下: ``` # demo for mask_rcnn_r50 diff --git a/slim/quantization/README.md b/slim/quantization/README.md index 0db1e37b048e168b59e8edd7c4e025fbd9cf2ea0..46a2c49ac746491dc7b8f792b5391ac04166fc41 100644 --- a/slim/quantization/README.md +++ b/slim/quantization/README.md @@ -176,9 +176,9 @@ python slim/quantization/infer.py --not_quant_pattern yolo_output \ | MobileNetV1 | ImageNet | post | 608 | 27.9 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_mobilenetv1_coco_quant_post.tar) | | MobileNetV1 | ImageNet | post | 416 | 28.0 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_mobilenetv1_coco_quant_post.tar) | | MobileNetV1 | ImageNet | post | 320 | 26.0 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_mobilenetv1_coco_quant_post.tar) | -| MobileNetV1 | ImageNet | aware | 608 | 28.1 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_mobilenetv1_coco_quant_aware.tar) | -| MobileNetV1 | ImageNet | aware | 416 | 28.2 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_mobilenetv1_coco_quant_aware.tar) | -| MobileNetV1 | ImageNet | aware | 320 | 25.8 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_mobilenetv1_coco_quant_aware.tar) | +| MobileNetV1 | ImageNet | aware | 608 | 28.1 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_mobilenet_coco_quant_aware.tar) | +| MobileNetV1 | ImageNet | aware | 416 | 28.2 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_mobilenet_coco_quant_aware.tar) | +| MobileNetV1 | ImageNet | aware | 320 | 25.8 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_mobilenet_coco_quant_aware.tar) | | ResNet34 | ImageNet | post | 608 | 35.7 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_r34_coco_quant_post.tar) | | ResNet34 | ImageNet | aware | 608 | 35.2 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_r34_coco_quant_aware.tar) | | ResNet34 | ImageNet | aware | 416 | 33.3 | [下载链接](https://paddlemodels.bj.bcebos.com/PaddleSlim/yolov3_r34_coco_quant_aware.tar) | diff --git a/slim/sensitive/README.md b/slim/sensitive/README.md index cb7a5470b06a1a7ad811a855846754747c8fd2f1..e6a0795f37bd5dca9b2e33d9b5fdfb9b1dc930af 100644 --- a/slim/sensitive/README.md +++ b/slim/sensitive/README.md @@ -1,6 +1,6 @@ # 卷积层敏感度分析教程 -请确保已正确[安装PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.1/docs/INSTALL_cn.md)及其依赖。 +请确保已正确[安装PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/tutorials/INSTALL_cn.md)及其依赖。 该文档介绍如何使用[PaddleSlim](https://paddlepaddle.github.io/PaddleSlim)的敏感度分析接口对检测库中的模型的卷积层进行敏感度分析。 @@ -10,11 +10,11 @@ ## 数据准备 -请参考检测库[数据模块](../../docs/advanced_tutorials/READER.md)文档准备数据。 +请参考检测库[数据模块](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/tutorials/INSTALL_cn.md)文档准备数据。 ## 模型选择 -通过`-c`选项指定待分析模型的配置文件的相对路径,更多可选配置文件请参考: [检测库配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/release/0.1/configs) +通过`-c`选项指定待分析模型的配置文件的相对路径,更多可选配置文件请参考: [检测库配置文件](https://github.com/PaddlePaddle/PaddleDetection/blob/master/configs) 通过`-o weights`指定模型的权重,可以指定url或本地文件系统的路径。如下所示: @@ -28,7 +28,7 @@ -o weights=output/yolov3_mobilenet_v1_voc/model_final ``` -官方已发布的模型请参考: [模型库](../../docs/MODEL_ZOO_cn.md) +官方已发布的模型请参考: [模型库](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/MODEL_ZOO_cn.md) ## 确定待分析参数 diff --git a/tools/export_model.py b/tools/export_model.py index 54113dc8eb20dfded508e12b5be194b600d02bdb..f29e9de0c56ae5972f65ce4ba79c337077b5a99d 100644 --- a/tools/export_model.py +++ b/tools/export_model.py @@ -112,6 +112,8 @@ def dump_infer_config(FLAGS, config): 'RetinaNet': 40, 'Face': 3, 'TTFNet': 3, + 'FCOS': 3, + 'EfficientDet': 40 } infer_arch = config['architecture'] diff --git a/tools/train.py b/tools/train.py index 828f548185ff078151585f13db6f28bf45b3d257..7f058c5281e1475927352286260f76b9ed0f584d 100644 --- a/tools/train.py +++ b/tools/train.py @@ -53,7 +53,9 @@ logger = logging.getLogger(__name__) def main(): env = os.environ - FLAGS.dist = 'PADDLE_TRAINER_ID' in env and 'PADDLE_TRAINERS_NUM' in env + FLAGS.dist = 'PADDLE_TRAINER_ID' in env \ + and 'PADDLE_TRAINERS_NUM' in env \ + and int(env['PADDLE_TRAINERS_NUM']) > 1 if FLAGS.dist: trainer_id = int(env['PADDLE_TRAINER_ID']) local_seed = (99 + trainer_id)