From 7d2a54a4aa3c135be00952b50359b6cb6b6540e4 Mon Sep 17 00:00:00 2001 From: Feng Ni Date: Thu, 15 Apr 2021 12:28:57 +0800 Subject: [PATCH] move ssld model (#2633) * move ssld model, test=document_fix * fix typo, test=document_fix --- configs/cascade_rcnn/README.md | 4 ++ ...cade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml | 6 +- ...cade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml | 6 +- .../cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml | 6 +- .../cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml | 6 +- configs/faster_rcnn/README.md | 2 + .../faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml | 6 +- .../faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml | 6 +- configs/mask_rcnn/README.md | 2 + .../mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml | 6 +- .../mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml | 6 +- configs/ssld/README.md | 33 ----------- configs/yolov3/README.md | 9 +++ .../yolov3_mobilenet_v1_ssld_270e_coco.yml | 11 ++++ .../yolov3_mobilenet_v1_ssld_270e_voc.yml | 54 ++++++++++++++++++ ...olov3_mobilenet_v3_large_ssld_270e_voc.yml | 54 ++++++++++++++++++ docs/feature_models/SSLD_PRETRAINED_MODEL.md | 54 ++++++++++++++++++ .../SSLD_PRETRAINED_MODEL_en.md | 53 +++++++++++++++++ docs/images/ssld_model.png | Bin 22184 -> 81566 bytes 19 files changed, 267 insertions(+), 57 deletions(-) rename configs/{ssld => cascade_rcnn}/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml (71%) rename configs/{ssld => cascade_rcnn}/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml (77%) rename configs/{ssld => cascade_rcnn}/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml (72%) rename configs/{ssld => cascade_rcnn}/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml (78%) rename configs/{ssld => faster_rcnn}/faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml (79%) rename configs/{ssld => faster_rcnn}/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml (79%) rename configs/{ssld => mask_rcnn}/mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml (80%) rename configs/{ssld => mask_rcnn}/mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml (80%) delete mode 100644 configs/ssld/README.md create mode 100644 configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml create mode 100644 configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml create mode 100644 configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml create mode 100644 docs/feature_models/SSLD_PRETRAINED_MODEL.md create mode 100644 docs/feature_models/SSLD_PRETRAINED_MODEL_en.md diff --git a/configs/cascade_rcnn/README.md b/configs/cascade_rcnn/README.md index fe2a2a7ad..e74641a3f 100644 --- a/configs/cascade_rcnn/README.md +++ b/configs/cascade_rcnn/README.md @@ -6,6 +6,10 @@ | :------------------- | :------------- | :-----: | :-----: | :------------: | :-----: | :-----: | :-----------------------------------------------------: | :-----: | | ResNet50-FPN | Cascade Faster | 1 | 1x | ---- | 41.1 | - | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_rcnn_r50_fpn_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.yml) | | ResNet50-FPN | Cascade Mask | 1 | 1x | ---- | 41.8 | 36.3 | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_mask_rcnn_r50_fpn_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Faster | 1 | 1x | ---- | 44.4 | - | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Faster | 1 | 2x | ---- | 45.0 | - | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Mask | 1 | 1x | ---- | 44.9 | 39.1 | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Mask | 1 | 2x | ---- | 45.7 | 39.7 | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | **注意:** Cascade R-CNN模型精度依赖Paddle develop分支修改,精度复现须使用[每日版本](https://www.paddlepaddle.org.cn/documentation/docs/zh/install/Tables.html#whl-dev)或2.0.1版本(将于2021.03发布),使用Paddle 2.0.0版本会有少量精度损失。 diff --git a/configs/ssld/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml b/configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml similarity index 71% rename from configs/ssld/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml rename to configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml index e64ad6bbf..0ab507caa 100644 --- a/configs/ssld/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml @@ -1,9 +1,9 @@ _BASE_: [ '../datasets/coco_instance.yml', '../runtime.yml', - '../cascade_rcnn/_base_/optimizer_1x.yml', - '../cascade_rcnn/_base_/cascade_mask_rcnn_r50_fpn.yml', - '../cascade_rcnn/_base_/cascade_mask_fpn_reader.yml', + '_base_/optimizer_1x.yml', + '_base_/cascade_mask_rcnn_r50_fpn.yml', + '_base_/cascade_mask_fpn_reader.yml', ] pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_vd_ssld_v2_pretrained.pdparams weights: output/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco/model_final diff --git a/configs/ssld/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml b/configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml similarity index 77% rename from configs/ssld/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml rename to configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml index 27dbb1e4c..736ba2e74 100644 --- a/configs/ssld/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml @@ -1,9 +1,9 @@ _BASE_: [ '../datasets/coco_instance.yml', '../runtime.yml', - '../cascade_rcnn/_base_/optimizer_1x.yml', - '../cascade_rcnn/_base_/cascade_mask_rcnn_r50_fpn.yml', - '../cascade_rcnn/_base_/cascade_mask_fpn_reader.yml', + '_base_/optimizer_1x.yml', + '_base_/cascade_mask_rcnn_r50_fpn.yml', + '_base_/cascade_mask_fpn_reader.yml', ] pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_vd_ssld_v2_pretrained.pdparams weights: output/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco/model_final diff --git a/configs/ssld/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml b/configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml similarity index 72% rename from configs/ssld/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml rename to configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml index 2715b33f1..905adbd61 100644 --- a/configs/ssld/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml +++ b/configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml @@ -1,9 +1,9 @@ _BASE_: [ '../datasets/coco_detection.yml', '../runtime.yml', - '../cascade_rcnn/_base_/optimizer_1x.yml', - '../cascade_rcnn/_base_/cascade_rcnn_r50_fpn.yml', - '../cascade_rcnn/_base_/cascade_fpn_reader.yml', + '_base_/optimizer_1x.yml', + '_base_/cascade_rcnn_r50_fpn.yml', + '_base_/cascade_fpn_reader.yml', ] pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_vd_ssld_v2_pretrained.pdparams weights: output/cascade_rcnn_r50_vd_fpn_ssld_1x_coco/model_final diff --git a/configs/ssld/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml b/configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml similarity index 78% rename from configs/ssld/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml rename to configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml index 00476f6db..a6272145d 100644 --- a/configs/ssld/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml +++ b/configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml @@ -1,9 +1,9 @@ _BASE_: [ '../datasets/coco_detection.yml', '../runtime.yml', - '../cascade_rcnn/_base_/optimizer_1x.yml', - '../cascade_rcnn/_base_/cascade_rcnn_r50_fpn.yml', - '../cascade_rcnn/_base_/cascade_fpn_reader.yml', + '_base_/optimizer_1x.yml', + '_base_/cascade_rcnn_r50_fpn.yml', + '_base_/cascade_fpn_reader.yml', ] pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_vd_ssld_v2_pretrained.pdparams weights: output/cascade_rcnn_r50_vd_fpn_ssld_2x_coco/model_final diff --git a/configs/faster_rcnn/README.md b/configs/faster_rcnn/README.md index e3b5987c5..cb176afff 100644 --- a/configs/faster_rcnn/README.md +++ b/configs/faster_rcnn/README.md @@ -18,6 +18,8 @@ | ResNet101-vd-FPN | Faster | 1 | 2x | ---- | 43.0 | [下载链接](https://paddledet.bj.bcebos.com/models/faster_rcnn_r101_vd_fpn_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/faster_rcnn/faster_rcnn_r101_vd_fpn_2x_coco.yml) | | ResNeXt101-vd-FPN | Faster | 1 | 1x | ---- | 43.4 | [下载链接](https://paddledet.bj.bcebos.com/models/faster_rcnn_x101_vd_64x4d_fpn_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/faster_rcnn/faster_rcnn_x101_vd_64x4d_fpn_1x_coco.yml) | | ResNeXt101-vd-FPN | Faster | 1 | 2x | ---- | 44.0 | [下载链接](https://paddledet.bj.bcebos.com/models/faster_rcnn_x101_vd_64x4d_fpn_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/faster_rcnn/faster_rcnn_x101_vd_64x4d_fpn_2x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Faster | 1 | 1x | ---- | 41.4 | [下载链接](https://paddledet.bj.bcebos.com/models/faster_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Faster | 1 | 2x | ---- | 42.3 | [下载链接](https://paddledet.bj.bcebos.com/models/faster_rcnn_r50_vd_ssld_fpn_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/faster_rcnn/faster_rcnn_r50_vd_ssld_fpn_2x_coco.yml) | **注意:** Faster R-CNN模型精度依赖Paddle develop分支修改,精度复现须使用[每日版本](https://www.paddlepaddle.org.cn/documentation/docs/zh/install/Tables.html#whl-dev)或2.0.1版本(将于2021.03发布),使用Paddle 2.0.0版本会有少量精度损失。 diff --git a/configs/ssld/faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml b/configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml similarity index 79% rename from configs/ssld/faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml rename to configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml index a529adb0b..d71b82d83 100644 --- a/configs/ssld/faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml +++ b/configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml @@ -1,9 +1,9 @@ _BASE_: [ '../datasets/coco_detection.yml', '../runtime.yml', - '../faster_rcnn/_base_/optimizer_1x.yml', - '../faster_rcnn/_base_/faster_rcnn_r50_fpn.yml', - '../faster_rcnn/_base_/faster_fpn_reader.yml', + '_base_/optimizer_1x.yml', + '_base_/faster_rcnn_r50_fpn.yml', + '_base_/faster_fpn_reader.yml', ] pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_vd_ssld_v2_pretrained.pdparams weights: output/faster_rcnn_r50_vd_fpn_ssld_1x_coco/model_final diff --git a/configs/ssld/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml b/configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml similarity index 79% rename from configs/ssld/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml rename to configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml index b1c682e31..0562354e7 100644 --- a/configs/ssld/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml +++ b/configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml @@ -1,9 +1,9 @@ _BASE_: [ '../datasets/coco_detection.yml', '../runtime.yml', - '../faster_rcnn/_base_/optimizer_1x.yml', - '../faster_rcnn/_base_/faster_rcnn_r50_fpn.yml', - '../faster_rcnn/_base_/faster_fpn_reader.yml', + '_base_/optimizer_1x.yml', + '_base_/faster_rcnn_r50_fpn.yml', + '_base_/faster_fpn_reader.yml', ] pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_vd_ssld_v2_pretrained.pdparams weights: output/faster_rcnn_r50_vd_fpn_ssld_2x_coco/model_final diff --git a/configs/mask_rcnn/README.md b/configs/mask_rcnn/README.md index 39d15322f..300d67b46 100644 --- a/configs/mask_rcnn/README.md +++ b/configs/mask_rcnn/README.md @@ -14,6 +14,8 @@ | ResNet101-vd-FPN | Mask | 1 | 1x | ---- | 42.4 | 38.1 | [下载链接](https://paddledet.bj.bcebos.com/models/mask_rcnn_r101_vd_fpn_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/mask_rcnn/mask_rcnn_r101_vd_fpn_1x_coco.yml) | | ResNeXt101-vd-FPN | Mask | 1 | 1x | ---- | 44.0 | 39.5 | [下载链接](https://paddledet.bj.bcebos.com/models/mask_rcnn_x101_vd_64x4d_fpn_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/mask_rcnn/mask_rcnn_x101_vd_64x4d_fpn_1x_coco.yml) | | ResNeXt101-vd-FPN | Mask | 1 | 2x | ---- | 44.6 | 39.8 | [下载链接](https://paddledet.bj.bcebos.com/models/mask_rcnn_x101_vd_64x4d_fpn_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/mask_rcnn/mask_rcnn_x101_vd_64x4d_fpn_2x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Mask | 1 | 1x | ---- | 42.0 | 38.2 | [下载链接](https://paddledet.bj.bcebos.com/models/mask_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Mask | 1 | 2x | ---- | 42.7 | 38.9 | [下载链接](https://paddledet.bj.bcebos.com/models/mask_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | **注意:** Mask R-CNN模型精度依赖Paddle develop分支修改,精度复现须使用[每日版本](https://www.paddlepaddle.org.cn/documentation/docs/zh/install/Tables.html#whl-dev)或2.0.1版本(将于2021.03发布),使用Paddle 2.0.0版本会有少量精度损失。 diff --git a/configs/ssld/mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml b/configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml similarity index 80% rename from configs/ssld/mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml rename to configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml index 29f906e86..c5718a8d2 100644 --- a/configs/ssld/mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml +++ b/configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml @@ -1,9 +1,9 @@ _BASE_: [ '../datasets/coco_instance.yml', '../runtime.yml', - '../mask_rcnn/_base_/optimizer_1x.yml', - '../mask_rcnn/_base_/mask_rcnn_r50_fpn.yml', - '../mask_rcnn/_base_/mask_fpn_reader.yml', + '_base_/optimizer_1x.yml', + '_base_/mask_rcnn_r50_fpn.yml', + '_base_/mask_fpn_reader.yml', ] pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_vd_ssld_v2_pretrained.pdparams weights: output/mask_rcnn_r50_vd_fpn_ssld_1x_coco/model_final diff --git a/configs/ssld/mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml b/configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml similarity index 80% rename from configs/ssld/mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml rename to configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml index 39674e25d..65b31e6f1 100644 --- a/configs/ssld/mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml +++ b/configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml @@ -1,9 +1,9 @@ _BASE_: [ '../datasets/coco_instance.yml', '../runtime.yml', - '../mask_rcnn/_base_/optimizer_1x.yml', - '../mask_rcnn/_base_/mask_rcnn_r50_fpn.yml', - '../mask_rcnn/_base_/mask_fpn_reader.yml', + '_base_/optimizer_1x.yml', + '_base_/mask_rcnn_r50_fpn.yml', + '_base_/mask_fpn_reader.yml', ] pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_vd_ssld_v2_pretrained.pdparams weights: output/mask_rcnn_r50_vd_fpn_ssld_2x_coco/model_final diff --git a/configs/ssld/README.md b/configs/ssld/README.md deleted file mode 100644 index 48a4dd7cb..000000000 --- a/configs/ssld/README.md +++ /dev/null @@ -1,33 +0,0 @@ -### Simple semi-supervised label knowledge distillation solution (SSLD) - -## Model Zoo - -| 骨架网络 | 网络类型 | 每张GPU图片个数 | 学习率策略 |推理时间(fps) | Box AP | Mask AP | 下载 | 配置文件 | -| :------------------- | :------------| :-----: | :-----: | :------------: | :-----: | :-----: | :-----------------------------------------------------: | :-----: | -| ResNet50-vd-FPN | Faster | 1 | 1x | ---- | 41.4 | - | [下载链接](https://paddledet.bj.bcebos.com/models/faster_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/ssld/faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | -| ResNet50-vd-FPN | Faster | 1 | 2x | ---- | 42.3 | - | [下载链接](https://paddledet.bj.bcebos.com/models/faster_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/ssld/faster_rcnn_r50_vd_ssld_fpn_2x_coco.yml) | -| ResNet50-vd-FPN | Mask | 1 | 1x | ---- | 42.0 | 38.2 | [下载链接](https://paddledet.bj.bcebos.com/models/mask_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/ssld/mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | -| ResNet50-vd-FPN | Mask | 1 | 2x | ---- | 42.7 | 38.9 | [下载链接](https://paddledet.bj.bcebos.com/models/mask_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/ssld/mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | -| ResNet50-vd-FPN | Cascade Faster | 1 | 1x | ---- | 44.4 | - | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/ssld/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | -| ResNet50-vd-FPN | Cascade Faster | 1 | 2x | ---- | 45.0 | - | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/ssld/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | -| ResNet50-vd-FPN | Cascade Mask | 1 | 1x | ---- | 44.9 | 39.1 | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/ssld/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | -| ResNet50-vd-FPN | Cascade Mask | 1 | 2x | ---- | 45.7 | 39.7 | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/ssld/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | - - -**注意事项:** - -- [SSLD](https://arxiv.org/abs/1811.11168)是一种知识蒸馏方法,我们使用蒸馏后性能更强的backbone预训练模型,进一步提升检测精度,详细方案请参考[知识蒸馏教程](https://github.com/PaddlePaddle/PaddleClas/blob/develop/docs/en/advanced_tutorials/distillation/distillation_en.md) - -![demo image](../../docs/images/ssld_model.png) - -## Citations -``` -@misc{cui2021selfsupervision, - title={Beyond Self-Supervision: A Simple Yet Effective Network Distillation Alternative to Improve Backbones}, - author={Cheng Cui and Ruoyu Guo and Yuning Du and Dongliang He and Fu Li and Zewu Wu and Qiwen Liu and Shilei Wen and Jizhou Huang and Xiaoguang Hu and Dianhai Yu and Errui Ding and Yanjun Ma}, - year={2021}, - eprint={2103.05959}, - archivePrefix={arXiv}, - primaryClass={cs.CV} -} -``` diff --git a/configs/yolov3/README.md b/configs/yolov3/README.md index b27673d9c..a7fba7589 100644 --- a/configs/yolov3/README.md +++ b/configs/yolov3/README.md @@ -22,6 +22,9 @@ | MobileNet-V3 | 608 | 8 | 270e | ---- | 31.4 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_270e_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_270e_coco.yml) | | MobileNet-V3 | 416 | 8 | 270e | ---- | 29.7 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_270e_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_270e_coco.yml) | | MobileNet-V3 | 320 | 8 | 270e | ---- | 26.9 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_270e_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_270e_coco.yml) | +| MobileNet-V1-SSLD | 608 | 8 | 270e | ---- | 31.0 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml) | +| MobileNet-V1-SSLD | 416 | 8 | 270e | ---- | 30.6 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml) | +| MobileNet-V1-SSLD | 320 | 8 | 270e | ---- | 28.4 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml) | ### YOLOv3 on Pasacl VOC @@ -33,6 +36,12 @@ | MobileNet-V3 | 608 | 8 | 270e | - | 79.6 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_270e_voc.yml) | | MobileNet-V3 | 416 | 8 | 270e | - | 78.6 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_270e_voc.yml) | | MobileNet-V3 | 320 | 8 | 270e | - | 76.4 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_270e_voc.yml) | +| MobileNet-V1-SSLD | 608 | 8 | 270e | - | 78.3 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml) | +| MobileNet-V1-SSLD | 416 | 8 | 270e | - | 79.6 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml) | +| MobileNet-V1-SSLD | 320 | 8 | 270e | - | 77.3 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml) | +| MobileNet-V3-SSLD | 608 | 8 | 270e | - | 80.4 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml) | +| MobileNet-V3-SSLD | 416 | 8 | 270e | - | 79.2 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml) | +| MobileNet-V3-SSLD | 320 | 8 | 270e | - | 77.3 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml) | **注意:** YOLOv3均使用8GPU训练,训练270个epoch diff --git a/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml b/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml new file mode 100644 index 000000000..10cf8166d --- /dev/null +++ b/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml @@ -0,0 +1,11 @@ +_BASE_: [ + '../datasets/coco_detection.yml', + '../runtime.yml', + '_base_/optimizer_270e.yml', + '_base_/yolov3_mobilenet_v1.yml', + '_base_/yolov3_reader.yml', +] + +snapshot_epoch: 5 +pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/MobileNetV1_ssld_pretrained.pdparams +weights: output/yolov3_mobilenet_v1_ssld_270e_coco/model_final diff --git a/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml b/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml new file mode 100644 index 000000000..37cce342a --- /dev/null +++ b/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml @@ -0,0 +1,54 @@ +_BASE_: [ + '../datasets/coco_detection.yml', + '../runtime.yml', + '_base_/optimizer_270e.yml', + '_base_/yolov3_mobilenet_v1.yml', + '_base_/yolov3_reader.yml', +] + +snapshot_epoch: 5 +pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/MobileNetV1_ssld_pretrained.pdparams +weights: output/yolov3_mobilenet_v1_ssld_270e_voc/model_final + +TrainReader: + inputs_def: + num_max_boxes: 50 + sample_transforms: + - Decode: {} + - Mixup: {alpha: 1.5, beta: 1.5} + - RandomDistort: {} + - RandomExpand: {fill_value: [123.675, 116.28, 103.53]} + - RandomCrop: {} + - RandomFlip: {} + batch_transforms: + - BatchRandomResize: + target_size: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608] + random_size: True + random_interp: True + keep_ratio: False + - NormalizeBox: {} + - PadBox: {num_max_boxes: 50} + - BboxXYXY2XYWH: {} + - NormalizeImage: {mean: [0.485, 0.456, 0.406], std: [0.229, 0.224, 0.225], is_scale: True} + - Permute: {} + - 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] + num_classes: 20 + batch_size: 8 + shuffle: true + drop_last: true + mixup_epoch: 250 + +LearningRate: + base_lr: 0.001 + schedulers: + - !PiecewiseDecay + gamma: 0.1 + milestones: + - 216 + - 243 + - !LinearWarmup + start_factor: 0. + steps: 1000 diff --git a/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml b/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml new file mode 100644 index 000000000..3099703b8 --- /dev/null +++ b/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml @@ -0,0 +1,54 @@ +_BASE_: [ + '../datasets/coco_detection.yml', + '../runtime.yml', + '_base_/optimizer_270e.yml', + '_base_/yolov3_mobilenet_v3_large.yml', + '_base_/yolov3_reader.yml', +] + +snapshot_epoch: 5 +pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/MobileNetV3_large_x1_0_ssld_pretrained.pdparams +weights: output/yolov3_mobilenet_v3_large_ssld_270e_voc/model_final + +TrainReader: + inputs_def: + num_max_boxes: 50 + sample_transforms: + - Decode: {} + - Mixup: {alpha: 1.5, beta: 1.5} + - RandomDistort: {} + - RandomExpand: {fill_value: [123.675, 116.28, 103.53]} + - RandomCrop: {} + - RandomFlip: {} + batch_transforms: + - BatchRandomResize: + target_size: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608] + random_size: True + random_interp: True + keep_ratio: False + - NormalizeBox: {} + - PadBox: {num_max_boxes: 50} + - BboxXYXY2XYWH: {} + - NormalizeImage: {mean: [0.485, 0.456, 0.406], std: [0.229, 0.224, 0.225], is_scale: True} + - Permute: {} + - 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] + num_classes: 20 + batch_size: 8 + shuffle: true + drop_last: true + mixup_epoch: 250 + +LearningRate: + base_lr: 0.001 + schedulers: + - !PiecewiseDecay + gamma: 0.1 + milestones: + - 216 + - 243 + - !LinearWarmup + start_factor: 0. + steps: 1000 diff --git a/docs/feature_models/SSLD_PRETRAINED_MODEL.md b/docs/feature_models/SSLD_PRETRAINED_MODEL.md new file mode 100644 index 000000000..50c26c5d1 --- /dev/null +++ b/docs/feature_models/SSLD_PRETRAINED_MODEL.md @@ -0,0 +1,54 @@ +简体中文 | [English](SSLD_PRETRAINED_MODEL_en.md) + +### Simple semi-supervised label knowledge distillation solution (SSLD) + +### R-CNN on COCO + +| 骨架网络 | 网络类型 | 每张GPU图片个数 | 学习率策略 |推理时间(fps) | Box AP | Mask AP | 下载 | 配置文件 | +| :------------------- | :------------| :-----: | :-----: | :------------: | :-----: | :-----: | :-----------------------------------------------------: | :-----: | +| ResNet50-vd-SSLDv2-FPN | Faster | 1 | 1x | ---- | 41.4 | - | [下载链接](https://paddledet.bj.bcebos.com/models/faster_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Faster | 1 | 2x | ---- | 42.3 | - | [下载链接](https://paddledet.bj.bcebos.com/models/faster_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/faster_rcnn/faster_rcnn_r50_vd_ssld_fpn_2x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Mask | 1 | 1x | ---- | 42.0 | 38.2 | [下载链接](https://paddledet.bj.bcebos.com/models/mask_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Mask | 1 | 2x | ---- | 42.7 | 38.9 | [下载链接](https://paddledet.bj.bcebos.com/models/mask_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Faster | 1 | 1x | ---- | 44.4 | - | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Faster | 1 | 2x | ---- | 45.0 | - | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Mask | 1 | 1x | ---- | 44.9 | 39.1 | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Mask | 1 | 2x | ---- | 45.7 | 39.7 | [下载链接](https://paddledet.bj.bcebos.com/models/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | + + +### YOLOv3 on COCO + +| 骨架网络 | 输入尺寸 | 每张GPU图片个数 | 学习率策略 |推理时间(fps) | Box AP | 下载 | 配置文件 | +| :----------------- | :-------- | :-----------: | :------: | :---------: | :----: | :----------------------------------------------------: | :-----: | +| MobileNet-V1-SSLD | 608 | 8 | 270e | ---- | 31.0 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml) | +| MobileNet-V1-SSLD | 416 | 8 | 270e | ---- | 30.6 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml) | +| MobileNet-V1-SSLD | 320 | 8 | 270e | ---- | 28.4 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_coco.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml) | + +### YOLOv3 on Pasacl VOC + +| 骨架网络 | 输入尺寸 | 每张GPU图片个数 | 学习率策略 |推理时间(fps) | Box AP | 下载 | 配置文件 | +| :----------------- | :-------- | :-----------: | :------: | :---------: | :----: | :----------------------------------------------------: | :-----: | +| MobileNet-V1-SSLD | 608 | 8 | 270e | - | 78.3 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml) | +| MobileNet-V1-SSLD | 416 | 8 | 270e | - | 79.6 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml) | +| MobileNet-V1-SSLD | 320 | 8 | 270e | - | 77.3 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml) | +| MobileNet-V3-SSLD | 608 | 8 | 270e | - | 80.4 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml) | +| MobileNet-V3-SSLD | 416 | 8 | 270e | - | 79.2 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml) | +| MobileNet-V3-SSLD | 320 | 8 | 270e | - | 77.3 | [下载链接](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_ssld_270e_voc.pdparams) | [配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml) | + +**注意事项:** + +- [SSLD](https://arxiv.org/abs/1811.11168)是一种知识蒸馏方法,我们使用蒸馏后性能更强的backbone预训练模型,进一步提升检测精度,详细方案请参考[知识蒸馏教程](https://github.com/PaddlePaddle/PaddleClas/blob/develop/docs/en/advanced_tutorials/distillation/distillation_en.md) + +![demo image](../images/ssld_model.png) + +## Citations +``` +@misc{cui2021selfsupervision, + title={Beyond Self-Supervision: A Simple Yet Effective Network Distillation Alternative to Improve Backbones}, + author={Cheng Cui and Ruoyu Guo and Yuning Du and Dongliang He and Fu Li and Zewu Wu and Qiwen Liu and Shilei Wen and Jizhou Huang and Xiaoguang Hu and Dianhai Yu and Errui Ding and Yanjun Ma}, + year={2021}, + eprint={2103.05959}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/docs/feature_models/SSLD_PRETRAINED_MODEL_en.md b/docs/feature_models/SSLD_PRETRAINED_MODEL_en.md new file mode 100644 index 000000000..70f52db9c --- /dev/null +++ b/docs/feature_models/SSLD_PRETRAINED_MODEL_en.md @@ -0,0 +1,53 @@ +English | [简体中文](SSLD_PRETRAINED_MODEL.md) + +### Simple semi-supervised label knowledge distillation solution (SSLD) + +### R-CNN on COCO + +| Backbone | Model | Images/GPU | Lr schd | FPS | Box AP | Mask AP | Download | Config | +| :------------------- | :------------| :-----: | :-----: | :------------: | :-----: | :-----: | :-----------------------------------------------------: | :-----: | +| ResNet50-vd-SSLDv2-FPN | Faster | 1 | 1x | ---- | 41.4 | - | [model](https://paddledet.bj.bcebos.com/models/faster_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Faster | 1 | 2x | ---- | 42.3 | - | [model](https://paddledet.bj.bcebos.com/models/faster_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/faster_rcnn/faster_rcnn_r50_vd_ssld_fpn_2x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Mask | 1 | 1x | ---- | 42.0 | 38.2 | [model](https://paddledet.bj.bcebos.com/models/mask_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Mask | 1 | 2x | ---- | 42.7 | 38.9 | [model](https://paddledet.bj.bcebos.com/models/mask_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/mask_rcnn/mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Faster | 1 | 1x | ---- | 44.4 | - | [model](https://paddledet.bj.bcebos.com/models/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Faster | 1 | 2x | ---- | 45.0 | - | [model](https://paddledet.bj.bcebos.com/models/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Mask | 1 | 1x | ---- | 44.9 | 39.1 | [model](https://paddledet.bj.bcebos.com/models/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_1x_coco.yml) | +| ResNet50-vd-SSLDv2-FPN | Cascade Mask | 1 | 2x | ---- | 45.7 | 39.7 | [model](https://paddledet.bj.bcebos.com/models/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/cascade_rcnn/cascade_mask_rcnn_r50_vd_fpn_ssld_2x_coco.yml) | + +### YOLOv3 on COCO + +| Backbone | Input shape | Images/GPU | Lr schd | FPS | Box AP | Download | Config | +| :----------------- | :-------- | :-----------: | :------: | :---------: | :----: | :----------------------------------------------------: | :-----: | +| MobileNet-V1-SSLD | 608 | 8 | 270e | ---- | 31.0 | [model](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_coco.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml) | +| MobileNet-V1-SSLD | 416 | 8 | 270e | ---- | 30.6 | [model](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_coco.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml) | +| MobileNet-V1-SSLD | 320 | 8 | 270e | ---- | 28.4 | [model](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_coco.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_coco.yml) | + +### YOLOv3 on Pasacl VOC + +| Backbone | Input shape | Images/GPU | Lr schd | FPS | Box AP | Download | Config | +| :----------------- | :-------- | :-----------: | :------: | :---------: | :----: | :----------------------------------------------------: | :-----: | +| MobileNet-V1-SSLD | 608 | 8 | 270e | - | 78.3 | [model](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_voc.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml) | +| MobileNet-V1-SSLD | 416 | 8 | 270e | - | 79.6 | [model](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_voc.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml) | +| MobileNet-V1-SSLD | 320 | 8 | 270e | - | 77.3 | [model](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_ssld_270e_voc.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v1_ssld_270e_voc.yml) | +| MobileNet-V3-SSLD | 608 | 8 | 270e | - | 80.4 | [model](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_ssld_270e_voc.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml) | +| MobileNet-V3-SSLD | 416 | 8 | 270e | - | 79.2 | [model](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_ssld_270e_voc.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml) | +| MobileNet-V3-SSLD | 320 | 8 | 270e | - | 77.3 | [model](https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v3_large_ssld_270e_voc.pdparams) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/yolov3/yolov3_mobilenet_v3_large_ssld_270e_voc.yml) | + +**Notes:** + +- [SSLD](https://arxiv.org/abs/1811.11168) is a knowledge distillation method. We use the stronger backbone pretrained model after distillation to further improve the detection accuracy. Please refer to the [knowledge distillation tutorial](https://github.com/PaddlePaddle/PaddleClas/blob/develop/docs/en/advanced_tutorials/distillation/distillation_en.md). + +![demo image](../images/ssld_model.png) + +## Citations +``` +@misc{cui2021selfsupervision, + title={Beyond Self-Supervision: A Simple Yet Effective Network Distillation Alternative to Improve Backbones}, + author={Cheng Cui and Ruoyu Guo and Yuning Du and Dongliang He and Fu Li and Zewu Wu and Qiwen Liu and Shilei Wen and Jizhou Huang and Xiaoguang Hu and Dianhai Yu and Errui Ding and Yanjun Ma}, + year={2021}, + eprint={2103.05959}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/docs/images/ssld_model.png b/docs/images/ssld_model.png index 594165933870931b98ee82fc3fab94d6bf4d3a74..23508712be7e6b6787575a66ca4c65037c9015c8 100644 GIT binary patch literal 81566 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 OfWXt$&t;ucLK6VN&p1c` literal 22184 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