From 192af2162b1d19511dbbf3a61cc9c83fa13fb647 Mon Sep 17 00:00:00 2001 From: zwhus <1062894314zwh@gmail.com> Date: Fri, 17 Feb 2023 14:23:20 +0800 Subject: [PATCH 01/13] efficientdet --- projects/EfficientDet/REMEAD.md | 130 ---- projects/EfficientDet/configs/d0.py | 164 +++++ ...16xb8-crop512-300e_coco.py => d0_90_xy.py} | 8 +- projects/EfficientDet/configs/d0_huber.py | 167 +++++ .../EfficientDet/configs/d0_huber_clip.py | 176 +++++ projects/EfficientDet/configs/d0_xy.py | 168 +++++ projects/EfficientDet/configs/d3.py | 175 +++++ ...k2former_r50_8xb2-lsj-50e_coco-panoptic.py | 241 +++++++ projects/EfficientDet/configs/mask_fpn.py | 240 +++++++ projects/EfficientDet/configs/retinanet.py | 119 ++++ projects/EfficientDet/convert_tf_to_pt.py | 627 ------------------ .../EfficientDet/efficientdet/__init__.py | 6 +- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 868 bytes .../anchor_generator.cpython-37.pyc | Bin 0 -> 2831 bytes .../__pycache__/bifpn.cpython-37.pyc | Bin 0 -> 6544 bytes .../__pycache__/bifpn_no_bn.cpython-37.pyc | Bin 0 -> 9256 bytes .../__pycache__/coco_90class.cpython-37.pyc | Bin 0 -> 6437 bytes .../__pycache__/coco_90metric.cpython-37.pyc | Bin 0 -> 15187 bytes .../__pycache__/efficientdet.cpython-37.pyc | Bin 0 -> 986 bytes .../efficientdet_head.cpython-37.pyc | Bin 0 -> 7803 bytes .../efficientdet_head_huber.cpython-37.pyc | Bin 0 -> 9488 bytes .../__pycache__/final.cpython-37.pyc | Bin 0 -> 6880 bytes .../__pycache__/final_mmcv.cpython-37.pyc | Bin 0 -> 6894 bytes .../__pycache__/final_syncbn.cpython-37.pyc | Bin 0 -> 6676 bytes .../__pycache__/huber_loss.cpython-37.pyc | Bin 0 -> 2963 bytes .../__pycache__/kaming_bifpn.cpython-37.pyc | Bin 0 -> 9925 bytes .../__pycache__/mask2former.cpython-37.pyc | Bin 0 -> 15062 bytes .../__pycache__/new_bifpn.cpython-37.pyc | Bin 0 -> 9894 bytes .../__pycache__/ori_bifpn.cpython-37.pyc | Bin 0 -> 9635 bytes .../ori_bifpn_nodepth.cpython-37.pyc | Bin 0 -> 9921 bytes .../__pycache__/ori_noinit.cpython-37.pyc | Bin 0 -> 10121 bytes .../__pycache__/ori_sync.cpython-37.pyc | Bin 0 -> 10372 bytes .../retina_sepbn_head.cpython-37.pyc | Bin 0 -> 4023 bytes .../trans_max_iou_assigner.cpython-37.pyc | Bin 0 -> 4223 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 4822 bytes .../__pycache__/utils_mmcv.cpython-37.pyc | Bin 0 -> 4114 bytes .../__pycache__/utils_syncbn.cpython-37.pyc | Bin 0 -> 5211 bytes .../yxyx_bbox_coder.cpython-37.pyc | Bin 0 -> 11605 bytes .../efficientdet/anchor_generator.py | 13 - .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 299 bytes .../__pycache__/coco_api.cpython-37.pyc | Bin 0 -> 4839 bytes .../efficientdet/api_wrappers/coco_api.py | 1 - projects/EfficientDet/efficientdet/bifpn.py | 53 +- .../efficientdet/efficientdet_head.py | 98 ++- .../efficientdet/efficientdet_head_huber.py | 261 ++++++++ .../EfficientDet/efficientdet/huber_loss.py | 91 +++ projects/EfficientDet/efficientdet/utils.py | 81 +-- .../efficientdet/yxyx_bbox_coder.py | 19 - 48 files changed, 1955 insertions(+), 883 deletions(-) delete mode 100644 projects/EfficientDet/REMEAD.md create mode 100644 projects/EfficientDet/configs/d0.py rename projects/EfficientDet/configs/{efficientdet_effb0_bifpn_16xb8-crop512-300e_coco.py => d0_90_xy.py} (96%) create mode 100644 projects/EfficientDet/configs/d0_huber.py create mode 100644 projects/EfficientDet/configs/d0_huber_clip.py create mode 100644 projects/EfficientDet/configs/d0_xy.py create mode 100644 projects/EfficientDet/configs/d3.py create mode 100644 projects/EfficientDet/configs/mask2former_r50_8xb2-lsj-50e_coco-panoptic.py create mode 100644 projects/EfficientDet/configs/mask_fpn.py create mode 100644 projects/EfficientDet/configs/retinanet.py delete mode 100644 projects/EfficientDet/convert_tf_to_pt.py create mode 100644 projects/EfficientDet/efficientdet/__pycache__/__init__.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/anchor_generator.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/bifpn.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/bifpn_no_bn.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/coco_90class.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/coco_90metric.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/efficientdet.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/efficientdet_head.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/efficientdet_head_huber.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/final.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/final_mmcv.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/final_syncbn.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/huber_loss.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/kaming_bifpn.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/mask2former.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/new_bifpn.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/ori_bifpn.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/ori_bifpn_nodepth.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/ori_noinit.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/ori_sync.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/retina_sepbn_head.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/trans_max_iou_assigner.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/utils.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/utils_mmcv.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/utils_syncbn.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/__pycache__/yxyx_bbox_coder.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/api_wrappers/__pycache__/__init__.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/api_wrappers/__pycache__/coco_api.cpython-37.pyc create mode 100644 projects/EfficientDet/efficientdet/efficientdet_head_huber.py create mode 100644 projects/EfficientDet/efficientdet/huber_loss.py diff --git a/projects/EfficientDet/REMEAD.md b/projects/EfficientDet/REMEAD.md deleted file mode 100644 index 7bc073f0df5..00000000000 --- a/projects/EfficientDet/REMEAD.md +++ /dev/null @@ -1,130 +0,0 @@ -# EfficientDet - -> [**EfficientDet: Scalable and Efficient Object Detection**](https://arxiv.org/pdf/1911.09070.pdf), -> Mingxing Tan, Ruoming Pang, Quoc V. Le, -> *CVPR 2020* - -## Abstract - -This is an implementation of [EfficientDet](https://github.com/google/automl) based on [MMDetection](https://github.com/open-mmlab/mmdetection/tree/3.x), [MMCV](https://github.com/open-mmlab/mmcv), and [MMEngine](https://github.com/open-mmlab/mmengine). -
-EfficientDet a new family of object detectors, which consistently achieve much better efficiency than prior art across a wide -spectrum of resource constraints. -In particular, with single model and single-scale, EfficientDet-D7 achieves stateof-the-art 55.1 AP on COCO test-dev with 77M parameters and 410B FLOP. -
-BiFPN is a simple yet highly effective weighted bi-directional feature pyramid network, which introduces learnable weights to learn the importance of different input features, while repeatedly applying topdown and bottom-up multi-scale feature fusion. -
-In contrast to other feature pyramid network, such as FPN, FPN + PAN, NAS-FPN, BiFPN achieves the best accuracy with fewer parameters and FLOPs. - -
- -
- -## Usage - -### Model conversion - -Firstly, download EfficientDet [weights](https://github.com/google/automl/tree/master/efficientdet) and unzip, please use the following command - -```bash -tar -xzvf {EFFICIENTDET_WEIGHT} -``` - -Then, install tensorflow, please use the following command - -```bash -pip install tensorflow-gpu==2.6.0 -``` - -Lastly, convert weights from tensorflow to pytorch, please use the following command - -```bash -python projects/EfficientDet/convert_tf_to_pt.py --backbone {BACKBONE_NAME} --tensorflow_weight {TENSORFLOW_WEIGHT_PATH} --out_weight {OUT_PATH} -``` - -### Testing commands - -In MMDetection's root directory, run the following command to test the model: - -```bash -python tools/test.py projects/EfficientDet/configs/efficientdet_effb0_bifpn_8xb16-crop512-300e_coco.py ${CHECKPOINT_PATH} -``` - -## Results - -Based on mmdetection, this project aligns the test accuracy of the [official model](https://github.com/google/automl). -
-If you want to reproduce the test results, you need to convert model weights first, then run the test command. -
-The training accuracy will also be aligned with the official in the future - -| Method | Backbone | Pretrained Model | Training set | Test set | Epoch | Val Box AP | Official AP | -| :------------------------------------------------------------------------------: | :-------------: | :--------------: | :------------: | :----------: | :---: | :--------: | :---------: | -| [efficientdet-d0](./configs/efficientdet_effb0_bifpn_8xb16-crop512-300e_coco.py) | efficientnet-b0 | ImageNet | COCO2017 Train | COCO2017 Val | 300 | 34.4 | 34.3 | - -## Citation - -```BibTeX -@inproceedings{tan2020efficientdet, - title={Efficientdet: Scalable and efficient object detection}, - author={Tan, Mingxing and Pang, Ruoming and Le, Quoc V}, - booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, - pages={10781--10790}, - year={2020} -} -``` - -## Checklist - - - -- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. - - - [x] Finish the code - - - - - [x] Basic docstrings & proper citation - - - - - [x] Test-time correctness - - - - - [x] A full README - - - -- [ ] Milestone 2: Indicates a successful model implementation. - - - [ ] Training-time correctness - - - -- [ ] Milestone 3: Good to be a part of our core package! - - - [ ] Type hints and docstrings - - - - - [ ] Unit tests - - - - - [ ] Code polishing - - - - - [ ] Metafile.yml - - - -- [ ] Move your modules into the core package following the codebase's file hierarchy structure. - - - -- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/projects/EfficientDet/configs/d0.py b/projects/EfficientDet/configs/d0.py new file mode 100644 index 00000000000..d749ab9e885 --- /dev/null +++ b/projects/EfficientDet/configs/d0.py @@ -0,0 +1,164 @@ +_base_ = [ + 'mmdet::_base_/datasets/coco_detection.py', + 'mmdet::_base_/schedules/schedule_1x.py', + 'mmdet::_base_/default_runtime.py' +] +custom_imports = dict( + imports=['projects.EfficientDet.efficientdet'], allow_failed_imports=False) + +image_size = 512 +datasettype = 'Coco90Dataset' +evalute_type = 'Coco90Metric' +batch_augments = [ + dict(type='BatchFixedSizePad', size=(image_size, image_size)) +] +norm_cfg = dict(type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01) +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k_20220119-26434485.pth' # noqa +model = dict( + type='EfficientDet', + data_preprocessor=dict( + type='DetDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_size_divisor=image_size, + batch_augments=batch_augments), + backbone=dict( + type='EfficientNet', + arch='b0', + drop_path_rate=0.2, + out_indices=(3, 4, 5), + frozen_stages=0, + norm_cfg=norm_cfg, + norm_eval=False, + init_cfg=dict( + type='Pretrained', prefix='backbone', checkpoint=checkpoint)), + neck=dict( + type='BiFPN', + num_stages=3, + in_channels=[40, 112, 320], + out_channels=64, + start_level=0, + norm_cfg=norm_cfg), + bbox_head=dict( + type='EfficientDetSepBNHead', + num_classes=90, + num_ins=5, + in_channels=64, + feat_channels=64, + stacked_convs=3, + norm_cfg=norm_cfg, + anchor_generator=dict( + type='YXYXAnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[1.0, 0.5, 2.0], + strides=[8, 16, 32, 64, 128], + center_offset=0.5), + bbox_coder=dict( + type='YXYXDeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='TransMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0, + ignore_iof_thr=-1), + sampler=dict( + type='PseudoSampler'), # Focal loss should use PseudoSampler + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict( + type='soft_nms', + iou_threshold=0.3, + sigma=0.5, + min_score=1e-3, + method='gaussian'), + max_per_img=100)) + +# dataset settings +train_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='RandomResize', + scale=(image_size, image_size), + ratio_range=(0.1, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(image_size, image_size)), + dict(type='RandomFlip', prob=0.5), + dict(type='PackDetInputs') +] +test_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='Resize', scale=(image_size, image_size), keep_ratio=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PackDetInputs', + meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', + 'scale_factor')) +] + +train_dataloader = dict( + batch_size=16, + num_workers=16, + dataset=dict(type=datasettype, pipeline=train_pipeline)) +val_dataloader = dict(dataset=dict(type=datasettype, pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='Coco90Metric') +test_evaluator = val_evaluator + +optim_wrapper = dict( + optimizer=dict(lr=0.16), + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) + +# learning policy +max_epochs = 300 +param_scheduler = [ + dict(type='LinearLR', start_factor=0.1, by_epoch=False, begin=0, end=917), + dict( + type='CosineAnnealingLR', + eta_min=0.0016, + begin=1, + T_max=284, + end=285, + by_epoch=True, + convert_to_iter_based=True) +] +train_cfg = dict(max_epochs=max_epochs, val_interval=1) + +vis_backends = [ + dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend') +] +visualizer = dict( + type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer') + +default_hooks = dict(checkpoint=dict(type='CheckpointHook', interval=15)) +# cudnn_benchmark=True can accelerate fix-size training +env_cfg = dict(cudnn_benchmark=True) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (32 samples per GPU) +auto_scale_lr = dict(base_batch_size=128) diff --git a/projects/EfficientDet/configs/efficientdet_effb0_bifpn_16xb8-crop512-300e_coco.py b/projects/EfficientDet/configs/d0_90_xy.py similarity index 96% rename from projects/EfficientDet/configs/efficientdet_effb0_bifpn_16xb8-crop512-300e_coco.py rename to projects/EfficientDet/configs/d0_90_xy.py index 080b7963b95..1eb198a6a66 100644 --- a/projects/EfficientDet/configs/efficientdet_effb0_bifpn_16xb8-crop512-300e_coco.py +++ b/projects/EfficientDet/configs/d0_90_xy.py @@ -49,14 +49,14 @@ stacked_convs=3, norm_cfg=norm_cfg, anchor_generator=dict( - type='YXYXAnchorGenerator', + type='AnchorGenerator', octave_base_scale=4, scales_per_octave=3, ratios=[1.0, 0.5, 2.0], strides=[8, 16, 32, 64, 128], center_offset=0.5), bbox_coder=dict( - type='YXYXDeltaXYWHBBoxCoder', + type='DeltaXYWHBBoxCoder', target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0]), loss_cls=dict( @@ -69,7 +69,7 @@ # training and testing settings train_cfg=dict( assigner=dict( - type='TransMaxIoUAssigner', + type='MaxIoUAssigner', pos_iou_thr=0.5, neg_iou_thr=0.5, min_pos_iou=0, @@ -125,7 +125,7 @@ val_dataloader = dict(dataset=dict(type=dataset_type, pipeline=test_pipeline)) test_dataloader = val_dataloader -val_evaluator = dict(type=evalute_type) +val_evaluator = dict(type='Coco90Metric') test_evaluator = val_evaluator optim_wrapper = dict( diff --git a/projects/EfficientDet/configs/d0_huber.py b/projects/EfficientDet/configs/d0_huber.py new file mode 100644 index 00000000000..84bf280b437 --- /dev/null +++ b/projects/EfficientDet/configs/d0_huber.py @@ -0,0 +1,167 @@ +_base_ = [ + 'mmdet::_base_/datasets/coco_detection.py', + 'mmdet::_base_/schedules/schedule_1x.py', + 'mmdet::_base_/default_runtime.py' +] +custom_imports = dict( + imports=['projects.EfficientDet.efficientdet'], allow_failed_imports=False) + +image_size = 512 +batch_augments = [ + dict(type='BatchFixedSizePad', size=(image_size, image_size)) +] +norm_cfg = dict(type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01) +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k_20220119-26434485.pth' # noqa +model = dict( + type='EfficientDet', + data_preprocessor=dict( + type='DetDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_size_divisor=image_size, + batch_augments=batch_augments), + backbone=dict( + type='EfficientNet', + arch='b0', + drop_path_rate=0.2, + out_indices=(3, 4, 5), + frozen_stages=0, + conv_cfg=dict(type='Conv2dSamePadding'), + norm_cfg=norm_cfg, + norm_eval=False, + init_cfg=dict( + type='Pretrained', prefix='backbone', checkpoint=checkpoint)), + neck=dict( + type='BiFPN', + num_stages=3, + in_channels=[40, 112, 320], + out_channels=64, + start_level=0, + norm_cfg=norm_cfg), + bbox_head=dict( + type='EfficientDetSepBNHead_Huber', + num_classes=80, + num_ins=5, + in_channels=64, + feat_channels=64, + stacked_convs=3, + norm_cfg=norm_cfg, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[1.0, 0.5, 2.0], + strides=[8, 16, 32, 64, 128], + center_offset=0.5), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=1.5, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='HuberLoss', beta=0.1, loss_weight=50)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0, + ignore_iof_thr=-1), + sampler=dict( + type='PseudoSampler'), # Focal loss should use PseudoSampler + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict( + type='soft_nms', + iou_threshold=0.3, + sigma=0.5, + min_score=1e-3, + method='gaussian'), + max_per_img=100)) + +# dataset settings +train_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='RandomResize', + scale=(image_size, image_size), + ratio_range=(0.1, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(image_size, image_size)), + dict(type='RandomFlip', prob=0.5), + dict(type='PackDetInputs') +] +test_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='Resize', scale=(image_size, image_size), keep_ratio=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PackDetInputs', + meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', + 'scale_factor')) +] + +train_dataloader = dict( + batch_size=16, num_workers=16, dataset=dict(pipeline=train_pipeline)) +val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader + +optim_wrapper = dict( + optimizer=dict(lr=0.16, weight_decay=4e-5), + paramwise_cfg=dict( + norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True)) + +# learning policy +max_epochs = 300 +param_scheduler = [ + dict(type='LinearLR', start_factor=0.1, by_epoch=False, begin=0, end=917), + dict( + type='CosineAnnealingLR', + eta_min=0.0, + begin=1, + T_max=299, + end=300, + by_epoch=True, + convert_to_iter_based=True) +] +train_cfg = dict(max_epochs=max_epochs, val_interval=1) + +vis_backends = [ + dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend') +] +visualizer = dict( + type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer') + +default_hooks = dict(checkpoint=dict(type='CheckpointHook', interval=15)) +custom_hooks = [ + dict( + type='EMAHook', + ema_type='ExpMomentumEMA', + momentum=0.0002, + update_buffers=True, + priority=49) +] +# cudnn_benchmark=True can accelerate fix-size training +env_cfg = dict(cudnn_benchmark=True) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (32 samples per GPU) +auto_scale_lr = dict(base_batch_size=128) diff --git a/projects/EfficientDet/configs/d0_huber_clip.py b/projects/EfficientDet/configs/d0_huber_clip.py new file mode 100644 index 00000000000..688332a1b28 --- /dev/null +++ b/projects/EfficientDet/configs/d0_huber_clip.py @@ -0,0 +1,176 @@ +_base_ = [ + 'mmdet::_base_/datasets/coco_detection.py', + 'mmdet::_base_/schedules/schedule_1x.py', + 'mmdet::_base_/default_runtime.py' +] +custom_imports = dict( + imports=['projects.EfficientDet.efficientdet'], allow_failed_imports=False) + +image_size = 512 +batch_augments = [ + dict(type='BatchFixedSizePad', size=(image_size, image_size)) +] +dataset_type = 'Coco90Dataset' +evalute_type = 'Coco90Metric' +norm_cfg = dict(type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01) +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k_20220119-26434485.pth' # noqa +model = dict( + type='EfficientDet', + data_preprocessor=dict( + type='DetDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_size_divisor=image_size, + batch_augments=batch_augments), + backbone=dict( + type='EfficientNet', + arch='b0', + drop_path_rate=0.2, + out_indices=(3, 4, 5), + frozen_stages=0, + conv_cfg=dict(type='Conv2dSamePadding'), + norm_cfg=norm_cfg, + norm_eval=False, + init_cfg=dict( + type='Pretrained', prefix='backbone', checkpoint=checkpoint)), + neck=dict( + type='BiFPN', + num_stages=3, + in_channels=[40, 112, 320], + out_channels=64, + start_level=0, + norm_cfg=norm_cfg, + use_meswish=False), + bbox_head=dict( + type='EfficientDetSepBNHead_Huber', + num_classes=90, + num_ins=5, + in_channels=64, + feat_channels=64, + stacked_convs=3, + norm_cfg=norm_cfg, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[1.0, 0.5, 2.0], + strides=[8, 16, 32, 64, 128], + center_offset=0.5), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=1.5, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='HuberLoss', beta=0.1, loss_weight=50)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0, + ignore_iof_thr=-1), + sampler=dict( + type='PseudoSampler'), # Focal loss should use PseudoSampler + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict( + type='soft_nms', + iou_threshold=0.3, + sigma=0.5, + min_score=1e-3, + method='gaussian'), + max_per_img=100)) + +# dataset settings +train_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='RandomResize', + scale=(image_size, image_size), + ratio_range=(0.1, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(image_size, image_size)), + dict(type='RandomFlip', prob=0.5), + dict(type='PackDetInputs') +] +test_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='Resize', scale=(image_size, image_size), keep_ratio=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PackDetInputs', + meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', + 'scale_factor')) +] + +train_dataloader = dict( + batch_size=16, + num_workers=16, + dataset=dict(type=dataset_type, pipeline=train_pipeline)) +val_dataloader = dict(dataset=dict(type=dataset_type, pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='Coco90Metric') +test_evaluator = val_evaluator + +optim_wrapper = dict( + optimizer=dict(lr=0.16, weight_decay=4e-5), + paramwise_cfg=dict( + norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True), + clip_grad=dict(max_norm=10, norm_type=2)) + +# learning policy +max_epochs = 300 +param_scheduler = [ + dict(type='LinearLR', start_factor=0.1, by_epoch=False, begin=0, end=917), + dict( + type='CosineAnnealingLR', + eta_min=0.0, + begin=1, + T_max=299, + end=300, + by_epoch=True, + convert_to_iter_based=True) +] +train_cfg = dict(max_epochs=max_epochs, val_interval=1) + +vis_backends = [ + dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend') +] +visualizer = dict( + type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer') + +default_hooks = dict(checkpoint=dict(type='CheckpointHook', interval=15)) +custom_hooks = [ + dict( + type='EMAHook', + ema_type='ExpMomentumEMA', + momentum=0.0002, + update_buffers=True, + priority=49) +] +# cudnn_benchmark=True can accelerate fix-size training +env_cfg = dict(cudnn_benchmark=True) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (32 samples per GPU) +auto_scale_lr = dict(base_batch_size=128) diff --git a/projects/EfficientDet/configs/d0_xy.py b/projects/EfficientDet/configs/d0_xy.py new file mode 100644 index 00000000000..c2afcd1e287 --- /dev/null +++ b/projects/EfficientDet/configs/d0_xy.py @@ -0,0 +1,168 @@ +_base_ = [ + 'mmdet::_base_/datasets/coco_detection.py', + 'mmdet::_base_/schedules/schedule_1x.py', + 'mmdet::_base_/default_runtime.py' +] +custom_imports = dict( + imports=['projects.EfficientDet.efficientdet'], allow_failed_imports=False) + +image_size = 512 +batch_augments = [ + dict(type='BatchFixedSizePad', size=(image_size, image_size)) +] +norm_cfg = dict(type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01) +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k_20220119-26434485.pth' # noqa +model = dict( + type='EfficientDet', + data_preprocessor=dict( + type='DetDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_size_divisor=image_size, + batch_augments=batch_augments), + backbone=dict( + type='EfficientNet', + arch='b0', + drop_path_rate=0.2, + out_indices=(3, 4, 5), + frozen_stages=0, + conv_cfg=dict(type='Conv2dSamePadding'), + norm_cfg=norm_cfg, + norm_eval=False, + init_cfg=dict( + type='Pretrained', prefix='backbone', checkpoint=checkpoint)), + neck=dict( + type='BiFPN', + num_stages=3, + in_channels=[40, 112, 320], + out_channels=64, + start_level=0, + norm_cfg=norm_cfg), + bbox_head=dict( + type='EfficientDetSepBNHead', + num_classes=80, + num_ins=5, + in_channels=64, + feat_channels=64, + stacked_convs=3, + norm_cfg=norm_cfg, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[1.0, 0.5, 2.0], + strides=[8, 16, 32, 64, 128], + center_offset=0.5), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0, + ignore_iof_thr=-1), + sampler=dict( + type='PseudoSampler'), # Focal loss should use PseudoSampler + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict( + type='soft_nms', + iou_threshold=0.3, + sigma=0.5, + min_score=1e-3, + method='gaussian'), + max_per_img=100)) + +# dataset settings +train_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='RandomResize', + scale=(image_size, image_size), + ratio_range=(0.1, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(image_size, image_size)), + dict(type='RandomFlip', prob=0.5), + dict(type='PackDetInputs') +] +test_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='Resize', scale=(image_size, image_size), keep_ratio=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PackDetInputs', + meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', + 'scale_factor')) +] + +train_dataloader = dict( + batch_size=16, num_workers=16, dataset=dict(pipeline=train_pipeline)) +val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader + +optim_wrapper = dict( + optimizer=dict(lr=0.16, weight_decay=4e-5), + paramwise_cfg=dict( + norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True), + clip_grad=dict(max_norm=10, norm_type=2)) + +# learning policy +max_epochs = 300 +param_scheduler = [ + dict(type='LinearLR', start_factor=0.1, by_epoch=False, begin=0, end=917), + dict( + type='CosineAnnealingLR', + eta_min=0.0, + begin=1, + T_max=299, + end=300, + by_epoch=True, + convert_to_iter_based=True) +] +train_cfg = dict(max_epochs=max_epochs, val_interval=1) + +vis_backends = [ + dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend') +] +visualizer = dict( + type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer') + +default_hooks = dict(checkpoint=dict(type='CheckpointHook', interval=15)) +custom_hooks = [ + dict( + type='EMAHook', + ema_type='ExpMomentumEMA', + momentum=0.0002, + update_buffers=True, + priority=49) +] +# cudnn_benchmark=True can accelerate fix-size training +env_cfg = dict(cudnn_benchmark=True) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (32 samples per GPU) +auto_scale_lr = dict(base_batch_size=128) diff --git a/projects/EfficientDet/configs/d3.py b/projects/EfficientDet/configs/d3.py new file mode 100644 index 00000000000..e0c59956317 --- /dev/null +++ b/projects/EfficientDet/configs/d3.py @@ -0,0 +1,175 @@ +_base_ = [ + 'mmdet::_base_/datasets/coco_detection.py', + 'mmdet::_base_/schedules/schedule_1x.py', + 'mmdet::_base_/default_runtime.py' +] +custom_imports = dict( + imports=['projects.EfficientDet.efficientdet'], allow_failed_imports=False) + +image_size = 896 +batch_augments = [ + dict(type='BatchFixedSizePad', size=(image_size, image_size)) +] +dataset_type = 'Coco90Dataset' +evalute_type = 'Coco90Metric' +norm_cfg = dict(type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01) +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32-aa-advprop_in1k_20220119-53b41118.pth' # noqa +model = dict( + type='EfficientDet', + data_preprocessor=dict( + type='DetDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_size_divisor=image_size, + batch_augments=batch_augments), + backbone=dict( + type='EfficientNet', + arch='b3', + drop_path_rate=0.3, + out_indices=(3, 4, 5), + frozen_stages=0, + conv_cfg=dict(type='Conv2dSamePadding'), + norm_cfg=norm_cfg, + norm_eval=False, + init_cfg=dict( + type='Pretrained', prefix='backbone', checkpoint=checkpoint)), + neck=dict( + type='BiFPN', + num_stages=6, + in_channels=[48, 136, 384], + out_channels=160, + start_level=0, + norm_cfg=norm_cfg), + bbox_head=dict( + type='EfficientDetSepBNHead_Huber', + num_classes=90, + num_ins=5, + in_channels=160, + feat_channels=160, + stacked_convs=4, + norm_cfg=norm_cfg, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[1.0, 0.5, 2.0], + strides=[8, 16, 32, 64, 128], + center_offset=0.5), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=1.5, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='HuberLoss', beta=0.1, loss_weight=50)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0, + ignore_iof_thr=-1), + sampler=dict( + type='PseudoSampler'), # Focal loss should use PseudoSampler + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict( + type='soft_nms', + iou_threshold=0.3, + sigma=0.5, + min_score=1e-3, + method='gaussian'), + max_per_img=100)) + +# dataset settings +train_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='RandomResize', + scale=(image_size, image_size), + ratio_range=(0.1, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(image_size, image_size)), + dict(type='RandomFlip', prob=0.5), + dict(type='PackDetInputs') +] +test_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='Resize', scale=(image_size, image_size), keep_ratio=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PackDetInputs', + meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', + 'scale_factor')) +] + +train_dataloader = dict( + batch_size=16, + num_workers=16, + dataset=dict(type=dataset_type, pipeline=train_pipeline)) +val_dataloader = dict(dataset=dict(type=dataset_type, pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='Coco90Metric') +test_evaluator = val_evaluator + +optim_wrapper = dict( + optimizer=dict(lr=0.16, weight_decay=4e-5), + paramwise_cfg=dict( + norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True), + clip_grad=dict(max_norm=10, norm_type=2)) + +# learning policy +max_epochs = 300 +param_scheduler = [ + dict(type='LinearLR', start_factor=0.1, by_epoch=False, begin=0, end=917), + dict( + type='CosineAnnealingLR', + eta_min=0.0, + begin=1, + T_max=299, + end=300, + by_epoch=True, + convert_to_iter_based=True) +] +train_cfg = dict(max_epochs=max_epochs, val_interval=1) + +vis_backends = [ + dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend') +] +visualizer = dict( + type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer') + +default_hooks = dict(checkpoint=dict(type='CheckpointHook', interval=15)) +custom_hooks = [ + dict( + type='EMAHook', + ema_type='ExpMomentumEMA', + momentum=0.0002, + update_buffers=True, + priority=49) +] +# cudnn_benchmark=True can accelerate fix-size training +env_cfg = dict(cudnn_benchmark=True) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (32 samples per GPU) +auto_scale_lr = dict(base_batch_size=128) diff --git a/projects/EfficientDet/configs/mask2former_r50_8xb2-lsj-50e_coco-panoptic.py b/projects/EfficientDet/configs/mask2former_r50_8xb2-lsj-50e_coco-panoptic.py new file mode 100644 index 00000000000..639b2181ba3 --- /dev/null +++ b/projects/EfficientDet/configs/mask2former_r50_8xb2-lsj-50e_coco-panoptic.py @@ -0,0 +1,241 @@ +_base_ = [ + 'mmdet::_base_/datasets/coco_panoptic.py', + 'mmdet::_base_/default_runtime.py' +] +custom_imports = dict( + imports=['projects.EfficientDet.EfficientDet'], allow_failed_imports=False) + +image_size = (1024, 1024) +batch_augments = [ + dict( + type='BatchFixedSizePad', + size=image_size, + img_pad_value=0, + pad_mask=True, + mask_pad_value=0, + pad_seg=True, + seg_pad_value=255) +] +data_preprocessor = dict( + type='DetDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_size_divisor=32, + pad_mask=True, + mask_pad_value=0, + pad_seg=True, + seg_pad_value=255, + batch_augments=batch_augments) + +num_things_classes = 80 +num_stuff_classes = 53 +num_classes = num_things_classes + num_stuff_classes +model = dict( + type='Mask2Former', + data_preprocessor=data_preprocessor, + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=-1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + panoptic_head=dict( + type='Mask2FormerHead', + in_channels=[256, 512, 1024, 2048], # pass to pixel_decoder inside + strides=[4, 8, 16, 32], + feat_channels=256, + out_channels=256, + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + num_queries=100, + num_transformer_feat_level=3, + pixel_decoder=dict( + type='PixelBiFPNDecoder', + stages=6, + num_outs=3, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU')), + enforce_decoder_input_project=False, + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True), + transformer_decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=9, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + attn_drop=0.0, + proj_drop=0.0, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.0, + dropout_layer=None, + add_identity=True), + feedforward_channels=2048, + operation_order=('cross_attn', 'norm', 'self_attn', 'norm', + 'ffn', 'norm')), + init_cfg=None), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=2.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + reduction='mean', + loss_weight=5.0), + loss_dice=dict( + type='DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=5.0)), + panoptic_fusion_head=dict( + type='MaskFormerFusionHead', + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + loss_panoptic=None, + init_cfg=None), + train_cfg=dict( + num_points=12544, + oversample_ratio=3.0, + importance_sample_ratio=0.75, + assigner=dict( + type='HungarianAssigner', + match_costs=[ + dict(type='ClassificationCost', weight=2.0), + dict( + type='CrossEntropyLossCost', weight=5.0, use_sigmoid=True), + dict(type='DiceCost', weight=5.0, pred_act=True, eps=1.0) + ]), + sampler=dict(type='MaskPseudoSampler')), + test_cfg=dict( + panoptic_on=True, + # For now, the dataset does not support + # evaluating semantic segmentation metric. + semantic_on=False, + instance_on=True, + # max_per_image is for instance segmentation. + max_per_image=100, + iou_thr=0.8, + # In Mask2Former's panoptic postprocessing, + # it will filter mask area where score is less than 0.5 . + filter_low_score=True), + init_cfg=None) + +# dataset settings +data_root = 'data/coco/' +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='LoadPanopticAnnotations', + with_bbox=True, + with_mask=True, + with_seg=True), + dict(type='RandomFlip', prob=0.5), + # large scale jittering + dict( + type='RandomResize', + scale=image_size, + ratio_range=(0.1, 2.0), + keep_ratio=True), + dict( + type='RandomCrop', + crop_size=image_size, + crop_type='absolute', + recompute_bbox=True, + allow_negative_crop=True), + dict(type='PackDetInputs') +] + +train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) + +val_evaluator = [ + dict( + type='CocoPanopticMetric', + ann_file=data_root + 'annotations/panoptic_val2017.json', + seg_prefix=data_root + 'annotations/panoptic_val2017/', + ), + dict( + type='CocoMetric', + ann_file=data_root + 'annotations/instances_val2017.json', + metric=['bbox', 'segm'], + ) +] +test_evaluator = val_evaluator + +# optimizer +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict( + type='AdamW', + lr=0.0001, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999)), + paramwise_cfg=dict( + custom_keys={ + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi, + }, + norm_decay_mult=0.0), + clip_grad=dict(max_norm=0.01, norm_type=2)) + +# learning policy +max_iters = 368750 +param_scheduler = dict( + type='MultiStepLR', + begin=0, + end=max_iters, + by_epoch=False, + milestones=[327778, 355092], + gamma=0.1) + +# Before 365001th iteration, we do evaluation every 5000 iterations. +# After 365000th iteration, we do evaluation every 368750 iterations, +# which means that we do evaluation at the end of training. +interval = 5000 +dynamic_intervals = [(max_iters // interval * interval + 1, max_iters)] +train_cfg = dict( + type='IterBasedTrainLoop', + max_iters=max_iters, + val_interval=interval, + dynamic_intervals=dynamic_intervals) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') + +default_hooks = dict( + checkpoint=dict( + type='CheckpointHook', + by_epoch=False, + save_last=True, + max_keep_ckpts=3, + interval=interval)) +log_processor = dict(type='LogProcessor', window_size=50, by_epoch=False) + +# Default setting for scaling LR automatically +# - `enable` means enable scaling LR automatically +# or not by default. +# - `base_batch_size` = (8 GPUs) x (2 samples per GPU). +auto_scale_lr = dict(enable=False, base_batch_size=16) diff --git a/projects/EfficientDet/configs/mask_fpn.py b/projects/EfficientDet/configs/mask_fpn.py new file mode 100644 index 00000000000..8358309fa06 --- /dev/null +++ b/projects/EfficientDet/configs/mask_fpn.py @@ -0,0 +1,240 @@ +_base_ = [ + 'mmdet::_base_/datasets/coco_panoptic.py', + 'mmdet::_base_/default_runtime.py' +] +custom_imports = dict( + imports=['projects.EfficientDet.EfficientDet'], allow_failed_imports=False) + +image_size = (1024, 1024) +batch_augments = [ + dict( + type='BatchFixedSizePad', + size=image_size, + img_pad_value=0, + pad_mask=True, + mask_pad_value=0, + pad_seg=True, + seg_pad_value=255) +] +data_preprocessor = dict( + type='DetDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_size_divisor=32, + pad_mask=True, + mask_pad_value=0, + pad_seg=True, + seg_pad_value=255, + batch_augments=batch_augments) + +num_things_classes = 80 +num_stuff_classes = 53 +num_classes = num_things_classes + num_stuff_classes +model = dict( + type='Mask2Former', + data_preprocessor=data_preprocessor, + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=-1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + panoptic_head=dict( + type='Mask2FormerHead', + in_channels=[256, 512, 1024, 2048], # pass to pixel_decoder inside + strides=[4, 8, 16, 32], + feat_channels=256, + out_channels=256, + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + num_queries=100, + num_transformer_feat_level=3, + pixel_decoder=dict( + type='PixelFPNDecoder', + num_outs=3, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU')), + enforce_decoder_input_project=False, + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True), + transformer_decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=9, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + attn_drop=0.0, + proj_drop=0.0, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.0, + dropout_layer=None, + add_identity=True), + feedforward_channels=2048, + operation_order=('cross_attn', 'norm', 'self_attn', 'norm', + 'ffn', 'norm')), + init_cfg=None), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=2.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + reduction='mean', + loss_weight=5.0), + loss_dice=dict( + type='DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=5.0)), + panoptic_fusion_head=dict( + type='MaskFormerFusionHead', + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + loss_panoptic=None, + init_cfg=None), + train_cfg=dict( + num_points=12544, + oversample_ratio=3.0, + importance_sample_ratio=0.75, + assigner=dict( + type='HungarianAssigner', + match_costs=[ + dict(type='ClassificationCost', weight=2.0), + dict( + type='CrossEntropyLossCost', weight=5.0, use_sigmoid=True), + dict(type='DiceCost', weight=5.0, pred_act=True, eps=1.0) + ]), + sampler=dict(type='MaskPseudoSampler')), + test_cfg=dict( + panoptic_on=True, + # For now, the dataset does not support + # evaluating semantic segmentation metric. + semantic_on=False, + instance_on=True, + # max_per_image is for instance segmentation. + max_per_image=100, + iou_thr=0.8, + # In Mask2Former's panoptic postprocessing, + # it will filter mask area where score is less than 0.5 . + filter_low_score=True), + init_cfg=None) + +# dataset settings +data_root = 'data/coco/' +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='LoadPanopticAnnotations', + with_bbox=True, + with_mask=True, + with_seg=True), + dict(type='RandomFlip', prob=0.5), + # large scale jittering + dict( + type='RandomResize', + scale=image_size, + ratio_range=(0.1, 2.0), + keep_ratio=True), + dict( + type='RandomCrop', + crop_size=image_size, + crop_type='absolute', + recompute_bbox=True, + allow_negative_crop=True), + dict(type='PackDetInputs') +] + +train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) + +val_evaluator = [ + dict( + type='CocoPanopticMetric', + ann_file=data_root + 'annotations/panoptic_val2017.json', + seg_prefix=data_root + 'annotations/panoptic_val2017/', + ), + dict( + type='CocoMetric', + ann_file=data_root + 'annotations/instances_val2017.json', + metric=['bbox', 'segm'], + ) +] +test_evaluator = val_evaluator + +# optimizer +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict( + type='AdamW', + lr=0.0001, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999)), + paramwise_cfg=dict( + custom_keys={ + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi, + }, + norm_decay_mult=0.0), + clip_grad=dict(max_norm=0.01, norm_type=2)) + +# learning policy +max_iters = 368750 +param_scheduler = dict( + type='MultiStepLR', + begin=0, + end=max_iters, + by_epoch=False, + milestones=[327778, 355092], + gamma=0.1) + +# Before 365001th iteration, we do evaluation every 5000 iterations. +# After 365000th iteration, we do evaluation every 368750 iterations, +# which means that we do evaluation at the end of training. +interval = 5000 +dynamic_intervals = [(max_iters // interval * interval + 1, max_iters)] +train_cfg = dict( + type='IterBasedTrainLoop', + max_iters=max_iters, + val_interval=interval, + dynamic_intervals=dynamic_intervals) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') + +default_hooks = dict( + checkpoint=dict( + type='CheckpointHook', + by_epoch=False, + save_last=True, + max_keep_ckpts=3, + interval=interval)) +log_processor = dict(type='LogProcessor', window_size=50, by_epoch=False) + +# Default setting for scaling LR automatically +# - `enable` means enable scaling LR automatically +# or not by default. +# - `base_batch_size` = (8 GPUs) x (2 samples per GPU). +auto_scale_lr = dict(enable=False, base_batch_size=16) diff --git a/projects/EfficientDet/configs/retinanet.py b/projects/EfficientDet/configs/retinanet.py new file mode 100644 index 00000000000..f4b1102e50e --- /dev/null +++ b/projects/EfficientDet/configs/retinanet.py @@ -0,0 +1,119 @@ +_base_ = [ + 'mmdet::_base_/models/retinanet_r50_fpn.py', + 'mmdet::_base_/datasets/coco_detection.py', + 'mmdet::_base_/schedules/schedule_1x.py', + 'mmdet::_base_/default_runtime.py' +] +custom_imports = dict( + imports=['projects.EfficientDet.efficientdet'], allow_failed_imports=False) + +image_size = 896 +batch_augments = [ + dict(type='BatchFixedSizePad', size=(image_size, image_size)) +] +norm_cfg = dict(type='BN', requires_grad=True) + +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32-aa_in1k_20220119-5b4887a0.pth' # noqa +model = dict( + data_preprocessor=dict( + type='DetDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_size_divisor=128, + batch_augments=batch_augments), + backbone=dict( + _delete_=True, + type='EfficientNet', + arch='b3', + drop_path_rate=0.2, + out_indices=(3, 4, 5), + frozen_stages=0, + # conv_cfg=dict(type='Conv2dSamePadding'), + norm_cfg=dict( + type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01), + norm_eval=False, + init_cfg=dict( + type='Pretrained', prefix='backbone', checkpoint=checkpoint)), + neck=dict( + _delete_=True, + type='BiFPN', + num_stages=6, + in_channels=[48, 136, 384], + out_channels=160, + start_level=0, + norm_cfg=norm_cfg), + bbox_head=dict( + type='RetinaSepBNHead', + in_channels=160, + feat_channels=160, + num_ins=5, + norm_cfg=norm_cfg), + # training and testing settings + train_cfg=dict(assigner=dict(neg_iou_thr=0.5))) + +# dataset settings +train_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='RandomResize', + scale=(image_size, image_size), + ratio_range=(0.8, 1.2), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(image_size, image_size)), + dict(type='RandomFlip', prob=0.5), + dict(type='PackDetInputs') +] +test_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args={{_base_.file_client_args}}), + dict(type='Resize', scale=(image_size, image_size), keep_ratio=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PackDetInputs', + meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', + 'scale_factor')) +] + +train_dataloader = dict( + batch_size=16, num_workers=16, dataset=dict(pipeline=train_pipeline)) +val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader + +optim_wrapper = dict( + optimizer=dict(lr=0.16), + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) + +# learning policy +max_epochs = 12 +param_scheduler = [ + dict(type='LinearLR', start_factor=0.1, by_epoch=False, begin=0, end=300), + dict( + type='MultiStepLR', + begin=0, + end=12, + by_epoch=True, + milestones=[8, 11], + gamma=0.1) +] +train_cfg = dict(max_epochs=max_epochs) + +vis_backends = [ + dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend') +] +visualizer = dict( + type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer') + +default_hooks = dict(checkpoint=dict(type='CheckpointHook')) +# cudnn_benchmark=True can accelerate fix-size training +env_cfg = dict(cudnn_benchmark=True) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x ( samples per GPU) +auto_scale_lr = dict(base_batch_size=128) diff --git a/projects/EfficientDet/convert_tf_to_pt.py b/projects/EfficientDet/convert_tf_to_pt.py deleted file mode 100644 index 6132a6ba241..00000000000 --- a/projects/EfficientDet/convert_tf_to_pt.py +++ /dev/null @@ -1,627 +0,0 @@ -import argparse - -import numpy as np -import torch -from tensorflow.python.training import py_checkpoint_reader - -torch.set_printoptions(precision=20) - - -def tf2pth(v): - if v.ndim == 4: - return np.ascontiguousarray(v.transpose(3, 2, 0, 1)) - elif v.ndim == 2: - return np.ascontiguousarray(v.transpose()) - return v - - -def convert_key(model_name, bifpn_repeats, weights): - - p6_w1 = [ - torch.tensor([-1e4, -1e4], dtype=torch.float64) - for _ in range(bifpn_repeats) - ] - p5_w1 = [ - torch.tensor([-1e4, -1e4], dtype=torch.float64) - for _ in range(bifpn_repeats) - ] - p4_w1 = [ - torch.tensor([-1e4, -1e4], dtype=torch.float64) - for _ in range(bifpn_repeats) - ] - p3_w1 = [ - torch.tensor([-1e4, -1e4], dtype=torch.float64) - for _ in range(bifpn_repeats) - ] - p4_w2 = [ - torch.tensor([-1e4, -1e4, -1e4], dtype=torch.float64) - for _ in range(bifpn_repeats) - ] - p5_w2 = [ - torch.tensor([-1e4, -1e4, -1e4], dtype=torch.float64) - for _ in range(bifpn_repeats) - ] - p6_w2 = [ - torch.tensor([-1e4, -1e4, -1e4], dtype=torch.float64) - for _ in range(bifpn_repeats) - ] - p7_w2 = [ - torch.tensor([-1e4, -1e4], dtype=torch.float64) - for _ in range(bifpn_repeats) - ] - idx2key = { - 0: '1.0', - 1: '2.0', - 2: '2.1', - 3: '3.0', - 4: '3.1', - 5: '4.0', - 6: '4.1', - 7: '4.2', - 8: '4.3', - 9: '4.4', - 10: '4.5', - 11: '5.0', - 12: '5.1', - 13: '5.2', - 14: '5.3', - 15: '5.4' - } - m = dict() - for k, v in weights.items(): - - if 'Exponential' in k or 'global_step' in k: - continue - - seg = k.split('/') - if len(seg) == 1: - continue - if seg[2] == 'depthwise_conv2d': - v = v.transpose(1, 0) - - if seg[0] == model_name: - if seg[1] == 'stem': - prefix = 'backbone.layers.0' - mapping = { - 'conv2d/kernel': 'conv.weight', - 'tpu_batch_normalization/beta': 'bn.bias', - 'tpu_batch_normalization/gamma': 'bn.weight', - 'tpu_batch_normalization/moving_mean': 'bn.running_mean', - 'tpu_batch_normalization/moving_variance': - 'bn.running_var', - } - suffix = mapping['/'.join(seg[2:])] - m[prefix + '.' + suffix] = v - - elif seg[1].startswith('blocks_'): - idx = int(seg[1][7:]) - prefix = '.'.join(['backbone', 'layers', idx2key[idx]]) - base_mapping = { - 'depthwise_conv2d/depthwise_kernel': - 'depthwise_conv.conv.weight', - 'se/conv2d/kernel': 'se.conv1.conv.weight', - 'se/conv2d/bias': 'se.conv1.conv.bias', - 'se/conv2d_1/kernel': 'se.conv2.conv.weight', - 'se/conv2d_1/bias': 'se.conv2.conv.bias' - } - if idx == 0: - mapping = { - 'conv2d/kernel': - 'linear_conv.conv.weight', - 'tpu_batch_normalization/beta': - 'depthwise_conv.bn.bias', - 'tpu_batch_normalization/gamma': - 'depthwise_conv.bn.weight', - 'tpu_batch_normalization/moving_mean': - 'depthwise_conv.bn.running_mean', - 'tpu_batch_normalization/moving_variance': - 'depthwise_conv.bn.running_var', - 'tpu_batch_normalization_1/beta': - 'linear_conv.bn.bias', - 'tpu_batch_normalization_1/gamma': - 'linear_conv.bn.weight', - 'tpu_batch_normalization_1/moving_mean': - 'linear_conv.bn.running_mean', - 'tpu_batch_normalization_1/moving_variance': - 'linear_conv.bn.running_var', - } - else: - mapping = { - 'depthwise_conv2d/depthwise_kernel': - 'depthwise_conv.conv.weight', - 'conv2d/kernel': - 'expand_conv.conv.weight', - 'conv2d_1/kernel': - 'linear_conv.conv.weight', - 'tpu_batch_normalization/beta': - 'expand_conv.bn.bias', - 'tpu_batch_normalization/gamma': - 'expand_conv.bn.weight', - 'tpu_batch_normalization/moving_mean': - 'expand_conv.bn.running_mean', - 'tpu_batch_normalization/moving_variance': - 'expand_conv.bn.running_var', - 'tpu_batch_normalization_1/beta': - 'depthwise_conv.bn.bias', - 'tpu_batch_normalization_1/gamma': - 'depthwise_conv.bn.weight', - 'tpu_batch_normalization_1/moving_mean': - 'depthwise_conv.bn.running_mean', - 'tpu_batch_normalization_1/moving_variance': - 'depthwise_conv.bn.running_var', - 'tpu_batch_normalization_2/beta': - 'linear_conv.bn.bias', - 'tpu_batch_normalization_2/gamma': - 'linear_conv.bn.weight', - 'tpu_batch_normalization_2/moving_mean': - 'linear_conv.bn.running_mean', - 'tpu_batch_normalization_2/moving_variance': - 'linear_conv.bn.running_var', - } - mapping.update(base_mapping) - suffix = mapping['/'.join(seg[2:])] - m[prefix + '.' + suffix] = v - elif seg[0] == 'resample_p6': - prefix = 'neck.bifpn.0.p5_to_p6.0' - mapping = { - 'conv2d/kernel': 'down_conv.conv.weight', - 'conv2d/bias': 'down_conv.conv.bias', - 'bn/beta': 'bn.bias', - 'bn/gamma': 'bn.weight', - 'bn/moving_mean': 'bn.running_mean', - 'bn/moving_variance': 'bn.running_var', - } - suffix = mapping['/'.join(seg[1:])] - m[prefix + '.' + suffix] = v - elif seg[0] == 'fpn_cells': - fpn_idx = int(seg[1][5:]) - prefix = '.'.join(['neck', 'bifpn', str(fpn_idx)]) - fnode_id = int(seg[2][5]) - if fnode_id == 0: - mapping = { - 'op_after_combine5/conv/depthwise_kernel': - 'conv6_up.depthwise_conv.conv.weight', - 'op_after_combine5/conv/pointwise_kernel': - 'conv6_up.pointwise_conv.conv.weight', - 'op_after_combine5/conv/bias': - 'conv6_up.pointwise_conv.conv.bias', - 'op_after_combine5/bn/beta': - 'conv6_up.bn.bias', - 'op_after_combine5/bn/gamma': - 'conv6_up.bn.weight', - 'op_after_combine5/bn/moving_mean': - 'conv6_up.bn.running_mean', - 'op_after_combine5/bn/moving_variance': - 'conv6_up.bn.running_var', - } - if seg[3] != 'WSM' and seg[3] != 'WSM_1': - suffix = mapping['/'.join(seg[3:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - elif seg[3] == 'WSM': - p6_w1[fpn_idx][0] = v - elif seg[3] == 'WSM_1': - p6_w1[fpn_idx][1] = v - if torch.min(p6_w1[fpn_idx]) > -1e4: - m[prefix + '.p6_w1'] = p6_w1[fpn_idx] - elif fnode_id == 1: - base_mapping = { - 'op_after_combine6/conv/depthwise_kernel': - 'conv5_up.depthwise_conv.conv.weight', - 'op_after_combine6/conv/pointwise_kernel': - 'conv5_up.pointwise_conv.conv.weight', - 'op_after_combine6/conv/bias': - 'conv5_up.pointwise_conv.conv.bias', - 'op_after_combine6/bn/beta': - 'conv5_up.bn.bias', - 'op_after_combine6/bn/gamma': - 'conv5_up.bn.weight', - 'op_after_combine6/bn/moving_mean': - 'conv5_up.bn.running_mean', - 'op_after_combine6/bn/moving_variance': - 'conv5_up.bn.running_var', - } - if fpn_idx == 0: - mapping = { - 'resample_0_2_6/conv2d/kernel': - 'p5_down_channel.down_conv.conv.weight', - 'resample_0_2_6/conv2d/bias': - 'p5_down_channel.down_conv.conv.bias', - 'resample_0_2_6/bn/beta': - 'p5_down_channel.bn.bias', - 'resample_0_2_6/bn/gamma': - 'p5_down_channel.bn.weight', - 'resample_0_2_6/bn/moving_mean': - 'p5_down_channel.bn.running_mean', - 'resample_0_2_6/bn/moving_variance': - 'p5_down_channel.bn.running_var', - } - base_mapping.update(mapping) - if seg[3] != 'WSM' and seg[3] != 'WSM_1': - suffix = base_mapping['/'.join(seg[3:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - elif seg[3] == 'WSM': - p5_w1[fpn_idx][0] = v - elif seg[3] == 'WSM_1': - p5_w1[fpn_idx][1] = v - if torch.min(p5_w1[fpn_idx]) > -1e4: - m[prefix + '.p5_w1'] = p5_w1[fpn_idx] - elif fnode_id == 2: - base_mapping = { - 'op_after_combine7/conv/depthwise_kernel': - 'conv4_up.depthwise_conv.conv.weight', - 'op_after_combine7/conv/pointwise_kernel': - 'conv4_up.pointwise_conv.conv.weight', - 'op_after_combine7/conv/bias': - 'conv4_up.pointwise_conv.conv.bias', - 'op_after_combine7/bn/beta': - 'conv4_up.bn.bias', - 'op_after_combine7/bn/gamma': - 'conv4_up.bn.weight', - 'op_after_combine7/bn/moving_mean': - 'conv4_up.bn.running_mean', - 'op_after_combine7/bn/moving_variance': - 'conv4_up.bn.running_var', - } - if fpn_idx == 0: - mapping = { - 'resample_0_1_7/conv2d/kernel': - 'p4_down_channel.down_conv.conv.weight', - 'resample_0_1_7/conv2d/bias': - 'p4_down_channel.down_conv.conv.bias', - 'resample_0_1_7/bn/beta': - 'p4_down_channel.bn.bias', - 'resample_0_1_7/bn/gamma': - 'p4_down_channel.bn.weight', - 'resample_0_1_7/bn/moving_mean': - 'p4_down_channel.bn.running_mean', - 'resample_0_1_7/bn/moving_variance': - 'p4_down_channel.bn.running_var', - } - base_mapping.update(mapping) - if seg[3] != 'WSM' and seg[3] != 'WSM_1': - suffix = base_mapping['/'.join(seg[3:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - elif seg[3] == 'WSM': - p4_w1[fpn_idx][0] = v - elif seg[3] == 'WSM_1': - p4_w1[fpn_idx][1] = v - if torch.min(p4_w1[fpn_idx]) > -1e4: - m[prefix + '.p4_w1'] = p4_w1[fpn_idx] - elif fnode_id == 3: - - base_mapping = { - 'op_after_combine8/conv/depthwise_kernel': - 'conv3_up.depthwise_conv.conv.weight', - 'op_after_combine8/conv/pointwise_kernel': - 'conv3_up.pointwise_conv.conv.weight', - 'op_after_combine8/conv/bias': - 'conv3_up.pointwise_conv.conv.bias', - 'op_after_combine8/bn/beta': - 'conv3_up.bn.bias', - 'op_after_combine8/bn/gamma': - 'conv3_up.bn.weight', - 'op_after_combine8/bn/moving_mean': - 'conv3_up.bn.running_mean', - 'op_after_combine8/bn/moving_variance': - 'conv3_up.bn.running_var', - } - if fpn_idx == 0: - mapping = { - 'resample_0_0_8/conv2d/kernel': - 'p3_down_channel.down_conv.conv.weight', - 'resample_0_0_8/conv2d/bias': - 'p3_down_channel.down_conv.conv.bias', - 'resample_0_0_8/bn/beta': - 'p3_down_channel.bn.bias', - 'resample_0_0_8/bn/gamma': - 'p3_down_channel.bn.weight', - 'resample_0_0_8/bn/moving_mean': - 'p3_down_channel.bn.running_mean', - 'resample_0_0_8/bn/moving_variance': - 'p3_down_channel.bn.running_var', - } - base_mapping.update(mapping) - if seg[3] != 'WSM' and seg[3] != 'WSM_1': - suffix = base_mapping['/'.join(seg[3:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - elif seg[3] == 'WSM': - p3_w1[fpn_idx][0] = v - elif seg[3] == 'WSM_1': - p3_w1[fpn_idx][1] = v - if torch.min(p3_w1[fpn_idx]) > -1e4: - m[prefix + '.p3_w1'] = p3_w1[fpn_idx] - elif fnode_id == 4: - base_mapping = { - 'op_after_combine9/conv/depthwise_kernel': - 'conv4_down.depthwise_conv.conv.weight', - 'op_after_combine9/conv/pointwise_kernel': - 'conv4_down.pointwise_conv.conv.weight', - 'op_after_combine9/conv/bias': - 'conv4_down.pointwise_conv.conv.bias', - 'op_after_combine9/bn/beta': - 'conv4_down.bn.bias', - 'op_after_combine9/bn/gamma': - 'conv4_down.bn.weight', - 'op_after_combine9/bn/moving_mean': - 'conv4_down.bn.running_mean', - 'op_after_combine9/bn/moving_variance': - 'conv4_down.bn.running_var', - } - if fpn_idx == 0: - mapping = { - 'resample_0_1_9/conv2d/kernel': - 'p4_level_connection.down_conv.conv.weight', - 'resample_0_1_9/conv2d/bias': - 'p4_level_connection.down_conv.conv.bias', - 'resample_0_1_9/bn/beta': - 'p4_level_connection.bn.bias', - 'resample_0_1_9/bn/gamma': - 'p4_level_connection.bn.weight', - 'resample_0_1_9/bn/moving_mean': - 'p4_level_connection.bn.running_mean', - 'resample_0_1_9/bn/moving_variance': - 'p4_level_connection.bn.running_var', - } - base_mapping.update(mapping) - if seg[3] != 'WSM' and seg[3] != 'WSM_1' and seg[3] != 'WSM_2': - suffix = base_mapping['/'.join(seg[3:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - elif seg[3] == 'WSM': - p4_w2[fpn_idx][0] = v - elif seg[3] == 'WSM_1': - p4_w2[fpn_idx][1] = v - elif seg[3] == 'WSM_2': - p4_w2[fpn_idx][2] = v - if torch.min(p4_w2[fpn_idx]) > -1e4: - m[prefix + '.p4_w2'] = p4_w2[fpn_idx] - elif fnode_id == 5: - base_mapping = { - 'op_after_combine10/conv/depthwise_kernel': - 'conv5_down.depthwise_conv.conv.weight', - 'op_after_combine10/conv/pointwise_kernel': - 'conv5_down.pointwise_conv.conv.weight', - 'op_after_combine10/conv/bias': - 'conv5_down.pointwise_conv.conv.bias', - 'op_after_combine10/bn/beta': - 'conv5_down.bn.bias', - 'op_after_combine10/bn/gamma': - 'conv5_down.bn.weight', - 'op_after_combine10/bn/moving_mean': - 'conv5_down.bn.running_mean', - 'op_after_combine10/bn/moving_variance': - 'conv5_down.bn.running_var', - } - if fpn_idx == 0: - mapping = { - 'resample_0_2_10/conv2d/kernel': - 'p5_level_connection.down_conv.conv.weight', - 'resample_0_2_10/conv2d/bias': - 'p5_level_connection.down_conv.conv.bias', - 'resample_0_2_10/bn/beta': - 'p5_level_connection.bn.bias', - 'resample_0_2_10/bn/gamma': - 'p5_level_connection.bn.weight', - 'resample_0_2_10/bn/moving_mean': - 'p5_level_connection.bn.running_mean', - 'resample_0_2_10/bn/moving_variance': - 'p5_level_connection.bn.running_var', - } - base_mapping.update(mapping) - if seg[3] != 'WSM' and seg[3] != 'WSM_1' and seg[3] != 'WSM_2': - suffix = base_mapping['/'.join(seg[3:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - elif seg[3] == 'WSM': - p5_w2[fpn_idx][0] = v - elif seg[3] == 'WSM_1': - p5_w2[fpn_idx][1] = v - elif seg[3] == 'WSM_2': - p5_w2[fpn_idx][2] = v - if torch.min(p5_w2[fpn_idx]) > -1e4: - m[prefix + '.p5_w2'] = p5_w2[fpn_idx] - elif fnode_id == 6: - base_mapping = { - 'op_after_combine11/conv/depthwise_kernel': - 'conv6_down.depthwise_conv.conv.weight', - 'op_after_combine11/conv/pointwise_kernel': - 'conv6_down.pointwise_conv.conv.weight', - 'op_after_combine11/conv/bias': - 'conv6_down.pointwise_conv.conv.bias', - 'op_after_combine11/bn/beta': - 'conv6_down.bn.bias', - 'op_after_combine11/bn/gamma': - 'conv6_down.bn.weight', - 'op_after_combine11/bn/moving_mean': - 'conv6_down.bn.running_mean', - 'op_after_combine11/bn/moving_variance': - 'conv6_down.bn.running_var', - } - if seg[3] != 'WSM' and seg[3] != 'WSM_1' and seg[3] != 'WSM_2': - suffix = base_mapping['/'.join(seg[3:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - elif seg[3] == 'WSM': - p6_w2[fpn_idx][0] = v - elif seg[3] == 'WSM_1': - p6_w2[fpn_idx][1] = v - elif seg[3] == 'WSM_2': - p6_w2[fpn_idx][2] = v - if torch.min(p6_w2[fpn_idx]) > -1e4: - m[prefix + '.p6_w2'] = p6_w2[fpn_idx] - elif fnode_id == 7: - base_mapping = { - 'op_after_combine12/conv/depthwise_kernel': - 'conv7_down.depthwise_conv.conv.weight', - 'op_after_combine12/conv/pointwise_kernel': - 'conv7_down.pointwise_conv.conv.weight', - 'op_after_combine12/conv/bias': - 'conv7_down.pointwise_conv.conv.bias', - 'op_after_combine12/bn/beta': - 'conv7_down.bn.bias', - 'op_after_combine12/bn/gamma': - 'conv7_down.bn.weight', - 'op_after_combine12/bn/moving_mean': - 'conv7_down.bn.running_mean', - 'op_after_combine12/bn/moving_variance': - 'conv7_down.bn.running_var', - } - if seg[3] != 'WSM' and seg[3] != 'WSM_1' and seg[3] != 'WSM_2': - suffix = base_mapping['/'.join(seg[3:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - elif seg[3] == 'WSM': - p7_w2[fpn_idx][0] = v - elif seg[3] == 'WSM_1': - p7_w2[fpn_idx][1] = v - if torch.min(p7_w2[fpn_idx]) > -1e4: - m[prefix + '.p7_w2'] = p7_w2[fpn_idx] - elif seg[0] == 'box_net': - if 'box-predict' in seg[1]: - prefix = '.'.join(['bbox_head', 'reg_header']) - base_mapping = { - 'depthwise_kernel': 'depthwise_conv.conv.weight', - 'pointwise_kernel': 'pointwise_conv.conv.weight', - 'bias': 'pointwise_conv.conv.bias' - } - suffix = base_mapping['/'.join(seg[2:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - elif 'bn' in seg[1]: - bbox_conv_idx = int(seg[1][4]) - bbox_bn_idx = int(seg[1][9]) - 3 - prefix = '.'.join([ - 'bbox_head', 'reg_bn_list', - str(bbox_conv_idx), - str(bbox_bn_idx) - ]) - base_mapping = { - 'beta': 'bias', - 'gamma': 'weight', - 'moving_mean': 'running_mean', - 'moving_variance': 'running_var' - } - suffix = base_mapping['/'.join(seg[2:])] - m[prefix + '.' + suffix] = v - else: - bbox_conv_idx = int(seg[1][4]) - prefix = '.'.join( - ['bbox_head', 'reg_conv_list', - str(bbox_conv_idx)]) - base_mapping = { - 'depthwise_kernel': 'depthwise_conv.conv.weight', - 'pointwise_kernel': 'pointwise_conv.conv.weight', - 'bias': 'pointwise_conv.conv.bias' - } - suffix = base_mapping['/'.join(seg[2:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - elif seg[0] == 'class_net': - if 'class-predict' in seg[1]: - prefix = '.'.join(['bbox_head', 'cls_header']) - base_mapping = { - 'depthwise_kernel': 'depthwise_conv.conv.weight', - 'pointwise_kernel': 'pointwise_conv.conv.weight', - 'bias': 'pointwise_conv.conv.bias' - } - suffix = base_mapping['/'.join(seg[2:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - elif 'bn' in seg[1]: - cls_conv_idx = int(seg[1][6]) - cls_bn_idx = int(seg[1][11]) - 3 - prefix = '.'.join([ - 'bbox_head', 'cls_bn_list', - str(cls_conv_idx), - str(cls_bn_idx) - ]) - base_mapping = { - 'beta': 'bias', - 'gamma': 'weight', - 'moving_mean': 'running_mean', - 'moving_variance': 'running_var' - } - suffix = base_mapping['/'.join(seg[2:])] - m[prefix + '.' + suffix] = v - else: - cls_conv_idx = int(seg[1][6]) - prefix = '.'.join( - ['bbox_head', 'cls_conv_list', - str(cls_conv_idx)]) - base_mapping = { - 'depthwise_kernel': 'depthwise_conv.conv.weight', - 'pointwise_kernel': 'pointwise_conv.conv.weight', - 'bias': 'pointwise_conv.conv.bias' - } - suffix = base_mapping['/'.join(seg[2:])] - if 'depthwise_conv' in suffix: - v = v.transpose(1, 0) - m[prefix + '.' + suffix] = v - return m - - -def parse_args(): - parser = argparse.ArgumentParser( - description='convert efficientdet weight from tensorflow to pytorch') - parser.add_argument( - '--backbone', - type=str, - help='efficientnet model name, like efficientnet-b0') - parser.add_argument( - '--tensorflow_weight', - type=str, - help='efficientdet tensorflow weight name, like efficientdet-d0/model') - parser.add_argument( - '--out_weight', - type=str, - help='efficientdet pytorch weight name like demo.pth') - args = parser.parse_args() - return args - - -def main(): - args = parse_args() - model_name = args.backbone - ori_weight_name = args.tensorflow_weight - out_name = args.out_weight - - repeat_map = { - 0: 3, - 1: 4, - 2: 5, - 3: 6, - 4: 7, - 5: 7, - 6: 8, - 7: 8, - } - - reader = py_checkpoint_reader.NewCheckpointReader(ori_weight_name) - weights = { - n: torch.as_tensor(tf2pth(reader.get_tensor(n))) - for (n, _) in reader.get_variable_to_shape_map().items() - } - print(weights.keys()) - bifpn_repeats = repeat_map[int(model_name[14])] - out = convert_key(model_name, bifpn_repeats, weights) - result = {'state_dict': out} - torch.save(result, out_name) - - -if __name__ == '__main__': - main() diff --git a/projects/EfficientDet/efficientdet/__init__.py b/projects/EfficientDet/efficientdet/__init__.py index dca95d53a35..8bf4981ccce 100644 --- a/projects/EfficientDet/efficientdet/__init__.py +++ b/projects/EfficientDet/efficientdet/__init__.py @@ -4,11 +4,15 @@ from .coco_90metric import Coco90Metric from .efficientdet import EfficientDet from .efficientdet_head import EfficientDetSepBNHead +from .efficientdet_head_huber import EfficientDetSepBNHead_Huber +from .huber_loss import HuberLoss from .trans_max_iou_assigner import TransMaxIoUAssigner +from .utils import Conv2dSamePadding from .yxyx_bbox_coder import YXYXDeltaXYWHBBoxCoder __all__ = [ 'EfficientDet', 'BiFPN', 'EfficientDetSepBNHead', 'YXYXAnchorGenerator', 'YXYXDeltaXYWHBBoxCoder', 'Coco90Dataset', 'Coco90Metric', - 'TransMaxIoUAssigner' + 'TransMaxIoUAssigner', 'Conv2dSamePadding', 'HuberLoss', + 'EfficientDetSepBNHead_Huber' ] diff --git a/projects/EfficientDet/efficientdet/__pycache__/__init__.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1cf3a87d682a8042e0122be26cc9b9014026b5d GIT binary patch literal 868 zcmZuvO^?z*7;b^`*)DWh!02@^TN55<+bZ8gdzKM_-TP#0JM?_}bWTHK4z^i1`z(?vwpTPU6qUvo(`r$plu1eH zH!JaBkMR3GP;nOQpi&{%Y4Bys;>~9fZ}%)v3K|e$7U?+HCHf=KG&mh-a9VyqX%t5p drB8QuxK)Ix9#!H!*sWk zI2xaJIr0rSBo`#U3kPmUeL~{2Ux5q%svbM*EDJZoAhk$ ze?C=dStOZu_h!?KYxm0n=DR(ry**yYQUJGcyBLg1@i8yBNR$x;d$;fYFaC1x)6edr z!Y8FjPs&0i*$3q@mjkrE8Vz9HhezH6!bwCKi7eIxZyoNUuiS%QgZtdQMsUWgA6;fM z=b;-lc`#`)(1KNmJ4V|9S(|r2&jUR?of~x-g;NFkxv#(a`l~0r-R-%$d5}mR%k+e6 zPY#ldOYOl?(h}YSUMMbL&ecp5156JNNE`9s`4Ar2r-W2=;lkrpkeK_vc&#E6Qn{DN zqG31>IKS{K=bp7_EPO>zt;#;5izcI0^98a9K+6_CR&HfMV#)VF@i>=A72q5t_59Rf z7JS#LyuWESpQ_m|_Wld2mCx*|eTiHpRRg$|;g+&1=dvqgP zlHu+?f}oK{f58|51LODi04p|2^PZ z04{$f;$<-P=e_N`P}@_k1Z*a^PsT|xI^xB6mTc!aNb4Gz8>Y-Ag4m?vERt2jt^A}BJPaLR+2Go%CgI()Z zK2%PyT*2ykywZe~Rz*(TDyUj#7T9P5*6fK_b*eT#BL^D=V6I!a%>1CP;0?88Un5nw z=2t5yyFwNl)y63xnt5jy@MPkPUsSW&ctCLlklRQii;!ivZyC=-0C40hS7QbYl)@PLQYnF`C|qB%6X=1q75tK-I6@V_t@!xQnZx2>c&zL9k@oA|;>X+=JQ$}#6(6sd zIcU|A;}tib!<~vUsatU9cv&i@lh))F*jHb@(DBxQ{uZoC^pre*8Jb+zzD}=OoAk1K zi?(f#`qs&lJ~~);6F~y9Q|j zuYLigPlS!+RU{_zjU^II1a)x7w8cFP^bYFaov}vnxS|PU10IQ~@Eg}@_hp9~Y3~{B zL6V@P*7ibQ%wEQc=xuY&^uckS$-YYD{pBHK-*kt^7mDmZdBq6q&QZ6vAowVSw9W*WRT62j!##YXATM literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/bifpn.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/bifpn.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e70d9a360e90de5d67eb3fb4250a55e6f654e3f0 GIT binary patch literal 6544 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 F^}p>-PYM74 literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/bifpn_no_bn.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/bifpn_no_bn.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..755c5433ad50f3fc5982771fda85b8d01c3e7df4 GIT binary patch literal 9256 zcmb_i-E$j9a^G((mHWa%rZ`nx+5VU(W&yfI#RZtFq*`j0mx>0c?+e{>|?!5jV?fGfFjQ>xHcY0537qR0tO zt*D|*Yv~oehcjBbBFR!KQ!xcbZDw0m#cEAerbJ$A=34nmUZnMAp*3BZ7HOk7)0(Z! zwu+UaEWIze8P|L&xu&N!<{I<6YUKoQS=R#2^7O_@U>1Oxa&y4sdYDCE@@@f`LJzY9 z%(OcL%#4>un`LkM@YFM+KkF8OEhhDL<;rPSejt_So@2h!dRgY$hkh896>i;b2V3{r zZnx=i{lOzY+(e;u%L%;%iJWoohj-rl@Bu1M-Rm|ZA1!Kro#%hpiIU{UPdZ+e2=^Zq ziFfdZX8}B^BD+#W@l;oKm8TL0qam%jnn>%ej)56`PIUf3tJCyaUJyBv-wvt@+S5Y> zHN3a+hNl5yIg$?LSbiqYOFK#|9V(QTrC0$mdA+Q1J!-S+CeMU^z18+zJ{vk)o?UA* zd&8+deB>|}mDFnVn9Dvlm=|Jdzn0hxi2wGJORXTf)bS$bHEZFe?M)}BKk|aju5+o? za=pl_(&#RASi6B_cr=;!tgQ(PrCaMRdUy z2+&#$0U8O*0?_b7;+84r41uX4lRhL=@8At-uzl%FWD^@+1+O$df6r^R*^_i(#Wd2D zAPOXsVkL-iePK+5PZ51`-RX3iPq1yY5MspT$4AFXGa+FPg_wg`lRE8-!8+Du5tZ2z zfn@@M6O))gL{H%rgiV=IeuM=k5cGuW00S0aTPm)4AmgjKx@)+Z18mxw=Fv~5AJ}Am zW$Z~cS!k<##Yl8iC9{VOS~0pGpt-}3G| zuImSN(nJx|2Ul*b*Z*+-@8AFD?Wb?o|MS=X@lW?Q?!R4D*%=Iwo2@qKgl>zgUMGaq zO!Z1~ToMa5vJYv==ovATVt0|LG)WzinXG7H zcafpgp_-h>_uK8}RrdiDXKx=>NnYq7iu6w74gVG(l6JvJlIBQhkPItdg0;2=Q_4w37k3kjK zp}*~M%Mbkk79*&7>^e17n_d7-Lh`~jht)%Fko~WR{Z$*4^$$=lBvF(gIAonIB`43& z0`|V!FQnrbT7hxdCc}`ydmC@~4*;=D_S%(xt}IEPDm%)KD(tojhCuNyL1jM!dl$*B zi#%8l8;+btr3=!Ime_ew4(5;4M;`T))*7)F_4QbDwPk6?fKoCRrJW3^Eac5tk4@yW zk$z}EB#bx{n{l?TJyXQK%k*|2?K^$_`G0-$%{PN(Vc*A8$|jW1rUS*TwVY^^YgNy0 zvLB#?y#>JKyIh5yV{cMjYp_?jyvgN9JmWo%m}A2|OA=dLYkIYa>&&ljV(Ufi4mUR1 zQPgft+TDKus=|6pa#6jkTvkl%G5nNyg?x^Q%hTWO#*y7V*xd}Lgdt_pmkzO~zlWmt zsaN4vD7hI%m@3}%q1{eTxCJn)nQpRvZ}7>W?@+^JLH6R$YZe<;JW*F@2@|I zoVw?%LJ?S{-ZNw|Ze0ng z;uH=VT`j#)x_={W5p-MRH-^31Vnn6D^W0L+b6|hHQp@RtB~(kB^o@4u!p-(Znt`DQ687kC1`~l)p99E!Is;JUP^jGGufR z@JJjwgpt4W{}@TiM_LJzCJUo|Nbx6m)~aO_&^bm7s_4% z_#b^#c9yEV3a~B|B+vAw1OGo4Rvj?3hDB*JC``5l5cs20qx;>btzU zkX)W~F*W9I2x*2QO`SJx)qEC4cI3A_XwgpSH`~DxkB;Yt7n7TPZnD=g%qp2Ddgz<_ zz%x)8GI~k8+3ks6Za`5_!|mfiOKVH{>Bl)1(P^m1jg@M%3(MsFzvMP9JZFvZ5%{ zCYH^KGIL_t{4woL9MkS(f2`;0rBSa80LjB%!^}~m&P!q zG0e+jm@{LTSE5|wZ1ig5oNEG}cdY}3EYAUP{sK5(7OVE!F|}S#Yh661)*ET9m1AmM zN^4zCYh}j9btSEJ^_W`M(psy>)LKhxT~BL`bK*u?>wD4ncS(+K3ePl;fEoJ?+vM(Z zctS(25RT*%4rq*GGl`d^9@&vN?&>a`cRxld&%DpOK2)Afk(ToB47^?THYmU)!rteF zcf-(QWX#@Utjz`*fK{kcuGYD7-Sz?s;<)T5qFuG!dBQ%WLENOg^#J|g_zayV&WOTw z;bv#ej@owTI#Sm~>IR?gT(jNwqx5VI#OhJR+9+ZUHJaWQoNwsSAPJ1|InW+M7W%Xj z`@##TBsxp;*N^0H4Ci~NUG%bb-R^d{IOngWsns-fjZzlXOU9n0lfII4(od33`rz67 z4#Q~*rb-0DxCX-H> zNp;`R9X$qpfszoXMugJ}IQ$st&r(c9!|~r33IWV3MRgQo9jP&v|F-&S4yR`PP%rrr zh3_DxYVslubz=~7nvCC`8@SZthdc_iQOxl+vFie?CoG@D?!@w^Djo24p!*TV&=AnT zIU7M*9Vwi(4^pjjNEnH`~-8>3l3-8s;l2hHhtTF{)HK=Z^9O>=~1VT>lmcz6;t7eI41o)t7_ zC(v9RqL~??IWtBRb81NNO@4zmODXS{6W#-N3gxHK-&{N=`kR~3-wQ+irE`d9h`-=F z`6bffi*b=|Cwd&82j(SEE`joi_=KQ*VgluthbX5Uj|(G|&&1$yN*Vk)dW~38G%0`5E6JwV3$Bd;30t~fnN~#Ie{*L7J+>Ndj#mX z&jJE}O5m3S9ua60_%i~(BJh|%2cUdvC?2A8u5qQaig!&|89%`1212^{TuVNy$!858 zF>P)<@sWp+{mnn3=J5W>moxVMdpUc z2!k-N3KUm84TBKUdPs_az?k?!o95I4^z|ZiXhDAQ_!MF_2&whzEX#|>qza(8T^!QB zI3S6OyTXwe4$s(d6{?8Hu3=GCmZ_RWJcXJ|h>ukcy0IRq>`zzLyF~hz4OGm+n6i%oUd_;%db;5dz8rYbCBY zQn=iuAdm9Kv42S;K-f*YDxrwitZeOKv{R*J%Jz)0z$5!@ZLQr_FJjE@F10fJw$L(V3 zkMJpASd_Sj$NMG8F_n&{^w5_KEljKwz5_4_Y>UGuE@&DElkdrU%AUHX?df~QUZ!S} zx_W9xdMxkCcX0RoCAsxUz*${Sqvj+rv~Y8H!>a&wRQv3;9o#bStNRF%;vPt0%dQ;Y zmSPNNxxED(1WQTNHWN@DzfhpOLptMr#N7K6q@7X!-n>|h*y z)s#D;ni7pf$|zAwUsK8?kRd=b{8ml$S5%3*o=3toNA=KIxj4(HM)?Ky9zNW_`4Ts) zNq53Rn&PhzD?uREwKCVwuGG4L_$PzYL^vr;C)U$!wW?byRWza<$0+X23oTs3)_ue* zDTdW#I*=70@t24d=G7@w^@I_B_*8;K*s2*OGo?9m)9FTSI_+}vZm+-OuG~lhlj0~N zPI}^yDzqz~PDp#K_x}Jf+o5ZLbQ^H6L5Du`5l?&O2fPkpWZ#k)1_4Sw1A<-t6PCn6Bi zNcXiyR_X(zk<*zsd~=X*lsL2p6bo%B}FD&0kQQ;pt6_t3Y|x6^mfchbFdA1%=l z`YzPoPj9DXTA`!#06j?Wpzo&dp?A{v(!1y(dYB%eReCoaqxV4aQPtZT=wo!8PS8m@ zMUT^a=`=k--$zdZe~RjKhMuNp=q#PR}eUUB!!E9mi7v;?HupK^hbZXi0fhkk#grdeKU0!O) z!q62_7|3GFYj3uFSLWJ|koF*qLy-ZNq;}~dyy8`ED!H*Nw8A*{-TK&G_X4-p z^_?if%tk|L!W(^=?+0For#uYd3|MvDM;j-=U*?_R5RS1T%w^q!y$T@=+Xd1RVY?mr zo-Dv=B8dD?uzGFS3$av61FtQ@ zbq5AAVI{1uICLWRxfyvuUsi+*7j#|WV4c-@!Xb>%_CsD%*Vsi?)b^qX3t?xn z-^Vsjp+>?(Pj(!JajzvtQEw@i{x!luy1--=1i(7;WhONR2#zL-q(6Qu@J|Xzuk1?v z!#;^8!KWN3mvUM2r&;X$9+07@ZUw%mfb>li=?x}#DL}Op?*lIyAa(Tm1ivVvB3>^2 z9Dp=tlp`G^o@ZW7fZJepzknh=!sv?`@J$AuVxXyjOsTIk`risje~l|SjNT-1mVxQ8 z8{pGVG5I72MhTeb`R_=4mVt*D$VN%O!aUnzN8-IZe0mKWRA<5TSD5@;2Jm3%gvmt( zq<@McQ}?Gb;J3K)PZ(u&r)F0MN*3P^v5D}RvDsit)XesvE} z(&8Kg+4RMgoyznZ;4uBSqezvfrhWV{OMHOQZYJ>)%)i1YH=fQ`@XXWSR6zP=u5_48 z`}j2T+=nQDV3Yxh^gT@8nE`*y{D(oNO@vwr%52jX21t`;sXBn7PK>7pB{~{AMCT9Bx3gxt^O|t=b zUgG^qLVN;6`WXhMs;jyDC6q6+_gIMIV76TXlJ$OS<1YU2Q3gMGr5m&eUTHlm$cXdUfj}8Xj_byVtc!+TL$>A|KI*D;YyY%9Odo;JJNxq8_sj#R`3Q0aeD!7`BILkF;eMFxWmE>Gfysl5I z#N0l>oDQk&`NTqt(yP#aQc7~$2a^)lTpd5heJs4Ji%NW3d?+!u^esKUjmy6AvL039 z!(>Ck_!*7LpG4yO0cd~OOmaxYD&rq}GIXfs1VI=(F%sXX))CW{ zC#qe(9JzjH8Eu+earv@s*QUR-$_dfKy8z>yR=+@AJHGUAZ4H@N6xYJezV4TIrR##7 z4R4l^ay5CtXxE{<`Aj_L*rA6&JWTsi^`bG+Cq|+t#>b4S<~i+`HSszsmvYirJ}PyU zfy7OZ6spLZ&#w%EcxC9uNX9zR${49wcijzoBWGnWAmo2-HpI$Mgjc{uDAj#6W^bwzZ{ve&yKby`6xF<-cJKJW zy)_3(FZ^2@1>V(>`?jUqWtkn{m}Wma5SiDPO5XP9+4ot-Qx z%it}_a5YT~mEm}cWWn7){z`Hd`FiALR#Zw9kc)D~%v!zPJbj{hp?>T`yzoA}%MylxqDdPTPl(=ZI%sOlEp zDv&UZ@tyzQTEhC6;q{?rpcMHX4ASOh$iI0!MLa4d{td@Oopi(^Y#)wxlbnZ`6;Goi zZm9TWZ0Gp;dfgDMU77rj%(ltb+Uo}4dWcw)Kg_KPfk_1w=}fW_=?p5P z)}%7{0?LZQW)wD~_^RTos~Vzb@nwDEXk17Tu})|&>zD4qR<|Z4=x8S;=z?oAbot$@ zHlk%i8nVD4MB9#!U%gM}P9us|T8F4WwQ)$b%9sFc=Dp5(QN&*@viOR0T zTr!)?EofBY2r7=KG3Id|l=^yfBbgzquc54RiTWp0{XsSJQXhJYi$KarWvYW3r)y3Q zD7_b0Z^(R*ti-0idtTy>mkF zCd~F;4&g$UR5;`Fg7JOVfdt2%EZ7x#E`J)3`E`#F`wI9N z5DNDcE`F_WLz)Pkj^v2tc0;j=z=v2I@dc7(ITLMmd|cyg7H?(&j|Uhau&VP^ngb{5 z%aRvFu@ki2XsIG|VT9}Tl@MPm%4(|)aq09nWDYJtA`=aL5AkY8&1i%pXG8o2rYv&< z2Vw&+5P!}V_$rgX16i6E|H%Bmf=D%A6%m$83(u@H`jNVo=`a&AG2AY;}|FY7KBsUs1Bl)ECew#cSx@yq*?l1 z2GdFw$iN@cO{1b42z>Y8Uj=uUdNcF|gge_nYkeMEMFqd{TW=0}x5WP46rqBF^LSKz z`#KoxBTaB#h7Wz9_z>5(#GQNZ*i-l{he(Bt=nBU-{`9Yu43r!VBL9MF|Jg zEeGkFrPZz*xEn)pjIY}&zcRJ){WmX3O>KD%sYXXW$@+tROvVu6uEh69;MY8;pY(lI=B1 zrHdR&=B_!uw=ZpovN@|XV^_gjOrTOXb|+778=6E%K(sz(itZIxG|4(BrRi)KbS$DH3?Iv4fgehiG#apr2q_7Rfdg|o) zwbS)eX9On|LVXtbd*;~d(&Upu{0qPH3Q+MuyoHVQI=}7_6+J9qWjxWlK%lp2%-KkV zY^8f)T3WlMg}LyoxW0n4$Ta4U-1&&$UY2IX*HFk}7%i)G)>NVYn~W9W%^^00Qc!8t zxLalX%WO;}iP18DLv13pSLOvG_{!0!W>UiKB4HPsf`g2#I76?wE;#QLkurgt%_QKR i%yvqleN$DF=J`r%HIq2Twu-7C?4mgYMf`Jf`u_q5#^bL5 literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/coco_90metric.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/coco_90metric.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..566b587b2d2858453f3da636be6bf01e6eff6e2d GIT binary patch literal 15187 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 literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/efficientdet.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/efficientdet.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a91fdcc5a7a54254f9924a4b8c2d648d5c79107a GIT binary patch literal 986 zcma)4zi-qq6t?sGu6LzX+m(eW%SB>F2tg|t=yf;-l*P)$zH3V21ltj`%7D~Lo%jzJ z%7VmSgyfZpe}Rejk`@joZ29whwx8ekJ^Sf&IwsI=zI@9+xP*L1=dSr+Jb|HK0C2)- zNh+FBindcam7BV~?Ur8Ur+yWrK^3MUCBnUlK9lE!d)&Vw+!yrHy`<@g2MZF1Kj1bJ zQ@gh)f zM>bk!`I}`eh4rM!-`LS|S-)qeBI9;sR8~lquhup)LYv;&<(bJ?qeP?XTxeY@8x^t` zHUlM0t7IPC62^H11IkbIeE>r)$r9|0Eq(XZ1jtR&5LHgg?Mvl z_%MvgtP+gbF=JKD+Y;>wV{hB69Cnlk*DCzWDnP(|c6zHV7iGzq+Q$uqn5sRr4-i5C z92$!qg@j`7SLg9KebDQkK~hob*-(O7>6z|-HPiU5l>?FK_Ha^(b)k(qSNPC&YglYe mQR;sv+Iz!Mp>8GhIscFxETm|oM}z3cn5gGDp%c3A?$BRoM)_#~ literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/efficientdet_head.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/efficientdet_head.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28815ae6b4b7ae120eb4a2e8951e6ed0bbaaa8de GIT binary patch literal 7803 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 literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/final.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/final.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2459ada7e5a5ab0ac77550310703e302c1dc83de GIT binary patch literal 6880 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 J!`b;I`M=)Ax)%Td literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/final_mmcv.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/final_mmcv.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..374323e5134e7c7c5afabbdf59d95ca1278799c3 GIT binary patch literal 6894 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 literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/final_syncbn.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/final_syncbn.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4390e440cc1039aef4e9b7b17f92d67c18a6a776 GIT binary patch literal 6676 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 Zl#($uHkqA#a`O1(lM}k#oZOhu{|8s^OqT!v literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/new_bifpn.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/new_bifpn.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef3bb8a1b6aa1d8fbfbbece49cf33d40ca261f9e GIT binary patch literal 9894 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 literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/ori_bifpn.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/ori_bifpn.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c8b397d87be9a6272e5e76699ae53f614000b08 GIT binary patch literal 9635 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 literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/ori_noinit.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/ori_noinit.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8730ca80ab15ac3bc788eb12b3481af48a17d161 GIT binary patch literal 10121 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 literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/utils.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c26ada0d2333bfb46f11a98430e46849c740a081 GIT binary patch literal 4822 zcmcIoO^+N$8LsND>FJqWZ`K>fA8`mIflPqiD1-nZ#KCqP3F3`|Hv|SytGBCXrq|s) zlj<6;z4Qv9HRKe;5Ab34mRY+pw|VV%`i|*$ zbFc3ipPjXGzwev6leP1pALN~W$F$w7n=kYi^2Pq5X?vNQpXe`{dMkS*U+yoXep0kW zaEJF#CjS1)0egdqj_BTDqMLYIkM7xfynhP51+fU#f|woY;EL((cA|k|o-Gr%1;|k8AJhTbEyd^E&lh-%iVsUfP_dnFx!q z%)>0Yok(<@5926{r&*+ua1a$?T7*#{Om#d}dO^u)5u010EW|^D0on>Lh%&Sm-kPXO z<6@8wH*QaoztBh+`{+V!)ip*7@1R^lDPM$9tYUloht{sOYgb%x!7FReI?r~wvi9LQ z;KDk`b{*wZOxTsPXJd-a`VhC`_~^p$ryu^|H-CQSuNP(>#(J)7p-bC&bW1yVq(<5) z-;+xE@b+BosiY{!Qai&aEwoq9QS(sSr4k=9xq{37{`Oj4sI^I=WReZawVhE^47ZbF zG>z8sTqG(nQ(l|M@fND(+UtWs8mCF2E+=X&nKy9Z+Ek@kxjMP6Pu+}U8WnL8mRRAm z7=~sk7x220hQ@f8FXEJ^P>;zmKRUBY`Eyhf*5`utEfFL(P6x%M+Q2%)sC+_?op{2z z>%Y$iT)4u!v(RrP{#KicXx+7hFWPsUe(*k`*Y6+%9sLO6eDeiyJ<5}7kr0^BJ&y57 zG8;W#cYvH2>sBOLsk^|=VXJc^k#L7)x|3+HR5BHbZcXZ^XkVm29}uOzp&U;qrFJ&c zsEpgQWuRZ8wvAFg0i)O++vgRKQvo4BkXN-T|G-cbL$%h;m1aPnRbAM4bbi= zci+Q;`&GLNs?N|kus~RMzXc!0h~m>*P}(Q~O6Q=3P`K;&{`v98AIsC2pb5%75{6zE zVK7kGPSW8>N#cZd;v~&XC^WyKZJ&m^&}ZmYH_eCPsQ%g3{tRuS zrnU`m-%>IPxAm+7jmVOL(ypWdXj_dZ+S?o}HO}ielPZ{C>(*c_w<9Si=p{v+@fCi` zdJd=0>l1ChbLK$^%tj5#St#_#S@-r-C_Nf(G(x(XzP`$ z(XDHk&v98XlYJKN>sg2VjLAy}agOSwlH~}dmV*P#L0MbaLMm$jVfY1584@C$Ef+Nu z)I8KY)k57>{+=bjMYSO|A#efLm>$pc2=sVOk0)3yEM`<~`Dwhij)7Gay4}n|I}?hI z(GyY@9i(Mil!~?i`3f98r-p4KJKDPea1G0Od>Y)D$G?bM$|V@)1bmqXJg{if=<=QO z%{z|>a-%to%#dzU2rr?OzlN#!)_o$Q_&(_<+p_PI6Vsl_$xK`z6^^-{M8y`zMa8sd zqC(fB7uUN`Xp$DMaw-o}(yH8<)VQ_Os9IW#hF9%cS}I1;a=>??@poEHZKM zA@HLJ3QzhWKToDvdHDruev!=UFumZ2T=0?R+wx0r&voIZq?MLmCi4=RuaH@3jA0G& z>mo`?e#V#W=dI`G5@4+$G&_$!G$?Zwuq53rXAt@t)n6v_butF?gb>4W6MREx`5O6} zk<4LY2J}sIy?|1BFuu+BOI=C67^OM1rRz0+N9?;<2EYFDDZ14IMJUt0hXg2*XHBF%eU&owE;_$eg!6YqQ& zY2{UPNZR$~TQJAyTCaSAq6aBC-=j+c*+VF43BE^^a}4olZ+7L&$}_~XKs;`U*D}PT z%+i1sV|UKnzsmoC603O9QA%uac@}L*){Gdod=72rI1ya=1De1m;J`0wl5`m5;;rLwO6P6HPpPTCU-ZxuOYLU(h&h_1Xla6)Or4^ g9FHw2U-6--K61J)U&7h7x>n#V@!*N&r`hk_X zxnDH;q2;~2S+x4CVyVBx*=;6#5jew7l>3JCHR*2w9j0qf?NqK++T~NLn+= zX-Jkt8lpw3WSpnQ|3#TqWtW@Q_M}WS_&6u+ zy@#0^n%8bt<<3>{fr!UC+ez=nLS*G2p*iM{3+6hSx(t%CJ{PR-q^{t?dBXO2-vjRo z&+@+Tv4_B%v9o_vU;{;3>X?>I9K25tO-RnYiKgBFnR3mZ@hLyxYi!S%vS$wQoJ}1} z#(Q1Y__~tG&@@ywD5^}D(<VJrm(xru&ccxD2bs!6UtXA&W0U;c8V zDD}oT)iTYu)yD2HE(Z_OayW@MibAA1wNBX>%W4ExZG5=Boh2D|eJj;3cP2W^Ra6wo z&ieSVX<&I;d5O#jK$z3vExvp41l!kVV;4Rk`{^C)gYScxvJq13JnYvT_B#iB&z{w-7L|Owh^sYY5eb@sGSWtZR-5NyoqLX5)A;dtoIeI`JcTSW{L%5fk|k%+l+AKD z>!d~JY0yJlUdLcbZ^&~*tS3%#!Ubq)terUIlKL;XfV@PH>VYg=5TIE z09>FO;C&tLJMv@V23(*@&={);tVTc+EHr^2j5s}c3G2ZGUrolTr0mSfOd}(mvNX+w zUB(;3KKU&Smfr+1txRPl(zHxc<7TBsu&7E|r5$DhDmep%qS}n2B#)JfqC*79%NR{> zC<-d`T6`7oX*q4);cdSA=3?a|9$lYrZjqOiiWJ(LXzDK@Q%)5^u-_w;pE!HYo@*znV;WAI1Mk4uLmZzqsCt8=)wheaHan24d1OtGCjz9{ws*DINbe@+x_7f0HWs zQdUL@4oKixnKsUg!(Pi)z^JTbVa_CYE!rxhIMLBK)*2PSEKO7z6{)iK3Y@`uBFn^{ zi`Xjt)85HNY6nC!ja=Dxo;kJ_P$dAeanf)3!bcoPWZ9it2#6fNYPT8wK*d zZj3^ljVM_nd`j{r@{~m_Xj@WFeL2!g`>gbId!OpXvaJfuUL8Qn$4vm606)X@Kvt8n zGTv4eE5v!B8T@YT&$s`+`{df-U!VW;Z+EutUc-^wE+<8_oyIUSRVFMdy5>v@7)`6@-Ny{yNYQ@L)!F zFTR>1uNEoFa|-EAH1$Iez#oOm!hd$9qmnRkSW#|61uB1SdT2ajo1DtKB^Q+4?0TPH7&;JL#E4QkL<;@zUhuD?>E%fpO ztp5@aDQ_rh>JyL?fanOmPk{0)+~_d&<-0l(Moc6x_Ia%>FGCrrB(`}wI zev$9zUfK0mXS=*ZTlk-noubr7tCQWIC3{Pfyt^jJ2PV*u$M}q_k3q^b`$b|x`xUod zmbT1Ej}%vE{3-iQm6YZBmdug|st&2GnqfTA6@9&!aC7$kTHnZnJN5&ku7q#VRJPvI nHV$E0a|BWozE^*dywB0I$A8FIaP+tFTXEOgtKRCR)l2^Y^lyYH literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/__pycache__/utils_syncbn.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/utils_syncbn.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38affefb6eee31b197b1b15e3c87800682fec96d GIT binary patch literal 5211 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 Zle39AET_t9?uw$0{|XNZE8~=+{s#(P(w+bS literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/anchor_generator.py b/projects/EfficientDet/efficientdet/anchor_generator.py index 51936a348b9..104a59d0967 100644 --- a/projects/EfficientDet/efficientdet/anchor_generator.py +++ b/projects/EfficientDet/efficientdet/anchor_generator.py @@ -21,19 +21,6 @@ def gen_single_level_base_anchors(self, ratios: Tensor, center: Optional[Tuple[float]] = None) \ -> Tensor: - """Generate base anchors of a single level. - - Args: - base_size (int | float): Basic size of an anchor. - scales (torch.Tensor): Scales of the anchor. - ratios (torch.Tensor): The ratio between the height - and width of anchors in a single level. - center (tuple[float], optional): The center of the base anchor - related to a single feature grid. Defaults to None. - - Returns: - torch.Tensor: Anchors in a single-level feature maps. - """ w = base_size h = base_size diff --git a/projects/EfficientDet/efficientdet/api_wrappers/__pycache__/__init__.cpython-37.pyc b/projects/EfficientDet/efficientdet/api_wrappers/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a868587fbaf63ce0386c38071358940e65c1f70b GIT binary patch literal 299 zcmZ9GJx&8L5QXjahO7|jI04-@_yQ0 zt)4xT{_K}xuxF)Rtyk;PRl!$U?tJDEasoR}{B0}!<^X=X$AQz3L1hy>k16a>PW)jUjWXc#J!B3?gF%ij fibIkyLYlY`#+xj}b$l(|jSG5jVOjq=Ra`dzKC)0I literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/api_wrappers/__pycache__/coco_api.cpython-37.pyc b/projects/EfficientDet/efficientdet/api_wrappers/__pycache__/coco_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09a40fea27369f14de58a7bc23d5a01f283a8890 GIT binary patch literal 4839 zcmb7IUymF|5uctvyR-k!=i@LrW5UFVkQdCJ;{XZ9GD*$^on&21>|kjVYdo3m-5cNR z%wG3ge0R*ga3>`^AO(rXJosLs@DY&s6ucny8}I}l!4HUE_3WLiP-o@9aulP7h zW13<1&}!&W4^arK&$!jMIqN(8>?hWMafiFdjlMgy=*R7W%ROE@W__=s3>;qPKH4>E z4{YAxO|hQgn6^i)o7Vl+Nv(9t+M0!Bdi1?+ z?Y?sltvgnUMH_#1wqgc}^w1F@mG0nG7f=kL$o&`*t?a*%$gD0 z?A{g463sq-&Js_W*HeVOI3JB~yi9YFA!^p)D|16kjoQ1O=5ds&8>q|%bUm{j8&QGn z&<&C8jfBKW(k`)RPr|W;c2bdb>(yS7yM`G86WHP6RaMeD`t7Npko-t{Nyf##dDlct@|L_5;K$fxsJ$v>gwWL(@&^N7*+FKPxb2QGO6op%7mH!51Fu``qAk!sf+B^rf5m7g=pCf z!%@!nQmVJZaCa|Cr#{-HZw()MA$QP2PV?4%IbNBk1vTdXp}LORA8U15%YhSod0RJ1Vx3i5D2B zdeG?EbF)HnDk$<`E6<=M^=#n)(E-ynDT+OreZ@8D7%IwB1UO3T$bM{>?1T}rtPZ0i zDHF+`Q9(IvdLpN3wQ>XF7seNe;~l)S81T(S!_PAw+~+!&<{_Oz5G6jN%wG}c3qax{ zD3O?-19(Kiec}|Xu#Z?(g62*ujr-JR4?cadT0 z+`W#hQnl8s$8K4t#expUE7@c3#KK&EMA9{sryRRmWqpX8R?(56w(eQGZ{CB^NTZ3r z|NYW^TstAzFMeqM&YCog0}~+k%Le7a(*Kk)+h35`d}K?)YtZ{MCNJ(^HJbZI*HbS{3hSZ1)E`&f`lnsmm z3Wc^-NP1Xdn=iwa&I0uSlN5w4k=J^MXJcy8k*f&3o^Cxo3QBjB7#cJV0656CpNxRk zfpWB+@VV#Aa5FAgi(p`ao#N2@Q)|aw1OxKt;4@(iZXBSl***{z+o?jEap9Lij_}TK zz~yIL*eESF%@R(*1G;9^L~f@@VS=%C9*&3F83T(oXi4Uf>n0L~80Ino4j|Y{^#iQ# zaLHIBsO0dMwh+C%vBWh((pu&BNa;GSf{LyY@XWY&cf^4LVkpE2AW({NiW`S^DL2X$ z8b&8vyOb!jODU?`u9Es~>U@uiUlE4^)&(%ELD^so(J-SNkaQjTQ=e{wMqR`g%8N7< z`vVM0JLO38_T|Jokxu*u*i(va=wA>c^w23|$$9$FK-fd3-i*zyfiv#GX! zz9ekAGI7XjWGl7{Y9n3SxSGgCb ze>U5YK!^`6nY;Z5w=nAm@UHupF?Det*=7?r)}fGwNg0g~=#Y|j3p&4N(#b*=qj}A8 zFPSOn9|g?0kj2O#SUPxu{3CO%s!|jUG}k;_lmS)%Pk@%gaI5R;IsH=t_Sd-Zn_zefPbyqOSmrl)s~cFywO5@c{K|zt9iDr}YvyQ?P}GwA2~GAo z6>m`SQ!2=5w1doC!KOaZ2+2swSu&(vm)2Y%sB1(#9W7BJC6`n_3g36_^Ul(1CcSpg zNP(IX;O)%w5gXDZqz-xI2gpGy^vO@SD){tKW`-6#f>!Cfm;PW!L#H9XqvT literal 0 HcmV?d00001 diff --git a/projects/EfficientDet/efficientdet/api_wrappers/coco_api.py b/projects/EfficientDet/efficientdet/api_wrappers/coco_api.py index ffaf33e0185..142f27d7f94 100644 --- a/projects/EfficientDet/efficientdet/api_wrappers/coco_api.py +++ b/projects/EfficientDet/efficientdet/api_wrappers/coco_api.py @@ -30,7 +30,6 @@ def get_ann_ids(self, img_ids=[], cat_ids=[], area_rng=[], iscrowd=None): return self.getAnnIds(img_ids, cat_ids, area_rng, iscrowd) def get_cat_ids(self, cat_names=[], sup_names=[], cat_ids=[]): - # return self.getCatIds(cat_names, sup_names, cat_ids) cat_ids_coco = self.getCatIds(cat_names, sup_names, cat_ids) if None in cat_names: index = [i for i, v in enumerate(cat_names) if v is not None] diff --git a/projects/EfficientDet/efficientdet/bifpn.py b/projects/EfficientDet/efficientdet/bifpn.py index 114af7b16c7..a26f4da4235 100644 --- a/projects/EfficientDet/efficientdet/bifpn.py +++ b/projects/EfficientDet/efficientdet/bifpn.py @@ -1,5 +1,3 @@ -# Copyright (c) OpenMMLab. All rights reserved. -# Modified from https://github.com/zylo117/Yet-Another-EfficientDet-Pytorch from typing import List import torch @@ -9,20 +7,25 @@ from mmdet.registry import MODELS from mmdet.utils import MultiConfig, OptConfigType -from .utils import (DepthWiseConvBlock, DownChannelBlock, MaxPool2dSamePadding, - MemoryEfficientSwish) +from .utils import DepthWiseConvBlock, DownChannelBlock, MaxPool2dSamePadding class BiFPNStage(nn.Module): ''' in_channels: List[int], input dim for P3, P4, P5 out_channels: int, output dim for P2 - P7 - first_time: int, whether is the first bifpnstage num_outs: int, BiFPN need feature maps num - use_swish: whether use MemoryEfficientSwish - norm_cfg: (:obj:`ConfigDict` or dict, optional): Config dict for - normalization layer. - epsilon: float, hyperparameter in fusion features + conv_cfg (:obj:`ConfigDict` or dict, optional): Config dict for + convolution layer. Defaults to Conv2dAdaptivePadding. + norm_cfg (:obj:`ConfigDict` or dict, optional): Config dict for + normalization layer. Defaults to None. + act_cfg (:obj:`ConfigDict` or dict, optional): Config dict for + activation layer in ConvModule. Defaults to None. + upsample_cfg (:obj:`ConfigDict` or dict, optional): Config dict + for interpolate layer. Defaults to dict(mode='nearest'). + init_cfg (:obj:`ConfigDict` or dict or list[:obj:`ConfigDict` or \ + dict]): Initialization config dict. + ''' def __init__(self, @@ -31,7 +34,6 @@ def __init__(self, first_time: bool = False, apply_bn_for_resampling: bool = True, conv_bn_act_pattern: bool = False, - use_meswish: bool = True, norm_cfg: OptConfigType = dict( type='BN', momentum=1e-2, eps=1e-3), epsilon: float = 1e-4) -> None: @@ -42,7 +44,6 @@ def __init__(self, self.first_time = first_time self.apply_bn_for_resampling = apply_bn_for_resampling self.conv_bn_act_pattern = conv_bn_act_pattern - self.use_meswish = use_meswish self.norm_cfg = norm_cfg self.epsilon = epsilon @@ -173,7 +174,7 @@ def __init__(self, torch.ones(2, dtype=torch.float32), requires_grad=True) self.p7_w2_relu = nn.ReLU() - self.swish = MemoryEfficientSwish() if use_meswish else Swish() + self.swish = Swish() def combine(self, x): if not self.conv_bn_act_pattern: @@ -268,19 +269,6 @@ def forward(self, x): @MODELS.register_module() class BiFPN(BaseModule): - ''' - num_stages: int, bifpn number of repeats - in_channels: List[int], input dim for P3, P4, P5 - out_channels: int, output dim for P2 - P7 - start_level: int, Index of input features in backbone - epsilon: float, hyperparameter in fusion features - apply_bn_for_resampling: bool, whether use bn after resampling - conv_bn_act_pattern: bool, whether use conv_bn_act_pattern - use_swish: whether use MemoryEfficientSwish - norm_cfg: (:obj:`ConfigDict` or dict, optional): Config dict for - normalization layer. - init_cfg: MultiConfig: init method - ''' def __init__(self, num_stages: int, @@ -290,11 +278,9 @@ def __init__(self, epsilon: float = 1e-4, apply_bn_for_resampling: bool = True, conv_bn_act_pattern: bool = False, - use_meswish: bool = True, norm_cfg: OptConfigType = dict( type='BN', momentum=1e-2, eps=1e-3), init_cfg: MultiConfig = None) -> None: - super().__init__(init_cfg=init_cfg) self.start_level = start_level self.bifpn = nn.Sequential(*[ @@ -304,11 +290,22 @@ def __init__(self, first_time=True if _ == 0 else False, apply_bn_for_resampling=apply_bn_for_resampling, conv_bn_act_pattern=conv_bn_act_pattern, - use_meswish=use_meswish, norm_cfg=norm_cfg, epsilon=epsilon) for _ in range(num_stages) ]) + """ + def init_weights(self) -> None: + # Initialize weights of the head + for name, module in self.bifpn.named_modules(): + is_conv_layer = isinstance(module, nn.Conv2d) + + if is_conv_layer: + nn.init.xavier_uniform_(module.weight) + if module.bias is not None: + module.bias.data.zero_() + """ + def forward(self, x): x = x[self.start_level:] x = self.bifpn(x) diff --git a/projects/EfficientDet/efficientdet/efficientdet_head.py b/projects/EfficientDet/efficientdet/efficientdet_head.py index 6ed6521d091..8db07290d9c 100644 --- a/projects/EfficientDet/efficientdet/efficientdet_head.py +++ b/projects/EfficientDet/efficientdet/efficientdet_head.py @@ -1,15 +1,19 @@ # Copyright (c) OpenMMLab. All rights reserved. -from typing import Tuple +from typing import List, Tuple +import torch import torch.nn as nn -from mmcv.cnn.bricks import build_norm_layer +from mmcv.cnn.bricks import Swish, build_norm_layer from mmengine.model import bias_init_with_prob from torch import Tensor from mmdet.models.dense_heads.anchor_head import AnchorHead +from mmdet.models.utils import images_to_levels, multi_apply from mmdet.registry import MODELS -from mmdet.utils import OptConfigType, OptMultiConfig -from .utils import DepthWiseConvBlock, MemoryEfficientSwish +from mmdet.structures.bbox import cat_boxes +from mmdet.utils import (InstanceList, OptConfigType, OptInstanceList, + OptMultiConfig, reduce_mean) +from .utils import DepthWiseConvBlock, variance_scaling_trunc @MODELS.register_module() @@ -83,17 +87,25 @@ def _init_layers(self) -> None: apply_norm=False) self.reg_header = DepthWiseConvBlock( self.in_channels, self.num_base_priors * 4, apply_norm=False) - self.swish = MemoryEfficientSwish() + self.swish = Swish() def init_weights(self) -> None: """Initialize weights of the head.""" for m in self.reg_conv_list: - nn.init.constant_(m.pointwise_conv.conv.bias, 0.0) + variance_scaling_trunc(m.depthwise_conv.conv.weight) + variance_scaling_trunc(m.pointwise_conv.conv.weight) + nn.init.constant_(m.pointwise_conv.bias, 0.0) for m in self.cls_conv_list: - nn.init.constant_(m.pointwise_conv.conv.bias, 0.0) + variance_scaling_trunc(m.depthwise_conv.conv.weight) + variance_scaling_trunc(m.pointwise_conv.conv.weight) + nn.init.constant_(m.pointwise_conv.bias, 0.0) bias_cls = bias_init_with_prob(0.01) - nn.init.constant_(self.cls_header.pointwise_conv.conv.bias, bias_cls) - nn.init.constant_(self.reg_header.pointwise_conv.conv.bias, 0.0) + variance_scaling_trunc(self.cls_header.depthwise_conv.weight) + variance_scaling_trunc(self.cls_header.pointwise_conv.weight) + nn.init.constant_(self.cls_header.pointwise_conv.bias, bias_cls) + variance_scaling_trunc(self.reg_header.depthwise_conv.weight) + variance_scaling_trunc(self.reg_header.pointwise_conv.weight) + nn.init.constant_(self.reg_header.pointwise_conv.bias, 0.0) def forward_single_bbox(self, feat: Tensor, level_id: int, i: int) -> Tensor: @@ -134,3 +146,71 @@ def forward(self, feats: Tuple[Tensor]) -> tuple: cls_scores.append(cls_score) return cls_scores, bbox_preds + + def loss_by_feat( + self, + cls_scores: List[Tensor], + bbox_preds: List[Tensor], + batch_gt_instances: InstanceList, + batch_img_metas: List[dict], + batch_gt_instances_ignore: OptInstanceList = None) -> dict: + """Calculate the loss based on the features extracted by the detection + head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + has shape (N, num_anchors * num_classes, H, W). + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W). + batch_gt_instances (list[:obj:`InstanceData`]): Batch of + gt_instance. It usually includes ``bboxes`` and ``labels`` + attributes. + batch_img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + batch_gt_instances_ignore (list[:obj:`InstanceData`], optional): + Batch of gt_instances_ignore. It includes ``bboxes`` attribute + data that is ignored during training and testing. + Defaults to None. + + Returns: + dict: A dictionary of loss components. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, batch_img_metas, device=device) + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + batch_gt_instances, + batch_img_metas, + batch_gt_instances_ignore=batch_gt_instances_ignore) + (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, + avg_factor) = cls_reg_targets + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + # concat all level anchors and flags to a single tensor + concat_anchor_list = [] + for i in range(len(anchor_list)): + concat_anchor_list.append(cat_boxes(anchor_list[i])) + all_anchor_list = images_to_levels(concat_anchor_list, + num_level_anchors) + + avg_factor = reduce_mean( + torch.tensor(avg_factor, dtype=torch.float, + device=device)).clamp_(min=1).item() + losses_cls, losses_bbox = multi_apply( + self.loss_by_feat_single, + cls_scores, + bbox_preds, + all_anchor_list, + labels_list, + label_weights_list, + bbox_targets_list, + bbox_weights_list, + avg_factor=avg_factor) + return dict(loss_cls=losses_cls, loss_bbox=losses_bbox) diff --git a/projects/EfficientDet/efficientdet/efficientdet_head_huber.py b/projects/EfficientDet/efficientdet/efficientdet_head_huber.py new file mode 100644 index 00000000000..91f64f3e032 --- /dev/null +++ b/projects/EfficientDet/efficientdet/efficientdet_head_huber.py @@ -0,0 +1,261 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Tuple + +import torch +import torch.nn as nn +from mmcv.cnn.bricks import Swish, build_norm_layer +from mmengine.model import bias_init_with_prob +from torch import Tensor + +from mmdet.models.dense_heads.anchor_head import AnchorHead +from mmdet.models.utils import images_to_levels, multi_apply +from mmdet.registry import MODELS +from mmdet.structures.bbox import cat_boxes, get_box_tensor +from mmdet.utils import (InstanceList, OptConfigType, OptInstanceList, + OptMultiConfig, reduce_mean) +from .utils import DepthWiseConvBlock + + +@MODELS.register_module() +class EfficientDetSepBNHead_Huber(AnchorHead): + """EfficientDetHead with separate BN. + + num_classes (int): Number of categories excluding the background + category. in_channels (int): Number of channels in the input feature map. + feat_channels (int): Number of hidden channels. stacked_convs (int): Number + of repetitions of conv norm_cfg (dict): Config dict for normalization + layer. anchor_generator (dict): Config dict for anchor generator bbox_coder + (dict): Config of bounding box coder. loss_cls (dict): Config of + classification loss. loss_bbox (dict): Config of localization loss. + train_cfg (dict): Training config of anchor head. test_cfg (dict): Testing + config of anchor head. init_cfg (dict or list[dict], optional): + Initialization config dict. + """ + + def __init__(self, + num_classes: int, + num_ins: int, + in_channels: int, + feat_channels: int, + stacked_convs: int = 3, + norm_cfg: OptConfigType = dict( + type='BN', momentum=1e-2, eps=1e-3), + init_cfg: OptMultiConfig = None, + **kwargs) -> None: + self.num_ins = num_ins + self.stacked_convs = stacked_convs + self.norm_cfg = norm_cfg + super().__init__( + num_classes=num_classes, + in_channels=in_channels, + feat_channels=feat_channels, + init_cfg=init_cfg, + **kwargs) + + def _init_layers(self) -> None: + """Initialize layers of the head.""" + self.reg_conv_list = nn.ModuleList() + self.cls_conv_list = nn.ModuleList() + for i in range(self.stacked_convs): + channels = self.in_channels if i == 0 else self.feat_channels + self.reg_conv_list.append( + DepthWiseConvBlock( + channels, self.feat_channels, apply_norm=False)) + self.cls_conv_list.append( + DepthWiseConvBlock( + channels, self.feat_channels, apply_norm=False)) + + self.reg_bn_list = nn.ModuleList([ + nn.ModuleList([ + build_norm_layer( + self.norm_cfg, num_features=self.feat_channels)[1] + for j in range(self.num_ins) + ]) for i in range(self.stacked_convs) + ]) + + self.cls_bn_list = nn.ModuleList([ + nn.ModuleList([ + build_norm_layer( + self.norm_cfg, num_features=self.feat_channels)[1] + for j in range(self.num_ins) + ]) for i in range(self.stacked_convs) + ]) + + self.cls_header = DepthWiseConvBlock( + self.in_channels, + self.num_base_priors * self.cls_out_channels, + apply_norm=False) + self.reg_header = DepthWiseConvBlock( + self.in_channels, self.num_base_priors * 4, apply_norm=False) + self.swish = Swish() + + def init_weights(self) -> None: + """Initialize weights of the head.""" + for m in self.reg_conv_list: + nn.init.constant_(m.pointwise_conv.bias, 0.0) + for m in self.cls_conv_list: + nn.init.constant_(m.pointwise_conv.bias, 0.0) + bias_cls = bias_init_with_prob(0.01) + nn.init.constant_(self.cls_header.pointwise_conv.bias, bias_cls) + nn.init.constant_(self.reg_header.pointwise_conv.bias, 0.0) + + def forward_single_bbox(self, feat: Tensor, level_id: int, + i: int) -> Tensor: + conv_op = self.reg_conv_list[i] + bn = self.reg_bn_list[i][level_id] + + feat = conv_op(feat) + feat = bn(feat) + feat = self.swish(feat) + + return feat + + def forward_single_cls(self, feat: Tensor, level_id: int, + i: int) -> Tensor: + conv_op = self.cls_conv_list[i] + bn = self.cls_bn_list[i][level_id] + + feat = conv_op(feat) + feat = bn(feat) + feat = self.swish(feat) + + return feat + + def forward(self, feats: Tuple[Tensor]) -> tuple: + cls_scores = [] + bbox_preds = [] + for level_id in range(self.num_ins): + feat = feats[level_id] + for i in range(self.stacked_convs): + feat = self.forward_single_bbox(feat, level_id, i) + bbox_pred = self.reg_header(feat) + bbox_preds.append(bbox_pred) + for level_id in range(self.num_ins): + feat = feats[level_id] + for i in range(self.stacked_convs): + feat = self.forward_single_cls(feat, level_id, i) + cls_score = self.cls_header(feat) + cls_scores.append(cls_score) + + return cls_scores, bbox_preds + + def loss_by_feat( + self, + cls_scores: List[Tensor], + bbox_preds: List[Tensor], + batch_gt_instances: InstanceList, + batch_img_metas: List[dict], + batch_gt_instances_ignore: OptInstanceList = None) -> dict: + """Calculate the loss based on the features extracted by the detection + head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + has shape (N, num_anchors * num_classes, H, W). + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W). + batch_gt_instances (list[:obj:`InstanceData`]): Batch of + gt_instance. It usually includes ``bboxes`` and ``labels`` + attributes. + batch_img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + batch_gt_instances_ignore (list[:obj:`InstanceData`], optional): + Batch of gt_instances_ignore. It includes ``bboxes`` attribute + data that is ignored during training and testing. + Defaults to None. + + Returns: + dict: A dictionary of loss components. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, batch_img_metas, device=device) + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + batch_gt_instances, + batch_img_metas, + batch_gt_instances_ignore=batch_gt_instances_ignore) + (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, + avg_factor) = cls_reg_targets + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + # concat all level anchors and flags to a single tensor + concat_anchor_list = [] + for i in range(len(anchor_list)): + concat_anchor_list.append(cat_boxes(anchor_list[i])) + all_anchor_list = images_to_levels(concat_anchor_list, + num_level_anchors) + + avg_factor = reduce_mean( + torch.tensor(avg_factor, dtype=torch.float, + device=device)).clamp_(min=1).item() + losses_cls, losses_bbox = multi_apply( + self.loss_by_feat_single, + cls_scores, + bbox_preds, + all_anchor_list, + labels_list, + label_weights_list, + bbox_targets_list, + bbox_weights_list, + avg_factor=avg_factor) + return dict(loss_cls=losses_cls, loss_bbox=losses_bbox) + + def loss_by_feat_single(self, cls_score: Tensor, bbox_pred: Tensor, + anchors: Tensor, labels: Tensor, + label_weights: Tensor, bbox_targets: Tensor, + bbox_weights: Tensor, avg_factor: int) -> tuple: + """Calculate the loss of a single scale level based on the features + extracted by the detection head. + + Args: + cls_score (Tensor): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W). + bbox_pred (Tensor): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W). + anchors (Tensor): Box reference for each scale level with shape + (N, num_total_anchors, 4). + labels (Tensor): Labels of each anchors with shape + (N, num_total_anchors). + label_weights (Tensor): Label weights of each anchor with shape + (N, num_total_anchors) + bbox_targets (Tensor): BBox regression targets of each anchor + weight shape (N, num_total_anchors, 4). + bbox_weights (Tensor): BBox regression loss weights of each anchor + with shape (N, num_total_anchors, 4). + avg_factor (int): Average factor that is used to average the loss. + + Returns: + tuple: loss components. + """ + + # classification loss + labels = labels.reshape(-1) + label_weights = label_weights.reshape(-1) + cls_score = cls_score.permute(0, 2, 3, + 1).reshape(-1, self.cls_out_channels) + loss_cls = self.loss_cls( + cls_score, labels, label_weights, avg_factor=avg_factor) + # regression loss + target_dim = bbox_targets.size(-1) + bbox_targets = bbox_targets.reshape(-1, target_dim) + bbox_weights = bbox_weights.reshape(-1, target_dim) + bbox_pred = bbox_pred.permute(0, 2, 3, + 1).reshape(-1, + self.bbox_coder.encode_size) + if self.reg_decoded_bbox: + # When the regression loss (e.g. `IouLoss`, `GIouLoss`) + # is applied directly on the decoded bounding boxes, it + # decodes the already encoded coordinates to absolute format. + anchors = anchors.reshape(-1, anchors.size(-1)) + bbox_pred = self.bbox_coder.decode(anchors, bbox_pred) + bbox_pred = get_box_tensor(bbox_pred) + loss_bbox = self.loss_bbox( + bbox_pred, bbox_targets, bbox_weights, avg_factor=avg_factor * 4) + return loss_cls, loss_bbox diff --git a/projects/EfficientDet/efficientdet/huber_loss.py b/projects/EfficientDet/efficientdet/huber_loss.py new file mode 100644 index 00000000000..055f34024d5 --- /dev/null +++ b/projects/EfficientDet/efficientdet/huber_loss.py @@ -0,0 +1,91 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional + +import torch +import torch.nn as nn +from torch import Tensor + +from mmdet.models.losses.utils import weighted_loss +from mmdet.registry import MODELS + + +@weighted_loss +def huber_loss(pred: Tensor, target: Tensor, beta: float = 1.0) -> Tensor: + """Smooth L1 loss. + + Args: + pred (Tensor): The prediction. + target (Tensor): The learning target of the prediction. + beta (float, optional): The threshold in the piecewise function. + Defaults to 1.0. + + Returns: + Tensor: Calculated loss + """ + assert beta > 0 + if target.numel() == 0: + return pred.sum() * 0 + + assert pred.size() == target.size() + diff = torch.abs(pred - target) + loss = torch.where(diff < beta, 0.5 * diff * diff, + beta * diff - 0.5 * beta * beta) + return loss + + +@MODELS.register_module() +class HuberLoss(nn.Module): + """Smooth L1 loss. + + Args: + beta (float, optional): The threshold in the piecewise function. + Defaults to 1.0. + reduction (str, optional): The method to reduce the loss. + Options are "none", "mean" and "sum". Defaults to "mean". + loss_weight (float, optional): The weight of loss. + """ + + def __init__(self, + beta: float = 1.0, + reduction: str = 'mean', + loss_weight: float = 1.0) -> None: + super().__init__() + self.beta = beta + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred: Tensor, + target: Tensor, + weight: Optional[Tensor] = None, + avg_factor: Optional[int] = None, + reduction_override: Optional[str] = None, + **kwargs) -> Tensor: + """Forward function. + + Args: + pred (Tensor): The prediction. + target (Tensor): The learning target of the prediction. + weight (Tensor, optional): The weight of loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Defaults to None. + + Returns: + Tensor: Calculated loss + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss_bbox = self.loss_weight * huber_loss( + pred, + target, + weight, + beta=self.beta, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss_bbox diff --git a/projects/EfficientDet/efficientdet/utils.py b/projects/EfficientDet/efficientdet/utils.py index 5fc898a64a7..9c30a01fc8b 100644 --- a/projects/EfficientDet/efficientdet/utils.py +++ b/projects/EfficientDet/efficientdet/utils.py @@ -1,4 +1,3 @@ -# Copyright (c) OpenMMLab. All rights reserved. import math from typing import Tuple, Union @@ -6,67 +5,49 @@ import torch.nn as nn from mmcv.cnn.bricks import Swish, build_norm_layer from torch.nn import functional as F +from torch.nn.init import _calculate_fan_in_and_fan_out, trunc_normal_ +from mmdet.registry import MODELS from mmdet.utils import OptConfigType -class SwishImplementation(torch.autograd.Function): +def variance_scaling_trunc(tensor, gain=1.): + fan_in, _ = _calculate_fan_in_and_fan_out(tensor) + gain /= max(1.0, fan_in) + std = math.sqrt(gain) / .87962566103423978 + return trunc_normal_(tensor, 0., std) - @staticmethod - def forward(ctx, i): - result = i * torch.sigmoid(i) - ctx.save_for_backward(i) - return result - @staticmethod - def backward(ctx, grad_output): - i = ctx.saved_variables[0] - sigmoid_i = torch.sigmoid(i) - return grad_output * (sigmoid_i * (1 + i * (1 - sigmoid_i))) - - -class MemoryEfficientSwish(nn.Module): - - def forward(self, x): - return SwishImplementation.apply(x) - - -class Conv2dSamePadding(nn.Module): +@MODELS.register_module() +class Conv2dSamePadding(nn.Conv2d): def __init__(self, in_channels: int, out_channels: int, kernel_size: Union[int, Tuple[int, int]], stride: Union[int, Tuple[int, int]] = 1, + padding: Union[int, Tuple[int, int]] = 0, + dilation: Union[int, Tuple[int, int]] = 1, groups: int = 1, bias: bool = True): - super().__init__() - self.conv = nn.Conv2d( - in_channels, - out_channels, - kernel_size, - stride=stride, - bias=bias, - groups=groups) - self.stride = self.conv.stride - self.kernel_size = self.conv.kernel_size - - def forward(self, x): - h, w = x.shape[-2:] - extra_h = (math.ceil(w / self.stride[1]) - - 1) * self.stride[1] - w + self.kernel_size[1] - extra_v = (math.ceil(h / self.stride[0]) - - 1) * self.stride[0] - h + self.kernel_size[0] - - left = extra_h // 2 - right = extra_h - left - top = extra_v // 2 - bottom = extra_v - top - + super().__init__(in_channels, out_channels, kernel_size, stride, 0, + dilation, groups, bias) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + img_h, img_w = x.size()[-2:] + kernel_h, kernel_w = self.weight.size()[-2:] + extra_w = (math.ceil(img_w / self.stride[1]) - + 1) * self.stride[1] - img_w + kernel_w + extra_h = (math.ceil(img_h / self.stride[0]) - + 1) * self.stride[0] - img_h + kernel_h + + left = extra_w // 2 + right = extra_w - left + top = extra_h // 2 + bottom = extra_h - top x = F.pad(x, [left, right, top, bottom]) - x = self.conv(x) - - return x + return F.conv2d(x, self.weight, self.bias, self.stride, self.padding, + self.dilation, self.groups) class MaxPool2dSamePadding(nn.Module): @@ -112,7 +93,6 @@ def __init__( out_channels: int, apply_norm: bool = True, conv_bn_act_pattern: bool = False, - use_meswish: bool = True, norm_cfg: OptConfigType = dict(type='BN', momentum=1e-2, eps=1e-3) ) -> None: super(DepthWiseConvBlock, self).__init__() @@ -132,7 +112,7 @@ def __init__( self.apply_activation = conv_bn_act_pattern if self.apply_activation: - self.swish = MemoryEfficientSwish() if use_meswish else Swish() + self.swish = Swish() def forward(self, x): x = self.depthwise_conv(x) @@ -153,7 +133,6 @@ def __init__( out_channels: int, apply_norm: bool = True, conv_bn_act_pattern: bool = False, - use_meswish: bool = True, norm_cfg: OptConfigType = dict(type='BN', momentum=1e-2, eps=1e-3) ) -> None: super(DownChannelBlock, self).__init__() @@ -163,7 +142,7 @@ def __init__( self.bn = build_norm_layer(norm_cfg, num_features=out_channels)[1] self.apply_activation = conv_bn_act_pattern if self.apply_activation: - self.swish = MemoryEfficientSwish() if use_meswish else Swish() + self.swish = Swish() def forward(self, x): x = self.down_conv(x) diff --git a/projects/EfficientDet/efficientdet/yxyx_bbox_coder.py b/projects/EfficientDet/efficientdet/yxyx_bbox_coder.py index 63e233002ee..c637f59e94c 100644 --- a/projects/EfficientDet/efficientdet/yxyx_bbox_coder.py +++ b/projects/EfficientDet/efficientdet/yxyx_bbox_coder.py @@ -38,26 +38,7 @@ def decode(self, pred_bboxes, max_shape=None, wh_ratio_clip=16 / 1000): - """Apply transformation `pred_bboxes` to `boxes`. - Args: - bboxes (torch.Tensor or :obj:`BaseBoxes`): Basic boxes. Shape - (B, N, 4) or (N, 4) - pred_bboxes (Tensor): Encoded offsets with respect to each roi. - Has shape (B, N, num_classes * 4) or (B, N, 4) or - (N, num_classes * 4) or (N, 4). Note N = num_anchors * W * H - when rois is a grid of anchors.Offset encoding follows [1]_. - max_shape (Sequence[int] or torch.Tensor or Sequence[ - Sequence[int]],optional): Maximum bounds for boxes, specifies - (H, W, C) or (H, W). If bboxes shape is (B, N, 4), then - the max_shape should be a Sequence[Sequence[int]] - and the length of max_shape should also be B. - wh_ratio_clip (float, optional): The allowed ratio between - width and height. - - Returns: - Union[torch.Tensor, :obj:`BaseBoxes`]: Decoded boxes. - """ bboxes = get_box_tensor(bboxes) assert pred_bboxes.size(0) == bboxes.size(0) if pred_bboxes.ndim == 3: From 3f3a3e7d50bf775dc034c2231fbb6c202b9d5f72 Mon Sep 17 00:00:00 2001 From: zwhus <1062894314zwh@gmail.com> Date: Fri, 17 Feb 2023 14:26:30 +0800 Subject: [PATCH 02/13] efficientdet --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 55ad113be46..291099280da 100644 --- a/.gitignore +++ b/.gitignore @@ -121,3 +121,6 @@ work_dirs/ *.pth *.py~ *.sh~ + +vitdet +dev_bifpn From 2c5b486310f5e714f223c0bd0b450526159eabbb Mon Sep 17 00:00:00 2001 From: zwhus <1062894314zwh@gmail.com> Date: Tue, 21 Feb 2023 15:45:16 +0800 Subject: [PATCH 03/13] efficientdet --- projects/EfficientDet/README.md | 114 ++++++ projects/EfficientDet/configs/d0.py | 164 -------- projects/EfficientDet/configs/d0_90_xy.py | 164 -------- projects/EfficientDet/configs/d0_huber.py | 167 --------- projects/EfficientDet/configs/d0_xy.py | 168 --------- ...et_effb0_bifpn_8xb16-crop512-300e_coco.py} | 3 +- ...et_effb3_bifpn_8xb16-crop896-300e_coco.py} | 0 ...k2former_r50_8xb2-lsj-50e_coco-panoptic.py | 241 ------------ projects/EfficientDet/configs/mask_fpn.py | 240 ------------ projects/EfficientDet/configs/retinanet.py | 119 ------ .../EfficientDet/efficientdet/__init__.py | 10 +- .../__pycache__/__init__.cpython-37.pyc | Bin 868 -> 587 bytes .../anchor_generator.cpython-37.pyc | Bin 2831 -> 2831 bytes .../__pycache__/bifpn.cpython-37.pyc | Bin 6544 -> 6544 bytes .../__pycache__/coco_90class.cpython-37.pyc | Bin 6437 -> 6437 bytes .../__pycache__/coco_90metric.cpython-37.pyc | Bin 15187 -> 15187 bytes .../__pycache__/efficientdet.cpython-37.pyc | Bin 986 -> 986 bytes .../efficientdet_head.cpython-37.pyc | Bin 7803 -> 7768 bytes .../efficientdet_head_huber.cpython-37.pyc | Bin 9488 -> 9467 bytes .../__pycache__/huber_loss.cpython-37.pyc | Bin 2963 -> 2963 bytes .../__pycache__/utils.cpython-37.pyc | Bin 4822 -> 4822 bytes .../yxyx_bbox_coder.cpython-37.pyc | Bin 11605 -> 11605 bytes .../efficientdet/anchor_generator.py | 96 ----- .../__pycache__/__init__.cpython-37.pyc | Bin 299 -> 299 bytes .../__pycache__/coco_api.cpython-37.pyc | Bin 4839 -> 4839 bytes .../efficientdet/efficientdet_head.py | 216 ----------- .../efficientdet/efficientdet_head_huber.py | 4 +- .../efficientdet/trans_max_iou_assigner.py | 110 ------ .../efficientdet/yxyx_bbox_coder.py | 350 ------------------ 29 files changed, 119 insertions(+), 2047 deletions(-) create mode 100644 projects/EfficientDet/README.md delete mode 100644 projects/EfficientDet/configs/d0.py delete mode 100644 projects/EfficientDet/configs/d0_90_xy.py delete mode 100644 projects/EfficientDet/configs/d0_huber.py delete mode 100644 projects/EfficientDet/configs/d0_xy.py rename projects/EfficientDet/configs/{d0_huber_clip.py => efficientdet_effb0_bifpn_8xb16-crop512-300e_coco.py} (98%) rename projects/EfficientDet/configs/{d3.py => efficientdet_effb3_bifpn_8xb16-crop896-300e_coco.py} (100%) delete mode 100644 projects/EfficientDet/configs/mask2former_r50_8xb2-lsj-50e_coco-panoptic.py delete mode 100644 projects/EfficientDet/configs/mask_fpn.py delete mode 100644 projects/EfficientDet/configs/retinanet.py delete mode 100644 projects/EfficientDet/efficientdet/anchor_generator.py delete mode 100644 projects/EfficientDet/efficientdet/efficientdet_head.py delete mode 100644 projects/EfficientDet/efficientdet/trans_max_iou_assigner.py delete mode 100644 projects/EfficientDet/efficientdet/yxyx_bbox_coder.py diff --git a/projects/EfficientDet/README.md b/projects/EfficientDet/README.md new file mode 100644 index 00000000000..e7401830bfb --- /dev/null +++ b/projects/EfficientDet/README.md @@ -0,0 +1,114 @@ +# EfficientDet + +> [**EfficientDet: Scalable and Efficient Object Detection**](https://arxiv.org/pdf/1911.09070.pdf), +> Mingxing Tan, Ruoming Pang, Quoc V. Le, +> *CVPR 2020* + +## Abstract + +This is an implementation of [EfficientDet](https://github.com/google/automl) based on [MMDetection](https://github.com/open-mmlab/mmdetection/tree/3.x), [MMCV](https://github.com/open-mmlab/mmcv), and [MMEngine](https://github.com/open-mmlab/mmengine). +
+EfficientDet a new family of object detectors, which consistently achieve much better efficiency than prior art across a wide +spectrum of resource constraints. +In particular, with single model and single-scale, EfficientDet-D7 achieves stateof-the-art 55.1 AP on COCO test-dev with 77M parameters and 410B FLOP. +
+BiFPN is a simple yet highly effective weighted bi-directional feature pyramid network, which introduces learnable weights to learn the importance of different input features, while repeatedly applying topdown and bottom-up multi-scale feature fusion. +
+In contrast to other feature pyramid network, such as FPN, FPN + PAN, NAS-FPN, BiFPN achieves the best accuracy with fewer parameters and FLOPs. + +
+ +
+ +## Usage + +### Training command + +In MMDetection's root directory, run the following command for single-gpu training: + +```bash +python tools/train.py projects/EfficientDet/configs/efficientdet_effb3_bifpn_8xb16-crop896-300e_coco.py +``` + +### Testing commands + +In MMDetection's root directory, run the following command to test the model: + +```bash +python tools/test.py projects/EfficientDet/configs/efficientdet_effb3_bifpn_8xb16-crop896-300e_coco.py ${CHECKPOINT_PATH} +``` + +## Results + +Based on mmdetection, this project aligns the accuracy of the [official model](https://github.com/google/automl). + +| Method | Backbone | Pretrained Model | Training set | Test set | Epoch | Val Box AP | Official AP | Download | +| :------------------------------------------------------------------------------: | :-------------: | :--------------: | :------------: | :----------: | :---: | :--------: | :---------: | :------: | +| [efficientdet-d3](./configs/efficientdet_effb3_bifpn_8xb16-crop896-300e_coco.py) | efficientnet-b3 | ImageNet | COCO2017 Train | COCO2017 Val | 300 | 47.2 | 46.8 | model() | + +## Citation + +```BibTeX +@inproceedings{tan2020efficientdet, + title={Efficientdet: Scalable and efficient object detection}, + author={Tan, Mingxing and Pang, Ruoming and Le, Quoc V}, + booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, + pages={10781--10790}, + year={2020} +} +``` + +## Checklist + + + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + + + - [x] Basic docstrings & proper citation + + + + - [x] Test-time correctness + + + + - [x] A full README + + + +- [x] Milestone 2: Indicates a successful model implementation. + + - [x] Training-time correctness + + + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + + + - [ ] Unit tests + + + + - [ ] Code polishing + + + + - [ ] Metafile.yml + + + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + + + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/projects/EfficientDet/configs/d0.py b/projects/EfficientDet/configs/d0.py deleted file mode 100644 index d749ab9e885..00000000000 --- a/projects/EfficientDet/configs/d0.py +++ /dev/null @@ -1,164 +0,0 @@ -_base_ = [ - 'mmdet::_base_/datasets/coco_detection.py', - 'mmdet::_base_/schedules/schedule_1x.py', - 'mmdet::_base_/default_runtime.py' -] -custom_imports = dict( - imports=['projects.EfficientDet.efficientdet'], allow_failed_imports=False) - -image_size = 512 -datasettype = 'Coco90Dataset' -evalute_type = 'Coco90Metric' -batch_augments = [ - dict(type='BatchFixedSizePad', size=(image_size, image_size)) -] -norm_cfg = dict(type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01) -checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k_20220119-26434485.pth' # noqa -model = dict( - type='EfficientDet', - data_preprocessor=dict( - type='DetDataPreprocessor', - mean=[123.675, 116.28, 103.53], - std=[58.395, 57.12, 57.375], - bgr_to_rgb=True, - pad_size_divisor=image_size, - batch_augments=batch_augments), - backbone=dict( - type='EfficientNet', - arch='b0', - drop_path_rate=0.2, - out_indices=(3, 4, 5), - frozen_stages=0, - norm_cfg=norm_cfg, - norm_eval=False, - init_cfg=dict( - type='Pretrained', prefix='backbone', checkpoint=checkpoint)), - neck=dict( - type='BiFPN', - num_stages=3, - in_channels=[40, 112, 320], - out_channels=64, - start_level=0, - norm_cfg=norm_cfg), - bbox_head=dict( - type='EfficientDetSepBNHead', - num_classes=90, - num_ins=5, - in_channels=64, - feat_channels=64, - stacked_convs=3, - norm_cfg=norm_cfg, - anchor_generator=dict( - type='YXYXAnchorGenerator', - octave_base_scale=4, - scales_per_octave=3, - ratios=[1.0, 0.5, 2.0], - strides=[8, 16, 32, 64, 128], - center_offset=0.5), - bbox_coder=dict( - type='YXYXDeltaXYWHBBoxCoder', - target_means=[.0, .0, .0, .0], - target_stds=[1.0, 1.0, 1.0, 1.0]), - loss_cls=dict( - type='FocalLoss', - use_sigmoid=True, - gamma=2.0, - alpha=0.25, - loss_weight=1.0), - loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0)), - # training and testing settings - train_cfg=dict( - assigner=dict( - type='TransMaxIoUAssigner', - pos_iou_thr=0.5, - neg_iou_thr=0.5, - min_pos_iou=0, - ignore_iof_thr=-1), - sampler=dict( - type='PseudoSampler'), # Focal loss should use PseudoSampler - allowed_border=-1, - pos_weight=-1, - debug=False), - test_cfg=dict( - nms_pre=1000, - min_bbox_size=0, - score_thr=0.05, - nms=dict( - type='soft_nms', - iou_threshold=0.3, - sigma=0.5, - min_score=1e-3, - method='gaussian'), - max_per_img=100)) - -# dataset settings -train_pipeline = [ - dict( - type='LoadImageFromFile', - file_client_args={{_base_.file_client_args}}), - dict(type='LoadAnnotations', with_bbox=True), - dict( - type='RandomResize', - scale=(image_size, image_size), - ratio_range=(0.1, 2.0), - keep_ratio=True), - dict(type='RandomCrop', crop_size=(image_size, image_size)), - dict(type='RandomFlip', prob=0.5), - dict(type='PackDetInputs') -] -test_pipeline = [ - dict( - type='LoadImageFromFile', - file_client_args={{_base_.file_client_args}}), - dict(type='Resize', scale=(image_size, image_size), keep_ratio=True), - dict(type='LoadAnnotations', with_bbox=True), - dict( - type='PackDetInputs', - meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', - 'scale_factor')) -] - -train_dataloader = dict( - batch_size=16, - num_workers=16, - dataset=dict(type=datasettype, pipeline=train_pipeline)) -val_dataloader = dict(dataset=dict(type=datasettype, pipeline=test_pipeline)) -test_dataloader = val_dataloader - -val_evaluator = dict(type='Coco90Metric') -test_evaluator = val_evaluator - -optim_wrapper = dict( - optimizer=dict(lr=0.16), - paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) - -# learning policy -max_epochs = 300 -param_scheduler = [ - dict(type='LinearLR', start_factor=0.1, by_epoch=False, begin=0, end=917), - dict( - type='CosineAnnealingLR', - eta_min=0.0016, - begin=1, - T_max=284, - end=285, - by_epoch=True, - convert_to_iter_based=True) -] -train_cfg = dict(max_epochs=max_epochs, val_interval=1) - -vis_backends = [ - dict(type='LocalVisBackend'), - dict(type='TensorboardVisBackend') -] -visualizer = dict( - type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer') - -default_hooks = dict(checkpoint=dict(type='CheckpointHook', interval=15)) -# cudnn_benchmark=True can accelerate fix-size training -env_cfg = dict(cudnn_benchmark=True) - -# NOTE: `auto_scale_lr` is for automatically scaling LR, -# USER SHOULD NOT CHANGE ITS VALUES. -# base_batch_size = (8 GPUs) x (32 samples per GPU) -auto_scale_lr = dict(base_batch_size=128) diff --git a/projects/EfficientDet/configs/d0_90_xy.py b/projects/EfficientDet/configs/d0_90_xy.py deleted file mode 100644 index 1eb198a6a66..00000000000 --- a/projects/EfficientDet/configs/d0_90_xy.py +++ /dev/null @@ -1,164 +0,0 @@ -_base_ = [ - 'mmdet::_base_/datasets/coco_detection.py', - 'mmdet::_base_/schedules/schedule_1x.py', - 'mmdet::_base_/default_runtime.py' -] -custom_imports = dict( - imports=['projects.EfficientDet.efficientdet'], allow_failed_imports=False) - -image_size = 512 -dataset_type = 'Coco90Dataset' -evalute_type = 'Coco90Metric' -batch_augments = [ - dict(type='BatchFixedSizePad', size=(image_size, image_size)) -] -norm_cfg = dict(type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01) -checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k_20220119-26434485.pth' # noqa -model = dict( - type='EfficientDet', - data_preprocessor=dict( - type='DetDataPreprocessor', - mean=[123.675, 116.28, 103.53], - std=[58.395, 57.12, 57.375], - bgr_to_rgb=True, - pad_size_divisor=image_size, - batch_augments=batch_augments), - backbone=dict( - type='EfficientNet', - arch='b0', - drop_path_rate=0.2, - out_indices=(3, 4, 5), - frozen_stages=0, - norm_cfg=norm_cfg, - norm_eval=False, - init_cfg=dict( - type='Pretrained', prefix='backbone', checkpoint=checkpoint)), - neck=dict( - type='BiFPN', - num_stages=3, - in_channels=[40, 112, 320], - out_channels=64, - start_level=0, - norm_cfg=norm_cfg), - bbox_head=dict( - type='EfficientDetSepBNHead', - num_classes=90, - num_ins=5, - in_channels=64, - feat_channels=64, - stacked_convs=3, - norm_cfg=norm_cfg, - anchor_generator=dict( - type='AnchorGenerator', - octave_base_scale=4, - scales_per_octave=3, - ratios=[1.0, 0.5, 2.0], - strides=[8, 16, 32, 64, 128], - center_offset=0.5), - bbox_coder=dict( - type='DeltaXYWHBBoxCoder', - target_means=[.0, .0, .0, .0], - target_stds=[1.0, 1.0, 1.0, 1.0]), - loss_cls=dict( - type='FocalLoss', - use_sigmoid=True, - gamma=2.0, - alpha=0.25, - loss_weight=1.0), - loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0)), - # training and testing settings - train_cfg=dict( - assigner=dict( - type='MaxIoUAssigner', - pos_iou_thr=0.5, - neg_iou_thr=0.5, - min_pos_iou=0, - ignore_iof_thr=-1), - sampler=dict( - type='PseudoSampler'), # Focal loss should use PseudoSampler - allowed_border=-1, - pos_weight=-1, - debug=False), - test_cfg=dict( - nms_pre=1000, - min_bbox_size=0, - score_thr=0.05, - nms=dict( - type='soft_nms', - iou_threshold=0.3, - sigma=0.5, - min_score=1e-3, - method='gaussian'), - max_per_img=100)) - -# dataset settings -train_pipeline = [ - dict( - type='LoadImageFromFile', - file_client_args={{_base_.file_client_args}}), - dict(type='LoadAnnotations', with_bbox=True), - dict( - type='RandomResize', - scale=(image_size, image_size), - ratio_range=(0.1, 2.0), - keep_ratio=True), - dict(type='RandomCrop', crop_size=(image_size, image_size)), - dict(type='RandomFlip', prob=0.5), - dict(type='PackDetInputs') -] -test_pipeline = [ - dict( - type='LoadImageFromFile', - file_client_args={{_base_.file_client_args}}), - dict(type='Resize', scale=(image_size, image_size), keep_ratio=True), - dict(type='LoadAnnotations', with_bbox=True), - dict( - type='PackDetInputs', - meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', - 'scale_factor')) -] - -train_dataloader = dict( - batch_size=16, - num_workers=16, - dataset=dict(type=dataset_type, pipeline=train_pipeline)) -val_dataloader = dict(dataset=dict(type=dataset_type, pipeline=test_pipeline)) -test_dataloader = val_dataloader - -val_evaluator = dict(type='Coco90Metric') -test_evaluator = val_evaluator - -optim_wrapper = dict( - optimizer=dict(lr=0.16), - paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) - -# learning policy -max_epochs = 300 -param_scheduler = [ - dict(type='LinearLR', start_factor=0.1, by_epoch=False, begin=0, end=917), - dict( - type='CosineAnnealingLR', - eta_min=0.0016, - begin=1, - T_max=284, - end=285, - by_epoch=True, - convert_to_iter_based=True) -] -train_cfg = dict(max_epochs=max_epochs, val_interval=1) - -vis_backends = [ - dict(type='LocalVisBackend'), - dict(type='TensorboardVisBackend') -] -visualizer = dict( - type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer') - -default_hooks = dict(checkpoint=dict(type='CheckpointHook', interval=15)) -# cudnn_benchmark=True can accelerate fix-size training -env_cfg = dict(cudnn_benchmark=True) - -# NOTE: `auto_scale_lr` is for automatically scaling LR, -# USER SHOULD NOT CHANGE ITS VALUES. -# base_batch_size = (8 GPUs) x (32 samples per GPU) -auto_scale_lr = dict(base_batch_size=128) diff --git a/projects/EfficientDet/configs/d0_huber.py b/projects/EfficientDet/configs/d0_huber.py deleted file mode 100644 index 84bf280b437..00000000000 --- a/projects/EfficientDet/configs/d0_huber.py +++ /dev/null @@ -1,167 +0,0 @@ -_base_ = [ - 'mmdet::_base_/datasets/coco_detection.py', - 'mmdet::_base_/schedules/schedule_1x.py', - 'mmdet::_base_/default_runtime.py' -] -custom_imports = dict( - imports=['projects.EfficientDet.efficientdet'], allow_failed_imports=False) - -image_size = 512 -batch_augments = [ - dict(type='BatchFixedSizePad', size=(image_size, image_size)) -] -norm_cfg = dict(type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01) -checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k_20220119-26434485.pth' # noqa -model = dict( - type='EfficientDet', - data_preprocessor=dict( - type='DetDataPreprocessor', - mean=[123.675, 116.28, 103.53], - std=[58.395, 57.12, 57.375], - bgr_to_rgb=True, - pad_size_divisor=image_size, - batch_augments=batch_augments), - backbone=dict( - type='EfficientNet', - arch='b0', - drop_path_rate=0.2, - out_indices=(3, 4, 5), - frozen_stages=0, - conv_cfg=dict(type='Conv2dSamePadding'), - norm_cfg=norm_cfg, - norm_eval=False, - init_cfg=dict( - type='Pretrained', prefix='backbone', checkpoint=checkpoint)), - neck=dict( - type='BiFPN', - num_stages=3, - in_channels=[40, 112, 320], - out_channels=64, - start_level=0, - norm_cfg=norm_cfg), - bbox_head=dict( - type='EfficientDetSepBNHead_Huber', - num_classes=80, - num_ins=5, - in_channels=64, - feat_channels=64, - stacked_convs=3, - norm_cfg=norm_cfg, - anchor_generator=dict( - type='AnchorGenerator', - octave_base_scale=4, - scales_per_octave=3, - ratios=[1.0, 0.5, 2.0], - strides=[8, 16, 32, 64, 128], - center_offset=0.5), - bbox_coder=dict( - type='DeltaXYWHBBoxCoder', - target_means=[.0, .0, .0, .0], - target_stds=[1.0, 1.0, 1.0, 1.0]), - loss_cls=dict( - type='FocalLoss', - use_sigmoid=True, - gamma=1.5, - alpha=0.25, - loss_weight=1.0), - loss_bbox=dict(type='HuberLoss', beta=0.1, loss_weight=50)), - # training and testing settings - train_cfg=dict( - assigner=dict( - type='MaxIoUAssigner', - pos_iou_thr=0.5, - neg_iou_thr=0.5, - min_pos_iou=0, - ignore_iof_thr=-1), - sampler=dict( - type='PseudoSampler'), # Focal loss should use PseudoSampler - allowed_border=-1, - pos_weight=-1, - debug=False), - test_cfg=dict( - nms_pre=1000, - min_bbox_size=0, - score_thr=0.05, - nms=dict( - type='soft_nms', - iou_threshold=0.3, - sigma=0.5, - min_score=1e-3, - method='gaussian'), - max_per_img=100)) - -# dataset settings -train_pipeline = [ - dict( - type='LoadImageFromFile', - file_client_args={{_base_.file_client_args}}), - dict(type='LoadAnnotations', with_bbox=True), - dict( - type='RandomResize', - scale=(image_size, image_size), - ratio_range=(0.1, 2.0), - keep_ratio=True), - dict(type='RandomCrop', crop_size=(image_size, image_size)), - dict(type='RandomFlip', prob=0.5), - dict(type='PackDetInputs') -] -test_pipeline = [ - dict( - type='LoadImageFromFile', - file_client_args={{_base_.file_client_args}}), - dict(type='Resize', scale=(image_size, image_size), keep_ratio=True), - dict(type='LoadAnnotations', with_bbox=True), - dict( - type='PackDetInputs', - meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', - 'scale_factor')) -] - -train_dataloader = dict( - batch_size=16, num_workers=16, dataset=dict(pipeline=train_pipeline)) -val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) -test_dataloader = val_dataloader - -optim_wrapper = dict( - optimizer=dict(lr=0.16, weight_decay=4e-5), - paramwise_cfg=dict( - norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True)) - -# learning policy -max_epochs = 300 -param_scheduler = [ - dict(type='LinearLR', start_factor=0.1, by_epoch=False, begin=0, end=917), - dict( - type='CosineAnnealingLR', - eta_min=0.0, - begin=1, - T_max=299, - end=300, - by_epoch=True, - convert_to_iter_based=True) -] -train_cfg = dict(max_epochs=max_epochs, val_interval=1) - -vis_backends = [ - dict(type='LocalVisBackend'), - dict(type='TensorboardVisBackend') -] -visualizer = dict( - type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer') - -default_hooks = dict(checkpoint=dict(type='CheckpointHook', interval=15)) -custom_hooks = [ - dict( - type='EMAHook', - ema_type='ExpMomentumEMA', - momentum=0.0002, - update_buffers=True, - priority=49) -] -# cudnn_benchmark=True can accelerate fix-size training -env_cfg = dict(cudnn_benchmark=True) - -# NOTE: `auto_scale_lr` is for automatically scaling LR, -# USER SHOULD NOT CHANGE ITS VALUES. -# base_batch_size = (8 GPUs) x (32 samples per GPU) -auto_scale_lr = dict(base_batch_size=128) diff --git a/projects/EfficientDet/configs/d0_xy.py b/projects/EfficientDet/configs/d0_xy.py deleted file mode 100644 index c2afcd1e287..00000000000 --- a/projects/EfficientDet/configs/d0_xy.py +++ /dev/null @@ -1,168 +0,0 @@ -_base_ = [ - 'mmdet::_base_/datasets/coco_detection.py', - 'mmdet::_base_/schedules/schedule_1x.py', - 'mmdet::_base_/default_runtime.py' -] -custom_imports = dict( - imports=['projects.EfficientDet.efficientdet'], allow_failed_imports=False) - -image_size = 512 -batch_augments = [ - dict(type='BatchFixedSizePad', size=(image_size, image_size)) -] -norm_cfg = dict(type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01) -checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k_20220119-26434485.pth' # noqa -model = dict( - type='EfficientDet', - data_preprocessor=dict( - type='DetDataPreprocessor', - mean=[123.675, 116.28, 103.53], - std=[58.395, 57.12, 57.375], - bgr_to_rgb=True, - pad_size_divisor=image_size, - batch_augments=batch_augments), - backbone=dict( - type='EfficientNet', - arch='b0', - drop_path_rate=0.2, - out_indices=(3, 4, 5), - frozen_stages=0, - conv_cfg=dict(type='Conv2dSamePadding'), - norm_cfg=norm_cfg, - norm_eval=False, - init_cfg=dict( - type='Pretrained', prefix='backbone', checkpoint=checkpoint)), - neck=dict( - type='BiFPN', - num_stages=3, - in_channels=[40, 112, 320], - out_channels=64, - start_level=0, - norm_cfg=norm_cfg), - bbox_head=dict( - type='EfficientDetSepBNHead', - num_classes=80, - num_ins=5, - in_channels=64, - feat_channels=64, - stacked_convs=3, - norm_cfg=norm_cfg, - anchor_generator=dict( - type='AnchorGenerator', - octave_base_scale=4, - scales_per_octave=3, - ratios=[1.0, 0.5, 2.0], - strides=[8, 16, 32, 64, 128], - center_offset=0.5), - bbox_coder=dict( - type='DeltaXYWHBBoxCoder', - target_means=[.0, .0, .0, .0], - target_stds=[1.0, 1.0, 1.0, 1.0]), - loss_cls=dict( - type='FocalLoss', - use_sigmoid=True, - gamma=2.0, - alpha=0.25, - loss_weight=1.0), - loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0)), - # training and testing settings - train_cfg=dict( - assigner=dict( - type='MaxIoUAssigner', - pos_iou_thr=0.5, - neg_iou_thr=0.5, - min_pos_iou=0, - ignore_iof_thr=-1), - sampler=dict( - type='PseudoSampler'), # Focal loss should use PseudoSampler - allowed_border=-1, - pos_weight=-1, - debug=False), - test_cfg=dict( - nms_pre=1000, - min_bbox_size=0, - score_thr=0.05, - nms=dict( - type='soft_nms', - iou_threshold=0.3, - sigma=0.5, - min_score=1e-3, - method='gaussian'), - max_per_img=100)) - -# dataset settings -train_pipeline = [ - dict( - type='LoadImageFromFile', - file_client_args={{_base_.file_client_args}}), - dict(type='LoadAnnotations', with_bbox=True), - dict( - type='RandomResize', - scale=(image_size, image_size), - ratio_range=(0.1, 2.0), - keep_ratio=True), - dict(type='RandomCrop', crop_size=(image_size, image_size)), - dict(type='RandomFlip', prob=0.5), - dict(type='PackDetInputs') -] -test_pipeline = [ - dict( - type='LoadImageFromFile', - file_client_args={{_base_.file_client_args}}), - dict(type='Resize', scale=(image_size, image_size), keep_ratio=True), - dict(type='LoadAnnotations', with_bbox=True), - dict( - type='PackDetInputs', - meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', - 'scale_factor')) -] - -train_dataloader = dict( - batch_size=16, num_workers=16, dataset=dict(pipeline=train_pipeline)) -val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) -test_dataloader = val_dataloader - -optim_wrapper = dict( - optimizer=dict(lr=0.16, weight_decay=4e-5), - paramwise_cfg=dict( - norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True), - clip_grad=dict(max_norm=10, norm_type=2)) - -# learning policy -max_epochs = 300 -param_scheduler = [ - dict(type='LinearLR', start_factor=0.1, by_epoch=False, begin=0, end=917), - dict( - type='CosineAnnealingLR', - eta_min=0.0, - begin=1, - T_max=299, - end=300, - by_epoch=True, - convert_to_iter_based=True) -] -train_cfg = dict(max_epochs=max_epochs, val_interval=1) - -vis_backends = [ - dict(type='LocalVisBackend'), - dict(type='TensorboardVisBackend') -] -visualizer = dict( - type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer') - -default_hooks = dict(checkpoint=dict(type='CheckpointHook', interval=15)) -custom_hooks = [ - dict( - type='EMAHook', - ema_type='ExpMomentumEMA', - momentum=0.0002, - update_buffers=True, - priority=49) -] -# cudnn_benchmark=True can accelerate fix-size training -env_cfg = dict(cudnn_benchmark=True) - -# NOTE: `auto_scale_lr` is for automatically scaling LR, -# USER SHOULD NOT CHANGE ITS VALUES. -# base_batch_size = (8 GPUs) x (32 samples per GPU) -auto_scale_lr = dict(base_batch_size=128) diff --git a/projects/EfficientDet/configs/d0_huber_clip.py b/projects/EfficientDet/configs/efficientdet_effb0_bifpn_8xb16-crop512-300e_coco.py similarity index 98% rename from projects/EfficientDet/configs/d0_huber_clip.py rename to projects/EfficientDet/configs/efficientdet_effb0_bifpn_8xb16-crop512-300e_coco.py index 688332a1b28..b7364980e9c 100644 --- a/projects/EfficientDet/configs/d0_huber_clip.py +++ b/projects/EfficientDet/configs/efficientdet_effb0_bifpn_8xb16-crop512-300e_coco.py @@ -40,8 +40,7 @@ in_channels=[40, 112, 320], out_channels=64, start_level=0, - norm_cfg=norm_cfg, - use_meswish=False), + norm_cfg=norm_cfg), bbox_head=dict( type='EfficientDetSepBNHead_Huber', num_classes=90, diff --git a/projects/EfficientDet/configs/d3.py b/projects/EfficientDet/configs/efficientdet_effb3_bifpn_8xb16-crop896-300e_coco.py similarity index 100% rename from projects/EfficientDet/configs/d3.py rename to projects/EfficientDet/configs/efficientdet_effb3_bifpn_8xb16-crop896-300e_coco.py diff --git a/projects/EfficientDet/configs/mask2former_r50_8xb2-lsj-50e_coco-panoptic.py b/projects/EfficientDet/configs/mask2former_r50_8xb2-lsj-50e_coco-panoptic.py deleted file mode 100644 index 639b2181ba3..00000000000 --- a/projects/EfficientDet/configs/mask2former_r50_8xb2-lsj-50e_coco-panoptic.py +++ /dev/null @@ -1,241 +0,0 @@ -_base_ = [ - 'mmdet::_base_/datasets/coco_panoptic.py', - 'mmdet::_base_/default_runtime.py' -] -custom_imports = dict( - imports=['projects.EfficientDet.EfficientDet'], allow_failed_imports=False) - -image_size = (1024, 1024) -batch_augments = [ - dict( - type='BatchFixedSizePad', - size=image_size, - img_pad_value=0, - pad_mask=True, - mask_pad_value=0, - pad_seg=True, - seg_pad_value=255) -] -data_preprocessor = dict( - type='DetDataPreprocessor', - mean=[123.675, 116.28, 103.53], - std=[58.395, 57.12, 57.375], - bgr_to_rgb=True, - pad_size_divisor=32, - pad_mask=True, - mask_pad_value=0, - pad_seg=True, - seg_pad_value=255, - batch_augments=batch_augments) - -num_things_classes = 80 -num_stuff_classes = 53 -num_classes = num_things_classes + num_stuff_classes -model = dict( - type='Mask2Former', - data_preprocessor=data_preprocessor, - backbone=dict( - type='ResNet', - depth=50, - num_stages=4, - out_indices=(0, 1, 2, 3), - frozen_stages=-1, - norm_cfg=dict(type='BN', requires_grad=False), - norm_eval=True, - style='pytorch', - init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), - panoptic_head=dict( - type='Mask2FormerHead', - in_channels=[256, 512, 1024, 2048], # pass to pixel_decoder inside - strides=[4, 8, 16, 32], - feat_channels=256, - out_channels=256, - num_things_classes=num_things_classes, - num_stuff_classes=num_stuff_classes, - num_queries=100, - num_transformer_feat_level=3, - pixel_decoder=dict( - type='PixelBiFPNDecoder', - stages=6, - num_outs=3, - norm_cfg=dict(type='GN', num_groups=32), - act_cfg=dict(type='ReLU')), - enforce_decoder_input_project=False, - positional_encoding=dict( - type='SinePositionalEncoding', num_feats=128, normalize=True), - transformer_decoder=dict( - type='DetrTransformerDecoder', - return_intermediate=True, - num_layers=9, - transformerlayers=dict( - type='DetrTransformerDecoderLayer', - attn_cfgs=dict( - type='MultiheadAttention', - embed_dims=256, - num_heads=8, - attn_drop=0.0, - proj_drop=0.0, - dropout_layer=None, - batch_first=False), - ffn_cfgs=dict( - embed_dims=256, - feedforward_channels=2048, - num_fcs=2, - act_cfg=dict(type='ReLU', inplace=True), - ffn_drop=0.0, - dropout_layer=None, - add_identity=True), - feedforward_channels=2048, - operation_order=('cross_attn', 'norm', 'self_attn', 'norm', - 'ffn', 'norm')), - init_cfg=None), - loss_cls=dict( - type='CrossEntropyLoss', - use_sigmoid=False, - loss_weight=2.0, - reduction='mean', - class_weight=[1.0] * num_classes + [0.1]), - loss_mask=dict( - type='CrossEntropyLoss', - use_sigmoid=True, - reduction='mean', - loss_weight=5.0), - loss_dice=dict( - type='DiceLoss', - use_sigmoid=True, - activate=True, - reduction='mean', - naive_dice=True, - eps=1.0, - loss_weight=5.0)), - panoptic_fusion_head=dict( - type='MaskFormerFusionHead', - num_things_classes=num_things_classes, - num_stuff_classes=num_stuff_classes, - loss_panoptic=None, - init_cfg=None), - train_cfg=dict( - num_points=12544, - oversample_ratio=3.0, - importance_sample_ratio=0.75, - assigner=dict( - type='HungarianAssigner', - match_costs=[ - dict(type='ClassificationCost', weight=2.0), - dict( - type='CrossEntropyLossCost', weight=5.0, use_sigmoid=True), - dict(type='DiceCost', weight=5.0, pred_act=True, eps=1.0) - ]), - sampler=dict(type='MaskPseudoSampler')), - test_cfg=dict( - panoptic_on=True, - # For now, the dataset does not support - # evaluating semantic segmentation metric. - semantic_on=False, - instance_on=True, - # max_per_image is for instance segmentation. - max_per_image=100, - iou_thr=0.8, - # In Mask2Former's panoptic postprocessing, - # it will filter mask area where score is less than 0.5 . - filter_low_score=True), - init_cfg=None) - -# dataset settings -data_root = 'data/coco/' -train_pipeline = [ - dict(type='LoadImageFromFile', to_float32=True), - dict( - type='LoadPanopticAnnotations', - with_bbox=True, - with_mask=True, - with_seg=True), - dict(type='RandomFlip', prob=0.5), - # large scale jittering - dict( - type='RandomResize', - scale=image_size, - ratio_range=(0.1, 2.0), - keep_ratio=True), - dict( - type='RandomCrop', - crop_size=image_size, - crop_type='absolute', - recompute_bbox=True, - allow_negative_crop=True), - dict(type='PackDetInputs') -] - -train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) - -val_evaluator = [ - dict( - type='CocoPanopticMetric', - ann_file=data_root + 'annotations/panoptic_val2017.json', - seg_prefix=data_root + 'annotations/panoptic_val2017/', - ), - dict( - type='CocoMetric', - ann_file=data_root + 'annotations/instances_val2017.json', - metric=['bbox', 'segm'], - ) -] -test_evaluator = val_evaluator - -# optimizer -embed_multi = dict(lr_mult=1.0, decay_mult=0.0) -optim_wrapper = dict( - type='OptimWrapper', - optimizer=dict( - type='AdamW', - lr=0.0001, - weight_decay=0.05, - eps=1e-8, - betas=(0.9, 0.999)), - paramwise_cfg=dict( - custom_keys={ - 'backbone': dict(lr_mult=0.1, decay_mult=1.0), - 'query_embed': embed_multi, - 'query_feat': embed_multi, - 'level_embed': embed_multi, - }, - norm_decay_mult=0.0), - clip_grad=dict(max_norm=0.01, norm_type=2)) - -# learning policy -max_iters = 368750 -param_scheduler = dict( - type='MultiStepLR', - begin=0, - end=max_iters, - by_epoch=False, - milestones=[327778, 355092], - gamma=0.1) - -# Before 365001th iteration, we do evaluation every 5000 iterations. -# After 365000th iteration, we do evaluation every 368750 iterations, -# which means that we do evaluation at the end of training. -interval = 5000 -dynamic_intervals = [(max_iters // interval * interval + 1, max_iters)] -train_cfg = dict( - type='IterBasedTrainLoop', - max_iters=max_iters, - val_interval=interval, - dynamic_intervals=dynamic_intervals) -val_cfg = dict(type='ValLoop') -test_cfg = dict(type='TestLoop') - -default_hooks = dict( - checkpoint=dict( - type='CheckpointHook', - by_epoch=False, - save_last=True, - max_keep_ckpts=3, - interval=interval)) -log_processor = dict(type='LogProcessor', window_size=50, by_epoch=False) - -# Default setting for scaling LR automatically -# - `enable` means enable scaling LR automatically -# or not by default. -# - `base_batch_size` = (8 GPUs) x (2 samples per GPU). -auto_scale_lr = dict(enable=False, base_batch_size=16) diff --git a/projects/EfficientDet/configs/mask_fpn.py b/projects/EfficientDet/configs/mask_fpn.py deleted file mode 100644 index 8358309fa06..00000000000 --- a/projects/EfficientDet/configs/mask_fpn.py +++ /dev/null @@ -1,240 +0,0 @@ -_base_ = [ - 'mmdet::_base_/datasets/coco_panoptic.py', - 'mmdet::_base_/default_runtime.py' -] -custom_imports = dict( - imports=['projects.EfficientDet.EfficientDet'], allow_failed_imports=False) - -image_size = (1024, 1024) -batch_augments = [ - dict( - type='BatchFixedSizePad', - size=image_size, - img_pad_value=0, - pad_mask=True, - mask_pad_value=0, - pad_seg=True, - seg_pad_value=255) -] -data_preprocessor = dict( - type='DetDataPreprocessor', - mean=[123.675, 116.28, 103.53], - std=[58.395, 57.12, 57.375], - bgr_to_rgb=True, - pad_size_divisor=32, - pad_mask=True, - mask_pad_value=0, - pad_seg=True, - seg_pad_value=255, - batch_augments=batch_augments) - -num_things_classes = 80 -num_stuff_classes = 53 -num_classes = num_things_classes + num_stuff_classes -model = dict( - type='Mask2Former', - data_preprocessor=data_preprocessor, - backbone=dict( - type='ResNet', - depth=50, - num_stages=4, - out_indices=(0, 1, 2, 3), - frozen_stages=-1, - norm_cfg=dict(type='BN', requires_grad=False), - norm_eval=True, - style='pytorch', - init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), - panoptic_head=dict( - type='Mask2FormerHead', - in_channels=[256, 512, 1024, 2048], # pass to pixel_decoder inside - strides=[4, 8, 16, 32], - feat_channels=256, - out_channels=256, - num_things_classes=num_things_classes, - num_stuff_classes=num_stuff_classes, - num_queries=100, - num_transformer_feat_level=3, - pixel_decoder=dict( - type='PixelFPNDecoder', - num_outs=3, - norm_cfg=dict(type='GN', num_groups=32), - act_cfg=dict(type='ReLU')), - enforce_decoder_input_project=False, - positional_encoding=dict( - type='SinePositionalEncoding', num_feats=128, normalize=True), - transformer_decoder=dict( - type='DetrTransformerDecoder', - return_intermediate=True, - num_layers=9, - transformerlayers=dict( - type='DetrTransformerDecoderLayer', - attn_cfgs=dict( - type='MultiheadAttention', - embed_dims=256, - num_heads=8, - attn_drop=0.0, - proj_drop=0.0, - dropout_layer=None, - batch_first=False), - ffn_cfgs=dict( - embed_dims=256, - feedforward_channels=2048, - num_fcs=2, - act_cfg=dict(type='ReLU', inplace=True), - ffn_drop=0.0, - dropout_layer=None, - add_identity=True), - feedforward_channels=2048, - operation_order=('cross_attn', 'norm', 'self_attn', 'norm', - 'ffn', 'norm')), - init_cfg=None), - loss_cls=dict( - type='CrossEntropyLoss', - use_sigmoid=False, - loss_weight=2.0, - reduction='mean', - class_weight=[1.0] * num_classes + [0.1]), - loss_mask=dict( - type='CrossEntropyLoss', - use_sigmoid=True, - reduction='mean', - loss_weight=5.0), - loss_dice=dict( - type='DiceLoss', - use_sigmoid=True, - activate=True, - reduction='mean', - naive_dice=True, - eps=1.0, - loss_weight=5.0)), - panoptic_fusion_head=dict( - type='MaskFormerFusionHead', - num_things_classes=num_things_classes, - num_stuff_classes=num_stuff_classes, - loss_panoptic=None, - init_cfg=None), - train_cfg=dict( - num_points=12544, - oversample_ratio=3.0, - importance_sample_ratio=0.75, - assigner=dict( - type='HungarianAssigner', - match_costs=[ - dict(type='ClassificationCost', weight=2.0), - dict( - type='CrossEntropyLossCost', weight=5.0, use_sigmoid=True), - dict(type='DiceCost', weight=5.0, pred_act=True, eps=1.0) - ]), - sampler=dict(type='MaskPseudoSampler')), - test_cfg=dict( - panoptic_on=True, - # For now, the dataset does not support - # evaluating semantic segmentation metric. - semantic_on=False, - instance_on=True, - # max_per_image is for instance segmentation. - max_per_image=100, - iou_thr=0.8, - # In Mask2Former's panoptic postprocessing, - # it will filter mask area where score is less than 0.5 . - filter_low_score=True), - init_cfg=None) - -# dataset settings -data_root = 'data/coco/' -train_pipeline = [ - dict(type='LoadImageFromFile', to_float32=True), - dict( - type='LoadPanopticAnnotations', - with_bbox=True, - with_mask=True, - with_seg=True), - dict(type='RandomFlip', prob=0.5), - # large scale jittering - dict( - type='RandomResize', - scale=image_size, - ratio_range=(0.1, 2.0), - keep_ratio=True), - dict( - type='RandomCrop', - crop_size=image_size, - crop_type='absolute', - recompute_bbox=True, - allow_negative_crop=True), - dict(type='PackDetInputs') -] - -train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) - -val_evaluator = [ - dict( - type='CocoPanopticMetric', - ann_file=data_root + 'annotations/panoptic_val2017.json', - seg_prefix=data_root + 'annotations/panoptic_val2017/', - ), - dict( - type='CocoMetric', - ann_file=data_root + 'annotations/instances_val2017.json', - metric=['bbox', 'segm'], - ) -] -test_evaluator = val_evaluator - -# optimizer -embed_multi = dict(lr_mult=1.0, decay_mult=0.0) -optim_wrapper = dict( - type='OptimWrapper', - optimizer=dict( - type='AdamW', - lr=0.0001, - weight_decay=0.05, - eps=1e-8, - betas=(0.9, 0.999)), - paramwise_cfg=dict( - custom_keys={ - 'backbone': dict(lr_mult=0.1, decay_mult=1.0), - 'query_embed': embed_multi, - 'query_feat': embed_multi, - 'level_embed': embed_multi, - }, - norm_decay_mult=0.0), - clip_grad=dict(max_norm=0.01, norm_type=2)) - -# learning policy -max_iters = 368750 -param_scheduler = dict( - type='MultiStepLR', - begin=0, - end=max_iters, - by_epoch=False, - milestones=[327778, 355092], - gamma=0.1) - -# Before 365001th iteration, we do evaluation every 5000 iterations. -# After 365000th iteration, we do evaluation every 368750 iterations, -# which means that we do evaluation at the end of training. -interval = 5000 -dynamic_intervals = [(max_iters // interval * interval + 1, max_iters)] -train_cfg = dict( - type='IterBasedTrainLoop', - max_iters=max_iters, - val_interval=interval, - dynamic_intervals=dynamic_intervals) -val_cfg = dict(type='ValLoop') -test_cfg = dict(type='TestLoop') - -default_hooks = dict( - checkpoint=dict( - type='CheckpointHook', - by_epoch=False, - save_last=True, - max_keep_ckpts=3, - interval=interval)) -log_processor = dict(type='LogProcessor', window_size=50, by_epoch=False) - -# Default setting for scaling LR automatically -# - `enable` means enable scaling LR automatically -# or not by default. -# - `base_batch_size` = (8 GPUs) x (2 samples per GPU). -auto_scale_lr = dict(enable=False, base_batch_size=16) diff --git a/projects/EfficientDet/configs/retinanet.py b/projects/EfficientDet/configs/retinanet.py deleted file mode 100644 index f4b1102e50e..00000000000 --- a/projects/EfficientDet/configs/retinanet.py +++ /dev/null @@ -1,119 +0,0 @@ -_base_ = [ - 'mmdet::_base_/models/retinanet_r50_fpn.py', - 'mmdet::_base_/datasets/coco_detection.py', - 'mmdet::_base_/schedules/schedule_1x.py', - 'mmdet::_base_/default_runtime.py' -] -custom_imports = dict( - imports=['projects.EfficientDet.efficientdet'], allow_failed_imports=False) - -image_size = 896 -batch_augments = [ - dict(type='BatchFixedSizePad', size=(image_size, image_size)) -] -norm_cfg = dict(type='BN', requires_grad=True) - -checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32-aa_in1k_20220119-5b4887a0.pth' # noqa -model = dict( - data_preprocessor=dict( - type='DetDataPreprocessor', - mean=[123.675, 116.28, 103.53], - std=[58.395, 57.12, 57.375], - bgr_to_rgb=True, - pad_size_divisor=128, - batch_augments=batch_augments), - backbone=dict( - _delete_=True, - type='EfficientNet', - arch='b3', - drop_path_rate=0.2, - out_indices=(3, 4, 5), - frozen_stages=0, - # conv_cfg=dict(type='Conv2dSamePadding'), - norm_cfg=dict( - type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01), - norm_eval=False, - init_cfg=dict( - type='Pretrained', prefix='backbone', checkpoint=checkpoint)), - neck=dict( - _delete_=True, - type='BiFPN', - num_stages=6, - in_channels=[48, 136, 384], - out_channels=160, - start_level=0, - norm_cfg=norm_cfg), - bbox_head=dict( - type='RetinaSepBNHead', - in_channels=160, - feat_channels=160, - num_ins=5, - norm_cfg=norm_cfg), - # training and testing settings - train_cfg=dict(assigner=dict(neg_iou_thr=0.5))) - -# dataset settings -train_pipeline = [ - dict( - type='LoadImageFromFile', - file_client_args={{_base_.file_client_args}}), - dict(type='LoadAnnotations', with_bbox=True), - dict( - type='RandomResize', - scale=(image_size, image_size), - ratio_range=(0.8, 1.2), - keep_ratio=True), - dict(type='RandomCrop', crop_size=(image_size, image_size)), - dict(type='RandomFlip', prob=0.5), - dict(type='PackDetInputs') -] -test_pipeline = [ - dict( - type='LoadImageFromFile', - file_client_args={{_base_.file_client_args}}), - dict(type='Resize', scale=(image_size, image_size), keep_ratio=True), - dict(type='LoadAnnotations', with_bbox=True), - dict( - type='PackDetInputs', - meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', - 'scale_factor')) -] - -train_dataloader = dict( - batch_size=16, num_workers=16, dataset=dict(pipeline=train_pipeline)) -val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) -test_dataloader = val_dataloader - -optim_wrapper = dict( - optimizer=dict(lr=0.16), - paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) - -# learning policy -max_epochs = 12 -param_scheduler = [ - dict(type='LinearLR', start_factor=0.1, by_epoch=False, begin=0, end=300), - dict( - type='MultiStepLR', - begin=0, - end=12, - by_epoch=True, - milestones=[8, 11], - gamma=0.1) -] -train_cfg = dict(max_epochs=max_epochs) - -vis_backends = [ - dict(type='LocalVisBackend'), - dict(type='TensorboardVisBackend') -] -visualizer = dict( - type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer') - -default_hooks = dict(checkpoint=dict(type='CheckpointHook')) -# cudnn_benchmark=True can accelerate fix-size training -env_cfg = dict(cudnn_benchmark=True) - -# NOTE: `auto_scale_lr` is for automatically scaling LR, -# USER SHOULD NOT CHANGE ITS VALUES. -# base_batch_size = (8 GPUs) x ( samples per GPU) -auto_scale_lr = dict(base_batch_size=128) diff --git a/projects/EfficientDet/efficientdet/__init__.py b/projects/EfficientDet/efficientdet/__init__.py index 8bf4981ccce..e32c1db0c97 100644 --- a/projects/EfficientDet/efficientdet/__init__.py +++ b/projects/EfficientDet/efficientdet/__init__.py @@ -1,18 +1,12 @@ -from .anchor_generator import YXYXAnchorGenerator from .bifpn import BiFPN from .coco_90class import Coco90Dataset from .coco_90metric import Coco90Metric from .efficientdet import EfficientDet -from .efficientdet_head import EfficientDetSepBNHead from .efficientdet_head_huber import EfficientDetSepBNHead_Huber from .huber_loss import HuberLoss -from .trans_max_iou_assigner import TransMaxIoUAssigner from .utils import Conv2dSamePadding -from .yxyx_bbox_coder import YXYXDeltaXYWHBBoxCoder __all__ = [ - 'EfficientDet', 'BiFPN', 'EfficientDetSepBNHead', 'YXYXAnchorGenerator', - 'YXYXDeltaXYWHBBoxCoder', 'Coco90Dataset', 'Coco90Metric', - 'TransMaxIoUAssigner', 'Conv2dSamePadding', 'HuberLoss', - 'EfficientDetSepBNHead_Huber' + 'EfficientDet', 'BiFPN', 'Coco90Dataset', 'Coco90Metric', + 'Conv2dSamePadding', 'HuberLoss', 'EfficientDetSepBNHead_Huber' ] diff --git a/projects/EfficientDet/efficientdet/__pycache__/__init__.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/__init__.cpython-37.pyc index e1cf3a87d682a8042e0122be26cc9b9014026b5d..88cbee5de868ac2ce8741b88e77e533b13da9809 100644 GIT binary patch delta 302 zcmaFDcA7=qiI2k0iSEw@-pOEPnc m!PeelkB?8x$%&6&$xy@taskiedrTQ30zf7YBNAlhU<3g2ensK{ literal 868 zcmZuvO^?z*7;b^`*)DWh!02@^TN55<+bZ8gdzKM_-TP#0JM?_}bWTHK4z^i1`z(?vwpTPU6qUvo(`r$plu1eH zH!JaBkMR3GP;nOQpi&{%Y4Bys;>~9fZ}%)v3K|e$7U?+HCHf=KG&mh-a9VyqX%t5p drB8Qlfp8;^pOH00QL)A2)IvGc!g_wr93>isGn;wc4cPs*=|FR3g@E#d$v5-1V}Nh^Q|MG&C`BETj}16fgQ zX{m`N@flFMJc^^Zq$o2bH6Fprh+;3!$V@AVuYfTsfvO-P6+o5-m|0nQiw!JT9L1fO zlLPZakqpQ>Fd;ixfODIr9EdLrByO>%<>V)p7#o3Ibc@R+wJb9^H3Z~vEw~lfp8;^pOH0D{V8*Eez-Gc(?rY|m`%bc>@RJ~=h7B(>-kMoFF7N>sCXqqk<#Wp%vmf_nn06_1b~DlW04?`@_Wew z;&2ryPIlnXtQQAKivfvSJf%SGN%Kosmy`fP0o0C{TxtMav37s} diff --git a/projects/EfficientDet/efficientdet/__pycache__/bifpn.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/bifpn.cpython-37.pyc index e70d9a360e90de5d67eb3fb4250a55e6f654e3f0..fb5b1338b5bd2b250e4b7d86d28b4a253af8c3b7 100644 GIT binary patch delta 227 zcmbPWJi(aPiILK|~ac&}1x%1hJz*M9$<|30cOR$+IN_#iICfb5l}F c^oml`GmA@#DvMZwDxxMcNqPen_(?he0Jyd@-2eap delta 227 zcmbPWJi(aPiIn)}NlUtjQ3-vHErfd!oS>)mxtpFrYHu<5rJY&jaMhTUORFFU#h)4$!nIIwy zL@<@0Q0x|8Zf;6y ciC$4^dS-D+QDqS;P{pmuOp@L}1%8rF0AE=)-T(jq diff --git a/projects/EfficientDet/efficientdet/__pycache__/coco_90class.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/coco_90class.cpython-37.pyc index 7a40e11dd81481fc82b5e352a7244fd2bf7ef0e1..69eadbff027e92f11f5337c0043d7bd9c05dfad8 100644 GIT binary patch delta 2200 zcmZXUU5Fe-5XarG*^k>ji5C$gh@bcYBKROOzQw0`QqVUaw5n$h6TIdAQ}e6p z>gwvAzA$}Zdgy^tsc;kgjUW2!^3b~EUSfDm`obkylUs9^!$``ak`y{Z2^oVN<Ziwv4MjTmE%yqe6 zkuWP$Bv?${21{zYyn(fQ0=knnMb9CINnQAn4D~$dRL+N@dfaM-hLF^40x_kqEa7ls zKo_M@{cKC9itdHS`+XQ{3%3i4w`d!ZTP^4u7Z;j*&x-F zOrZTRh%5&*vy+z5+=wy`QiF&Qe9?lj)l~F8JR*g3lLoSaHahhfh`0cDv<1Ng2!MYO z96~S|{GBNqcgE&=V_#`9j`#*iIp`SW#AL8w?An4MgZlLB(WMw*d}N`#6@&YOKa92W zgETdCTmg|Wh|5}sAg*3cFFT_@!GhZEf=Be&G6nD)+6R#~K>)mj_RC0dFcgKk7PMpWF42*m*lfKxgMM>qqbsJ&STQ4#64ZD9RwKhfay| zJP2gniq8Eg`(l8tk&mP7&>;F1?J55p1+v ztNrm{2f=|D9EV5r9)dwxy3R)stk)6IGiYx^i8nR+4(+>xRfUPfo~4<>wM14g06w(M z#ogrv@K#e{a%yXs;2~Tls?KeRR4yz%Rosz)xGSZj6J)5#z}0Dj8*V>GP#fR;m{Zr) zJeVHlkK$Pj^EOqq?r>j`k`jtK^+Ak0g}HH`Np=~X#w(;Dh(Q$?z8L&I z{B+`lCHLl^lZHMcr-Oqd+Y+aOCr9oXB|}g)YYI6BMUX7_@%phz@a@R)C&;kRn)MF# z>VCJ;;3wp3kS|Pi=m`++%2zS{>nLx4R7d37Xyd0ra(cB;2+8R}!5S<}S9b{mFQZ&V zIT@T+duP zR+zTArR2K^_1AnJtshbTYm>GXgImT9uRe=ovcjM8sA`32RQXBJ8=F}Z4tF{>Q&W;P W;h@PmnSoH)_p$1V|7A+ty7^xtEKs)q delta 2200 zcmZWqYp7IJ6n0)`9`})5OD%78HMuoHQc{tq5j`NJrn0M;k;6Xc?3vllnX?b;?78E; zSy%i~XduQ0n5bD0QChnnni6p+=t+NqY^{ApQo6(a_B!AC_S)-l zX3xGA`&JCxJ~ULBgMT|;J@NLyqU>$Pi8#bEG(}f1JN^w^xk74Ly14O*U z<=o`swuntR4rR}k4E*VVIFg{^F_#5_(Rb#qzQ$DIHdEZXQQ3t?svJ^03`IN!cq&&$ z@6KI?CACA*pxh&g-O0PM7Z}H7A%0AOMGhJR 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 delta 1766 zcmY*ZO>7%Q6!!Wzv6H%?ZW0yZl-d!PKpHoRqa+|vr-2kuD@7neTd~^Mll3;cUh`)2 zV+oX&rY#5|MVS^Z914eWfD5wtKLHoiYY!E30tvVQCy;t7^X)c2wd7B;Z@zgm@4fH6 z+bg$MQsvIhWJvw4-@Nlh>aVmWTX)kl(d=<$DuiWtXjsOH@nzd1m;xw^bD4Lv6XK7| zrT%GH`vHdmClttb)6*9g+%?9fxOy-*JOg9IsMlq9tti9IqSRKUR+9;06~nf<3>&o9 zeM=rZ5GE81T(?h z5qQ-XEt~P}XGhg;x%GLrJ36?cNQDSJhXZc|E&=wW6`!*TqMFzo=@q{Wq(vr|&DqK% zW2;uxtI2qcS!T_Xp+Yq9aT$lMh*wmW7qK)!PFZH%C8jUhhFORQL_eAyP+kPQ0bbM~ zX2_^x@TF74VfMtW+^8nSy6X3qJDvcB8vTmOv+EF2F?|6wD4Nn zyJ}fzrxmeTc&zM;2|*VU^b9y313pn8Q%I4{4X0r zxHc{R87`)Fle8fQi^o-8ImI6Bs<>QashyJ2$=1KcsP-@!ogRD{cf=QNb!$d{(v=c~#e3k}1o(K@_#!0Yyypg!DRg*{=rrtWYv7zB~} zvLo9pcUkwE4JK1?uSSuo3zyoOObq(2tKNO(!l&%=ZK{vRs_2NA)1&Y#{x0>b%j8aF zxy;<3QhI|ClINE>XqkABOBt>^^gT|8jfPCrm{DcKWpexAv8qgZ#)8dse^mVrW@L#q zx9k6dGSH8JGPcsKjd7;+eBiHjeYeH9uG7laL{?iB{S%Lz^s6(BW0<*g0dNEG86X0< zr$Bb`Tzg` delta 26 gcmcb`ev6&kiIyS|Y-l9@4Taw>Bv0A3acGynhq diff --git a/projects/EfficientDet/efficientdet/__pycache__/efficientdet_head.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/efficientdet_head.cpython-37.pyc index 28815ae6b4b7ae120eb4a2e8951e6ed0bbaaa8de..18cb2d902aaa619fc15bc3e76a2e443ae7a3b682 100644 GIT binary patch delta 1696 zcmaJ>O>Epm6yEW!f8t&5ZZb9S{kefcVoMWk;h(* z9YQKqkth-uIKW7pIFu77xa5Gu6{$i(NL={QT;RY3BqX>X5Etf+w@o4emi*28o6qmP zdE>w5zMnImHVi$(pZk9N-68K9qkCU)#m%@V$Y5k4ELjo)T?(>RR;)QJTe7fa0|l#= ziZx3UdM@b0x}^(Q4zf6J<%O&S1#DP`kkz1wOI8V&t+LRypdVMPijez)0lYG34GKjM zhVZa8jE`Bz@Q5{nN3Bs@wW{2gcMCxck6B~5Zq-r7tK4pUn0Yqi8gB8;j9c`KTiIL4 zI_^rV8ME{r8rCExukQHq79B@324ecz(AkQ}b6&@#-=L;zBBm^@oIAg`%B4Q1lh_;4 z>t1ZitZ*TWlTPS(i+-FiW2KucMB#OR^YU)jV#G>GMi=WaWmjlE8| z{|EXr*R1j0k~%;Gpvl3M$r#AT0mf-bt>++$w$uh)R(H?|dPhBrCiXS$Yjmmt8?re40N=#~>X6RKDk^8}T62PQ6eWwZ3rbJHhg(3fF07SLv2l|(fwLtt2Zn2j<06a(N z)7`i8msh4hJPq(5z@bl)X>RzJZQQ!V-&o?Hf(+76i_>U|{!*+x^e`9{fX4ym zIPi`F8$+0B8-6FYogUZSPR^Dh1wKV4=*Oj(=LP4ZpwGi@CGGn2V0ZyQWTiS$_?jJc znY0n6JiTLCD1UNBBr*H{3}g}f(5EBYTm9G21bw^zyQ}xQozBiOL_#^_5r7o{DADXo z^Sj7prt{M5*olZ2Gkt@Px!vVM8mD=S3a062m1Y{bpsy2p1(W1ZtxcUJ4=_}QfNT+XAn{6=`X|~{c3E(Qg8V6?d^0j0C zh8L4{`fc?Fx<)V6T4z~FAO=7Q;3fxV*n9*#aqM_OVA}`H z<+D8rK_-`o%$rw=x_Cr znrI#T`dJZU*Gt;O+vI;avP<&Ruh(Xwzbv1+wiBOU36Z5JRHQ1Z?T08i^$&2F-?ih7 qq4SW`LEZ-^&9pfjx!ZyF1k@c@Ig}+06;PSK1*x~9F{zv_qkjMxU1>-F delta 1796 zcmaJ?O>7%Q6!xsW>)*9E&c7WeaiTyrv~Fkwv?z%JE#fafg@m>l6fL%Qo4DFpo7pub zIW!XGj?hR*NF3;ip2{H?ZU}Kf0tpUCR4Z{sDndxykht*PtVE@VDb(W`jIZn9+W>7=gX}6CRX^|Y_W*N7i4bTBL zNC(*v9b&_Dn2pd8NzA&VtVBz!Ov^CN*}6N%Dzw7J={Siw#ZM>h#$JrsdAsm_%q}>_ zo%kI>Cv9ajW*QGMQBw&Mt1UkW)va#Fb=FN1s++f3{vH@cqbr8U{IC+HoAtnIwBL37 zFu&_a(+b228MsP9ZEfT73#*%^8tNOJ;8NSW(c0bG?>J!|hHG6nXhps-_p;{)b+75j z{R%L9%8})c-EBG+bLyVhB-Nt_NwZ zXG)w+9*`MvFZmpqKKeEJ13A+VelyNhDS?3MPz$9tACj9U;g6xyM3@u5q;FMG+*J5k zc!Z>Nnt-fx;&$fSi)YaM4{f=Y*HGt_e6;$#?AFFSnolB}M>w%1UjWCyECcTv{CovK zOFT@#W8EzBNJz}&rYcft68y(S47GZv<9Ie75O!|2DlFxA|vd!FO^GVw>-%^m%g z`;2H$p~j&2IDekZi|_K~g{RS>AuJ*+0YF7jEhH>VHClDwYWB1qRkBoQYq%Ak79SM0 zm!#$e953T)Evovf=vYONQ6-yg?;We%36+Ky>GY0e#<>5i4C3PdD{w3kUq_HDd&~8{ zx5%{c`hL3hPqq0Zk~R=99sUf$6$DJtOh@s(26mW%)GWW*=5Qr44Y(Rs2m05K;+7dK zh);^8?8zO!D!!q;j%u4?tp75!V!i*0Ixbr(dBdp(tll{pAu`X2??iu zq1S>*xJP?!9-UOLx{?p@HTZe!04^in!P$OsZ`39`LNARE%A{q2DV*v8OSwXEaPLTAq+X%1m178Bo$J#NA?W>!NDs@3v#BR#oGDrocO zUd{8OYjsnMR4$17l@U$WEiKk6bBFk!5#|}QouI~@U3j1JeV#>UHga}@7F>nn?2aQf zfJKWDi?waIeYJ=zPo#(%YUCIIn-8L+5bfb`3s!Vp=OxVIWOqj`j?~m*L|MiH`S_kR UlpINsT=Z28`5Yq#G2#aK8|EE_8UO$Q diff --git a/projects/EfficientDet/efficientdet/__pycache__/efficientdet_head_huber.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/efficientdet_head_huber.cpython-37.pyc index 9256aa03e7799742196d4a31362eed31e72db897..fd76552233339100c497ea841c767659b742fa89 100644 GIT binary patch delta 932 zcmY+AO-~a+7{_OJyU=dC?eHYPPDo(zTv8iat=z-a>3(j8!NW=m$L07nHEUTWkk8oi@Al0H zYv}l+G!Aee0Td!gHKal1HKHRu+GEr}MikRYAMHo|G>+ntkC6m5kr`=&=roCvk?tcY zY9TAq{Ul8@C_`;zM?OxnG>3ALPLMo3E}#M}qGA*<$t^m72IwFfq(f+kmQab7QCa4a zPKpfE3aUVWa~C6*U>-P@lRgDb8e1p&2}GlgwgPIIZ>qVP7RHubpNGb3cbDMj(i1H8(o(;O|Qdfle7*n6LmOd!O(o{wYNL$8E!e^Gpw3581^kUo;+Pz5e+!9WQ3^& z&*v?#jiYm|#x9@hc$@Cl>cK7!Gt&N-Ps_k^mvFaN6ebyVx^3K~xaD2_g7aDUS3JyL z&s}6L!BK|WLB@%nXi{YZu#*d5pauCL8KeR$NXuN}EU~5?6^@EL9~6S3W1gvAldbPM z0HRvSUo{HDMq*2~4#3YDu{U&bKP4qgDC8tUgLhbaJM81w^E)gwHc6+&!=;ZK^*y|VoSJg@olm5Iq2G_-Pb^6#+zj!54 zOR-6%Un;y%Knm{^4iy50BZW1Eb&1gAEw+Vu({X8Z2)mWQkF$(aEGx9}M@d`B1BD&2IKBdB#QFGWkzrLEkET)gJa$i6 z@n!shn3|ZX#FfiY>R?`{9S0M?-sLXwqd|)0iSl%@m-IR7wt1IfzrL~2*=NzT)hNPb lub}r?T1I+zQnwM86OECQ6t)(ZSGQFIT5q@Eu$Izo_zz1p>rDUv delta 843 zcmY+CO-~a+7{_QFY3WJf&qys(PSbtwX>9!nWfooV~`>T zIG7NOW)jcv1-$S9h(~Y6<9-7503MAVbY@FToX!5{_xztH&+N0izvtdQFm4-$DzMc) zIc=T3Gx9s1S%3rtus{F=M1&&Xv4|5yg3>w5P-b2NC&>^Tiam+30+pC$oFXbzV@_h3 zXi$rJ2@6Fe1a%3!a!aE!Os@GoH?6{H1 z!i63Vy@40$bAC5$`Yku^Z?Wuuh8DP}*K!-gZThqhD#u^J>@fIAuVp^!&n={&)B!lO zj|BQBlOI(NQcuP0>~=29^t1gO(hm3t`tfvjM%IH29|S}R;`tQkcQu8@!7vw_{>nR6 zvW1(Z(}*N5bV-n=W#N`Vvd*S0=y; z{ZP4)O!2M_`lI43Y;o*!+2-Y zPbOa5m{FAQ{4mfN1qMBvxT#qjUvgQe*Q<5*$otjtT%?2>L2GTw_k(GkTV(?2Np*%k znjA~UFCayKR4>>0uN;|#AUB)}+&25v!DgUwQyZAQ(8JyH19>NtOMIx!2&M;BWCOXl eI~5nxHs> diff --git a/projects/EfficientDet/efficientdet/__pycache__/huber_loss.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/huber_loss.cpython-37.pyc index e2b43dca7bc8b0f43671d4c1451156bdf6896213..d00c4d99aa7b1b3250f3604318646082010679f3 100644 GIT binary patch delta 147 zcmbO%K3SaCiIIC%?E@lkpat zufL0{Pw>Y3iG(VgcH8iw`1Sl$xGdTvAjyS(iJWotcSILR^3m0Qd|ou>b%7 delta 125 zcmbO%K3SaCiIlR)Wpf-^JA@Sd;MscOmgp6wre_wH c6jc_n0F95D{Etg|vL1IFI};P5gqQ#$0QZF?TL1t6 diff --git a/projects/EfficientDet/efficientdet/__pycache__/utils.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/utils.cpython-37.pyc index c26ada0d2333bfb46f11a98430e46849c740a081..1913684891fcfe214854674d436b5a3ed185e53e 100644 GIT binary patch delta 293 zcmW-b&r1SP9K;=6U489a-!2A~hvW(Hlg}kA=xn>TDcA~9x(=H3W zSxuO)sO>J09{U!AHb6AD|29zTA5EQ z%02Z3IF!@u7^u+=8>1qB*$w55-5Dc|&ah;;PLKaX({L!o_f zj1l$4JBW6S2RzZlu#WPsYu}Y^&nvfl$LBkN>tUI)hT$v(Wd z7>g#W^EEMsZeGP#!6?86bX!pvhzJJ}tdord>=^4O7YgiToG@8iu$HlQ@=8G;LB8DF zl++TvqSW-v;*z4uB9_S?1w}PkL0Uj2MDdp77bR!t<>l#R=4F-?v4bQyKm;d<(3$Ka ZR42m2C;)^!Ogv0nYyym2aze^N8USW!N{9de diff --git a/projects/EfficientDet/efficientdet/__pycache__/yxyx_bbox_coder.cpython-37.pyc b/projects/EfficientDet/efficientdet/__pycache__/yxyx_bbox_coder.cpython-37.pyc index 3ac11c5ad97308ee8de3c6fa3c18eb759ba85b9f..b5757a379bb6c3b840bfde0b842915136269fc3a 100644 GIT binary patch delta 26 gcmcZ_bv26HiI Tensor: - - w = base_size - h = base_size - if center is None: - x_center = self.center_offset * w - y_center = self.center_offset * h - else: - x_center, y_center = center - - h_ratios = torch.sqrt(ratios) - w_ratios = 1 / h_ratios - if self.scale_major: - ws = (w * scales[:, None] * w_ratios[None, :]).view(-1) - hs = (h * scales[:, None] * h_ratios[None, :]).view(-1) - else: - ws = (w * scales[:, None] * w_ratios[None, :]).view(-1) - hs = (h * scales[:, None] * h_ratios[None, :]).view(-1) - - # use float anchor and the anchor's center is aligned with the - # pixel center - base_anchors = [ - y_center - 0.5 * hs, - x_center - 0.5 * ws, - y_center + 0.5 * hs, - x_center + 0.5 * ws, - ] - base_anchors = torch.stack(base_anchors, dim=-1) - - return base_anchors - - def single_level_grid_priors(self, - featmap_size: Tuple[int, int], - level_idx: int, - dtype: torch.dtype = torch.float32, - device: DeviceType = 'cuda') -> Tensor: - """Generate grid anchors of a single level. - - Note: - This function is usually called by method ``self.grid_priors``. - - Args: - featmap_size (tuple[int, int]): Size of the feature maps. - level_idx (int): The index of corresponding feature map level. - dtype (obj:`torch.dtype`): Date type of points.Defaults to - ``torch.float32``. - device (str | torch.device): The device the tensor will be put on. - Defaults to 'cuda'. - - Returns: - torch.Tensor: Anchors in the overall feature maps. - """ - base_anchors = self.base_anchors[level_idx].to(device).to(dtype) - feat_h, feat_w = featmap_size - stride_w, stride_h = self.strides[level_idx] - # First create Range with the default dtype, than convert to - # target `dtype` for onnx exporting. - shift_x = torch.arange(0, feat_w, device=device).to(dtype) * stride_w - shift_y = torch.arange(0, feat_h, device=device).to(dtype) * stride_h - - shift_xx, shift_yy = self._meshgrid(shift_x, shift_y) - shifts = torch.stack([shift_yy, shift_xx, shift_yy, shift_xx], dim=-1) - # first feat_w elements correspond to the first row of shifts - # add A anchors (1, A, 4) to K shifts (K, 1, 4) to get - # shifted anchors (K, A, 4), reshape to (K*A, 4) - - all_anchors = base_anchors[None, :, :] + shifts[:, None, :] - all_anchors = all_anchors.view(-1, 4) - # first A rows correspond to A anchors of (0, 0) in feature map, - # then (0, 1), (0, 2), ... - if self.use_box_type: - all_anchors = HorizontalBoxes(all_anchors) - - return all_anchors diff --git a/projects/EfficientDet/efficientdet/api_wrappers/__pycache__/__init__.cpython-37.pyc b/projects/EfficientDet/efficientdet/api_wrappers/__pycache__/__init__.cpython-37.pyc index a868587fbaf63ce0386c38071358940e65c1f70b..84eba981bbea67c9f0e2756b26430fe51cf6bf7c 100644 GIT binary patch delta 20 acmZ3@w3>O<^=En diff --git a/projects/EfficientDet/efficientdet/api_wrappers/__pycache__/coco_api.cpython-37.pyc b/projects/EfficientDet/efficientdet/api_wrappers/__pycache__/coco_api.cpython-37.pyc index 09a40fea27369f14de58a7bc23d5a01f283a8890..3bbad23cb8379d890d714b972f823d1f7a7ef585 100644 GIT binary patch delta 20 acmaE^`dpRUiI