diff --git a/configs/dcn/yolov3_enhance_reader.yml b/configs/dcn/yolov3_enhance_reader.yml new file mode 100644 index 0000000000000000000000000000000000000000..228e5558aa1c616021823aa7f99ac4748a1a9826 --- /dev/null +++ b/configs/dcn/yolov3_enhance_reader.yml @@ -0,0 +1,104 @@ +TrainReader: + inputs_def: + fields: ['image', 'gt_bbox', 'gt_class', 'gt_score'] + num_max_boxes: 50 + use_fine_grained_loss: true + dataset: + !COCODataSet + image_dir: train2017 + anno_path: annotations/instances_train2017.json + dataset_dir: dataset/coco + with_background: false + sample_transforms: + - !DecodeImage + to_rgb: True + - !RandomCrop {} + - !RandomFlipImage + is_normalized: false + - !NormalizeBox {} + - !PadBox + num_max_boxes: 50 + - !BboxXYXY2XYWH {} + batch_transforms: + - !RandomShape + sizes: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608] + random_inter: True + - !NormalizeImage + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + is_scale: False + is_channel_first: false + - !Permute + to_bgr: false + channel_first: True + # Gt2YoloTarget is only used when use_fine_grained_loss set as true, + # this operator will be deleted automatically if use_fine_grained_loss + # is set as false + - !Gt2YoloTarget + anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]] + anchors: [[10, 13], [16, 30], [33, 23], + [30, 61], [62, 45], [59, 119], + [116, 90], [156, 198], [373, 326]] + downsample_ratios: [32, 16, 8] + batch_size: 8 + shuffle: true + drop_last: true + worker_num: 8 + bufsize: 32 + use_process: true + +EvalReader: + inputs_def: + image_shape: [3, 608, 608] + fields: ['image', 'im_size', 'im_id'] + num_max_boxes: 50 + dataset: + !COCODataSet + dataset_dir: dataset/coco + anno_path: annotations/instances_val2017.json + image_dir: val2017 + with_background: false + sample_transforms: + - !DecodeImage + to_rgb: True + with_mixup: false + - !ResizeImage + interp: 2 + target_size: 608 + - !NormalizeImage + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + is_scale: False + is_channel_first: false + - !Permute + to_bgr: false + channel_first: True + batch_size: 8 + drop_empty: false + worker_num: 8 + bufsize: 32 + +TestReader: + inputs_def: + image_shape: [3, 608, 608] + fields: ['image', 'im_size', 'im_id'] + dataset: + !ImageFolder + anno_path: annotations/instances_val2017.json + with_background: false + sample_transforms: + - !DecodeImage + to_rgb: True + with_mixup: false + - !ResizeImage + interp: 2 + target_size: 608 + - !NormalizeImage + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + is_scale: False + is_channel_first: false + - !Permute + to_bgr: false + channel_first: True + batch_size: 1 diff --git a/configs/dcn/yolov3_r50vd_dcn_iouloss_obj365_pretrained_coco.yml b/configs/dcn/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco.yml similarity index 85% rename from configs/dcn/yolov3_r50vd_dcn_iouloss_obj365_pretrained_coco.yml rename to configs/dcn/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco.yml index bc067249c725ede6efd07948c99478ad6f1e2f7f..8a7fde79702285c1a9b969bbd36839fbe009607f 100755 --- a/configs/dcn/yolov3_r50vd_dcn_iouloss_obj365_pretrained_coco.yml +++ b/configs/dcn/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco.yml @@ -1,12 +1,12 @@ architecture: YOLOv3 use_gpu: true -max_iters: 55000 +max_iters: 85000 log_smooth_window: 20 save_dir: output snapshot_iter: 10000 metric: COCO -pretrain_weights: https://paddlemodels.bj.bcebos.com/object_detection/ResNet50_vd_obj365_pretrained.tar -weights: output/yolov3_r50vd_dcn_iouloss_obj365_pretrained_coco/model_final +pretrain_weights: https://paddlemodels.bj.bcebos.com/object_detection/ResNet50_vd_dcn_db_obj365_pretrained.tar +weights: output/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco/model_final num_classes: 80 use_fine_grained_loss: true @@ -39,6 +39,7 @@ YOLOv3Head: nms_top_k: 1000 normalized: false score_threshold: 0.01 + drop_block: true YOLOv3Loss: batch_size: 8 @@ -58,8 +59,8 @@ LearningRate: - !PiecewiseDecay gamma: 0.1 milestones: - - 40000 - - 50000 + - 55000 + - 75000 - !LinearWarmup start_factor: 0. steps: 4000 @@ -72,4 +73,4 @@ OptimizerBuilder: factor: 0.0005 type: L2 -_READER_: '../yolov3_reader.yml' +_READER_: 'yolov3_enhance_reader.yml' diff --git a/configs/dcn/yolov3_r50vd_dcn_db_obj365_pretrained_coco.yml b/configs/dcn/yolov3_r50vd_dcn_db_obj365_pretrained_coco.yml new file mode 100755 index 0000000000000000000000000000000000000000..8d4e0200e4db77d0be537e2f5c67909905e294fe --- /dev/null +++ b/configs/dcn/yolov3_r50vd_dcn_db_obj365_pretrained_coco.yml @@ -0,0 +1,70 @@ +architecture: YOLOv3 +use_gpu: true +max_iters: 85000 +log_smooth_window: 20 +save_dir: output +snapshot_iter: 10000 +metric: COCO +pretrain_weights: https://paddlemodels.bj.bcebos.com/object_detection/ResNet50_vd_dcn_db_obj365_pretrained.tar +weights: output/yolov3_r50vd_dcn_db_obj365_pretrained_coco/model_final +num_classes: 80 +use_fine_grained_loss: true + +YOLOv3: + backbone: ResNet + yolo_head: YOLOv3Head + use_fine_grained_loss: true + +ResNet: + norm_type: sync_bn + freeze_at: 0 + freeze_norm: false + norm_decay: 0. + depth: 50 + feature_maps: [3, 4, 5] + variant: d + dcn_v2_stages: [5] + +YOLOv3Head: + anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]] + anchors: [[10, 13], [16, 30], [33, 23], + [30, 61], [62, 45], [59, 119], + [116, 90], [156, 198], [373, 326]] + norm_decay: 0. + yolo_loss: YOLOv3Loss + nms: + background_label: -1 + keep_top_k: 100 + nms_threshold: 0.45 + nms_top_k: 1000 + normalized: false + score_threshold: 0.01 + drop_block: true + +YOLOv3Loss: + batch_size: 8 + ignore_thresh: 0.7 + label_smooth: false + use_fine_grained_loss: true + +LearningRate: + base_lr: 0.001 + schedulers: + - !PiecewiseDecay + gamma: 0.1 + milestones: + - 55000 + - 75000 + - !LinearWarmup + start_factor: 0. + steps: 4000 + +OptimizerBuilder: + optimizer: + momentum: 0.9 + type: Momentum + regularizer: + factor: 0.0005 + type: L2 + +_READER_: 'yolov3_enhance_reader.yml' diff --git a/configs/dcn/yolov3_r50vd_dcn_obj365_pretrained_coco.yml b/configs/dcn/yolov3_r50vd_dcn_obj365_pretrained_coco.yml index 9e66437407c480c39d884203f1184e1cf2102095..7042d9538d801618d5f83c9b1de2df2ce0e0dcda 100755 --- a/configs/dcn/yolov3_r50vd_dcn_obj365_pretrained_coco.yml +++ b/configs/dcn/yolov3_r50vd_dcn_obj365_pretrained_coco.yml @@ -1,18 +1,19 @@ architecture: YOLOv3 use_gpu: true -max_iters: 55000 +max_iters: 85000 log_smooth_window: 20 save_dir: output snapshot_iter: 10000 metric: COCO -pretrain_weights: https://paddlemodels.bj.bcebos.com/object_detection/ResNet50_vd_obj365_pretrained.tar -weights: output/yolov3_r50vd_dcn_obj365_pretrained_coco/model_final +pretrain_weights: https://paddlemodels.bj.bcebos.com/object_detection/ResNet50_vd_dcn_db_obj365_pretrained.tar +weights: output/yolov3_r50vd_dcn_db_obj365_pretrained_coco/model_final num_classes: 80 -use_fine_grained_loss: false +use_fine_grained_loss: true YOLOv3: backbone: ResNet yolo_head: YOLOv3Head + use_fine_grained_loss: true ResNet: norm_type: sync_bn @@ -43,6 +44,7 @@ YOLOv3Loss: batch_size: 8 ignore_thresh: 0.7 label_smooth: false + use_fine_grained_loss: true LearningRate: base_lr: 0.001 @@ -50,8 +52,8 @@ LearningRate: - !PiecewiseDecay gamma: 0.1 milestones: - - 40000 - - 50000 + - 55000 + - 75000 - !LinearWarmup start_factor: 0. steps: 4000 @@ -64,106 +66,4 @@ OptimizerBuilder: factor: 0.0005 type: L2 -TrainReader: - inputs_def: - fields: ['image', 'gt_bbox', 'gt_class', 'gt_score'] - num_max_boxes: 50 - dataset: - !COCODataSet - image_dir: train2017 - anno_path: annotations/instances_train2017.json - dataset_dir: dataset/coco - with_background: false - sample_transforms: - - !DecodeImage - to_rgb: True - - !RandomCrop {} - - !RandomFlipImage - is_normalized: false - - !NormalizeBox {} - - !PadBox - num_max_boxes: 50 - - !BboxXYXY2XYWH {} - batch_transforms: - - !RandomShape - sizes: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608] - random_inter: True - - !NormalizeImage - mean: [0.485, 0.456, 0.406] - std: [0.229, 0.224, 0.225] - is_scale: False - is_channel_first: false - - !Permute - to_bgr: false - channel_first: True - # Gt2YoloTarget is only used when use_fine_grained_loss set as true, - # this operator will be deleted automatically if use_fine_grained_loss - # is set as false - - !Gt2YoloTarget - anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]] - anchors: [[10, 13], [16, 30], [33, 23], - [30, 61], [62, 45], [59, 119], - [116, 90], [156, 198], [373, 326]] - downsample_ratios: [32, 16, 8] - batch_size: 8 - shuffle: true - drop_last: true - worker_num: 8 - bufsize: 32 - use_process: true - -EvalReader: - inputs_def: - image_shape: [3, 608, 608] - fields: ['image', 'im_size', 'im_id'] - num_max_boxes: 50 - dataset: - !COCODataSet - dataset_dir: dataset/coco - anno_path: annotations/instances_val2017.json - image_dir: val2017 - with_background: false - sample_transforms: - - !DecodeImage - to_rgb: True - with_mixup: false - - !ResizeImage - interp: 2 - target_size: 608 - - !NormalizeImage - mean: [0.485, 0.456, 0.406] - std: [0.229, 0.224, 0.225] - is_scale: False - is_channel_first: false - - !Permute - to_bgr: false - channel_first: True - batch_size: 8 - drop_empty: false - worker_num: 8 - bufsize: 32 - -TestReader: - inputs_def: - image_shape: [3, 608, 608] - fields: ['image', 'im_size', 'im_id'] - dataset: - !ImageFolder - anno_path: annotations/instances_val2017.json - with_background: false - sample_transforms: - - !DecodeImage - to_rgb: True - with_mixup: false - - !ResizeImage - interp: 2 - target_size: 608 - - !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 +_READER_: 'yolov3_enhance_reader.yml' diff --git a/demo/dropblock.png b/demo/dropblock.png new file mode 100644 index 0000000000000000000000000000000000000000..66b8a88e39ad23f3e83ba7a49b93ebfdfcf5aacb Binary files /dev/null and b/demo/dropblock.png differ diff --git a/docs/featured_model/YOLOv3_ENHANCEMENT.md b/docs/featured_model/YOLOv3_ENHANCEMENT.md index a154ebc23265085d114ba4c559b7d618000b9636..78694af6f9dfab7d92f9fa5c9de5a779d23a80d8 100644 --- a/docs/featured_model/YOLOv3_ENHANCEMENT.md +++ b/docs/featured_model/YOLOv3_ENHANCEMENT.md @@ -1,6 +1,7 @@ # YOLOv3增强模型 --- + ## 简介 [YOLOv3](https://arxiv.org/abs/1804.02767) 是由 [Joseph Redmon](https://arxiv.org/search/cs?searchtype=author&query=Redmon%2C+J) 和 [Ali Farhadi](https://arxiv.org/search/cs?searchtype=author&query=Farhadi%2C+A) 提出的单阶段检测器, 该检测 @@ -8,12 +9,22 @@ PaddleDetection实现版本中使用了 [Bag of Freebies for Training Object Detection Neural Networks](https://arxiv.org/abs/1902.04103v3) 中提出的图像增强和label smooth等优化方法,精度优于darknet框架的实现版本,在COCO-2017数据集上,YOLOv3(DarkNet)达到`mAP(0.50:0.95)= 38.9`的精度,比darknet实现版本的精度(33.0)要高5.9。同时,在推断速度方面,基于Paddle预测库的加速方法,推断速度比darknet高30%。 -在此基础上,PaddleDetection对YOLOv3进一步改进,得到了更大的精度和速度优势。 +在此基础上,PaddleDetection对YOLOv3进一步改进,进一步提升了速度和精度,最终在COCO mAP上可以达到43.2。 ## 方法描述 -将YOLOv3骨架网络更换为ResNet50-vd,同时在最后一个Residual block中引入[Deformable convolution v2](https://arxiv.org/abs/1811.11168)(可变形卷积)替代原始卷积操作。另外,使用[object365数据集](https://www.objects365.org/download.html)训练得到的模型作为coco数据集上的预训练模型,进一步提高YOLOv3的精度。 +1.将[YOLOv3](https://arxiv.org/pdf/1804.02767.pdf)骨架网络更换为[ResNet50-VD](https://arxiv.org/pdf/1812.01187.pdf)。ResNet50-VD网络相比原生的DarkNet53网络在速度和精度上都有一定的优势,且相较DarkNet53 ResNet系列更容易扩展,针对自己业务场景可以选择ResNet18、34、101等不同结构作为检测模型的主干网络。 + +2.引入[Deformable Convolution v2](https://arxiv.org/abs/1811.11168)(可变形卷积)替代原始卷积操作,Deformable Convolution已经在多个视觉任务中广泛验证过其效果,在Yolo v3增强模型中考虑到速度与精度的平衡,我们仅使用Deformable Convolution替换了主干网络中Stage5部分的3x3卷积。 + +3.在FPN部分增加[DropBlock](https://arxiv.org/abs/1810.12890)模块,提高模型泛化能力。Dropout操作如下图(b)中所示是分类网络中广泛使用的增强模型泛化能力的重要手段之一。DropBlock算法相比于Dropout算法,在Drop特征的时候会集中Drop掉某一块区域,更适应于在检测任务中提高网络泛化能力。 + +![image-20200204141739840](../images/dropblock.png) + +4.Yolo v3作为一阶段检测网络,在定位精度上相比Faster RCNN,Cascade RCNN等网络结构有着其天然的劣势,增加[IoU Loss](https://arxiv.org/abs/1908.03851)分支,可以一定程度上提高BBox定位精度,缩小一阶段和两阶段检测网络的差距。 + +5.使用[Object365数据集](https://www.objects365.org/download.html)训练得到的模型作为coco数据集上的预训练模型,Object365数据集包含约60万张图片以及365种类别,相比coco数据集进行预训练可以进一步提高YOLOv3的精度。 ## 使用方法 @@ -21,15 +32,17 @@ PaddleDetection实现版本中使用了 [Bag of Freebies for Training Object Det ```bash export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 -python tools/train.py -c configs/dcn/yolov3_r50vd_dcn.yml +python tools/train.py -c configs/dcn/yolov3_r50vd_dcn_iouloss_obj365_pretrained_coco.yml ``` 更多模型参数请使用``python tools/train.py --help``查看,或参考[训练、评估及参数说明](../tutorials/GETTING_STARTED_cn.md)文档 ### 模型效果 -| 模型 | 预训练模型 | 验证集 mAP | P4预测速度 | 下载 | -| :---------------------:|:-----------------: | :-------------: | :----------------------:|:-----------------------------------------------------: | -| YOLOv3 DarkNet | [DarkNet pretrain](https://paddle-imagenet-models-name.bj.bcebos.com/DarkNet53_pretrained.tar) | 38.9 | 原生:88.3ms
tensorRT-FP32: 42.5ms | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_darknet.tar) | -| YOLOv3 ResNet50_vd dcn | [ImageNet pretrain](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_pretrained.tar) | 39.1 | 原生:74.4ms
tensorRT-FP32: 35.2ms | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_r50vd_dcn_imagenet.tar) | -| YOLOv3 ResNet50_vd dcn | [Object365 pretrain](https://paddlemodels.bj.bcebos.com/object_detection/ResNet50_vd_obj365_pretrained.tar) | 41.4 | 原生:74.4ms
tensorRT-FP32: 35.2ms | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_r50vd_dcn_obj365.tar) | +| 模型 | 预训练模型 | 验证集 mAP | P4预测速度 | 下载 | +| :--------------------------------------: | :----------------------------------------------------------: | :--------: | :------------------------------------: | :----------------------------------------------------------: | +| YOLOv3 DarkNet | [DarkNet pretrain](https://paddle-imagenet-models-name.bj.bcebos.com/DarkNet53_pretrained.tar) | 38.9 | 原生:88.3ms
tensorRT-FP32: 42.5ms | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_darknet.tar) | +| YOLOv3 ResNet50_vd DCN | [ImageNet pretrain](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_pretrained.tar) | 39.1 | 原生:74.4ms
tensorRT-FP32: 35.2ms | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_r50vd_dcn_imagenet.tar) | +| YOLOv3 ResNet50_vd DCN | [Object365 pretrain](https://paddlemodels.bj.bcebos.com/object_detection/ResNet50_vd_dcn_db_obj365_pretrained.tar) | 42.5 | 原生:74.4ms
tensorRT-FP32: 35.2ms | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_r50vd_dcn_obj365_v2.tar) | +| YOLOv3 ResNet50_vd DCN DropBlock | [Object365 pretrain](https://paddlemodels.bj.bcebos.com/object_detection/ResNet50_vd_dcn_db_obj365_pretrained.tar) | 42.8 | 原生:74.4ms
tensorRT-FP32: 35.2ms | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_r50vd_dcn_db_obj365.tar) | +| YOLOv3 ResNet50_vd DCN DropBlock IoULoss | [Object365 pretrain](https://paddlemodels.bj.bcebos.com/object_detection/ResNet50_vd_dcn_db_obj365_pretrained.tar) | 43.2 | 原生:74.4ms
tensorRT-FP32: 35.2ms | [下载链接](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_r50vd_dcn_db_obj365.tar) | diff --git a/docs/images/dropblock.png b/docs/images/dropblock.png new file mode 100644 index 0000000000000000000000000000000000000000..66b8a88e39ad23f3e83ba7a49b93ebfdfcf5aacb Binary files /dev/null and b/docs/images/dropblock.png differ