├── docs ├── .gitignore ├── modules │ ├── layers.rst │ ├── solver.rst │ ├── evaluation.rst │ ├── structures.rst │ ├── index.rst │ ├── checkpoint.rst │ ├── configs.rst │ ├── data.rst │ └── engine.rst ├── index.rst ├── requirements.txt ├── _static │ └── css │ │ └── custom.css ├── README.md └── Makefile ├── tests ├── __init__.py ├── README.md ├── engine │ └── test_engine.py ├── structures │ ├── test_imagelist.py │ └── test_masks.py ├── checkpoint │ └── test_checkpoint.py └── layers │ └── test_nms.py ├── assets ├── erf_layer1.png ├── analyze_norm.png └── angular_update.png ├── .github ├── cvpods_logo.png ├── cvpods_tasks.png └── ISSUE_TEMPLATE │ ├── how-to-use-xxx-in-cvpods.md │ ├── feature_request.md │ ├── custom-modification.md │ └── bug-report.md ├── cvpods ├── utils │ ├── file │ │ ├── __init__.py │ │ └── serialize.py │ ├── distributed │ │ └── __init__.py │ ├── metrics │ │ ├── __init__.py │ │ └── accuracy.py │ ├── env │ │ └── __init__.py │ ├── benchmark │ │ └── __init__.py │ ├── README.md │ ├── dump │ │ └── __init__.py │ ├── visualizer │ │ └── __init__.py │ ├── apex_wrapper.py │ ├── imports.py │ ├── __init__.py │ └── compat_wrapper.py ├── analyser │ ├── tide │ │ ├── __init__.py │ │ └── errors │ │ │ └── qualifiers.py │ ├── erf.md │ ├── angular_update.md │ └── weight_analysis.md ├── modeling │ ├── proposal_generator │ │ └── __init__.py │ ├── basenet │ │ └── __init__.py │ ├── backbone │ │ ├── dynamic_arch │ │ │ └── __init__.py │ │ └── __init__.py │ ├── roi_heads │ │ └── __init__.py │ ├── nn_utils │ │ ├── __init__.py │ │ └── scale_grad.py │ ├── losses │ │ ├── __init__.py │ │ ├── reg_l1_loss.py │ │ └── dice_loss.py │ ├── meta_arch │ │ └── __init__.py │ └── __init__.py ├── layers │ ├── csrc │ │ ├── README.md │ │ ├── cuda_version.cu │ │ ├── tree_filter │ │ │ ├── rst.hpp │ │ │ ├── bfs.hpp │ │ │ ├── mst.hpp │ │ │ ├── boruvka_rst.hpp │ │ │ └── boruvka.hpp │ │ ├── PSROIPool │ │ │ └── psroi_pool_cuda.h │ │ ├── ml_nms │ │ │ └── ml_nms.h │ │ ├── box_iou_rotated │ │ │ ├── box_iou_rotated.h │ │ │ └── box_iou_rotated_cpu.cpp │ │ ├── nms_rotated │ │ │ └── nms_rotated.h │ │ ├── border_align │ │ │ └── border_align.h │ │ ├── SwapAlign2Nat │ │ │ └── SwapAlign2Nat.h │ │ └── sigmoid_focal_loss │ │ │ └── SigmoidFocalLoss.h │ ├── shape_spec.py │ ├── rotated_boxes.py │ ├── activation_funcs.py │ ├── __init__.py │ └── border_align.py ├── evaluation │ ├── registry.py │ └── __init__.py ├── data │ ├── transforms │ │ └── __init__.py │ ├── registry.py │ ├── samplers │ │ ├── __init__.py │ │ └── infinite.py │ ├── datasets │ │ └── __init__.py │ └── __init__.py ├── engine │ └── __init__.py ├── __init__.py ├── checkpoint │ └── __init__.py ├── structures │ └── __init__.py ├── solver │ └── __init__.py ├── configs │ ├── __init__.py │ ├── boxinst_config.py │ ├── yolo_config.py │ ├── condinst_config.py │ ├── rcnn_fpn_config.py │ ├── base_classification_config.py │ ├── panoptic_seg_config.py │ └── segm_config.py └── tools │ └── __init__.py ├── playground ├── detection │ ├── voc │ │ └── rcnn │ │ │ └── faster_rcnn.res50.fpn.voc.multiscale.1x │ │ │ ├── README.md │ │ │ └── net.py │ ├── coco │ │ ├── yolo │ │ │ └── yolov3.darknet53.coco.multiscale.syncbn │ │ │ │ └── net.py │ │ ├── tridentnet │ │ │ ├── tridentnet_base │ │ │ │ ├── __init__.py │ │ │ │ └── trident_rpn.py │ │ │ └── tridentnet.res50.C4.coco.800size.1x │ │ │ │ └── net.py │ │ ├── centernet │ │ │ ├── centernet.res18.coco.512size │ │ │ │ └── net.py │ │ │ └── centernet.res50.coco.512size │ │ │ │ └── net.py │ │ ├── detr │ │ │ ├── detr.res50.c5.coco.multiscale.150e.bs16 │ │ │ │ └── net.py │ │ │ └── optimizer.py │ │ ├── sparse_rcnn │ │ │ └── sparse_rcnn.res50.fpn.coco.multiscale.3x │ │ │ │ └── net.py │ │ ├── ssd │ │ │ ├── ssd.vgg16.coco.300size │ │ │ │ └── net.py │ │ │ ├── ssd.vgg16.coco.512size │ │ │ │ └── net.py │ │ │ ├── ssd.vgg16.coco.300size.expand_aug │ │ │ │ └── net.py │ │ │ └── ssd.vgg16.coco.512size.expand_aug │ │ │ │ └── net.py │ │ ├── atss │ │ │ └── atss.res50.fpn.coco.800size.1x │ │ │ │ └── net.py │ │ ├── fcos │ │ │ └── fcos.res50.fpn.coco.800size.1x │ │ │ │ └── net.py │ │ ├── free_anchor │ │ │ └── free_anchor.res50.fpn.coco.800size.1x │ │ │ │ └── net.py │ │ ├── reppoints │ │ │ └── reppoints.res50.fpn.coco.800size.1x.partial_minmax │ │ │ │ └── net.py │ │ ├── retinanet │ │ │ └── retinanet.res50.fpn.coco.multiscale.1x │ │ │ │ ├── net.py │ │ │ │ └── config.py │ │ ├── rcnn │ │ │ ├── faster_rcnn.res50.c4.coco.multiscale.1x │ │ │ │ ├── net.py │ │ │ │ └── config.py │ │ │ ├── faster_rcnn.res50.fpn.coco.multiscale.1x │ │ │ │ ├── net.py │ │ │ │ └── config.py │ │ │ └── faster_rcnn.res50.fpn.coco.multiscale.1x.syncbn │ │ │ │ ├── net.py │ │ │ │ └── config.py │ │ └── efficientdet │ │ │ ├── effdet0.effnet0.bifpn.coco.512size.300e │ │ │ └── net.py │ │ │ ├── effdet1.effnet1.bifpn.coco.640size.300e │ │ │ └── net.py │ │ │ ├── effdet0.effnet0.bifpn.coco.512size.300e.syncbn │ │ │ └── net.py │ │ │ └── effdet1.effnet1.bifpn.coco.640size.300e.syncbn │ │ │ └── net.py │ ├── citypersons │ │ ├── fcos │ │ │ └── fcos.res50.fpn.citypersons.640size.1x │ │ │ │ ├── net.py │ │ │ │ └── README.md │ │ ├── retinanet │ │ │ └── retinanet.res50.fpn.citypersons.640size.1x │ │ │ │ ├── net.py │ │ │ │ └── README.md │ │ └── rcnn │ │ │ └── faster_rcnn.res50.fpn.citypersons.640size.1x │ │ │ ├── net.py │ │ │ └── README.md │ ├── widerface │ │ ├── fcos │ │ │ └── fcos.res50.fpn.widerface.600size.0.5x_crop.plus.norm_sync │ │ │ │ ├── net.py │ │ │ │ └── README.md │ │ └── retinanet │ │ │ └── retinanet.res50.fpn.widerface.600size.0.5x_crop │ │ │ ├── net.py │ │ │ └── README.md │ └── crowdhuman │ │ └── rcnn │ │ └── faster_rcnn.res50.fpn.crowdhuman.800size.1x │ │ └── net.py ├── semantic_segmentation │ ├── cityscapes │ │ ├── dynamic_routing │ │ │ ├── Seg.Layer16 │ │ │ │ ├── README.md │ │ │ │ └── net.py │ │ │ ├── Seg.Layer16.SmallGate.Dynamic_A │ │ │ │ ├── README.md │ │ │ │ └── net.py │ │ │ ├── Seg.Layer16.SmallGate.Dynamic_B │ │ │ │ ├── README.md │ │ │ │ └── net.py │ │ │ └── Seg.Layer16.SmallGate.Dynamic_C │ │ │ │ ├── README.md │ │ │ │ └── net.py │ │ ├── fcn │ │ │ ├── fcn.res101.cityscapes.multiscale.1x.s8 │ │ │ │ ├── README.md │ │ │ │ └── net.py │ │ │ ├── fcn.res101.cityscapes.multiscale.1x.s16 │ │ │ │ ├── README.md │ │ │ │ └── net.py │ │ │ └── fcn.res101.cityscapes.multiscale.1x.s32 │ │ │ │ ├── README.md │ │ │ │ └── net.py │ │ └── pointrend │ │ │ └── pointrend.res101.fpn.cityscapes.multiscale.1x │ │ │ ├── README.md │ │ │ └── net.py │ └── coco │ │ └── semanticfpn │ │ └── semanticfpn.res50.fpn.coco.multiscale.1x │ │ ├── README.md │ │ ├── net.py │ │ └── config.py ├── segmentation │ ├── cityscapes │ │ ├── pointrend │ │ │ └── pointrend.res50.fpn.cityscapes.multiscale.1x │ │ │ │ ├── README.md │ │ │ │ └── net.py │ │ └── rcnn │ │ │ └── mask_rcnn.res50.fpn.cityscapes.multiscales.1x │ │ │ ├── README.md │ │ │ ├── net.py │ │ │ └── config.py │ ├── coco │ │ ├── tensormask │ │ │ └── tensormask.res50.fpn.coco.800size.1x │ │ │ │ └── net.py │ │ ├── solo │ │ │ ├── solo.res50.fpn.coco.800size.1x │ │ │ │ └── net.py │ │ │ ├── solo.res50.fpn.coco.multiscale.3x │ │ │ │ └── net.py │ │ │ ├── decoupled_solo.res50.fpn.coco.800size.1x │ │ │ │ └── net.py │ │ │ └── decoupled_solo.res50.fpn.coco.multiscale.3x │ │ │ │ └── net.py │ │ ├── rcnn │ │ │ ├── mask_rcnn.res50.c4.coco.multiscale.1x │ │ │ │ ├── net.py │ │ │ │ └── config.py │ │ │ ├── mask_rcnn.res50.c4.coco.multiscale.2x │ │ │ │ ├── net.py │ │ │ │ └── config.py │ │ │ ├── mask_rcnn.res50.c4.coco.multiscale.2x.syncbn │ │ │ │ └── net.py │ │ │ ├── mask_rcnn.res50.fpn.coco.multiscale.1x │ │ │ │ ├── net.py │ │ │ │ └── config.py │ │ │ └── cascade_rcnn.res50.fpn.coco.800size.1x │ │ │ │ └── net.py │ │ └── pointrend │ │ │ ├── pointrend.res50.fpn.coco.multiscale.1x │ │ │ ├── config.py │ │ │ └── net.py │ │ │ └── pointrend.res50.fpn.coco.multiscale.3x │ │ │ ├── config.py │ │ │ └── net.py │ └── lvis │ │ └── rcnn │ │ ├── mask_rcnn.res50.fpn.lvis.800size.1x │ │ ├── net.py │ │ └── config.py │ │ ├── mask_rcnn.res50.fpn.lvis.800size.1x.data_resampling │ │ └── net.py │ │ └── mask_rcnn.res50.fpn.lvis.multiscale.1x.data_resampling │ │ └── net.py └── panoptic_segmentation │ └── coco │ ├── panoptic_fpn.res50.fpn.coco.800size.1x │ └── config.py │ └── panoptic_fpn.res50.fpn.coco.multiscale.1x │ └── config.py ├── tools ├── dev │ ├── README.md │ ├── run_instant_tests.sh │ ├── linter.sh │ └── run_inference_tests.sh └── rm_files.py ├── .pre-commit-config.yaml ├── datasets └── prepare_for_tests.sh ├── .gitignore ├── docker ├── README.md └── Dockerfile └── setup.cfg /docs/.gitignore: -------------------------------------------------------------------------------- 1 | _build 2 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | -------------------------------------------------------------------------------- /assets/erf_layer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Megvii-BaseDetection/cvpods/HEAD/assets/erf_layer1.png -------------------------------------------------------------------------------- /.github/cvpods_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Megvii-BaseDetection/cvpods/HEAD/.github/cvpods_logo.png -------------------------------------------------------------------------------- /.github/cvpods_tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Megvii-BaseDetection/cvpods/HEAD/.github/cvpods_tasks.png -------------------------------------------------------------------------------- /assets/analyze_norm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Megvii-BaseDetection/cvpods/HEAD/assets/analyze_norm.png -------------------------------------------------------------------------------- /assets/angular_update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Megvii-BaseDetection/cvpods/HEAD/assets/angular_update.png -------------------------------------------------------------------------------- /cvpods/utils/file/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from .download import * 4 | from .file_io import * 5 | from .serialize import * 6 | -------------------------------------------------------------------------------- /cvpods/analyser/tide/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '1.0.0' 2 | 3 | from . import datasets 4 | from .errors.qualifiers import * 5 | from .quantify import * 6 | -------------------------------------------------------------------------------- /cvpods/modeling/proposal_generator/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | from .rpn import RPN 3 | from .rrpn import RRPN 4 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | To add a new Op: 4 | 5 | 1. Create a new directory 6 | 2. Implement new ops there 7 | 3. Delcare its Python interface in `vision.cpp`. 8 | -------------------------------------------------------------------------------- /cvpods/utils/distributed/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .comm import * 6 | -------------------------------------------------------------------------------- /cvpods/modeling/basenet/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .basenet import basenet 6 | -------------------------------------------------------------------------------- /cvpods/utils/metrics/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .accuracy import accuracy 6 | -------------------------------------------------------------------------------- /docs/modules/layers.rst: -------------------------------------------------------------------------------- 1 | cvpods.layers package 2 | ========================= 3 | 4 | .. automodule:: cvpods.layers 5 | :members: 6 | :undoc-members: 7 | :show-inheritance: 8 | -------------------------------------------------------------------------------- /docs/modules/solver.rst: -------------------------------------------------------------------------------- 1 | cvpods.solver package 2 | ========================= 3 | 4 | .. automodule:: cvpods.solver 5 | :members: 6 | :undoc-members: 7 | :show-inheritance: 8 | -------------------------------------------------------------------------------- /cvpods/utils/env/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .collect_env import * 6 | from .env import * 7 | -------------------------------------------------------------------------------- /docs/modules/evaluation.rst: -------------------------------------------------------------------------------- 1 | cvpods.evaluation package 2 | ============================= 3 | 4 | .. automodule:: cvpods.evaluation 5 | :members: 6 | :undoc-members: 7 | :show-inheritance: 8 | -------------------------------------------------------------------------------- /docs/modules/structures.rst: -------------------------------------------------------------------------------- 1 | cvpods.structures package 2 | ============================= 3 | 4 | .. automodule:: cvpods.structures 5 | :members: 6 | :undoc-members: 7 | :show-inheritance: 8 | -------------------------------------------------------------------------------- /cvpods/utils/benchmark/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .benchmark import * 6 | from .timer import * 7 | -------------------------------------------------------------------------------- /cvpods/utils/README.md: -------------------------------------------------------------------------------- 1 | # Utility functions 2 | 3 | This folder contain utility functions that are not used in the 4 | core library, but are useful for building models or training 5 | code using the config system. 6 | -------------------------------------------------------------------------------- /cvpods/evaluation/registry.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from cvpods.utils import Registry 6 | 7 | EVALUATOR = Registry("evaluator") 8 | -------------------------------------------------------------------------------- /cvpods/utils/dump/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .events import * 6 | from .history_buffer import * 7 | from .logger import * 8 | -------------------------------------------------------------------------------- /tests/README.md: -------------------------------------------------------------------------------- 1 | ## Unit Tests 2 | 3 | To run the unittests, do: 4 | ``` 5 | python -m unittest discover -v -s tests 6 | ``` 7 | 8 | There are also end-to-end inference & training tests, in [tools/dev/run_*_tests.sh](../tools/dev). 9 | -------------------------------------------------------------------------------- /cvpods/modeling/backbone/dynamic_arch/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .dynamic_backbone import DynamicNetwork, build_dynamic_backbone 6 | -------------------------------------------------------------------------------- /cvpods/data/transforms/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | from .transform import * 3 | from .transform_gen import * 4 | 5 | __all__ = [k for k in globals().keys() if not k.startswith("_")] 6 | -------------------------------------------------------------------------------- /cvpods/utils/visualizer/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .colormap import * 6 | from .video_visualizer import * 7 | from .visualizer import * 8 | -------------------------------------------------------------------------------- /docs/modules/index.rst: -------------------------------------------------------------------------------- 1 | API Documentation 2 | ================== 3 | 4 | .. toctree:: 5 | 6 | checkpoint 7 | configs 8 | data 9 | engine 10 | evaluation 11 | layers 12 | modeling 13 | solver 14 | structures 15 | utils 16 | -------------------------------------------------------------------------------- /playground/detection/voc/rcnn/faster_rcnn.res50.fpn.voc.multiscale.1x/README.md: -------------------------------------------------------------------------------- 1 | # faster_rcnn.res50.fpn.voc.multiscale.1x 2 | 3 | ## Evaluation results for bbox: 4 | 5 | | AP | AP50 | AP75 | 6 | |:------:|:------:|:------:| 7 | | 54.214 | 82.063 | 59.314 | 8 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/cuda_version.cu: -------------------------------------------------------------------------------- 1 | // Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. 2 | 3 | #include 4 | 5 | namespace cvpods { 6 | int get_cudart_version() { 7 | return CUDART_VERSION; 8 | } 9 | } // namespace cvpods 10 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/dynamic_routing/Seg.Layer16/README.md: -------------------------------------------------------------------------------- 1 | # Seg.Layer16 2 | 3 | ## Evaluation results for sem_seg: 4 | 5 | | mIoU | fwIoU | mACC | pACC | 6 | |:------:|:-------:|:------:|:------:| 7 | | 76.459 | 92.918 | 84.169 | 96.185 | 8 | -------------------------------------------------------------------------------- /cvpods/modeling/roi_heads/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | from .roi_heads import Res5ROIHeads, ROIHeads, StandardROIHeads, select_foreground_proposals 3 | from .rotated_fast_rcnn import RROIHeads 4 | 5 | from . import cascade_rcnn # isort:skip 6 | -------------------------------------------------------------------------------- /cvpods/engine/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. 2 | 3 | from .hooks import * 4 | from .launch import * 5 | from .predictor import * 6 | from .runner import * 7 | from .setup import * 8 | 9 | __all__ = [k for k in globals().keys() if not k.startswith("_")] 10 | -------------------------------------------------------------------------------- /tools/dev/README.md: -------------------------------------------------------------------------------- 1 | 2 | ## Some scripts for developers to use, include: 3 | 4 | - `linter.sh`: lint the codebase before commit 5 | - `run_{inference,instant}_tests.sh`: run inference/training for a few iterations. 6 | Note that these tests require 2 GPUs. 7 | - `parse_results.sh`: parse results from a log file. 8 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/tree_filter/rst.hpp: -------------------------------------------------------------------------------- 1 | // Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 2 | #pragma once 3 | #include 4 | 5 | extern at::Tensor rst_forward( 6 | const at::Tensor & edge_index_tensor, 7 | const at::Tensor & edge_weight_tensor, 8 | int vertex_count 9 | ); 10 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/dynamic_routing/Seg.Layer16.SmallGate.Dynamic_A/README.md: -------------------------------------------------------------------------------- 1 | # Seg.Layer16.SmallGate.Dynamic_A 2 | 3 | ## Evaluation results for sem_seg: 4 | 5 | | mIoU | fwIoU | mACC | pACC | 6 | |:------:|:-------:|:------:|:------:| 7 | | 75.668 | 92.708 | 83.367 | 96.068 | 8 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/dynamic_routing/Seg.Layer16.SmallGate.Dynamic_B/README.md: -------------------------------------------------------------------------------- 1 | # Seg.Layer16.SmallGate.Dynamic_B 2 | 3 | ## Evaluation results for sem_seg: 4 | 5 | | mIoU | fwIoU | mACC | pACC | 6 | |:------:|:-------:|:------:|:------:| 7 | | 75.343 | 92.784 | 83.320 | 96.112 | 8 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/dynamic_routing/Seg.Layer16.SmallGate.Dynamic_C/README.md: -------------------------------------------------------------------------------- 1 | # Seg.Layer16.SmallGate.Dynamic_C 2 | 3 | ## Evaluation results for sem_seg: 4 | 5 | | mIoU | fwIoU | mACC | pACC | 6 | |:------:|:-------:|:------:|:------:| 7 | | 76.171 | 92.788 | 83.986 | 96.116 | 8 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/fcn/fcn.res101.cityscapes.multiscale.1x.s8/README.md: -------------------------------------------------------------------------------- 1 | # fcn.res101.cityscapes.multiscale.1x.s8 2 | 3 | ## Evaluation results for sem_seg: 4 | 5 | | mIoU | fwIoU | mACC | pACC | 6 | |:------:|:-------:|:------:|:------:| 7 | | 73.964 | 92.031 | 81.770 | 95.691 | 8 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/fcn/fcn.res101.cityscapes.multiscale.1x.s16/README.md: -------------------------------------------------------------------------------- 1 | # fcn.res101.cityscapes.multiscale.1x.s16 2 | 3 | ## Evaluation results for sem_seg: 4 | 5 | | mIoU | fwIoU | mACC | pACC | 6 | |:------:|:-------:|:------:|:------:| 7 | | 73.465 | 91.716 | 81.480 | 95.500 | 8 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/fcn/fcn.res101.cityscapes.multiscale.1x.s32/README.md: -------------------------------------------------------------------------------- 1 | # fcn.res101.cityscapes.multiscale.1x.s32 2 | 3 | ## Evaluation results for sem_seg: 4 | 5 | | mIoU | fwIoU | mACC | pACC | 6 | |:------:|:-------:|:------:|:------:| 7 | | 71.916 | 91.026 | 80.335 | 95.096 | 8 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/coco/semanticfpn/semanticfpn.res50.fpn.coco.multiscale.1x/README.md: -------------------------------------------------------------------------------- 1 | # semanticfpn.res50.fpn.coco.multiscale.1x 2 | 3 | ## Evaluation results for sem_seg: 4 | 5 | | mIoU | fwIoU | mACC | pACC | 6 | |:------:|:-------:|:------:|:------:| 7 | | 40.334 | 67.567 | 50.851 | 79.770 | 8 | -------------------------------------------------------------------------------- /cvpods/modeling/nn_utils/__init__.py: -------------------------------------------------------------------------------- 1 | from .activation_count import activation_count 2 | from .flop_count import flop_count 3 | from .module_converter import freeze_module_until, maybe_convert_module 4 | from .parameter_count import parameter_count, parameter_count_table 5 | from .precise_bn import get_bn_modules, update_bn_stats 6 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/tree_filter/bfs.hpp: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2019-2021 Megvii Inc. All rights reserved. */ 2 | #pragma once 3 | #include 4 | 5 | extern std::tuple 6 | bfs_forward( 7 | const at::Tensor & edge_index_tensor, 8 | int max_adj_per_node 9 | ); 10 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/tree_filter/mst.hpp: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2019-2021 Megvii Inc. All rights reserved. */ 2 | #pragma once 3 | #include 4 | 5 | extern at::Tensor mst_forward( 6 | const at::Tensor & edge_index_tensor, 7 | const at::Tensor & edge_weight_tensor, 8 | int vertex_count); 9 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/pointrend/pointrend.res101.fpn.cityscapes.multiscale.1x/README.md: -------------------------------------------------------------------------------- 1 | # pointrend.res101.fpn.cityscapes.multiscale.1x 2 | 3 | ## Evaluation results for sem_seg: 4 | 5 | | mIoU | fwIoU | mACC | pACC | 6 | |:------:|:-------:|:------:|:------:| 7 | | 78.170 | 92.924 | 85.100 | 96.204 | 8 | -------------------------------------------------------------------------------- /cvpods/data/registry.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from cvpods.utils import Registry 6 | 7 | DATASETS = Registry("datasets") 8 | TRANSFORMS = Registry("transforms") 9 | SAMPLERS = Registry("samplers") 10 | PATH_ROUTES = Registry("path_routes") 11 | -------------------------------------------------------------------------------- /cvpods/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. 2 | 3 | from .utils import set_megfile, setup_environment 4 | 5 | setup_environment() 6 | set_megfile() 7 | 8 | # This line will be programatically read/write by setup.py. 9 | # Leave them at the bottom of this file and don't touch them. 10 | __version__ = "0.1" 11 | -------------------------------------------------------------------------------- /cvpods/checkpoint/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 3 | 4 | 5 | from . import catalog as _UNUSED # register the handler 6 | from .checkpoint import Checkpointer, DefaultCheckpointer, PeriodicCheckpointer 7 | 8 | __all__ = [ 9 | "Checkpointer", 10 | "PeriodicCheckpointer", 11 | "DefaultCheckpointer", 12 | ] 13 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. cvpods documentation master file, created by 2 | sphinx-quickstart on Sat Sep 21 13:46:45 2019. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to cvpods's documentation! 7 | ====================================== 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | 12 | modules/index 13 | -------------------------------------------------------------------------------- /docs/modules/checkpoint.rst: -------------------------------------------------------------------------------- 1 | cvpods.checkpoint package 2 | ============================= 3 | 4 | .. automodule:: cvpods.checkpoint 5 | :members: 6 | :undoc-members: 7 | :show-inheritance: 8 | 9 | cvpods.checkpoint.checkpoint module 10 | -------------------------------------- 11 | 12 | .. automodule:: cvpods.checkpoint.checkpoint 13 | :members: 14 | :undoc-members: 15 | :show-inheritance: 16 | 17 | -------------------------------------------------------------------------------- /docs/modules/configs.rst: -------------------------------------------------------------------------------- 1 | cvpods.configs package 2 | ========================= 3 | 4 | .. automodule:: cvpods.configs.base_config 5 | :members: 6 | :undoc-members: 7 | :show-inheritance: 8 | :inherited-members: 9 | 10 | cvpods.configs.config\_helper module 11 | ---------------------------------------- 12 | 13 | .. automodule:: cvpods.configs.config_helper 14 | :members: 15 | :undoc-members: 16 | :show-inheritance: 17 | 18 | -------------------------------------------------------------------------------- /playground/detection/coco/yolo/yolov3.darknet53.coco.multiscale.syncbn/net.py: -------------------------------------------------------------------------------- 1 | import torch.nn 2 | 3 | from cvpods.modeling.backbone import build_darknet_backbone 4 | from cvpods.modeling.meta_arch import YOLOv3 5 | 6 | 7 | def build_model(cfg): 8 | 9 | cfg.build_backbone = build_darknet_backbone 10 | model = YOLOv3(cfg) 11 | # YOLOv3 can apply official SyncBN 12 | model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model) 13 | 14 | return model 15 | -------------------------------------------------------------------------------- /cvpods/modeling/nn_utils/scale_grad.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | from torch.autograd.function import Function 5 | 6 | 7 | class _ScaleGradient(Function): 8 | 9 | @staticmethod 10 | def forward(ctx, input, scale): 11 | ctx.scale = scale 12 | return input 13 | 14 | @staticmethod 15 | def backward(ctx, grad_output): 16 | return grad_output * ctx.scale, None 17 | -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | termcolor 2 | numpy 3 | tqdm 4 | docutils>=0.14 5 | Sphinx==3.0.0 6 | recommonmark==0.4.0 7 | sphinx_rtd_theme 8 | catalyst-sphinx-theme 9 | sphinx-markdown-tables 10 | mock 11 | matplotlib 12 | termcolor 13 | yacs 14 | tabulate 15 | cloudpickle 16 | Pillow==6.2.2 17 | future 18 | requests 19 | six 20 | colorama 21 | easydict 22 | https://download.pytorch.org/whl/cpu/torch-1.5.0%2Bcpu-cp37-cp37m-linux_x86_64.whl 23 | https://download.pytorch.org/whl/cpu/torchvision-0.6.0%2Bcpu-cp37-cp37m-linux_x86_64.whl 24 | lvis 25 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/how-to-use-xxx-in-cvpods.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: How to use xxx in cvpods 3 | about: Usage of cvpods 4 | title: "[Usage]" 5 | labels: '' 6 | assignees: poodarchu 7 | 8 | --- 9 | 10 | **Please use this template to submit your problem or your question will _NOT_ be properly tackled.** 11 | 12 | --- 13 | 14 | Describe what you want to do, including: 15 | 1. what inputs you will provide, if any: 16 | 2. what outputs you are expecting: 17 | 18 | ## ❓ What does an API do and how to use it? 19 | 20 | _Pur your question here._ 21 | -------------------------------------------------------------------------------- /docs/_static/css/custom.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * some extra css to make markdown look similar between github/sphinx 4 | */ 5 | 6 | /* 7 | * Below is for install.md: 8 | */ 9 | .rst-content code { 10 | white-space: pre; 11 | border: 0px; 12 | } 13 | 14 | .rst-content th { 15 | border: 1px solid #e1e4e5; 16 | } 17 | 18 | .rst-content th p { 19 | /* otherwise will be default 24px for regular paragraph */ 20 | margin-bottom: 0px; 21 | } 22 | 23 | div.section > details { 24 | padding-bottom: 1em; 25 | } 26 | -------------------------------------------------------------------------------- /cvpods/modeling/losses/__init__.py: -------------------------------------------------------------------------------- 1 | from .dice_loss import dice_loss 2 | from .focal_loss import ( 3 | sigmoid_focal_loss, 4 | sigmoid_focal_loss_jit, 5 | sigmoid_focal_loss_star, 6 | sigmoid_focal_loss_star_jit 7 | ) 8 | from .grw_loss import GRWCrossEntropyLoss 9 | from .iou_loss import IOULoss, iou_loss 10 | from .label_smooth_ce_loss import LabelSmoothCELoss, label_smooth_ce_loss 11 | from .reg_l1_loss import reg_l1_loss 12 | from .sigmoid_focal_loss import SigmoidFocalLoss, sigmoid_focal_loss_cuda 13 | from .smooth_l1_loss import smooth_l1_loss 14 | -------------------------------------------------------------------------------- /playground/detection/coco/tridentnet/tridentnet_base/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | from .trident_backbone import ( 3 | TridentBottleneckBlock, 4 | build_trident_resnet_backbone, 5 | make_trident_stage 6 | ) 7 | from .trident_rcnn import TridentRes5ROIHeads, TridentStandardROIHeads 8 | from .trident_rpn import TridentRPN 9 | 10 | __all__ = ["TridentBottleneckBlock", "build_trident_resnet_backbone", "make_trident_stage", 11 | "TridentRPN", "TridentRes5ROIHeads", "TridentStandardROIHeads"] 12 | -------------------------------------------------------------------------------- /cvpods/structures/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | from .boxes import Boxes, BoxMode, pairwise_ioa, pairwise_iou 3 | from .image_list import ImageList 4 | from .instances import Instances 5 | from .keypoints import Keypoints, heatmaps_to_keypoints 6 | from .masks import BitMasks, PolygonMasks, polygons_to_bitmask, rasterize_polygons_within_box 7 | from .rotated_boxes import RotatedBoxes 8 | from .rotated_boxes import pairwise_iou as pairwise_iou_rotated 9 | 10 | __all__ = [k for k in globals().keys() if not k.startswith("_")] 11 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Read the docs: 2 | 3 | The latest documentation built from this directory is available at [cvpods.readthedocs.io](https://cvpods.readthedocs.io/). 4 | Documents in this directory are not meant to be read on github. 5 | 6 | # Build the docs: 7 | 8 | 1. Install cvpods according to [README.md](https://github.com/Megvii-BaseDetection/cvpods/blob/master/README.md). 9 | 2. Install additional libraries required to build docs: 10 | - docutils==0.16 11 | - Sphinx==3.0.0 12 | - recommonmark==0.6.0 13 | - sphinx_rtd_theme 14 | - mock 15 | 16 | 3. Run `make html` from this directory. 17 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/pre-commit/pre-commit-hooks 3 | rev: v2.3.0 4 | hooks: 5 | - id: check-added-large-files 6 | # - id: check-docstring-first 7 | # - id: check-executables-have-shebangs 8 | # - id: check-json 9 | - id: check-merge-conflict 10 | - id: check-yaml 11 | args: ["--unsafe"] 12 | - id: debug-statements 13 | # - id: end-of-file-fixer 14 | # - id: trailing-whitespace 15 | - repo: https://gitlab.com/pycqa/flake8 16 | rev: 3.8.3 17 | hooks: 18 | - id: flake8 19 | args: 20 | - --jobs=4 21 | -------------------------------------------------------------------------------- /cvpods/data/samplers/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | from .distributed_sampler import InferenceSampler, RepeatFactorTrainingSampler, TrainingSampler 3 | from .grouped_batch_sampler import GroupedBatchSampler 4 | from .infinite import Infinite 5 | from .sampler import DistributedGroupSampler, DistributedSampler, GroupSampler 6 | 7 | __all__ = [ 8 | "GroupedBatchSampler", 9 | "TrainingSampler", 10 | "InferenceSampler", 11 | "Infinite", 12 | "RepeatFactorTrainingSampler", 13 | "DistributedSampler", 14 | "GroupSampler", 15 | "DistributedGroupSampler", 16 | ] 17 | -------------------------------------------------------------------------------- /datasets/prepare_for_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 3 | 4 | # Download some files needed for running tests. 5 | 6 | cd "${0%/*}" 7 | 8 | BASE=https://dl.fbaipublicfiles.com/detectron2 9 | mkdir -p coco/annotations 10 | 11 | for anno in instances_val2017_100 \ 12 | person_keypoints_val2017_100 \ 13 | instances_minival2014_100 \ 14 | person_keypoints_minival2014_100; do 15 | 16 | dest=coco/annotations/$anno.json 17 | [[ -s $dest ]] && { 18 | echo "$dest exists. Skipping ..." 19 | } || { 20 | wget $BASE/annotations/coco/$anno.json -O $dest 21 | } 22 | done 23 | -------------------------------------------------------------------------------- /playground/segmentation/cityscapes/pointrend/pointrend.res50.fpn.cityscapes.multiscale.1x/README.md: -------------------------------------------------------------------------------- 1 | # pointrend.res50.fpn.cityscapes.multiscale.1x 2 | 3 | ## Evaluation results for segm: 4 | 5 | | AP | AP50 | 6 | |:------:|:------:| 7 | | 35.990 | 62.763 | 8 | 9 | ### Per-category segm AP: 10 | 11 | | category | AP | AP50 | 12 | |:-----------|:-------|:-------| 13 | | person | 33.495 | 66.580 | 14 | | rider | 27.560 | 68.961 | 15 | | car | 54.707 | 78.707 | 16 | | truck | 34.435 | 47.185 | 17 | | bus | 56.324 | 74.352 | 18 | | train | 37.966 | 63.169 | 19 | | motorcycle | 21.240 | 46.942 | 20 | | bicycle | 22.192 | 56.210 | 21 | -------------------------------------------------------------------------------- /playground/segmentation/cityscapes/rcnn/mask_rcnn.res50.fpn.cityscapes.multiscales.1x/README.md: -------------------------------------------------------------------------------- 1 | # mask_rcnn.res50.fpn.cityscapes.multiscales.1x 2 | 3 | ## Evaluation results for segm: 4 | 5 | | AP | AP50 | 6 | |:------:|:------:| 7 | | 37.390 | 63.959 | 8 | 9 | ### Per-category segm AP: 10 | 11 | | category | AP | AP50 | 12 | |:-----------|:-------|:-------| 13 | | person | 35.939 | 68.493 | 14 | | rider | 29.089 | 68.953 | 15 | | car | 53.689 | 78.077 | 16 | | truck | 37.366 | 51.158 | 17 | | bus | 58.555 | 76.773 | 18 | | train | 39.029 | 63.201 | 19 | | motorcycle | 22.067 | 49.308 | 20 | | bicycle | 23.386 | 55.709 | 21 | -------------------------------------------------------------------------------- /cvpods/data/datasets/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .citypersons import CityPersonsDataset 6 | from .cityscapes import CityScapesDataset 7 | from .coco import COCODataset 8 | from .crowdhuman import CrowdHumanDataset 9 | from .imagenet import ImageNetDataset 10 | from .imagenetlt import ImageNetLTDataset 11 | from .lvis import LVISDataset 12 | from .objects365 import Objects365Dataset 13 | from .torchvision_datasets import CIFAR10Dataset, STL10Datasets 14 | from .voc import VOCDataset 15 | from .widerface import WiderFaceDataset 16 | 17 | __all__ = [k for k in globals().keys() if not k.startswith("_")] 18 | -------------------------------------------------------------------------------- /cvpods/solver/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | from .build import build_lr_scheduler, build_optimizer 3 | from .optimizer_builder import ( 4 | OPTIMIZER_BUILDER, 5 | AdamBuilder, 6 | AdamWBuilder, 7 | OptimizerBuilder, 8 | SGDBuilder, 9 | SGDGateLRBuilder 10 | ) 11 | from .scheduler_builder import ( 12 | SCHEDULER_BUILDER, 13 | BaseSchedulerBuilder, 14 | LambdaLRBuilder, 15 | OneCycleLRBuilder, 16 | PolyLRBuilder, 17 | WarmupCosineLR, 18 | WarmupCosineLRBuilder, 19 | WarmupMultiStepLR, 20 | WarmupMultiStepLRBuilder 21 | ) 22 | 23 | __all__ = [k for k in globals().keys() if not k.startswith("_")] 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # output dir 2 | output 3 | instant_test_output 4 | inference_test_output 5 | .vscode/ 6 | 7 | *.jpg 8 | *.png 9 | *.txt 10 | 11 | # compilation and distribution 12 | __pycache__ 13 | _ext 14 | *.pyc 15 | *.so 16 | cvpods.egg-info/ 17 | build/ 18 | dist/ 19 | wheels/ 20 | 21 | # pytorch/python/numpy formats 22 | *.pth 23 | *.pkl 24 | *.npy 25 | 26 | # ipython/jupyter notebooks 27 | *.ipynb 28 | **/.ipynb_checkpoints/ 29 | 30 | # Editor temporaries 31 | *.swn 32 | *.swo 33 | *.swp 34 | *~ 35 | 36 | # Pycharm editor settings 37 | .idea 38 | 39 | /cvpods/model_zoo/configs 40 | 41 | # project dirs 42 | /datasets 43 | /models 44 | tools/pods_* 45 | **/_build 46 | # 47 | # soft link 48 | **/log 49 | 50 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # Copyright (c) Facebook, Inc. and its affiliates. 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SOURCEDIR = . 8 | BUILDDIR = _build 9 | 10 | # Put it first so that "make" without argument is like "make help". 11 | help: 12 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 13 | 14 | .PHONY: help Makefile 15 | 16 | # Catch-all target: route all unknown targets to Sphinx using the new 17 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 18 | %: Makefile 19 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 20 | -------------------------------------------------------------------------------- /cvpods/data/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (c) Facebook, Inc. and its affiliates. 4 | # This file has been modified by Megvii ("Megvii Modifications"). 5 | # All Megvii Modifications are Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 6 | 7 | from .build import build_dataset, build_test_loader, build_train_loader, build_transform_gens 8 | from .registry import DATASETS, SAMPLERS, TRANSFORMS 9 | from .wrapped_dataset import ConcatDataset, RepeatDataset 10 | 11 | from . import transforms # isort:skip 12 | # ensure the builtin datasets are registered 13 | from . import datasets, samplers # isort:skip 14 | 15 | 16 | __all__ = [k for k in globals().keys() if not k.startswith("_")] 17 | -------------------------------------------------------------------------------- /cvpods/layers/shape_spec.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 3 | from collections import namedtuple 4 | 5 | 6 | class ShapeSpec(namedtuple("_ShapeSpec", ["channels", "height", "width", "stride"])): 7 | """ 8 | A simple structure that contains basic shape specification about a tensor. 9 | It is often used as the auxiliary inputs/outputs of models, 10 | to obtain the shape inference ability among pytorch modules. 11 | 12 | Attributes: 13 | channels: 14 | height: 15 | width: 16 | stride: 17 | """ 18 | 19 | def __new__(cls, *, channels=None, height=None, width=None, stride=None): 20 | return super().__new__(cls, channels, height, width, stride) 21 | -------------------------------------------------------------------------------- /playground/detection/coco/centernet/centernet.res18.coco.512size/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone, build_resnet_backbone 3 | from cvpods.modeling.meta_arch import CenterNet 4 | 5 | 6 | def build_backbone(cfg, input_shape=None): 7 | """ 8 | Build a backbone. 9 | 10 | Returns: 11 | an instance of :class:`Backbone` 12 | """ 13 | if input_shape is None: 14 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 15 | 16 | backbone = build_resnet_backbone(cfg, input_shape) 17 | assert isinstance(backbone, Backbone) 18 | return backbone 19 | 20 | 21 | def build_model(cfg): 22 | cfg.build_backbone = build_backbone 23 | model = CenterNet(cfg) 24 | return model 25 | -------------------------------------------------------------------------------- /playground/detection/coco/centernet/centernet.res50.coco.512size/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone, build_resnet_backbone 3 | from cvpods.modeling.meta_arch import CenterNet 4 | 5 | 6 | def build_backbone(cfg, input_shape=None): 7 | """ 8 | Build a backbone. 9 | 10 | Returns: 11 | an instance of :class:`Backbone` 12 | """ 13 | if input_shape is None: 14 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 15 | 16 | backbone = build_resnet_backbone(cfg, input_shape) 17 | assert isinstance(backbone, Backbone) 18 | return backbone 19 | 20 | 21 | def build_model(cfg): 22 | cfg.build_backbone = build_backbone 23 | model = CenterNet(cfg) 24 | return model 25 | -------------------------------------------------------------------------------- /cvpods/utils/metrics/accuracy.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | import torch 5 | 6 | 7 | @torch.no_grad() 8 | def accuracy(output, target, topk=(1,)): 9 | """Computes the precision@k for the specified values of k""" 10 | if target.numel() == 0: 11 | return [torch.zeros([], device=output.device)] 12 | maxk = max(topk) 13 | batch_size = target.size(0) 14 | 15 | _, pred = output.topk(maxk, 1, True, True) 16 | pred = pred.t() 17 | correct = pred.eq(target.view(1, -1).expand_as(pred)) 18 | 19 | res = [] 20 | for k in topk: 21 | correct_k = correct[:k].view(-1).float().sum(0) 22 | res.append(correct_k.mul_(100.0 / batch_size)) 23 | return res 24 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/tree_filter/boruvka_rst.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // a structure to represent a weighted edge in graph 4 | struct Edge 5 | { 6 | int src, dest; 7 | float weight; 8 | }; 9 | 10 | // a structure to represent a connected, undirected 11 | // and weighted graph as a collection of edges. 12 | struct Graph 13 | { 14 | // V-> Number of vertices, E-> Number of edges 15 | int V, E; 16 | 17 | // graph is represented as an array of edges. 18 | // Since the graph is undirected, the edge 19 | // from src to dest is also edge from dest 20 | // to src. Both are counted as 1 edge here. 21 | Edge* edge; 22 | }; 23 | 24 | extern struct Graph* create_graph(int V, int E); 25 | extern void boruvka_rst(struct Graph* graph, int * edge_out); 26 | 27 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an new feature for cvpods 4 | title: "[FEATURE]" 5 | labels: enhancement 6 | assignees: poodarchu 7 | 8 | --- 9 | 10 | **Please use this template to submit your need.** 11 | 12 | --- 13 | 14 | **Is your feature request related to a problem? Please describe.** 15 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 16 | 17 | **Describe the solution you'd like** 18 | A clear and concise description of what you want to happen. 19 | 20 | **Describe alternatives you've considered** 21 | A clear and concise description of any alternative solutions or features you've considered. 22 | 23 | **Additional context** 24 | Add any other context or screenshots about the feature request here. 25 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/tree_filter/boruvka.hpp: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2019-2021 Megvii Inc. All rights reserved. */ 2 | #pragma once 3 | 4 | // a structure to represent a weighted edge in graph 5 | struct Edge 6 | { 7 | int src, dest; 8 | float weight; 9 | }; 10 | 11 | // a structure to represent a connected, undirected 12 | // and weighted graph as a collection of edges. 13 | struct Graph 14 | { 15 | // V-> Number of vertices, E-> Number of edges 16 | int V, E; 17 | 18 | // graph is represented as an array of edges. 19 | // Since the graph is undirected, the edge 20 | // from src to dest is also edge from dest 21 | // to src. Both are counted as 1 edge here. 22 | Edge* edge; 23 | }; 24 | 25 | extern struct Graph* createGraph(int V, int E); 26 | extern void boruvkaMST(struct Graph* graph, int * edge_out); 27 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/PSROIPool/psroi_pool_cuda.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | namespace cvpods { 9 | at::Tensor psroi_pooling_forward_cuda( 10 | at::Tensor& features, 11 | at::Tensor& rois, 12 | at::Tensor& mappingchannel, 13 | const int pooled_height, 14 | const int pooled_width, 15 | const float spatial_scale, 16 | const int group_size, 17 | const int output_dim); 18 | 19 | at::Tensor psroi_pooling_backward_cuda( 20 | at::Tensor& top_grad, 21 | at::Tensor& rois, 22 | at::Tensor& mappingchannel, 23 | const int batch_size, 24 | const int bottom_dim, 25 | const int bottom_height, 26 | const int bottom_width, 27 | const float spatial_scale); 28 | } 29 | -------------------------------------------------------------------------------- /cvpods/modeling/losses/reg_l1_loss.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | import torch.nn as nn 6 | import torch.nn.functional as F 7 | 8 | from cvpods.modeling.nn_utils.feature_utils import gather_feature 9 | 10 | 11 | class reg_l1_loss(nn.Module): 12 | 13 | def __init__(self): 14 | super(reg_l1_loss, self).__init__() 15 | 16 | def forward(self, output, mask, index, target): 17 | pred = gather_feature(output, index, use_transform=True) 18 | mask = mask.unsqueeze(dim=2).expand_as(pred).float() 19 | # loss = F.l1_loss(pred * mask, target * mask, reduction='elementwise_mean') 20 | loss = F.l1_loss(pred * mask, target * mask, reduction='sum') 21 | loss = loss / (mask.sum() + 1e-4) 22 | return loss 23 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/fcn/fcn.res101.cityscapes.multiscale.1x.s8/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone, build_resnet_backbone 3 | from cvpods.modeling.meta_arch import FCNHead, SemanticSegmentor 4 | 5 | 6 | def build_backbone(cfg, input_shape=None): 7 | if input_shape is None: 8 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 9 | backbone = build_resnet_backbone(cfg, input_shape) 10 | assert isinstance(backbone, Backbone) 11 | return backbone 12 | 13 | 14 | def build_sem_seg_head(cfg, input_shape): 15 | return FCNHead(cfg, input_shape) 16 | 17 | 18 | def build_model(cfg): 19 | cfg.build_backbone = build_backbone 20 | cfg.build_sem_seg_head = build_sem_seg_head 21 | 22 | model = SemanticSegmentor(cfg) 23 | return model 24 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/fcn/fcn.res101.cityscapes.multiscale.1x.s16/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone, build_resnet_backbone 3 | from cvpods.modeling.meta_arch import FCNHead, SemanticSegmentor 4 | 5 | 6 | def build_backbone(cfg, input_shape=None): 7 | if input_shape is None: 8 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 9 | backbone = build_resnet_backbone(cfg, input_shape) 10 | assert isinstance(backbone, Backbone) 11 | return backbone 12 | 13 | 14 | def build_sem_seg_head(cfg, input_shape): 15 | return FCNHead(cfg, input_shape) 16 | 17 | 18 | def build_model(cfg): 19 | cfg.build_backbone = build_backbone 20 | cfg.build_sem_seg_head = build_sem_seg_head 21 | 22 | model = SemanticSegmentor(cfg) 23 | return model 24 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/fcn/fcn.res101.cityscapes.multiscale.1x.s32/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone, build_resnet_backbone 3 | from cvpods.modeling.meta_arch import FCNHead, SemanticSegmentor 4 | 5 | 6 | def build_backbone(cfg, input_shape=None): 7 | if input_shape is None: 8 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 9 | backbone = build_resnet_backbone(cfg, input_shape) 10 | assert isinstance(backbone, Backbone) 11 | return backbone 12 | 13 | 14 | def build_sem_seg_head(cfg, input_shape): 15 | return FCNHead(cfg, input_shape) 16 | 17 | 18 | def build_model(cfg): 19 | cfg.build_backbone = build_backbone 20 | cfg.build_sem_seg_head = build_sem_seg_head 21 | 22 | model = SemanticSegmentor(cfg) 23 | return model 24 | -------------------------------------------------------------------------------- /cvpods/utils/apex_wrapper.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | import functools 6 | 7 | try: 8 | from apex import amp 9 | except ImportError: 10 | pass 11 | 12 | 13 | def is_amp_training(): 14 | """ 15 | check weather amp training is enabled. 16 | 17 | Returns: 18 | bool: True if amp training is enabled 19 | """ 20 | try: 21 | return hasattr(amp._amp_state, "loss_scalers") 22 | except Exception: 23 | return False 24 | 25 | 26 | def float_function(func): 27 | 28 | @functools.wraps(func) 29 | def float_wraps(*args, **kwargs): 30 | if is_amp_training(): 31 | return amp.float_function(func)(*args, **kwargs) 32 | else: 33 | return func(*args, **kwargs) 34 | return float_wraps 35 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/custom-modification.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Custom Modification 3 | about: Guides of custom development based on cvpods. 4 | title: "[CUSTOM]" 5 | labels: '' 6 | assignees: poodarchu 7 | 8 | --- 9 | 10 | **Please use this template to submit your problem or your question will _NOT_ be properly tackled.** 11 | 12 | --- 13 | 14 | This template is used for the following circumstances: 15 | * You want to use cvpods to implement some custom requirements (_e.g. new layers / optimizers / datasets_), but after checking the basic documentation, you still don't know how to do it. 16 | * You want to improve or implement a custom function in a more efficient way. 17 | 18 | ## What do you want to implement? 19 | Describe your need here. 20 | 21 | ## What have you already finished? 22 | Describe your progress here. 23 | 24 | ## What is your problem. 25 | Put your question here. 26 | -------------------------------------------------------------------------------- /docker/README.md: -------------------------------------------------------------------------------- 1 | 2 | ## Use the container (with docker ≥ 19.03) 3 | 4 | ``` 5 | cd docker/ 6 | # Build: 7 | docker build --build-arg USER_ID=$UID -t cvpods:v0 . 8 | # Launch: 9 | docker run --gpus all -it \ 10 | --shm-size=8gb --env="DISPLAY" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ 11 | --name=cvpods cvpods:v0 12 | 13 | # Grant docker access to host X server to show images 14 | xhost +local:`docker inspect --format='{{ .Config.Hostname }}' cvpods` 15 | ``` 16 | 17 | ## Use the container (with docker < 19.03) 18 | 19 | Install docker-compose and nvidia-docker2, then run: 20 | ``` 21 | cd docker && USER_ID=$UID docker-compose run cvpods 22 | ``` 23 | 24 | ## Install new dependencies 25 | Add the following to `Dockerfile` to make persistent changes. 26 | ``` 27 | RUN sudo apt-get update && sudo apt-get install -y vim 28 | ``` 29 | Or run them in the container to make temporary changes. 30 | -------------------------------------------------------------------------------- /cvpods/layers/rotated_boxes.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. 4 | # This file has been modified by Megvii ("Megvii Modifications"). 5 | # All Megvii Modifications are Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 6 | 7 | from cvpods import _C 8 | 9 | 10 | def pairwise_iou_rotated(boxes1, boxes2): 11 | """ 12 | Return intersection-over-union (Jaccard index) of boxes. 13 | 14 | Both sets of boxes are expected to be in 15 | (x_center, y_center, width, height, angle) format. 16 | 17 | Arguments: 18 | boxes1 (Tensor[N, 5]) 19 | boxes2 (Tensor[M, 5]) 20 | 21 | Returns: 22 | iou (Tensor[N, M]): the NxM matrix containing the pairwise 23 | IoU values for every element in boxes1 and boxes2 24 | """ 25 | return _C.box_iou_rotated(boxes1, boxes2) 26 | -------------------------------------------------------------------------------- /playground/segmentation/coco/tensormask/tensormask.res50.fpn.coco.800size.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_retinanet_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch import TensorMask 5 | 6 | 7 | def build_backbone(cfg, input_shape=None): 8 | """ 9 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 10 | 11 | Returns: 12 | an instance of :class:`Backbone` 13 | """ 14 | if input_shape is None: 15 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 16 | 17 | backbone = build_retinanet_resnet_fpn_backbone(cfg, input_shape) 18 | assert isinstance(backbone, Backbone) 19 | return backbone 20 | 21 | 22 | def build_model(cfg): 23 | 24 | cfg.build_backbone = build_backbone 25 | 26 | model = TensorMask(cfg) 27 | return model 28 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/coco/semanticfpn/semanticfpn.res50.fpn.coco.multiscale.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch import SemanticSegmentor, SemSegFPNHead 5 | 6 | 7 | def build_backbone(cfg, input_shape=None): 8 | if input_shape is None: 9 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 10 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 11 | assert isinstance(backbone, Backbone) 12 | return backbone 13 | 14 | 15 | def build_sem_seg_head(cfg, input_shape): 16 | return SemSegFPNHead(cfg, input_shape) 17 | 18 | 19 | def build_model(cfg): 20 | cfg.build_backbone = build_backbone 21 | cfg.build_sem_seg_head = build_sem_seg_head 22 | 23 | model = SemanticSegmentor(cfg) 24 | return model 25 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/ml_nms/ml_nms.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. 2 | #pragma once 3 | #include 4 | 5 | namespace cvpods { 6 | #ifdef WITH_CUDA 7 | at::Tensor ml_nms_cuda(const at::Tensor boxes, float nms_overlap_thresh); 8 | #endif 9 | 10 | 11 | inline at::Tensor ml_nms(const at::Tensor& dets, 12 | const at::Tensor& scores, 13 | const at::Tensor& labels, 14 | const float threshold) { 15 | 16 | if (dets.device().is_cuda()) { 17 | #ifdef WITH_CUDA 18 | // TODO raise error if not compiled with CUDA 19 | if (dets.numel() == 0) 20 | return at::empty({0}, dets.options().dtype(at::kLong).device(at::kCPU)); 21 | auto b = at::cat({dets, scores.unsqueeze(1), labels.unsqueeze(1)}, 1); 22 | return ml_nms_cuda(b, threshold); 23 | #else 24 | AT_ERROR("Not compiled with GPU support"); 25 | #endif 26 | } 27 | AT_ERROR("CPU version not implemented"); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /tools/dev/run_instant_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 3 | 4 | BIN="python tools/train_net.py" 5 | OUTPUT="instant_test_output" 6 | NUM_GPUS=2 7 | 8 | CFG_LIST=( "${@:1}" ) 9 | if [ ${#CFG_LIST[@]} -eq 0 ]; then 10 | CFG_LIST=( ./configs/quick_schedules/*instant_test.yaml ) 11 | fi 12 | 13 | echo "========================================================================" 14 | echo "Configs to run:" 15 | echo "${CFG_LIST[@]}" 16 | echo "========================================================================" 17 | 18 | for cfg in "${CFG_LIST[@]}"; do 19 | echo "========================================================================" 20 | echo "Running $cfg ..." 21 | echo "========================================================================" 22 | $BIN --num-gpus $NUM_GPUS --config-file "$cfg" \ 23 | SOLVER.IMS_PER_BATCH $(($NUM_GPUS * 2)) \ 24 | OUTPUT_DIR "$OUTPUT" 25 | rm -rf "$OUTPUT" 26 | done 27 | 28 | -------------------------------------------------------------------------------- /cvpods/utils/imports.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | import importlib 6 | import os.path as osp 7 | 8 | 9 | def dynamic_import(config_name, config_path): 10 | """ 11 | Dynamic import a project. 12 | 13 | Args: 14 | config_name (str): module name 15 | config_path (str): the dir that contains the .py with this module. 16 | 17 | Examples:: 18 | >>> root = "/path/to/your/retinanet/" 19 | >>> project = root + "retinanet.res50.fpn.coco.800size.1x.mrcnn_sigmoid" 20 | >>> cfg = dynamic_import("config", project).config 21 | >>> net = dynamic_import("net", project) 22 | """ 23 | spec = importlib.util.spec_from_file_location("", osp.join(config_path, config_name + ".py")) 24 | module = importlib.util.module_from_spec(spec) 25 | spec.loader.exec_module(module) 26 | return module 27 | 28 | # return importlib.import_module(config_name, config_path) 29 | -------------------------------------------------------------------------------- /cvpods/configs/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .base_classification_config import BaseClassificationConfig 6 | from .base_config import BaseConfig 7 | from .base_detection_config import BaseDetectionConfig 8 | from .boxinst_config import BoxInstConfig 9 | from .condinst_config import CondInstConfig 10 | from .dynamic_routing_config import SemanticSegmentationConfig 11 | from .efficientdet_config import EfficientDetConfig 12 | from .fcos_config import FCOSConfig 13 | from .keypoint_config import KeypointConfig 14 | from .panoptic_seg_config import PanopticSegmentationConfig 15 | from .pointrend_config import PointRendRCNNFPNConfig 16 | from .rcnn_config import RCNNConfig 17 | from .rcnn_fpn_config import RCNNFPNConfig 18 | from .retinanet_config import RetinaNetConfig 19 | from .segm_config import SegmentationConfig 20 | from .solo_config import SOLOConfig 21 | from .ssd_config import SSDConfig 22 | from .yolo_config import YOLO3Config 23 | -------------------------------------------------------------------------------- /tools/dev/linter.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 3 | 4 | # Run this script at project root by "./dev/linter.sh" before you commit 5 | 6 | { 7 | black --version | grep "19.3b0" > /dev/null 8 | } || { 9 | echo "Linter requires black==19.3b0 !" 10 | exit 1 11 | } 12 | 13 | set -v 14 | 15 | echo "Running isort ..." 16 | isort -y --multi-line 3 --trailing-comma -sp . --skip datasets --skip docs --skip-glob '*/__init__.py' --atomic 17 | 18 | echo "Running black ..." 19 | black -l 100 . 20 | 21 | echo "Running flake8 ..." 22 | if [ -x "$(command -v flake8-3)" ]; then 23 | flake8-3 . 24 | else 25 | python3 -m flake8 . 26 | fi 27 | 28 | # echo "Running mypy ..." 29 | # Pytorch does not have enough type annotations 30 | # mypy cvpods/solver cvpods/structures cvpods/config 31 | 32 | echo "Running clang-format ..." 33 | find . -regex ".*\.\(cpp\|c\|cc\|cu\|cxx\|h\|hh\|hpp\|hxx\|tcc\|mm\|m\)" -print0 | xargs -0 clang-format -i 34 | 35 | command -v arc > /dev/null && arc lint 36 | -------------------------------------------------------------------------------- /playground/detection/coco/detr/detr.res50.c5.coco.multiscale.150e.bs16/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import sys 3 | 4 | from cvpods.layers import ShapeSpec 5 | from cvpods.modeling.backbone import Backbone, build_resnet_backbone 6 | from cvpods.modeling.meta_arch.detr import DETR 7 | 8 | from optimizer import OPTIMIZER_BUILDER # noqa 9 | 10 | sys.path.append("..") 11 | 12 | 13 | def build_backbone(cfg, input_shape=None): 14 | """ 15 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 16 | 17 | Returns: 18 | an instance of :class:`Backbone` 19 | """ 20 | if input_shape is None: 21 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 22 | 23 | backbone = build_resnet_backbone(cfg, input_shape) 24 | assert isinstance(backbone, Backbone) 25 | return backbone 26 | 27 | 28 | def build_model(cfg): 29 | cfg.build_backbone = build_backbone 30 | model = DETR(cfg) 31 | 32 | logger = logging.getLogger(__name__) 33 | logger.info("Model:\n{}".format(model)) 34 | return model 35 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/box_iou_rotated/box_iou_rotated.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | #pragma once 3 | #include 4 | 5 | namespace cvpods { 6 | 7 | at::Tensor box_iou_rotated_cpu( 8 | const at::Tensor& boxes1, 9 | const at::Tensor& boxes2); 10 | 11 | #ifdef WITH_CUDA 12 | at::Tensor box_iou_rotated_cuda( 13 | const at::Tensor& boxes1, 14 | const at::Tensor& boxes2); 15 | #endif 16 | 17 | // Interface for Python 18 | // inline is needed to prevent multiple function definitions when this header is 19 | // included by different cpps 20 | inline at::Tensor box_iou_rotated( 21 | const at::Tensor& boxes1, 22 | const at::Tensor& boxes2) { 23 | assert(boxes1.device().is_cuda() == boxes2.device().is_cuda()); 24 | if (boxes1.device().is_cuda()) { 25 | #ifdef WITH_CUDA 26 | return box_iou_rotated_cuda(boxes1, boxes2); 27 | #else 28 | AT_ERROR("Not compiled with GPU support"); 29 | #endif 30 | } 31 | 32 | return box_iou_rotated_cpu(boxes1, boxes2); 33 | } 34 | 35 | } // namespace cvpods 36 | -------------------------------------------------------------------------------- /docs/modules/data.rst: -------------------------------------------------------------------------------- 1 | cvpods.data package 2 | ======================= 3 | 4 | .. automodule:: cvpods.data 5 | :members: 6 | :undoc-members: 7 | :show-inheritance: 8 | 9 | cvpods.data.catalog module 10 | -------------------------------- 11 | 12 | cvpods.data.detection\_utils module 13 | --------------------------------------- 14 | 15 | .. automodule:: cvpods.data.detection_utils 16 | :members: 17 | :undoc-members: 18 | :show-inheritance: 19 | 20 | cvpods.data.datasets module 21 | --------------------------------------- 22 | 23 | .. automodule:: cvpods.data.datasets 24 | :members: 25 | :undoc-members: 26 | :show-inheritance: 27 | 28 | cvpods.data.samplers module 29 | --------------------------------------- 30 | 31 | .. automodule:: cvpods.data.samplers 32 | :members: 33 | :undoc-members: 34 | :show-inheritance: 35 | 36 | 37 | cvpods.data.transforms module 38 | --------------------------------------- 39 | 40 | .. automodule:: cvpods.data.transforms 41 | :members: 42 | :undoc-members: 43 | :show-inheritance: 44 | -------------------------------------------------------------------------------- /playground/detection/coco/sparse_rcnn/sparse_rcnn.res50.fpn.coco.multiscale.3x/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import sys 3 | 4 | from cvpods.layers import ShapeSpec 5 | from cvpods.modeling.backbone import Backbone 6 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 7 | 8 | from optimizer import OPTIMIZER_BUILDER # noqa 9 | from sparse_rcnn import SparseRCNN 10 | 11 | sys.path.append("..") 12 | 13 | 14 | def build_backbone(cfg, input_shape=None): 15 | """ 16 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 17 | Returns: 18 | an instance of :class:`Backbone` 19 | """ 20 | if input_shape is None: 21 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 22 | 23 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 24 | assert isinstance(backbone, Backbone) 25 | return backbone 26 | 27 | 28 | def build_model(cfg): 29 | cfg.build_backbone = build_backbone 30 | model = SparseRCNN(cfg) 31 | 32 | logger = logging.getLogger(__name__) 33 | logger.info("Model:\n{}".format(model)) 34 | return model 35 | -------------------------------------------------------------------------------- /cvpods/configs/boxinst_config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .condinst_config import CondInstConfig 6 | 7 | _config_dict = dict( 8 | MODEL=dict( 9 | BOXINST=dict( 10 | BOTTOM_PIXELS_REMOVED=10, 11 | PAIRWISE_LOSS=dict( 12 | ENABLE=True, 13 | PATCH_SIZE=3, 14 | DILATION=2, 15 | THETA=2, 16 | EDGE_COUNT_ONCE=True, 17 | COLOR_SIM_THRESH=0.3, 18 | WARMUP_ITERS=10000, 19 | ), 20 | ), 21 | CONDINST=dict( 22 | MAX_PROPOSALS=-1, 23 | TOPK_PROPOSALS_PER_IM=64, 24 | MASK_BRANCH=dict( 25 | OUT_CHANNELS=16, 26 | ), 27 | ), 28 | ), 29 | ) 30 | 31 | 32 | class BoxInstConfig(CondInstConfig): 33 | def __init__(self, d=None, **kwargs): 34 | super().__init__(d, **kwargs) 35 | self._register_configuration(_config_dict) 36 | 37 | 38 | config = BoxInstConfig() 39 | -------------------------------------------------------------------------------- /cvpods/utils/file/serialize.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | import cloudpickle 3 | 4 | 5 | class PicklableWrapper(object): 6 | """ 7 | Wrap an object to make it more picklable, note that it uses 8 | heavy weight serialization libraries that are slower than pickle. 9 | It's best to use it only on closures (which are usually not picklable). 10 | 11 | This is a simplified version of 12 | https://github.com/joblib/joblib/blob/master/joblib/externals/loky/cloudpickle_wrapper.py 13 | """ 14 | 15 | def __init__(self, obj): 16 | self._obj = obj 17 | 18 | def __reduce__(self): 19 | s = cloudpickle.dumps(self._obj) 20 | return cloudpickle.loads, (s,) 21 | 22 | def __call__(self, *args, **kwargs): 23 | return self._obj(*args, **kwargs) 24 | 25 | def __getattr__(self, attr): 26 | # Ensure that the wrapped object can be used seamlessly as the previous object. 27 | if attr not in ["_obj"]: 28 | return getattr(self._obj, attr) 29 | return getattr(self, attr) 30 | -------------------------------------------------------------------------------- /playground/segmentation/coco/solo/solo.res50.fpn.coco.800size.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.solo import SOLO 5 | from cvpods.modeling.meta_arch.solo_decoupled import DecoupledSOLO 6 | 7 | 8 | def build_backbone(cfg, input_shape=None): 9 | if input_shape is None: 10 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 11 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 12 | assert isinstance(backbone, Backbone) 13 | return backbone 14 | 15 | 16 | def build_model(cfg): 17 | cfg.build_backbone = build_backbone 18 | solo_head = cfg.MODEL.SOLO.HEAD.TYPE 19 | if solo_head in ["SOLOHead"]: 20 | model = SOLO(cfg) 21 | elif solo_head in ["DecoupledSOLOHead"]: 22 | model = DecoupledSOLO(cfg) 23 | else: 24 | raise ValueError( 25 | f"Unknow SOLO head type: {solo_head}. " 26 | "Please select from ['SOLOHead', 'DecoupledSOLOHead'].") 27 | return model 28 | -------------------------------------------------------------------------------- /playground/segmentation/coco/solo/solo.res50.fpn.coco.multiscale.3x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.solo import SOLO 5 | from cvpods.modeling.meta_arch.solo_decoupled import DecoupledSOLO 6 | 7 | 8 | def build_backbone(cfg, input_shape=None): 9 | if input_shape is None: 10 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 11 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 12 | assert isinstance(backbone, Backbone) 13 | return backbone 14 | 15 | 16 | def build_model(cfg): 17 | cfg.build_backbone = build_backbone 18 | solo_head = cfg.MODEL.SOLO.HEAD.TYPE 19 | if solo_head in ["SOLOHead"]: 20 | model = SOLO(cfg) 21 | elif solo_head in ["DecoupledSOLOHead"]: 22 | model = DecoupledSOLO(cfg) 23 | else: 24 | raise ValueError( 25 | f"Unknow SOLO head type: {solo_head}. " 26 | "Please select from ['SOLOHead', 'DecoupledSOLOHead'].") 27 | return model 28 | -------------------------------------------------------------------------------- /playground/segmentation/coco/solo/decoupled_solo.res50.fpn.coco.800size.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.solo import SOLO 5 | from cvpods.modeling.meta_arch.solo_decoupled import DecoupledSOLO 6 | 7 | 8 | def build_backbone(cfg, input_shape=None): 9 | if input_shape is None: 10 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 11 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 12 | assert isinstance(backbone, Backbone) 13 | return backbone 14 | 15 | 16 | def build_model(cfg): 17 | cfg.build_backbone = build_backbone 18 | solo_head = cfg.MODEL.SOLO.HEAD.TYPE 19 | if solo_head in ["SOLOHead"]: 20 | model = SOLO(cfg) 21 | elif solo_head in ["DecoupledSOLOHead"]: 22 | model = DecoupledSOLO(cfg) 23 | else: 24 | raise ValueError( 25 | f"Unknow SOLO head type: {solo_head}. " 26 | "Please select from ['SOLOHead', 'DecoupledSOLOHead'].") 27 | return model 28 | -------------------------------------------------------------------------------- /playground/segmentation/coco/solo/decoupled_solo.res50.fpn.coco.multiscale.3x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.solo import SOLO 5 | from cvpods.modeling.meta_arch.solo_decoupled import DecoupledSOLO 6 | 7 | 8 | def build_backbone(cfg, input_shape=None): 9 | if input_shape is None: 10 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 11 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 12 | assert isinstance(backbone, Backbone) 13 | return backbone 14 | 15 | 16 | def build_model(cfg): 17 | cfg.build_backbone = build_backbone 18 | solo_head = cfg.MODEL.SOLO.HEAD.TYPE 19 | if solo_head in ["SOLOHead"]: 20 | model = SOLO(cfg) 21 | elif solo_head in ["DecoupledSOLOHead"]: 22 | model = DecoupledSOLO(cfg) 23 | else: 24 | raise ValueError( 25 | f"Unknow SOLO head type: {solo_head}. " 26 | "Please select from ['SOLOHead', 'DecoupledSOLOHead'].") 27 | return model 28 | -------------------------------------------------------------------------------- /cvpods/modeling/backbone/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. 4 | # This file has been modified by Megvii ("Megvii Modifications"). 5 | # All Megvii Modifications are Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 6 | 7 | # TODO wangfeng02: refine __init__.py 8 | from .backbone import Backbone 9 | from .bifpn import BiFPN, build_efficientnet_bifpn_backbone 10 | from .darknet import Darknet, build_darknet_backbone 11 | from .dynamic_arch import DynamicNetwork, build_dynamic_backbone 12 | from .efficientnet import EfficientNet, build_efficientnet_backbone 13 | from .fpn import FPN 14 | from .mobilenet import InvertedResBlock, MobileNetV2, MobileStem, build_mobilenetv2_backbone 15 | from .resnet import ResNet, ResNetBlockBase, build_resnet_backbone, make_stage 16 | # TODO can expose more resnet blocks after careful consideration 17 | from .shufflenet import ShuffleNetV2, ShuffleV2Block, build_shufflenetv2_backbone 18 | from .snet import SNet, build_snet_backbone 19 | # from .timm_backbone import build_timm_backbone 20 | from .transformer import Transformer 21 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/nms_rotated/nms_rotated.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | #pragma once 3 | #include 4 | 5 | namespace cvpods { 6 | 7 | at::Tensor nms_rotated_cpu( 8 | const at::Tensor& dets, 9 | const at::Tensor& scores, 10 | const float iou_threshold); 11 | 12 | #ifdef WITH_CUDA 13 | at::Tensor nms_rotated_cuda( 14 | const at::Tensor& dets, 15 | const at::Tensor& scores, 16 | const float iou_threshold); 17 | #endif 18 | 19 | // Interface for Python 20 | // inline is needed to prevent multiple function definitions when this header is 21 | // included by different cpps 22 | inline at::Tensor nms_rotated( 23 | const at::Tensor& dets, 24 | const at::Tensor& scores, 25 | const float iou_threshold) { 26 | assert(dets.device().is_cuda() == scores.device().is_cuda()); 27 | if (dets.device().is_cuda()) { 28 | #ifdef WITH_CUDA 29 | return nms_rotated_cuda(dets, scores, iou_threshold); 30 | #else 31 | AT_ERROR("Not compiled with GPU support"); 32 | #endif 33 | } 34 | 35 | return nms_rotated_cpu(dets, scores, iou_threshold); 36 | } 37 | 38 | } // namespace cvpods 39 | -------------------------------------------------------------------------------- /playground/detection/coco/ssd/ssd.vgg16.coco.300size/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.backbone import Backbone 5 | from cvpods.modeling.backbone.vgg import build_ssd_vgg_backbone 6 | from cvpods.modeling.meta_arch import SSD 7 | from cvpods.modeling.meta_arch.ssd import DefaultBox 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_ssd_vgg_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_default_box_generator(cfg): 26 | return DefaultBox(cfg) 27 | 28 | 29 | def build_model(cfg): 30 | cfg.build_backbone = build_backbone 31 | cfg.build_default_box_generator = build_default_box_generator 32 | 33 | model = SSD(cfg) 34 | logger = logging.getLogger(__name__) 35 | logger.info("Model:\n{}".format(model)) 36 | return model 37 | -------------------------------------------------------------------------------- /playground/detection/coco/ssd/ssd.vgg16.coco.512size/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.backbone import Backbone 5 | from cvpods.modeling.backbone.vgg import build_ssd_vgg_backbone 6 | from cvpods.modeling.meta_arch import SSD 7 | from cvpods.modeling.meta_arch.ssd import DefaultBox 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_ssd_vgg_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_default_box_generator(cfg): 26 | return DefaultBox(cfg) 27 | 28 | 29 | def build_model(cfg): 30 | cfg.build_backbone = build_backbone 31 | cfg.build_default_box_generator = build_default_box_generator 32 | 33 | model = SSD(cfg) 34 | logger = logging.getLogger(__name__) 35 | logger.info("Model:\n{}".format(model)) 36 | return model 37 | -------------------------------------------------------------------------------- /playground/detection/coco/ssd/ssd.vgg16.coco.300size.expand_aug/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.backbone import Backbone 5 | from cvpods.modeling.backbone.vgg import build_ssd_vgg_backbone 6 | from cvpods.modeling.meta_arch import SSD 7 | from cvpods.modeling.meta_arch.ssd import DefaultBox 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_ssd_vgg_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_default_box_generator(cfg): 26 | return DefaultBox(cfg) 27 | 28 | 29 | def build_model(cfg): 30 | cfg.build_backbone = build_backbone 31 | cfg.build_default_box_generator = build_default_box_generator 32 | 33 | model = SSD(cfg) 34 | logger = logging.getLogger(__name__) 35 | logger.info("Model:\n{}".format(model)) 36 | return model 37 | -------------------------------------------------------------------------------- /playground/detection/coco/ssd/ssd.vgg16.coco.512size.expand_aug/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.backbone import Backbone 5 | from cvpods.modeling.backbone.vgg import build_ssd_vgg_backbone 6 | from cvpods.modeling.meta_arch import SSD 7 | from cvpods.modeling.meta_arch.ssd import DefaultBox 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_ssd_vgg_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_default_box_generator(cfg): 26 | return DefaultBox(cfg) 27 | 28 | 29 | def build_model(cfg): 30 | cfg.build_backbone = build_backbone 31 | cfg.build_default_box_generator = build_default_box_generator 32 | 33 | model = SSD(cfg) 34 | logger = logging.getLogger(__name__) 35 | logger.info("Model:\n{}".format(model)) 36 | return model 37 | -------------------------------------------------------------------------------- /cvpods/modeling/meta_arch/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. 4 | # This file has been modified by Megvii ("Megvii Modifications"). 5 | # All Megvii Modifications are Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 6 | 7 | # import all the meta_arch, so they will be registered 8 | 9 | from .auto_assign import AutoAssign 10 | from .borderdet import BorderDet 11 | from .boxinst import BoxInst 12 | from .centernet import CenterNet 13 | from .condinst import CondInst 14 | from .dynamic4seg import DynamicNet4Seg 15 | from .efficientdet import EfficientDet 16 | from .fcn import FCNHead 17 | from .fcos import FCOS 18 | from .free_anchor import FreeAnchor 19 | from .panoptic_fpn import PanopticFPN 20 | from .pointrend import CoarseMaskHead, PointRendROIHeads, PointRendSemSegHead, StandardPointHead 21 | from .rcnn import GeneralizedRCNN, ProposalNetwork 22 | from .reppoints import RepPoints 23 | from .retinanet import RetinaNet 24 | from .semantic_seg import SemanticSegmentor, SemSegFPNHead 25 | from .ssd import SSD 26 | from .tensormask import TensorMask 27 | from .yolov3 import YOLOv3 28 | -------------------------------------------------------------------------------- /cvpods/modeling/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. 4 | # This file has been modified by Megvii ("Megvii Modifications"). 5 | # All Megvii Modifications are Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 6 | 7 | import torch 8 | 9 | from cvpods.layers import ShapeSpec 10 | 11 | # from .anchor_generator import build_anchor_generator 12 | from .backbone import FPN, Backbone, ResNet, ResNetBlockBase, build_resnet_backbone, make_stage 13 | from .matcher import Matcher 14 | from .meta_arch import GeneralizedRCNN, PanopticFPN, ProposalNetwork, RetinaNet, SemanticSegmentor 15 | from .postprocessing import detector_postprocess 16 | from .roi_heads import ROIHeads, StandardROIHeads 17 | from .test_time_augmentation import DatasetMapperTTA, GeneralizedRCNNWithTTA, TTAWarper 18 | 19 | _EXCLUDE = {"torch", "ShapeSpec"} 20 | __all__ = [k for k in globals().keys() if k not in _EXCLUDE and not k.startswith("_")] 21 | 22 | assert (torch.Tensor([1]) == torch.Tensor([2])).dtype == torch.bool, ( 23 | "Your Pytorch is too old. " 24 | "Please update to contain https://github.com/pytorch/pytorch/pull/21113" 25 | ) 26 | -------------------------------------------------------------------------------- /cvpods/modeling/losses/dice_loss.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | import torch 6 | 7 | 8 | def dice_loss(input, target): 9 | r""" 10 | Dice loss defined in the V-Net paper as: 11 | 12 | Loss_dice = 1 - D 13 | 14 | 2 * sum(p_i * g_i) 15 | D = ------------------------------ 16 | sum(p_i ^ 2) + sum(g_i ^ 2) 17 | 18 | where the sums run over the N mask pixels (i = 1 ... N), of the predicted binary segmentation 19 | pixel p_i ∈ P and the ground truth binary pixel g_i ∈ G. 20 | 21 | Args: 22 | input (Tensor): predicted binary mask, each pixel value should be in range [0, 1]. 23 | target (Tensor): ground truth binary mask. 24 | 25 | Returns: 26 | Tensor: dice loss. 27 | """ 28 | assert input.shape[-2:] == target.shape[-2:] 29 | input = input.view(input.size(0), -1).float() 30 | target = target.view(target.size(0), -1).float() 31 | 32 | d = ( 33 | 2 * torch.sum(input * target, dim=1) 34 | ) / ( 35 | torch.sum(input * input, dim=1) + torch.sum(target * target, dim=1) + 1e-4 36 | ) 37 | 38 | return 1 - d 39 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/border_align/border_align.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2019-2021 Megvii Inc. All rights reserved. */ 2 | #pragma once 3 | #include 4 | #include 5 | #include 6 | 7 | namespace cvpods { 8 | 9 | at::Tensor border_align_cuda_forward( 10 | const at::Tensor& feature, 11 | const at::Tensor& boxes, 12 | const at::Tensor& wh, 13 | const int pool_size); 14 | 15 | 16 | at::Tensor border_align_cuda_backward( 17 | const at::Tensor& gradOutput, 18 | const at::Tensor& feature, 19 | const at::Tensor& boxes, 20 | const at::Tensor& wh, 21 | const int pool_size); 22 | 23 | 24 | at::Tensor BorderAlign_Forward( 25 | const at::Tensor& feature, 26 | const at::Tensor& boxes, 27 | const at::Tensor& wh, 28 | const int pool_size) { 29 | return border_align_cuda_forward(feature, boxes, wh, pool_size); 30 | } 31 | 32 | 33 | at::Tensor BorderAlign_Backward( 34 | const at::Tensor& gradOutput, 35 | const at::Tensor& feature, 36 | const at::Tensor& boxes, 37 | const at::Tensor& wh, 38 | const int pool_size) { 39 | return border_align_cuda_backward(gradOutput, feature, boxes, wh, pool_size); 40 | } 41 | 42 | } // namespace cvpods 43 | -------------------------------------------------------------------------------- /playground/detection/coco/atss/atss.res50.fpn.coco.800size.1x/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import ShiftGenerator 5 | from cvpods.modeling.backbone import Backbone 6 | from cvpods.modeling.backbone.fpn import build_retinanet_resnet_fpn_backbone 7 | from cvpods.modeling.meta_arch.atss import ATSS 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_retinanet_resnet_fpn_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_shift_generator(cfg, input_shape): 26 | 27 | return ShiftGenerator(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | 32 | cfg.build_backbone = build_backbone 33 | cfg.build_shift_generator = build_shift_generator 34 | 35 | model = ATSS(cfg) 36 | logger = logging.getLogger(__name__) 37 | logger.info("Model:\n{}".format(model)) 38 | return model 39 | -------------------------------------------------------------------------------- /playground/detection/coco/fcos/fcos.res50.fpn.coco.800size.1x/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import ShiftGenerator 5 | from cvpods.modeling.backbone import Backbone 6 | from cvpods.modeling.backbone.fpn import build_retinanet_resnet_fpn_backbone 7 | from cvpods.modeling.meta_arch.fcos import FCOS 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_retinanet_resnet_fpn_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_shift_generator(cfg, input_shape): 26 | 27 | return ShiftGenerator(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | 32 | cfg.build_backbone = build_backbone 33 | cfg.build_shift_generator = build_shift_generator 34 | 35 | model = FCOS(cfg) 36 | logger = logging.getLogger(__name__) 37 | logger.info("Model:\n{}".format(model)) 38 | return model 39 | -------------------------------------------------------------------------------- /playground/detection/coco/tridentnet/tridentnet_base/trident_rpn.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | import torch 3 | 4 | from cvpods.modeling.proposal_generator.rpn import RPN 5 | from cvpods.structures import ImageList 6 | 7 | 8 | class TridentRPN(RPN): 9 | """ 10 | Trident RPN subnetwork. 11 | """ 12 | 13 | def __init__(self, cfg, input_shape): 14 | super(TridentRPN, self).__init__(cfg, input_shape) 15 | 16 | self.num_branch = cfg.MODEL.TRIDENT.NUM_BRANCH 17 | self.trident_fast = cfg.MODEL.TRIDENT.TEST_BRANCH_IDX != -1 18 | 19 | def forward(self, images, features, gt_instances=None): 20 | """ 21 | See :class:`RPN.forward`. 22 | """ 23 | num_branch = self.num_branch if self.training or not self.trident_fast else 1 24 | # Duplicate images and gt_instances for all branches in TridentNet. 25 | all_images = ImageList( 26 | torch.cat([images.tensor] * num_branch), images.image_sizes * num_branch 27 | ) 28 | all_gt_instances = gt_instances * num_branch if gt_instances is not None else None 29 | 30 | return super(TridentRPN, self).forward(all_images, features, all_gt_instances) 31 | -------------------------------------------------------------------------------- /playground/detection/citypersons/fcos/fcos.res50.fpn.citypersons.640size.1x/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import ShiftGenerator 5 | from cvpods.modeling.backbone import Backbone 6 | from cvpods.modeling.backbone.fpn import build_retinanet_resnet_fpn_backbone 7 | from cvpods.modeling.meta_arch import FCOS 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_retinanet_resnet_fpn_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_shift_generator(cfg, input_shape): 26 | 27 | return ShiftGenerator(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | 32 | cfg.build_backbone = build_backbone 33 | cfg.build_shift_generator = build_shift_generator 34 | 35 | model = FCOS(cfg) 36 | logger = logging.getLogger(__name__) 37 | logger.info("Model:\n{}".format(model)) 38 | return model 39 | -------------------------------------------------------------------------------- /playground/detection/widerface/fcos/fcos.res50.fpn.widerface.600size.0.5x_crop.plus.norm_sync/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import ShiftGenerator 5 | from cvpods.modeling.backbone import Backbone 6 | from cvpods.modeling.backbone.fpn import build_retinanet_resnet_fpn_backbone 7 | 8 | from fcos import FCOS 9 | 10 | 11 | def build_backbone(cfg, input_shape=None): 12 | """ 13 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 14 | 15 | Returns: 16 | an instance of :class:`Backbone` 17 | """ 18 | if input_shape is None: 19 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 20 | 21 | backbone = build_retinanet_resnet_fpn_backbone(cfg, input_shape) 22 | assert isinstance(backbone, Backbone) 23 | return backbone 24 | 25 | 26 | def build_shift_generator(cfg, input_shape): 27 | 28 | return ShiftGenerator(cfg, input_shape) 29 | 30 | 31 | def build_model(cfg): 32 | 33 | cfg.build_backbone = build_backbone 34 | cfg.build_shift_generator = build_shift_generator 35 | 36 | model = FCOS(cfg) 37 | logger = logging.getLogger(__name__) 38 | logger.info("Model:\n{}".format(model)) 39 | return model 40 | -------------------------------------------------------------------------------- /playground/detection/coco/detr/optimizer.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding:utf-8 -*- 3 | 4 | from torch import optim 5 | 6 | from cvpods.solver import OPTIMIZER_BUILDER, OptimizerBuilder 7 | 8 | 9 | @OPTIMIZER_BUILDER.register() 10 | class DETRAdamWBuilder(OptimizerBuilder): 11 | 12 | @staticmethod 13 | def build(model, cfg): 14 | lr = cfg.SOLVER.OPTIMIZER.BASE_LR 15 | 16 | param_dicts = [ 17 | { 18 | "params": [ 19 | param for name, param in model.named_parameters() 20 | if "backbone" not in name and param.requires_grad] 21 | }, 22 | { 23 | "params": [ 24 | param for name, param in model.named_parameters() 25 | if "backbone" in name and param.requires_grad], 26 | "lr": cfg.SOLVER.OPTIMIZER.BASE_LR_RATIO_BACKBONE * lr, 27 | }, 28 | ] 29 | 30 | optimizer = optim.AdamW( 31 | param_dicts, 32 | lr=lr, 33 | betas=cfg.SOLVER.OPTIMIZER.BETAS, 34 | weight_decay=cfg.SOLVER.OPTIMIZER.WEIGHT_DECAY, 35 | amsgrad=cfg.SOLVER.OPTIMIZER.AMSGRAD 36 | ) 37 | return optimizer 38 | -------------------------------------------------------------------------------- /playground/detection/coco/free_anchor/free_anchor.res50.fpn.coco.800size.1x/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import DefaultAnchorGenerator 5 | from cvpods.modeling.backbone import Backbone 6 | from cvpods.modeling.backbone.fpn import build_retinanet_resnet_fpn_backbone 7 | 8 | from retinanet import RetinaNet 9 | 10 | 11 | def build_backbone(cfg, input_shape=None): 12 | """ 13 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 14 | 15 | Returns: 16 | an instance of :class:`Backbone` 17 | """ 18 | if input_shape is None: 19 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 20 | 21 | backbone = build_retinanet_resnet_fpn_backbone(cfg, input_shape) 22 | assert isinstance(backbone, Backbone) 23 | return backbone 24 | 25 | 26 | def build_anchor_generator(cfg, input_shape): 27 | 28 | return DefaultAnchorGenerator(cfg, input_shape) 29 | 30 | 31 | def build_model(cfg): 32 | 33 | cfg.build_backbone = build_backbone 34 | cfg.build_anchor_generator = build_anchor_generator 35 | 36 | model = RetinaNet(cfg) 37 | logger = logging.getLogger(__name__) 38 | logger.info("Model:\n{}".format(model)) 39 | return model 40 | -------------------------------------------------------------------------------- /playground/detection/coco/reppoints/reppoints.res50.fpn.coco.800size.1x.partial_minmax/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import ShiftGenerator 5 | from cvpods.modeling.backbone import Backbone 6 | from cvpods.modeling.backbone.fpn import build_retinanet_resnet_fpn_backbone 7 | from cvpods.modeling.meta_arch import RepPoints 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_retinanet_resnet_fpn_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_shift_generator(cfg, input_shape): 26 | 27 | return ShiftGenerator(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | 32 | cfg.build_backbone = build_backbone 33 | cfg.build_shift_generator = build_shift_generator 34 | 35 | model = RepPoints(cfg) 36 | logger = logging.getLogger(__name__) 37 | logger.info("Model:\n{}".format(model)) 38 | return model 39 | -------------------------------------------------------------------------------- /cvpods/data/samplers/infinite.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from torch.utils.data import Sampler 6 | 7 | from ..registry import SAMPLERS 8 | 9 | 10 | @SAMPLERS.register() 11 | class Infinite(Sampler): 12 | r""" 13 | Infinite Sampler wraper for basic sampler. Code of pytorch dataloader will be autoloaded after 14 | sampler raise a StopIteration, we will check code of torch in the futures. Use Infinite wrapper 15 | to work around temporarily. 16 | """ 17 | 18 | def __init__(self, sampler): 19 | self.epoch = 0 20 | self.sampler = sampler 21 | self.sampler_iter = iter(self.sampler) 22 | 23 | def __iter__(self): 24 | return self 25 | 26 | def __next__(self): 27 | try: 28 | index = next(self.sampler_iter) 29 | except StopIteration: 30 | self.epoch += 1 31 | if callable(getattr(self.sampler, "set_epoch", None)): 32 | # use set_epoch to prevent generating the same sampler index 33 | self.sampler.set_epoch(self.epoch) 34 | self.sampler_iter = iter(self.sampler) 35 | index = next(self.sampler_iter) 36 | return index 37 | -------------------------------------------------------------------------------- /playground/detection/coco/retinanet/retinanet.res50.fpn.coco.multiscale.1x/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import DefaultAnchorGenerator 5 | from cvpods.modeling.backbone import Backbone 6 | from cvpods.modeling.backbone.fpn import build_retinanet_resnet_fpn_backbone 7 | from cvpods.modeling.meta_arch import RetinaNet 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_retinanet_resnet_fpn_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_anchor_generator(cfg, input_shape): 26 | 27 | return DefaultAnchorGenerator(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | 32 | cfg.build_backbone = build_backbone 33 | cfg.build_anchor_generator = build_anchor_generator 34 | 35 | model = RetinaNet(cfg) 36 | logger = logging.getLogger(__name__) 37 | logger.info("Model:\n{}".format(model)) 38 | 39 | return model 40 | -------------------------------------------------------------------------------- /playground/detection/citypersons/retinanet/retinanet.res50.fpn.citypersons.640size.1x/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import DefaultAnchorGenerator 5 | from cvpods.modeling.backbone import Backbone 6 | from cvpods.modeling.backbone.fpn import build_retinanet_resnet_fpn_backbone 7 | from cvpods.modeling.meta_arch import RetinaNet 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_retinanet_resnet_fpn_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_anchor_generator(cfg, input_shape): 26 | 27 | return DefaultAnchorGenerator(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | 32 | cfg.build_backbone = build_backbone 33 | cfg.build_anchor_generator = build_anchor_generator 34 | 35 | model = RetinaNet(cfg) 36 | logger = logging.getLogger(__name__) 37 | logger.info("Model:\n{}".format(model)) 38 | return model 39 | -------------------------------------------------------------------------------- /cvpods/configs/yolo_config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .base_detection_config import BaseDetectionConfig 6 | 7 | _config_dict = dict( 8 | MODEL=dict( 9 | PIXEL_MEAN=(0.485, 0.456, 0.406), 10 | PIXEL_STD=(0.229, 0.224, 0.225), 11 | DARKNET=dict( 12 | DEPTH=53, 13 | STEM_OUT_CHANNELS=32, 14 | WEIGHTS="cvpods/ImageNetPretrained/custom/darknet53.mix.pth", 15 | OUT_FEATURES=["dark3", "dark4", "dark5"] 16 | ), 17 | YOLO=dict( 18 | CLASSES=80, 19 | IN_FEATURES=["dark3", "dark4", "dark5"], 20 | ANCHORS=[ 21 | [[116, 90], [156, 198], [373, 326]], 22 | [[30, 61], [62, 45], [42, 119]], 23 | [[10, 13], [16, 30], [33, 23]], 24 | ], 25 | CONF_THRESHOLD=0.01, # TEST 26 | NMS_THRESHOLD=0.5, 27 | IGNORE_THRESHOLD=0.7, 28 | ), 29 | ), 30 | ) 31 | 32 | 33 | class YOLO3Config(BaseDetectionConfig): 34 | def __init__(self, d=None, **kwargs): 35 | super().__init__(d, **kwargs) 36 | self._register_configuration(_config_dict) 37 | 38 | 39 | config = YOLO3Config() 40 | -------------------------------------------------------------------------------- /cvpods/tools/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding:utf-8 -*- 3 | # Copyright (C) Megvii, Inc. and its affiliates. All rights reserved. 4 | 5 | # This file is modified by the following file: 6 | # https://github.com/facebookresearch/detectron2/blob/main/detectron2/projects/__init__.py 7 | # original file LICENSE: Apache2.0 8 | 9 | import importlib 10 | from pathlib import Path 11 | 12 | _TOOLS_ROOT = Path(__file__).resolve().parent.parent.parent / "tools" 13 | 14 | if _TOOLS_ROOT.is_dir(): 15 | # This is true only for in-place installation (pip install -e, setup.py develop), 16 | # where setup(package_dir=) does not work: https://github.com/pypa/setuptools/issues/230 17 | 18 | class _ToolsFinder(importlib.abc.MetaPathFinder): 19 | 20 | def find_spec(self, name, path, target=None): 21 | # pylint: disable=unused-argument 22 | if not name.startswith("cvpods.tools."): 23 | return 24 | project_name = name.split(".")[-1] + ".py" 25 | target_file = _TOOLS_ROOT / project_name 26 | if not target_file.is_file(): 27 | return 28 | return importlib.util.spec_from_file_location(name, target_file) 29 | 30 | import sys 31 | sys.meta_path.append(_ToolsFinder()) 32 | -------------------------------------------------------------------------------- /playground/detection/widerface/retinanet/retinanet.res50.fpn.widerface.600size.0.5x_crop/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import DefaultAnchorGenerator 5 | from cvpods.modeling.backbone import Backbone 6 | from cvpods.modeling.backbone.fpn import build_retinanet_resnet_fpn_backbone 7 | from cvpods.modeling.meta_arch import RetinaNet 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_retinanet_resnet_fpn_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_anchor_generator(cfg, input_shape): 26 | 27 | return DefaultAnchorGenerator(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | 32 | cfg.build_backbone = build_backbone 33 | cfg.build_anchor_generator = build_anchor_generator 34 | 35 | model = RetinaNet(cfg) 36 | logger = logging.getLogger(__name__) 37 | logger.info("Model:\n{}".format(model)) 38 | return model 39 | -------------------------------------------------------------------------------- /cvpods/utils/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. 4 | # This file has been modified by Megvii ("Megvii Modifications"). 5 | # All Megvii Modifications are Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 6 | 7 | from .distributed import comm # isort:skip 8 | from .file import * # isort:skip 9 | from .apex_wrapper import float_function, is_amp_training 10 | from .benchmark import Timer, benchmark, timeit 11 | from .dump import ( 12 | CommonMetricPrinter, 13 | EventStorage, 14 | EventWriter, 15 | HistoryBuffer, 16 | JSONWriter, 17 | TensorboardXWriter, 18 | create_small_table, 19 | create_table_with_header, 20 | get_event_storage, 21 | log_every_n, 22 | log_every_n_seconds, 23 | log_first_n, 24 | setup_logger 25 | ) 26 | from .env import collect_env_info, seed_all_rng, setup_custom_environment, setup_environment 27 | from .imports import dynamic_import 28 | from .memory import retry_if_cuda_oom 29 | from .metrics import accuracy 30 | from .registry import Registry 31 | from .visualizer import ColorMode, VideoVisualizer, VisImage, Visualizer, colormap, random_color 32 | 33 | __all__ = [k for k in globals().keys() if not k.startswith("_")] 34 | -------------------------------------------------------------------------------- /cvpods/utils/compat_wrapper.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | import functools 5 | from types import FunctionType 6 | from loguru import logger 7 | 8 | 9 | def deprecated_func(extra_info=None): 10 | 11 | def deprecated(func): 12 | @functools.wraps(func) 13 | def wrap_deprecated(*args, **kwargs): 14 | logger.warning("{} will be deprecated. {}".format(func.__name__, extra_info)) 15 | res = func(*args, **kwargs) 16 | return res 17 | 18 | return wrap_deprecated 19 | 20 | return deprecated 21 | 22 | 23 | def deprecated_cls(extra_info=None): 24 | 25 | def deprecated(cls): 26 | def __init__(self, *args, **kwargs): 27 | logger.warning("{} will be deprecated. {}".format(cls.__name__, extra_info)) 28 | super(cls, self).__init__(*args, **kwargs) 29 | 30 | cls.__init__ = __init__ 31 | 32 | return cls 33 | 34 | return deprecated 35 | 36 | 37 | def deprecated(extra_info=None): 38 | 39 | def deprecated(input): 40 | if isinstance(input, FunctionType): 41 | return deprecated_func(extra_info)(input) 42 | else: 43 | return deprecated_cls(extra_info)(input) 44 | 45 | return deprecated 46 | -------------------------------------------------------------------------------- /docs/modules/engine.rst: -------------------------------------------------------------------------------- 1 | cvpods.engine package 2 | ========================= 3 | 4 | 5 | .. automodule:: cvpods.engine 6 | :members: 7 | :undoc-members: 8 | :show-inheritance: 9 | 10 | cvpods.engine.hooks module 11 | --------------------------------- 12 | 13 | .. automodule:: cvpods.engine.hooks 14 | :members: 15 | :undoc-members: 16 | :show-inheritance: 17 | 18 | cvpods.engine.launch module 19 | --------------------------------- 20 | 21 | .. automodule:: cvpods.engine.launch 22 | :members: 23 | :undoc-members: 24 | :show-inheritance: 25 | 26 | cvpods.engine.setup module 27 | --------------------------------- 28 | 29 | .. automodule:: cvpods.engine.setup 30 | :members: 31 | :undoc-members: 32 | :show-inheritance: 33 | 34 | cvpods.engine.base_runner module 35 | --------------------------------- 36 | 37 | .. automodule:: cvpods.engine.base_runner 38 | :members: 39 | :undoc-members: 40 | :show-inheritance: 41 | 42 | cvpods.engine.runner module 43 | --------------------------------- 44 | 45 | .. automodule:: cvpods.engine.runner 46 | :members: 47 | :undoc-members: 48 | :show-inheritance: 49 | 50 | cvpods.engine.predictor module 51 | ---------------------------------- 52 | 53 | .. automodule:: cvpods.engine.predictor 54 | :members: 55 | :undoc-members: 56 | :show-inheritance: 57 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/dynamic_routing/Seg.Layer16/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.backbone import Backbone 5 | from cvpods.modeling.backbone.dynamic_arch.dynamic_backbone import build_dynamic_backbone 6 | from cvpods.modeling.meta_arch.dynamic4seg import DynamicNet4Seg, SemSegDecoderHead 7 | 8 | 9 | def build_backbone(cfg, input_shape=None): 10 | """ 11 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 12 | 13 | Returns: 14 | an instance of :class:`Backbone` 15 | """ 16 | if input_shape is None: 17 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN), 18 | height=cfg.INPUT.FIX_SIZE_FOR_FLOPS[0], 19 | width=cfg.INPUT.FIX_SIZE_FOR_FLOPS[1]) 20 | 21 | backbone = build_dynamic_backbone(cfg, input_shape) 22 | assert isinstance(backbone, Backbone) 23 | return backbone 24 | 25 | 26 | def build_sem_seg_head(cfg, input_shape=None): 27 | return SemSegDecoderHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_sem_seg_head = build_sem_seg_head 33 | model = DynamicNet4Seg(cfg) 34 | logger = logging.getLogger(__name__) 35 | logger.info("Model:\n{}".format(model)) 36 | return model 37 | -------------------------------------------------------------------------------- /cvpods/analyser/erf.md: -------------------------------------------------------------------------------- 1 | # Visualize ERF(effective receptive field) 2 | 3 | This tutorial explains how to visualize the ERF of layers in the model. 4 | 5 | ## Step1: Visualization command 6 | 7 | We provide a tool named `visualize_erf.py` to help you visualize the ERF of your model. 8 | 9 | For quick starter, make sure that you have installed [timm](https://github.com/huggingface/pytorch-image-models). Please install it with ```python3 -m pip install timm```. 10 | 11 | Here is an example to show the ERF of `layer1` in timm `ResNet50`. 12 | ```shell 13 | python3 visualize_erf.py --model resnet50 --name_list layer1 14 | ``` 15 | 16 | And you will see the quantitative analysis of ERF shown on your terminal: 17 | 18 | ```shell 19 | ERF analysis of model.layer1: 20 | Threshold 0.2 0.3 0.5 0.99 21 | Area Ratio 0.0007 0.0012 0.0018 0.0147 22 | Side Length 7 9 11 31 23 | ``` 24 | 25 | Then, a figure will be saved in the path, let's open it and go on. 26 | 27 | 28 | ## Step2: Check the visualization result 29 | 30 | Here is an example of visualization result: 31 |
32 | 33 | We report the high-contribution *area ratio* and the *side length* of a minimum square that covers the contribution scores over a given *threshold*. 34 | -------------------------------------------------------------------------------- /playground/detection/crowdhuman/rcnn/faster_rcnn.res50.fpn.crowdhuman.800size.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 6 | 7 | from roi_heads import StandardROIHeadsIgnore 8 | from rpn import RPNIgnore 9 | 10 | 11 | def build_backbone(cfg, input_shape=None): 12 | if input_shape is None: 13 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 14 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 15 | assert isinstance(backbone, Backbone) 16 | return backbone 17 | 18 | 19 | def build_proposal_generator(cfg, input_shape): 20 | return RPNIgnore(cfg, input_shape) 21 | 22 | 23 | def build_roi_heads(cfg, input_shape): 24 | return StandardROIHeadsIgnore(cfg, input_shape) 25 | 26 | 27 | def build_box_head(cfg, input_shape): 28 | return FastRCNNConvFCHead(cfg, input_shape) 29 | 30 | 31 | def build_model(cfg): 32 | cfg.build_backbone = build_backbone 33 | cfg.build_proposal_generator = build_proposal_generator 34 | cfg.build_roi_heads = build_roi_heads 35 | cfg.build_box_head = build_box_head 36 | 37 | model = GeneralizedRCNN(cfg) 38 | return model 39 | -------------------------------------------------------------------------------- /playground/detection/coco/rcnn/faster_rcnn.res50.c4.coco.multiscale.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.resnet import build_resnet_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import Res5ROIHeads 7 | from cvpods.modeling.roi_heads.mask_head import MaskRCNNConvUpsampleHead 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | if input_shape is None: 12 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 13 | backbone = build_resnet_backbone(cfg, input_shape) 14 | assert isinstance(backbone, Backbone) 15 | return backbone 16 | 17 | 18 | def build_proposal_generator(cfg, input_shape): 19 | return RPN(cfg, input_shape) 20 | 21 | 22 | def build_roi_heads(cfg, input_shape): 23 | return Res5ROIHeads(cfg, input_shape) 24 | 25 | 26 | def build_mask_head(cfg, input_shape): 27 | return MaskRCNNConvUpsampleHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_proposal_generator = build_proposal_generator 33 | cfg.build_roi_heads = build_roi_heads 34 | cfg.build_mask_head = build_mask_head 35 | 36 | model = GeneralizedRCNN(cfg) 37 | return model 38 | -------------------------------------------------------------------------------- /playground/detection/coco/rcnn/faster_rcnn.res50.fpn.coco.multiscale.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import StandardROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | if input_shape is None: 12 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 13 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 14 | assert isinstance(backbone, Backbone) 15 | return backbone 16 | 17 | 18 | def build_proposal_generator(cfg, input_shape): 19 | return RPN(cfg, input_shape) 20 | 21 | 22 | def build_roi_heads(cfg, input_shape): 23 | return StandardROIHeads(cfg, input_shape) 24 | 25 | 26 | def build_box_head(cfg, input_shape): 27 | return FastRCNNConvFCHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_proposal_generator = build_proposal_generator 33 | cfg.build_roi_heads = build_roi_heads 34 | cfg.build_box_head = build_box_head 35 | 36 | model = GeneralizedRCNN(cfg) 37 | return model 38 | -------------------------------------------------------------------------------- /playground/detection/voc/rcnn/faster_rcnn.res50.fpn.voc.multiscale.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import StandardROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | if input_shape is None: 12 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 13 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 14 | assert isinstance(backbone, Backbone) 15 | return backbone 16 | 17 | 18 | def build_proposal_generator(cfg, input_shape): 19 | return RPN(cfg, input_shape) 20 | 21 | 22 | def build_roi_heads(cfg, input_shape): 23 | return StandardROIHeads(cfg, input_shape) 24 | 25 | 26 | def build_box_head(cfg, input_shape): 27 | return FastRCNNConvFCHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_proposal_generator = build_proposal_generator 33 | cfg.build_roi_heads = build_roi_heads 34 | cfg.build_box_head = build_box_head 35 | 36 | model = GeneralizedRCNN(cfg) 37 | return model 38 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/dynamic_routing/Seg.Layer16.SmallGate.Dynamic_A/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.backbone import Backbone 5 | from cvpods.modeling.backbone.dynamic_arch.dynamic_backbone import build_dynamic_backbone 6 | from cvpods.modeling.meta_arch.dynamic4seg import DynamicNet4Seg, SemSegDecoderHead 7 | 8 | 9 | def build_backbone(cfg, input_shape=None): 10 | """ 11 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 12 | 13 | Returns: 14 | an instance of :class:`Backbone` 15 | """ 16 | if input_shape is None: 17 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN), 18 | height=cfg.INPUT.FIX_SIZE_FOR_FLOPS[0], 19 | width=cfg.INPUT.FIX_SIZE_FOR_FLOPS[1]) 20 | 21 | backbone = build_dynamic_backbone(cfg, input_shape) 22 | assert isinstance(backbone, Backbone) 23 | return backbone 24 | 25 | 26 | def build_sem_seg_head(cfg, input_shape=None): 27 | return SemSegDecoderHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_sem_seg_head = build_sem_seg_head 33 | model = DynamicNet4Seg(cfg) 34 | logger = logging.getLogger(__name__) 35 | logger.info("Model:\n{}".format(model)) 36 | return model 37 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/dynamic_routing/Seg.Layer16.SmallGate.Dynamic_B/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.backbone import Backbone 5 | from cvpods.modeling.backbone.dynamic_arch.dynamic_backbone import build_dynamic_backbone 6 | from cvpods.modeling.meta_arch.dynamic4seg import DynamicNet4Seg, SemSegDecoderHead 7 | 8 | 9 | def build_backbone(cfg, input_shape=None): 10 | """ 11 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 12 | 13 | Returns: 14 | an instance of :class:`Backbone` 15 | """ 16 | if input_shape is None: 17 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN), 18 | height=cfg.INPUT.FIX_SIZE_FOR_FLOPS[0], 19 | width=cfg.INPUT.FIX_SIZE_FOR_FLOPS[1]) 20 | 21 | backbone = build_dynamic_backbone(cfg, input_shape) 22 | assert isinstance(backbone, Backbone) 23 | return backbone 24 | 25 | 26 | def build_sem_seg_head(cfg, input_shape=None): 27 | return SemSegDecoderHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_sem_seg_head = build_sem_seg_head 33 | model = DynamicNet4Seg(cfg) 34 | logger = logging.getLogger(__name__) 35 | logger.info("Model:\n{}".format(model)) 36 | return model 37 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/dynamic_routing/Seg.Layer16.SmallGate.Dynamic_C/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.backbone import Backbone 5 | from cvpods.modeling.backbone.dynamic_arch.dynamic_backbone import build_dynamic_backbone 6 | from cvpods.modeling.meta_arch.dynamic4seg import DynamicNet4Seg, SemSegDecoderHead 7 | 8 | 9 | def build_backbone(cfg, input_shape=None): 10 | """ 11 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 12 | 13 | Returns: 14 | an instance of :class:`Backbone` 15 | """ 16 | if input_shape is None: 17 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN), 18 | height=cfg.INPUT.FIX_SIZE_FOR_FLOPS[0], 19 | width=cfg.INPUT.FIX_SIZE_FOR_FLOPS[1]) 20 | 21 | backbone = build_dynamic_backbone(cfg, input_shape) 22 | assert isinstance(backbone, Backbone) 23 | return backbone 24 | 25 | 26 | def build_sem_seg_head(cfg, input_shape=None): 27 | return SemSegDecoderHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_sem_seg_head = build_sem_seg_head 33 | model = DynamicNet4Seg(cfg) 34 | logger = logging.getLogger(__name__) 35 | logger.info("Model:\n{}".format(model)) 36 | return model 37 | -------------------------------------------------------------------------------- /playground/detection/coco/rcnn/faster_rcnn.res50.fpn.coco.multiscale.1x.syncbn/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import StandardROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | if input_shape is None: 12 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 13 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 14 | assert isinstance(backbone, Backbone) 15 | return backbone 16 | 17 | 18 | def build_proposal_generator(cfg, input_shape): 19 | return RPN(cfg, input_shape) 20 | 21 | 22 | def build_roi_heads(cfg, input_shape): 23 | return StandardROIHeads(cfg, input_shape) 24 | 25 | 26 | def build_box_head(cfg, input_shape): 27 | return FastRCNNConvFCHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_proposal_generator = build_proposal_generator 33 | cfg.build_roi_heads = build_roi_heads 34 | cfg.build_box_head = build_box_head 35 | 36 | model = GeneralizedRCNN(cfg) 37 | return model 38 | -------------------------------------------------------------------------------- /playground/segmentation/coco/rcnn/mask_rcnn.res50.c4.coco.multiscale.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.resnet import build_resnet_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import Res5ROIHeads 7 | from cvpods.modeling.roi_heads.mask_head import MaskRCNNConvUpsampleHead 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | if input_shape is None: 12 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 13 | backbone = build_resnet_backbone(cfg, input_shape) 14 | assert isinstance(backbone, Backbone) 15 | return backbone 16 | 17 | 18 | def build_proposal_generator(cfg, input_shape): 19 | return RPN(cfg, input_shape) 20 | 21 | 22 | def build_roi_heads(cfg, input_shape): 23 | return Res5ROIHeads(cfg, input_shape) 24 | 25 | 26 | def build_mask_head(cfg, input_shape): 27 | return MaskRCNNConvUpsampleHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_proposal_generator = build_proposal_generator 33 | cfg.build_roi_heads = build_roi_heads 34 | cfg.build_mask_head = build_mask_head 35 | 36 | model = GeneralizedRCNN(cfg) 37 | return model 38 | -------------------------------------------------------------------------------- /playground/segmentation/coco/rcnn/mask_rcnn.res50.c4.coco.multiscale.2x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.resnet import build_resnet_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import Res5ROIHeads 7 | from cvpods.modeling.roi_heads.mask_head import MaskRCNNConvUpsampleHead 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | if input_shape is None: 12 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 13 | backbone = build_resnet_backbone(cfg, input_shape) 14 | assert isinstance(backbone, Backbone) 15 | return backbone 16 | 17 | 18 | def build_proposal_generator(cfg, input_shape): 19 | return RPN(cfg, input_shape) 20 | 21 | 22 | def build_roi_heads(cfg, input_shape): 23 | return Res5ROIHeads(cfg, input_shape) 24 | 25 | 26 | def build_mask_head(cfg, input_shape): 27 | return MaskRCNNConvUpsampleHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_proposal_generator = build_proposal_generator 33 | cfg.build_roi_heads = build_roi_heads 34 | cfg.build_mask_head = build_mask_head 35 | 36 | model = GeneralizedRCNN(cfg) 37 | return model 38 | -------------------------------------------------------------------------------- /cvpods/analyser/angular_update.md: -------------------------------------------------------------------------------- 1 | # Augular update check 2 | 3 | This tutorial explains how to visualize auglar update of layers. 4 | 5 | The concept of au (short for angular update) is proposed in our [SMD paper](https://arxiv.org/abs/2006.08419), which is used to analyze the dynamics of neural networks. 6 | 7 | ## Step1: Visualization command 8 | 9 | We provide a tool in our train script `train_net.py` to help you visualize the ERF of your model. 10 | 11 | For quick starter, make sure that you have installed cvpods in the right way. 12 | 13 | Here is a command example to anaylyze the angular update in cvpods training: 14 | ```shell 15 | pods_train --dir /path/to/your/ --angular MODEL.RESNETS.NORM "BN" 16 | ``` 17 | * `--augular` is crucial here, it enables recording augular update value into tensorboard. 18 | * `MODEL.RESNETS.NORM BN` is used here to make sure the dynamics of norm in your module is recordable. 19 | 20 | 21 | After training the who model, open your tensorboard log and you will see the `au` curve of every layer. 22 | 23 | Let's go to the next step. 24 | 25 | ## Step2: Check the visualization result 26 | 27 | Here is an example of visualization result in tensorboard: 28 |
29 | 30 | The figure show the similar result with our paper, for more details, please read our paper and post issue here. -------------------------------------------------------------------------------- /playground/detection/citypersons/rcnn/faster_rcnn.res50.fpn.citypersons.640size.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import StandardROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | if input_shape is None: 12 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 13 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 14 | assert isinstance(backbone, Backbone) 15 | return backbone 16 | 17 | 18 | def build_proposal_generator(cfg, input_shape): 19 | return RPN(cfg, input_shape) 20 | 21 | 22 | def build_roi_heads(cfg, input_shape): 23 | return StandardROIHeads(cfg, input_shape) 24 | 25 | 26 | def build_box_head(cfg, input_shape): 27 | return FastRCNNConvFCHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_proposal_generator = build_proposal_generator 33 | cfg.build_roi_heads = build_roi_heads 34 | cfg.build_box_head = build_box_head 35 | 36 | model = GeneralizedRCNN(cfg) 37 | return model 38 | -------------------------------------------------------------------------------- /playground/segmentation/coco/rcnn/mask_rcnn.res50.c4.coco.multiscale.2x.syncbn/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.resnet import build_resnet_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import Res5ROIHeads 7 | from cvpods.modeling.roi_heads.mask_head import MaskRCNNConvUpsampleHead 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | if input_shape is None: 12 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 13 | backbone = build_resnet_backbone(cfg, input_shape) 14 | assert isinstance(backbone, Backbone) 15 | return backbone 16 | 17 | 18 | def build_proposal_generator(cfg, input_shape): 19 | return RPN(cfg, input_shape) 20 | 21 | 22 | def build_roi_heads(cfg, input_shape): 23 | return Res5ROIHeads(cfg, input_shape) 24 | 25 | 26 | def build_mask_head(cfg, input_shape): 27 | return MaskRCNNConvUpsampleHead(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_proposal_generator = build_proposal_generator 33 | cfg.build_roi_heads = build_roi_heads 34 | cfg.build_mask_head = build_mask_head 35 | 36 | model = GeneralizedRCNN(cfg) 37 | return model 38 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/cityscapes/pointrend/pointrend.res101.fpn.cityscapes.multiscale.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch import SemanticSegmentor, SemSegFPNHead 5 | from cvpods.modeling.meta_arch.pointrend import PointRendSemSegHead 6 | from cvpods.modeling.roi_heads.point_head import StandardPointHead 7 | 8 | 9 | def build_backbone(cfg, input_shape=None): 10 | if input_shape is None: 11 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 12 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 13 | assert isinstance(backbone, Backbone) 14 | return backbone 15 | 16 | 17 | def build_coarse_sem_seg_head(cfg, input_shape): 18 | return SemSegFPNHead(cfg, input_shape) 19 | 20 | 21 | def build_sem_seg_head(cfg, input_shape): 22 | return PointRendSemSegHead(cfg, input_shape) 23 | 24 | 25 | def build_point_head(cfg, input_shape): 26 | return StandardPointHead(cfg, input_shape) 27 | 28 | 29 | def build_model(cfg): 30 | cfg.build_backbone = build_backbone 31 | cfg.build_coarse_sem_seg_head = build_coarse_sem_seg_head 32 | cfg.build_sem_seg_head = build_sem_seg_head 33 | cfg.build_point_head = build_point_head 34 | 35 | model = SemanticSegmentor(cfg) 36 | return model 37 | -------------------------------------------------------------------------------- /cvpods/evaluation/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. 4 | # This file has been modified by Megvii ("Megvii Modifications"). 5 | # All Megvii Modifications are Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 6 | 7 | from .build import build_evaluator 8 | from .citypersons_evaluation import CityPersonsEvaluator 9 | from .cityscapes_evaluation import CityscapesEvaluator 10 | from .classification_evaluation import ClassificationEvaluator 11 | from .coco_evaluation import COCOEvaluator 12 | from .crowdhuman_evaluation import CrowdHumanEvaluator 13 | from .evaluator import ( 14 | DatasetEvaluator, 15 | DatasetEvaluators, 16 | inference_context, 17 | inference_on_dataset, 18 | inference_on_files 19 | ) 20 | from .longtail_classification_evaluation import LongTailClassificationEvaluator 21 | from .lvis_evaluation import LVISEvaluator 22 | from .panoptic_evaluation import COCOPanopticEvaluator 23 | from .pascal_voc_evaluation import PascalVOCDetectionEvaluator 24 | from .registry import EVALUATOR 25 | from .rotated_coco_evaluation import RotatedCOCOEvaluator 26 | from .sem_seg_evaluation import SemSegEvaluator 27 | from .testing import print_csv_format, verify_results 28 | from .widerface_evaluation import WiderFaceEvaluator 29 | 30 | __all__ = [k for k in globals().keys() if not k.startswith("_")] 31 | -------------------------------------------------------------------------------- /cvpods/layers/activation_funcs.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | import torch 6 | import torch.nn as nn 7 | 8 | 9 | # Ref: 10 | # https://medium.com/the-artificial-impostor/more-memory-efficient-swish-activation-function-e07c22c12a76 11 | class SwishImplementation(torch.autograd.Function): 12 | """ 13 | Swish activation function memory-efficient implementation. 14 | 15 | This implementation explicitly processes the gradient, it keeps a copy of the input tensor, 16 | and uses it to calculate the gradient during the back-propagation phase. 17 | """ 18 | @staticmethod 19 | def forward(ctx, i): 20 | result = i * torch.sigmoid(i) 21 | ctx.save_for_backward(i) 22 | return result 23 | 24 | @staticmethod 25 | def backward(ctx, grad_output): 26 | i = ctx.saved_variables[0] 27 | sigmoid_i = torch.sigmoid(i) 28 | return grad_output * (sigmoid_i * (1 + i * (1 - sigmoid_i))) 29 | 30 | 31 | class MemoryEfficientSwish(nn.Module): 32 | def forward(self, x): 33 | return SwishImplementation.apply(x) 34 | 35 | 36 | class Swish(nn.Module): 37 | """ 38 | Implement the Swish activation function. 39 | See: https://arxiv.org/abs/1710.05941 for more details. 40 | """ 41 | def forward(self, x): 42 | return x * torch.sigmoid(x) 43 | -------------------------------------------------------------------------------- /cvpods/layers/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. 4 | # This file has been modified by Megvii ("Megvii Modifications"). 5 | # All Megvii Modifications are Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 6 | 7 | from .activation_funcs import MemoryEfficientSwish, Swish 8 | from .batch_norm import ( 9 | FrozenBatchNorm2d, 10 | NaiveSyncBatchNorm, 11 | NaiveSyncBatchNorm1d, 12 | get_activation, 13 | get_norm 14 | ) 15 | from .border_align import BorderAlign, BorderAlignFunc 16 | from .deform_conv import DeformConv, ModulatedDeformConv 17 | from .deform_conv_with_off import DeformConvWithOff, ModulatedDeformConvWithOff 18 | from .mask_ops import paste_masks_in_image 19 | from .nms import * 20 | from .position_encoding import ( 21 | PositionEmbeddingLearned, 22 | PositionEmbeddingSine, 23 | position_encoding_dict 24 | ) 25 | from .roi_align import ROIAlign, roi_align 26 | from .roi_align_rotated import ROIAlignRotated, roi_align_rotated 27 | from .shape_spec import ShapeSpec 28 | from .swap_align2nat import SwapAlign2Nat, swap_align2nat 29 | from .tree_filter_v2 import TreeFilterV2 30 | from .wrappers import * 31 | 32 | ## SplAtConv2d must be imported after Conv2d 33 | from .splat import SplAtConv2d # isort:skip 34 | 35 | __all__ = [k for k in globals().keys() if not k.startswith("_")] 36 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug Report 3 | about: Describe abnormal behavior or unexpected problems 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: poodarchu 7 | 8 | --- 9 | 10 | **Please use this template to submit your problem or your question will _NOT_ be properly tackled.** 11 | 12 | * We recommend that you check the existing issues before creating a new issue to see if anyone has encountered the same issue as you. 13 | * Please check whether the software version is the latest version first. If not, you can try to update to the latest version and see if the problem is resolved. 14 | 15 | --- 16 | 17 | In order for us to know the problem you are facing more quickly, please provide the following basic information. 18 | 19 | 1. **OS version**:_e.g. Ubuntu 18.04_ 20 | 2. **Environment version:** _Python / PyTorch / CUDA / cuDNN version_ 21 | 3. **cvpods version**:_You can use `git log` to get the corresponding commit id_ 22 | 23 | The following information is recommended to be provided in **text** rather than _screenshots_ for future retrieval. If your needs do not apply, the following template can be modified, but please keep the content above this bank. 24 | 25 | I ran the following command: 26 | ```bash 27 | 28 | Put your command here. 29 | 30 | ``` 31 | 32 | Expect the following results: 33 | ``` 34 | 35 | Put expected output here. 36 | 37 | ``` 38 | 39 | Actual results: 40 | ``` 41 | 42 | Pur error message here. 43 | 44 | ``` 45 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [isort] 2 | line_length = 100 3 | multi_line_output = 3 4 | balanced_wrapping = True 5 | skip = tools/test_net.py, tools/train_net.py 6 | known_standard_library = setuptools,mock 7 | known_myself = cvpods 8 | known_third_party = appdirs,colorama,easydict,portalocker,yacs,termcolor,tabulate,tqdm,psutil,pkg_resources 9 | known_data_processing = cv2,numpy,scipy,PIL,matplotlib 10 | known_datasets = pycocotools,cityscapesscripts,lvis 11 | known_deeplearning = torch,torchvision,caffe2,onnx 12 | sections = FUTURE,STDLIB,THIRDPARTY,data_processing,datasets,deeplearning,myself,FIRSTPARTY,LOCALFOLDER 13 | no_lines_before=STDLIB,THIRDPARTY,datasets 14 | default_section = FIRSTPARTY 15 | 16 | [flake8] 17 | ignore = W503, E221 18 | max-line-length = 100 19 | max-complexity = 18 20 | select = B,C,E,F,W,T4,B9 21 | exclude = build,__init__.py 22 | 23 | [pep8] 24 | ignore = W503, E203, E221, E402, E741, C901, W504, E731, F541, E722 25 | max-line-length = 100 26 | 27 | [yapf] 28 | based_on_style = pep8 29 | spaces_before_comment = 4 30 | split_before_logical_operator = true 31 | 32 | [mypy] 33 | python_version=3.6 34 | ignore_missing_imports = True 35 | warn_unused_configs = True 36 | disallow_untyped_defs = True 37 | check_untyped_defs = True 38 | warn_unused_ignores = True 39 | warn_redundant_casts = True 40 | show_column_numbers = True 41 | follow_imports = silent 42 | allow_redefinition = True 43 | ; Require all functions to be annotated 44 | disallow_incomplete_defs = True 45 | -------------------------------------------------------------------------------- /playground/detection/coco/tridentnet/tridentnet.res50.C4.coco.800size.1x/net.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from cvpods.layers.shape_spec import ShapeSpec 4 | from cvpods.modeling.backbone import Backbone 5 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 6 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 7 | 8 | from tridentnet_base.trident_backbone import build_trident_resnet_backbone 9 | from tridentnet_base.trident_rcnn import TridentRes5ROIHeads 10 | from tridentnet_base.trident_rpn import TridentRPN 11 | 12 | sys.path.append("..") 13 | 14 | 15 | def build_backbone(cfg, input_shape=None): 16 | if input_shape is None: 17 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 18 | backbone = build_trident_resnet_backbone(cfg, input_shape) 19 | assert isinstance(backbone, Backbone) 20 | return backbone 21 | 22 | 23 | def build_proposal_generator(cfg, input_shape): 24 | return TridentRPN(cfg, input_shape) 25 | 26 | 27 | def build_roi_heads(cfg, input_shape): 28 | return TridentRes5ROIHeads(cfg, input_shape) 29 | 30 | 31 | def build_box_head(cfg, input_shape): 32 | return FastRCNNConvFCHead(cfg, input_shape) 33 | 34 | 35 | def build_model(cfg): 36 | cfg.build_backbone = build_backbone 37 | cfg.build_proposal_generator = build_proposal_generator 38 | cfg.build_roi_heads = build_roi_heads 39 | cfg.build_box_head = build_box_head 40 | 41 | model = GeneralizedRCNN(cfg) 42 | return model 43 | -------------------------------------------------------------------------------- /tests/engine/test_engine.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | 3 | 4 | import unittest 5 | import torch 6 | from torch import nn 7 | 8 | 9 | from cvpods.engine import SimpleRunner 10 | from torch.utils.data import Dataset 11 | 12 | 13 | class SimpleDataset(Dataset): 14 | def __init__(self, length=100): 15 | self.data_list = torch.rand(length, 3, 3) 16 | 17 | def __getitem__(self, index): 18 | return self.data_list[index] 19 | 20 | 21 | class SimpleModel(nn.Sequential): 22 | def forward(self, x): 23 | return {"loss": x.sum() + sum([x.mean() for x in self.parameters()])} 24 | 25 | 26 | class TestTrainer(unittest.TestCase): 27 | def test_simple_trainer(self, device="cpu"): 28 | device = torch.device(device) 29 | model = SimpleModel(nn.Linear(10, 10)).to(device) 30 | 31 | class DataLoader: 32 | def __len__(self): 33 | return 10000 34 | 35 | def __iter__(self): 36 | while True: 37 | yield torch.rand(3, 3).to(device) 38 | 39 | trainer = SimpleRunner(model, DataLoader(), torch.optim.SGD(model.parameters(), 0.1)) 40 | trainer.max_epoch = None 41 | trainer.train(0, 0, 10) 42 | return trainer 43 | 44 | @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") 45 | def test_simple_trainer_cuda(self): 46 | self.test_simple_trainer(device="cuda") 47 | -------------------------------------------------------------------------------- /tools/dev/run_inference_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 3 | 4 | BIN="python tools/train_net.py" 5 | OUTPUT="inference_test_output" 6 | NUM_GPUS=2 7 | 8 | CFG_LIST=( "${@:1}" ) 9 | 10 | if [ ${#CFG_LIST[@]} -eq 0 ]; then 11 | CFG_LIST=( ./configs/quick_schedules/*inference_acc_test.yaml ) 12 | fi 13 | 14 | echo "========================================================================" 15 | echo "Configs to run:" 16 | echo "${CFG_LIST[@]}" 17 | echo "========================================================================" 18 | 19 | 20 | for cfg in "${CFG_LIST[@]}"; do 21 | echo "========================================================================" 22 | echo "Running $cfg ..." 23 | echo "========================================================================" 24 | $BIN \ 25 | --eval-only \ 26 | --num-gpus $NUM_GPUS \ 27 | --config-file "$cfg" \ 28 | OUTPUT_DIR $OUTPUT 29 | rm -rf $OUTPUT 30 | done 31 | 32 | 33 | echo "========================================================================" 34 | echo "Running demo.py ..." 35 | echo "========================================================================" 36 | DEMO_BIN="python demo/demo.py" 37 | COCO_DIR=datasets/coco/val2014 38 | mkdir -pv $OUTPUT 39 | 40 | set -v 41 | 42 | $DEMO_BIN --config-file ./configs/quick_schedules/panoptic_fpn_R_50_inference_acc_test.yaml \ 43 | --input $COCO_DIR/COCO_val2014_0000001933* --output $OUTPUT 44 | rm -rf $OUTPUT 45 | -------------------------------------------------------------------------------- /cvpods/analyser/tide/errors/qualifiers.py: -------------------------------------------------------------------------------- 1 | # Defines qualifiers like "Extra small box" 2 | 3 | 4 | def _area(x): 5 | return x["bbox"][2] * x["bbox"][3] 6 | 7 | 8 | def _ar(x): 9 | return x["bbox"][2] / x["bbox"][3] 10 | 11 | 12 | class Qualifier: 13 | """ 14 | Creates a qualifier with the given name. 15 | 16 | test_func should be a callable object (e.g., lambda) that 17 | takes in as input an annotation object (either a ground truth or prediction) 18 | and returns whether or not that object qualifies (i.e., a bool). 19 | """ 20 | 21 | def __init__(self, name: str, test_func: object): 22 | self.test = test_func 23 | self.name = name 24 | 25 | # This is horrible, but I like it 26 | def _make_error_func(self, error_type): 27 | return ( 28 | ( 29 | lambda err: isinstance(err, error_type) 30 | and (self.test(err.gt) if hasattr(err, "gt") else self.test(err.pred)) 31 | ) 32 | if self.test is not None 33 | else (lambda err: isinstance(err, error_type)) 34 | ) 35 | 36 | 37 | AREA = [ 38 | Qualifier("Small", lambda x: _area(x) <= 32 ** 2), 39 | Qualifier("Medium", lambda x: 32 ** 2 < _area(x) <= 96 ** 2), 40 | Qualifier("Large", lambda x: 96 ** 2 < _area(x)), 41 | ] 42 | 43 | ASPECT_RATIO = [ 44 | Qualifier("Tall", lambda x: _ar(x) <= 0.75), 45 | Qualifier("Square", lambda x: 0.75 < _ar(x) <= 1.33), 46 | Qualifier("Wide", lambda x: 1.33 < _ar(x)), 47 | ] 48 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/SwapAlign2Nat/SwapAlign2Nat.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | #pragma once 3 | #include 4 | 5 | namespace cvpods { 6 | 7 | #ifdef WITH_CUDA 8 | at::Tensor SwapAlign2Nat_forward_cuda( 9 | const at::Tensor& X, 10 | const int lambda_val, 11 | const float pad_val); 12 | 13 | at::Tensor SwapAlign2Nat_backward_cuda( 14 | const at::Tensor& gY, 15 | const int lambda_val, 16 | const int batch_size, 17 | const int channel, 18 | const int height, 19 | const int width); 20 | #endif 21 | 22 | inline at::Tensor SwapAlign2Nat_forward( 23 | const at::Tensor& X, 24 | const int lambda_val, 25 | const float pad_val) { 26 | if (X.device().is_cuda()) { 27 | #ifdef WITH_CUDA 28 | return SwapAlign2Nat_forward_cuda(X, lambda_val, pad_val); 29 | #else 30 | AT_ERROR("Not compiled with GPU support"); 31 | #endif 32 | } 33 | AT_ERROR("Not implemented on the CPU"); 34 | } 35 | 36 | inline at::Tensor SwapAlign2Nat_backward( 37 | const at::Tensor& gY, 38 | const int lambda_val, 39 | const int batch_size, 40 | const int channel, 41 | const int height, 42 | const int width) { 43 | if (gY.device().is_cuda()) { 44 | #ifdef WITH_CUDA 45 | return SwapAlign2Nat_backward_cuda( 46 | gY, lambda_val, batch_size, channel, height, width); 47 | #else 48 | AT_ERROR("Not compiled with GPU support"); 49 | #endif 50 | } 51 | AT_ERROR("Not implemented on the CPU"); 52 | } 53 | 54 | } // namespace cvpods 55 | -------------------------------------------------------------------------------- /playground/detection/widerface/retinanet/retinanet.res50.fpn.widerface.600size.0.5x_crop/README.md: -------------------------------------------------------------------------------- 1 | # retinanet.res50.fpn.widerface.600size.0.5x_crop 2 | ## Evaluation results for bbox: 3 | ``` 4 | Average Precision (AP) @[ IoU=0.50:0.95 | height= all | maxDets=1000 ] = 0.494 5 | Average Precision (AP) @[ IoU=0.50 | height= all | maxDets=1000 ] = 0.862 6 | Average Precision (AP) @[ IoU=0.75 | height= all | maxDets=1000 ] = 0.508 7 | Average Precision (AP) @[ IoU=0.50:0.95 | height= small | maxDets=1000 ] = 0.454 8 | Average Precision (AP) @[ IoU=0.50:0.95 | height=medium | maxDets=1000 ] = 0.667 9 | Average Precision (AP) @[ IoU=0.50:0.95 | height= large | maxDets=1000 ] = 0.777 10 | Average Recall (AR) @[ IoU=0.50:0.95 | height= all | maxDets= 10 ] = 0.311 11 | Average Recall (AR) @[ IoU=0.50:0.95 | height= all | maxDets= 100 ] = 0.508 12 | Average Recall (AR) @[ IoU=0.50:0.95 | height= all | maxDets=1000 ] = 0.563 13 | Average Recall (AR) @[ IoU=0.50:0.95 | height= small | maxDets=1000 ] = 0.528 14 | Average Recall (AR) @[ IoU=0.50:0.95 | height=medium | maxDets=1000 ] = 0.721 15 | Average Recall (AR) @[ IoU=0.50:0.95 | height= large | maxDets=1000 ] = 0.826 16 | ``` 17 | | AP | AP50 | AP75 | APs | APm | APl | 18 | |:------:|:------:|:------:|:------:|:------:|:------:| 19 | | 49.374 | 86.239 | 50.836 | 45.411 | 66.650 | 77.721 | 20 | ### Per-category bbox AP: 21 | 22 | | category | AP | 23 | |:-----------|:-------| 24 | | face | 49.374 | 25 | -------------------------------------------------------------------------------- /cvpods/configs/condinst_config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .fcos_config import FCOSConfig 6 | 7 | _config_dict = dict( 8 | MODEL=dict( 9 | MASK_ON=True, 10 | SHIFT_GENERATOR=dict( 11 | NUM_SHIFTS=1, 12 | OFFSET=0.5, 13 | ), 14 | CONDINST=dict( 15 | MASK_OUT_STRIDE=4, 16 | MAX_PROPOSALS=500, 17 | TOPK_PROPOSALS_PER_IM=-1, 18 | MASK_CENTER_SAMPLE=True, 19 | INFER_MASK_THRESH=0.5, 20 | MASK_HEAD=dict( 21 | HEAD_CHANNELS=8, 22 | NUM_LAYERS=3, 23 | DISABLE_REL_COORDS=False 24 | ), 25 | MASK_BRANCH=dict( 26 | IN_FEATURES=["p3", "p4", "p5"], 27 | BRANCH_CHANNELS=128, 28 | OUT_CHANNELS=8, 29 | NORM="BN", 30 | NUM_CONVS=4 31 | ), 32 | ), 33 | FCOS=dict( 34 | THRESH_WITH_CENTERNESS=True, 35 | CENTERNESS_ON_REG=True, 36 | NORM_REG_TARGETS=True, 37 | IOU_LOSS_TYPE="giou", 38 | IOU_SMOOTH=True, 39 | CENTER_SAMPLING_RADIUS=1.5, 40 | ), 41 | ), 42 | ) 43 | 44 | 45 | class CondInstConfig(FCOSConfig): 46 | def __init__(self, d=None, **kwargs): 47 | super().__init__(d, **kwargs) 48 | self._register_configuration(_config_dict) 49 | 50 | 51 | config = CondInstConfig() 52 | -------------------------------------------------------------------------------- /cvpods/configs/rcnn_fpn_config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .rcnn_config import RCNNConfig 6 | 7 | _config_dict = dict( 8 | MODEL=dict( 9 | # BACKBONE=dict(NAME='build_resnet_backbone',), 10 | RESNETS=dict(OUT_FEATURES=["res2", "res3", "res4", "res5"],), 11 | FPN=dict(IN_FEATURES=["res2", "res3", "res4", "res5"]), 12 | ANCHOR_GENERATOR=dict( 13 | SIZES=[[32], [64], [128], [256], [512]], ASPECT_RATIOS=[[0.5, 1.0, 2.0]], 14 | ), 15 | RPN=dict( 16 | IN_FEATURES=["p2", "p3", "p4", "p5", "p6"], 17 | PRE_NMS_TOPK_TRAIN=2000, 18 | PRE_NMS_TOPK_TEST=1000, 19 | POST_NMS_TOPK_TRAIN=1000, 20 | POST_NMS_TOPK_TEST=1000, 21 | ), 22 | ROI_HEADS=dict( 23 | # NAME: "StandardROIHeads" 24 | IN_FEATURES=["p2", "p3", "p4", "p5"], 25 | ), 26 | ROI_BOX_HEAD=dict( 27 | # NAME: "FastRCNNConvFCHead" 28 | NUM_FC=2, 29 | POOLER_RESOLUTION=7, 30 | ), 31 | ROI_MASK_HEAD=dict( 32 | # NAME: "MaskRCNNConvUpsampleHead" 33 | NUM_CONV=4, 34 | POOLER_RESOLUTION=14, 35 | ), 36 | ), 37 | ) 38 | 39 | 40 | class RCNNFPNConfig(RCNNConfig): 41 | def __init__(self, d=None, **kwargs): 42 | super().__init__(d, **kwargs) 43 | self._register_configuration(_config_dict) 44 | 45 | 46 | config = RCNNFPNConfig() 47 | -------------------------------------------------------------------------------- /cvpods/layers/border_align.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | from torch import nn 5 | from torch.autograd import Function 6 | from torch.autograd.function import once_differentiable 7 | 8 | from cvpods import _C 9 | 10 | 11 | class BorderAlignFunc(Function): 12 | @staticmethod 13 | def forward(ctx, input, boxes, wh, pool_size): 14 | output = _C.border_align_forward(input, boxes, wh, pool_size) 15 | ctx.pool_size = pool_size 16 | ctx.save_for_backward(input, boxes, wh) 17 | return output 18 | 19 | @staticmethod 20 | @once_differentiable 21 | def backward(ctx, grad_output): 22 | pool_size = ctx.pool_size 23 | input, boxes, wh = ctx.saved_tensors 24 | grad_input = _C.border_align_backward( 25 | grad_output, input, boxes, wh, pool_size) 26 | return grad_input, None, None, None 27 | 28 | 29 | border_align = BorderAlignFunc.apply 30 | 31 | 32 | class BorderAlign(nn.Module): 33 | def __init__(self, pool_size): 34 | super(BorderAlign, self).__init__() 35 | self.pool_size = pool_size 36 | 37 | def forward(self, feature, boxes): 38 | feature = feature.contiguous() 39 | boxes = boxes.contiguous() 40 | wh = (boxes[:, :, 2:] - boxes[:, :, :2]).contiguous() 41 | output = border_align(feature, boxes, wh, self.pool_size) 42 | return output 43 | 44 | def extra_repr(self): 45 | return "pool_size={}".format(self.pool_size) 46 | -------------------------------------------------------------------------------- /playground/detection/widerface/fcos/fcos.res50.fpn.widerface.600size.0.5x_crop.plus.norm_sync/README.md: -------------------------------------------------------------------------------- 1 | # fcos.res50.fpn.widerface.600size.0.5x_crop.plus.norm_sync 2 | ## Evaluation results for bbox: 3 | ``` 4 | Average Precision (AP) @[ IoU=0.50:0.95 | height= all | maxDets=1000 ] = 0.508 5 | Average Precision (AP) @[ IoU=0.50 | height= all | maxDets=1000 ] = 0.894 6 | Average Precision (AP) @[ IoU=0.75 | height= all | maxDets=1000 ] = 0.525 7 | Average Precision (AP) @[ IoU=0.50:0.95 | height= small | maxDets=1000 ] = 0.476 8 | Average Precision (AP) @[ IoU=0.50:0.95 | height=medium | maxDets=1000 ] = 0.650 9 | Average Precision (AP) @[ IoU=0.50:0.95 | height= large | maxDets=1000 ] = 0.752 10 | Average Recall (AR) @[ IoU=0.50:0.95 | height= all | maxDets= 10 ] = 0.315 11 | Average Recall (AR) @[ IoU=0.50:0.95 | height= all | maxDets= 100 ] = 0.529 12 | Average Recall (AR) @[ IoU=0.50:0.95 | height= all | maxDets=1000 ] = 0.593 13 | Average Recall (AR) @[ IoU=0.50:0.95 | height= small | maxDets=1000 ] = 0.561 14 | Average Recall (AR) @[ IoU=0.50:0.95 | height=medium | maxDets=1000 ] = 0.736 15 | Average Recall (AR) @[ IoU=0.50:0.95 | height= large | maxDets=1000 ] = 0.827 16 | ``` 17 | | AP | AP50 | AP75 | APs | APm | APl | 18 | |:------:|:------:|:------:|:------:|:------:|:------:| 19 | | 50.808 | 89.363 | 52.530 | 47.639 | 65.020 | 75.160 | 20 | ### Per-category bbox AP: 21 | 22 | | category | AP | 23 | |:-----------|:-------| 24 | | face | 50.808 | 25 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/box_iou_rotated/box_iou_rotated_cpu.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | #include "box_iou_rotated.h" 3 | #include "box_iou_rotated_utils.h" 4 | 5 | namespace cvpods { 6 | 7 | template 8 | void box_iou_rotated_cpu_kernel( 9 | const at::Tensor& boxes1, 10 | const at::Tensor& boxes2, 11 | at::Tensor& ious) { 12 | auto widths1 = boxes1.select(1, 2).contiguous(); 13 | auto heights1 = boxes1.select(1, 3).contiguous(); 14 | auto widths2 = boxes2.select(1, 2).contiguous(); 15 | auto heights2 = boxes2.select(1, 3).contiguous(); 16 | 17 | at::Tensor areas1 = widths1 * heights1; 18 | at::Tensor areas2 = widths2 * heights2; 19 | 20 | auto num_boxes1 = boxes1.size(0); 21 | auto num_boxes2 = boxes2.size(0); 22 | 23 | for (int i = 0; i < num_boxes1; i++) { 24 | for (int j = 0; j < num_boxes2; j++) { 25 | ious[i * num_boxes2 + j] = single_box_iou_rotated( 26 | boxes1[i].data_ptr(), boxes2[j].data_ptr()); 27 | } 28 | } 29 | } 30 | 31 | at::Tensor box_iou_rotated_cpu( 32 | const at::Tensor& boxes1, 33 | const at::Tensor& boxes2) { 34 | auto num_boxes1 = boxes1.size(0); 35 | auto num_boxes2 = boxes2.size(0); 36 | at::Tensor ious = 37 | at::empty({num_boxes1 * num_boxes2}, boxes1.options().dtype(at::kFloat)); 38 | 39 | box_iou_rotated_cpu_kernel(boxes1, boxes2, ious); 40 | 41 | // reshape from 1d array to 2d array 42 | auto shape = std::vector{num_boxes1, num_boxes2}; 43 | return ious.reshape(shape); 44 | } 45 | 46 | } // namespace cvpods 47 | -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nvidia/cuda:10.1-cudnn7-devel 2 | 3 | ENV DEBIAN_FRONTEND noninteractive 4 | RUN apt-get update 5 | RUN apt-get install -y \ 6 | python3-opencv ca-certificates python3-dev git wget sudo 7 | RUN ln -sv /usr/bin/python3 /usr/bin/python 8 | 9 | # create a non-root user 10 | ARG USER_ID=1000 11 | RUN useradd -m --no-log-init --system --uid ${USER_ID} appuser -g sudo 12 | RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers 13 | USER appuser 14 | WORKDIR /home/appuser 15 | 16 | ENV PATH="/home/appuser/.local/bin:${PATH}" 17 | RUN wget https://bootstrap.pypa.io/get-pip.py && \ 18 | python3 get-pip.py --user && \ 19 | rm get-pip.py 20 | 21 | # install dependencies 22 | # See https://pytorch.org/ for other options if you use a different version of CUDA 23 | RUN pip install --user tensorboard cmake # cmake from apt-get is too old 24 | RUN pip install --user torch==1.7.1+cu101 torchvision==0.8.2+cu101 -f https://download.pytorch.org/whl/torch_stable.html 25 | 26 | # install cvpods 27 | RUN git clone https://github.com/megvii-basedetection/cvpods cvpods_repo 28 | # set FORCE_CUDA because during `docker build` cuda is not accessible 29 | ENV FORCE_CUDA="1" 30 | # This will by default build detectron2 for all common cuda architectures and take a lot more time, 31 | # because inside `docker build`, there is no way to tell which architecture will be used. 32 | ARG TORCH_CUDA_ARCH_LIST="Kepler;Kepler+Tesla;Maxwell;Maxwell+Tegra;Pascal;Volta;Turing" 33 | ENV TORCH_CUDA_ARCH_LIST="${TORCH_CUDA_ARCH_LIST}" 34 | 35 | WORKDIR /home/appuser/cvpods_repo 36 | RUN python3 setup.py build develop --user 37 | -------------------------------------------------------------------------------- /playground/segmentation/coco/rcnn/mask_rcnn.res50.fpn.coco.multiscale.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import StandardROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | from cvpods.modeling.roi_heads.mask_head import MaskRCNNConvUpsampleHead 9 | 10 | 11 | def build_backbone(cfg, input_shape=None): 12 | if input_shape is None: 13 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 14 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 15 | assert isinstance(backbone, Backbone) 16 | return backbone 17 | 18 | 19 | def build_proposal_generator(cfg, input_shape): 20 | return RPN(cfg, input_shape) 21 | 22 | 23 | def build_roi_heads(cfg, input_shape): 24 | return StandardROIHeads(cfg, input_shape) 25 | 26 | 27 | def build_box_head(cfg, input_shape): 28 | return FastRCNNConvFCHead(cfg, input_shape) 29 | 30 | 31 | def build_mask_head(cfg, input_shape): 32 | return MaskRCNNConvUpsampleHead(cfg, input_shape) 33 | 34 | 35 | def build_model(cfg): 36 | cfg.build_backbone = build_backbone 37 | cfg.build_proposal_generator = build_proposal_generator 38 | cfg.build_roi_heads = build_roi_heads 39 | cfg.build_box_head = build_box_head 40 | cfg.build_mask_head = build_mask_head 41 | 42 | model = GeneralizedRCNN(cfg) 43 | return model 44 | -------------------------------------------------------------------------------- /playground/segmentation/lvis/rcnn/mask_rcnn.res50.fpn.lvis.800size.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import StandardROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | from cvpods.modeling.roi_heads.mask_head import MaskRCNNConvUpsampleHead 9 | 10 | 11 | def build_backbone(cfg, input_shape=None): 12 | if input_shape is None: 13 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 14 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 15 | assert isinstance(backbone, Backbone) 16 | return backbone 17 | 18 | 19 | def build_proposal_generator(cfg, input_shape): 20 | return RPN(cfg, input_shape) 21 | 22 | 23 | def build_roi_heads(cfg, input_shape): 24 | return StandardROIHeads(cfg, input_shape) 25 | 26 | 27 | def build_box_head(cfg, input_shape): 28 | return FastRCNNConvFCHead(cfg, input_shape) 29 | 30 | 31 | def build_mask_head(cfg, input_shape): 32 | return MaskRCNNConvUpsampleHead(cfg, input_shape) 33 | 34 | 35 | def build_model(cfg): 36 | cfg.build_backbone = build_backbone 37 | cfg.build_proposal_generator = build_proposal_generator 38 | cfg.build_roi_heads = build_roi_heads 39 | cfg.build_box_head = build_box_head 40 | cfg.build_mask_head = build_mask_head 41 | 42 | model = GeneralizedRCNN(cfg) 43 | return model 44 | -------------------------------------------------------------------------------- /playground/segmentation/cityscapes/rcnn/mask_rcnn.res50.fpn.cityscapes.multiscales.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import StandardROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | from cvpods.modeling.roi_heads.mask_head import MaskRCNNConvUpsampleHead 9 | 10 | 11 | def build_backbone(cfg, input_shape=None): 12 | if input_shape is None: 13 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 14 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 15 | assert isinstance(backbone, Backbone) 16 | return backbone 17 | 18 | 19 | def build_proposal_generator(cfg, input_shape): 20 | return RPN(cfg, input_shape) 21 | 22 | 23 | def build_roi_heads(cfg, input_shape): 24 | return StandardROIHeads(cfg, input_shape) 25 | 26 | 27 | def build_box_head(cfg, input_shape): 28 | return FastRCNNConvFCHead(cfg, input_shape) 29 | 30 | 31 | def build_mask_head(cfg, input_shape): 32 | return MaskRCNNConvUpsampleHead(cfg, input_shape) 33 | 34 | 35 | def build_model(cfg): 36 | cfg.build_backbone = build_backbone 37 | cfg.build_proposal_generator = build_proposal_generator 38 | cfg.build_roi_heads = build_roi_heads 39 | cfg.build_box_head = build_box_head 40 | cfg.build_mask_head = build_mask_head 41 | 42 | model = GeneralizedRCNN(cfg) 43 | return model 44 | -------------------------------------------------------------------------------- /playground/segmentation/lvis/rcnn/mask_rcnn.res50.fpn.lvis.800size.1x.data_resampling/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import StandardROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | from cvpods.modeling.roi_heads.mask_head import MaskRCNNConvUpsampleHead 9 | 10 | 11 | def build_backbone(cfg, input_shape=None): 12 | if input_shape is None: 13 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 14 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 15 | assert isinstance(backbone, Backbone) 16 | return backbone 17 | 18 | 19 | def build_proposal_generator(cfg, input_shape): 20 | return RPN(cfg, input_shape) 21 | 22 | 23 | def build_roi_heads(cfg, input_shape): 24 | return StandardROIHeads(cfg, input_shape) 25 | 26 | 27 | def build_box_head(cfg, input_shape): 28 | return FastRCNNConvFCHead(cfg, input_shape) 29 | 30 | 31 | def build_mask_head(cfg, input_shape): 32 | return MaskRCNNConvUpsampleHead(cfg, input_shape) 33 | 34 | 35 | def build_model(cfg): 36 | cfg.build_backbone = build_backbone 37 | cfg.build_proposal_generator = build_proposal_generator 38 | cfg.build_roi_heads = build_roi_heads 39 | cfg.build_box_head = build_box_head 40 | cfg.build_mask_head = build_mask_head 41 | 42 | model = GeneralizedRCNN(cfg) 43 | return model 44 | -------------------------------------------------------------------------------- /playground/segmentation/lvis/rcnn/mask_rcnn.res50.fpn.lvis.multiscale.1x.data_resampling/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import StandardROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | from cvpods.modeling.roi_heads.mask_head import MaskRCNNConvUpsampleHead 9 | 10 | 11 | def build_backbone(cfg, input_shape=None): 12 | if input_shape is None: 13 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 14 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 15 | assert isinstance(backbone, Backbone) 16 | return backbone 17 | 18 | 19 | def build_proposal_generator(cfg, input_shape): 20 | return RPN(cfg, input_shape) 21 | 22 | 23 | def build_roi_heads(cfg, input_shape): 24 | return StandardROIHeads(cfg, input_shape) 25 | 26 | 27 | def build_box_head(cfg, input_shape): 28 | return FastRCNNConvFCHead(cfg, input_shape) 29 | 30 | 31 | def build_mask_head(cfg, input_shape): 32 | return MaskRCNNConvUpsampleHead(cfg, input_shape) 33 | 34 | 35 | def build_model(cfg): 36 | cfg.build_backbone = build_backbone 37 | cfg.build_proposal_generator = build_proposal_generator 38 | cfg.build_roi_heads = build_roi_heads 39 | cfg.build_box_head = build_box_head 40 | cfg.build_mask_head = build_mask_head 41 | 42 | model = GeneralizedRCNN(cfg) 43 | return model 44 | -------------------------------------------------------------------------------- /playground/segmentation/coco/rcnn/cascade_rcnn.res50.fpn.coco.800size.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers.shape_spec import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 7 | from cvpods.modeling.roi_heads.cascade_rcnn import CascadeROIHeads 8 | from cvpods.modeling.roi_heads.mask_head import MaskRCNNConvUpsampleHead 9 | 10 | 11 | def build_backbone(cfg, input_shape=None): 12 | if input_shape is None: 13 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 14 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 15 | assert isinstance(backbone, Backbone) 16 | return backbone 17 | 18 | 19 | def build_proposal_generator(cfg, input_shape): 20 | return RPN(cfg, input_shape) 21 | 22 | 23 | def build_roi_heads(cfg, input_shape): 24 | return CascadeROIHeads(cfg, input_shape) 25 | 26 | 27 | def build_box_head(cfg, input_shape): 28 | return FastRCNNConvFCHead(cfg, input_shape) 29 | 30 | 31 | def build_mask_head(cfg, input_shape): 32 | return MaskRCNNConvUpsampleHead(cfg, input_shape) 33 | 34 | 35 | def build_model(cfg): 36 | cfg.build_backbone = build_backbone 37 | cfg.build_proposal_generator = build_proposal_generator 38 | cfg.build_roi_heads = build_roi_heads 39 | cfg.build_box_head = build_box_head 40 | cfg.build_mask_head = build_mask_head 41 | 42 | model = GeneralizedRCNN(cfg) 43 | return model 44 | -------------------------------------------------------------------------------- /playground/segmentation/coco/rcnn/mask_rcnn.res50.c4.coco.multiscale.1x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.rcnn_config import RCNNConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | MASK_ON=True, 9 | RESNETS=dict(DEPTH=50), 10 | ), 11 | DATASETS=dict( 12 | TRAIN=("coco_2017_train",), 13 | TEST=("coco_2017_val",), 14 | ), 15 | SOLVER=dict( 16 | LR_SCHEDULER=dict( 17 | STEPS=(60000, 80000), 18 | MAX_ITER=90000, 19 | ), 20 | OPTIMIZER=dict( 21 | BASE_LR=0.02, 22 | ), 23 | IMS_PER_BATCH=16, 24 | ), 25 | INPUT=dict( 26 | AUG=dict( 27 | TRAIN_PIPELINES=[ 28 | ("ResizeShortestEdge", 29 | dict(short_edge_length=(640, 672, 704, 736, 768, 800), 30 | max_size=1333, sample_style="choice")), 31 | ("RandomFlip", dict()), 32 | ], 33 | TEST_PIPELINES=[ 34 | ("ResizeShortestEdge", 35 | dict(short_edge_length=800, max_size=1333, sample_style="choice")), 36 | ], 37 | ), 38 | ), 39 | OUTPUT_DIR=osp.join( 40 | '/data/Outputs/model_logs/cvpods_playground', 41 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1]), 42 | ) 43 | 44 | 45 | class MaskRCNNConfig(RCNNConfig): 46 | def __init__(self): 47 | super(MaskRCNNConfig, self).__init__() 48 | self._register_configuration(_config_dict) 49 | 50 | 51 | config = MaskRCNNConfig() 52 | -------------------------------------------------------------------------------- /playground/segmentation/coco/rcnn/mask_rcnn.res50.c4.coco.multiscale.2x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.rcnn_config import RCNNConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | MASK_ON=True, 9 | RESNETS=dict(DEPTH=50), 10 | ), 11 | DATASETS=dict( 12 | TRAIN=("coco_2017_train",), 13 | TEST=("coco_2017_val",), 14 | ), 15 | SOLVER=dict( 16 | LR_SCHEDULER=dict( 17 | STEPS=(120000, 160000), 18 | MAX_ITER=180000, 19 | ), 20 | OPTIMIZER=dict( 21 | BASE_LR=0.02, 22 | ), 23 | IMS_PER_BATCH=16, 24 | ), 25 | INPUT=dict( 26 | AUG=dict( 27 | TRAIN_PIPELINES=[ 28 | ("ResizeShortestEdge", 29 | dict(short_edge_length=(640, 672, 704, 736, 768, 800), 30 | max_size=1333, sample_style="choice")), 31 | ("RandomFlip", dict()), 32 | ], 33 | TEST_PIPELINES=[ 34 | ("ResizeShortestEdge", 35 | dict(short_edge_length=800, max_size=1333, sample_style="choice")), 36 | ], 37 | ), 38 | ), 39 | OUTPUT_DIR=osp.join( 40 | '/data/Outputs/model_logs/cvpods_playground', 41 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1]), 42 | ) 43 | 44 | 45 | class MaskRCNNConfig(RCNNConfig): 46 | def __init__(self): 47 | super(MaskRCNNConfig, self).__init__() 48 | self._register_configuration(_config_dict) 49 | 50 | 51 | config = MaskRCNNConfig() 52 | -------------------------------------------------------------------------------- /cvpods/analyser/weight_analysis.md: -------------------------------------------------------------------------------- 1 | # Analyze the weights of the model 2 | 3 | This tutorial explains how to use the weight-analysis tool. 4 | 5 | The tool analyzes the statistics of model weights, which helps to improve the generalization ability of the model. 6 | 7 | By comparing of mean, variance, norm, or maximum value of the target model and the anchor model with high transfer performance, we could know **how to tune the target model to get close to the anchor model and achieve better performance without tuning lots of hyper-parameters**. 8 | 9 | ## Visualization command 10 | We provide this tool to compare the statistical value between anchor and target models. 11 | When the statistics are closer to the anchor model, the target model can achieve better transfer performance without funing hyperparameters. 12 | 13 | Here is an example to analyze the norm values between ```moco``` weights and ```byol```/```supervised``` weights on ResNet50. 14 | The default ```--name_filter``` is set to ```conv2```, which means the module named `conv2` will be analyzed. 15 | ``` 16 | python3 visualize_weight_analysis.py --name_filter conv2 --save_path /path/to/save/figures 17 | ``` 18 | 19 | Then, a image file will be saved in the path `/path/to/save/figures/analyze_norm.png`, here is an example: 20 |
21 | 22 | As shown in the figure, **the norm value of byol weights is far from that of moco weights, resulting in the lower transfer performances of byol than moco on downstream tasks**. 23 | 24 | For more details, please read [our paper](https://arxiv.org/pdf/2208.00275.pdf) and post a issue. 25 | -------------------------------------------------------------------------------- /playground/segmentation/coco/rcnn/mask_rcnn.res50.fpn.coco.multiscale.1x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.rcnn_fpn_config import RCNNFPNConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | MASK_ON=True, 9 | RESNETS=dict(DEPTH=50), 10 | ), 11 | DATASETS=dict( 12 | TRAIN=("coco_2017_train",), 13 | TEST=("coco_2017_val",), 14 | ), 15 | SOLVER=dict( 16 | LR_SCHEDULER=dict( 17 | STEPS=(60000, 80000), 18 | MAX_ITER=90000, 19 | ), 20 | OPTIMIZER=dict( 21 | BASE_LR=0.02, 22 | ), 23 | IMS_PER_BATCH=16, 24 | ), 25 | INPUT=dict( 26 | AUG=dict( 27 | TRAIN_PIPELINES=[ 28 | ("ResizeShortestEdge", 29 | dict(short_edge_length=(640, 672, 704, 736, 768, 800), 30 | max_size=1333, sample_style="choice")), 31 | ("RandomFlip", dict()), 32 | ], 33 | TEST_PIPELINES=[ 34 | ("ResizeShortestEdge", 35 | dict(short_edge_length=800, max_size=1333, sample_style="choice")), 36 | ], 37 | ), 38 | ), 39 | OUTPUT_DIR=osp.join( 40 | '/data/Outputs/model_logs/cvpods_playground', 41 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1]), 42 | ) 43 | 44 | 45 | class MaskRCNNConfig(RCNNFPNConfig): 46 | def __init__(self): 47 | super(MaskRCNNConfig, self).__init__() 48 | self._register_configuration(_config_dict) 49 | 50 | 51 | config = MaskRCNNConfig() 52 | -------------------------------------------------------------------------------- /cvpods/configs/base_classification_config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from cvpods.configs.base_config import BaseConfig 6 | 7 | _config_dict = dict( 8 | MODEL=dict( 9 | WEIGHTS="", 10 | PIXEL_MEAN=[0.485, 0.456, 0.406], # RGB 11 | PIXEL_STD=[0.229, 0.224, 0.225], 12 | BACKBONE=dict(FREEZE_AT=-1, ), # do not freeze 13 | RESNETS=dict( 14 | NUM_CLASSES=None, 15 | DEPTH=None, 16 | OUT_FEATURES=["linear"], 17 | NUM_GROUPS=1, 18 | # Options: FrozenBN, GN, "SyncBN", "BN" 19 | NORM="BN", 20 | ACTIVATION=dict( 21 | NAME="ReLU", 22 | INPLACE=True, 23 | ), 24 | # Whether init last bn weight of each BasicBlock or BottleneckBlock to 0 25 | ZERO_INIT_RESIDUAL=True, 26 | WIDTH_PER_GROUP=64, 27 | # Use True only for the original MSRA ResNet; use False for C2 and Torch models 28 | STRIDE_IN_1X1=False, 29 | RES5_DILATION=1, 30 | RES2_OUT_CHANNELS=256, 31 | STEM_OUT_CHANNELS=64, 32 | 33 | # Deep Stem 34 | DEEP_STEM=False, 35 | ), 36 | ), 37 | INPUT=dict(FORMAT="RGB"), 38 | SOLVER=dict( 39 | IMS_PER_DEVICE=32, # defalut: 8 gpus x 32 = 256 40 | ), 41 | ) 42 | 43 | 44 | class BaseClassificationConfig(BaseConfig): 45 | def __init__(self, d=None, **kwargs): 46 | super().__init__(d, **kwargs) 47 | self._register_configuration(_config_dict) 48 | 49 | 50 | config = BaseClassificationConfig() 51 | -------------------------------------------------------------------------------- /playground/detection/coco/rcnn/faster_rcnn.res50.c4.coco.multiscale.1x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.rcnn_config import RCNNConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | MASK_ON=False, 9 | RESNETS=dict(DEPTH=50), 10 | ), 11 | DATASETS=dict( 12 | TRAIN=("coco_2017_train",), 13 | TEST=("coco_2017_val",), 14 | ), 15 | SOLVER=dict( 16 | LR_SCHEDULER=dict( 17 | STEPS=(60000, 80000), 18 | MAX_ITER=90000, 19 | ), 20 | OPTIMIZER=dict( 21 | BASE_LR=0.02, 22 | ), 23 | IMS_PER_BATCH=16, 24 | ), 25 | INPUT=dict( 26 | AUG=dict( 27 | TRAIN_PIPELINES=[ 28 | ("ResizeShortestEdge", 29 | dict(short_edge_length=(640, 672, 704, 736, 768, 800), 30 | max_size=1333, sample_style="choice")), 31 | ("RandomFlip", dict()), 32 | ], 33 | TEST_PIPELINES=[ 34 | ("ResizeShortestEdge", 35 | dict(short_edge_length=800, max_size=1333, sample_style="choice")), 36 | ], 37 | ) 38 | ), 39 | TEST=dict( 40 | EVAL_PEROID=10000, 41 | ), 42 | OUTPUT_DIR=osp.join( 43 | '/data/Outputs/model_logs/cvpods_playground', 44 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1]), 45 | ) 46 | 47 | 48 | class FasterRCNNConfig(RCNNConfig): 49 | def __init__(self): 50 | super(FasterRCNNConfig, self).__init__() 51 | self._register_configuration(_config_dict) 52 | 53 | 54 | config = FasterRCNNConfig() 55 | -------------------------------------------------------------------------------- /playground/detection/coco/rcnn/faster_rcnn.res50.fpn.coco.multiscale.1x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.rcnn_fpn_config import RCNNFPNConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | MASK_ON=False, 9 | RESNETS=dict(DEPTH=50), 10 | ), 11 | DATASETS=dict( 12 | TRAIN=("coco_2017_train",), 13 | TEST=("coco_2017_val",), 14 | ), 15 | SOLVER=dict( 16 | LR_SCHEDULER=dict( 17 | STEPS=(60000, 80000), 18 | MAX_ITER=90000, 19 | ), 20 | OPTIMIZER=dict( 21 | BASE_LR=0.02, 22 | ), 23 | IMS_PER_BATCH=16, 24 | ), 25 | INPUT=dict( 26 | AUG=dict( 27 | TRAIN_PIPELINES=[ 28 | ("ResizeShortestEdge", 29 | dict(short_edge_length=(640, 672, 704, 736, 768, 800), 30 | max_size=1333, sample_style="choice")), 31 | ("RandomFlip", dict()), 32 | ], 33 | TEST_PIPELINES=[ 34 | ("ResizeShortestEdge", 35 | dict(short_edge_length=800, max_size=1333, sample_style="choice")), 36 | ], 37 | ) 38 | ), 39 | TEST=dict( 40 | EVAL_PEROID=10000, 41 | ), 42 | OUTPUT_DIR=osp.join( 43 | '/data/Outputs/model_logs/cvpods_playground', 44 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1]), 45 | ) 46 | 47 | 48 | class FasterRCNNConfig(RCNNFPNConfig): 49 | def __init__(self): 50 | super(FasterRCNNConfig, self).__init__() 51 | self._register_configuration(_config_dict) 52 | 53 | 54 | config = FasterRCNNConfig() 55 | -------------------------------------------------------------------------------- /playground/segmentation/coco/pointrend/pointrend.res50.fpn.coco.multiscale.1x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.pointrend_config import PointRendRCNNFPNConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | MASK_ON=True, 9 | RESNETS=dict(DEPTH=50), 10 | ), 11 | DATASETS=dict( 12 | TRAIN=("coco_2017_train",), 13 | TEST=("coco_2017_val",), 14 | ), 15 | SOLVER=dict( 16 | LR_SCHEDULER=dict( 17 | STEPS=(60000, 80000), 18 | MAX_ITER=90000, 19 | ), 20 | OPTIMIZER=dict( 21 | BASE_LR=0.02, 22 | ), 23 | IMS_PER_BATCH=16, 24 | ), 25 | INPUT=dict( 26 | AUG=dict( 27 | TRAIN_PIPELINES=[ 28 | ("ResizeShortestEdge", 29 | dict(short_edge_length=(640, 672, 704, 736, 768, 800), 30 | max_size=1333, sample_style="choice")), 31 | ("RandomFlip", dict()), 32 | ], 33 | TEST_PIPELINES=[ 34 | ("ResizeShortestEdge", 35 | dict(short_edge_length=800, max_size=1333, sample_style="choice")), 36 | ], 37 | ), 38 | ), 39 | OUTPUT_DIR=osp.join( 40 | '/data/Outputs/model_logs/cvpods_playground', 41 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1] 42 | ), 43 | ) 44 | 45 | 46 | class CustomPointRendRCNNFPNConfig(PointRendRCNNFPNConfig): 47 | def __init__(self): 48 | super(CustomPointRendRCNNFPNConfig, self).__init__() 49 | self._register_configuration(_config_dict) 50 | 51 | 52 | config = CustomPointRendRCNNFPNConfig() 53 | -------------------------------------------------------------------------------- /playground/segmentation/coco/pointrend/pointrend.res50.fpn.coco.multiscale.3x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.pointrend_config import PointRendRCNNFPNConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | MASK_ON=True, 9 | RESNETS=dict(DEPTH=50), 10 | ), 11 | DATASETS=dict( 12 | TRAIN=("coco_2017_train",), 13 | TEST=("coco_2017_val",), 14 | ), 15 | SOLVER=dict( 16 | LR_SCHEDULER=dict( 17 | STEPS=(210000, 250000), 18 | MAX_ITER=270000, 19 | ), 20 | OPTIMIZER=dict( 21 | BASE_LR=0.02, 22 | ), 23 | IMS_PER_BATCH=16, 24 | ), 25 | INPUT=dict( 26 | AUG=dict( 27 | TRAIN_PIPELINES=[ 28 | ("ResizeShortestEdge", 29 | dict(short_edge_length=(640, 672, 704, 736, 768, 800), 30 | max_size=1333, sample_style="choice")), 31 | ("RandomFlip", dict()), 32 | ], 33 | TEST_PIPELINES=[ 34 | ("ResizeShortestEdge", 35 | dict(short_edge_length=800, max_size=1333, sample_style="choice")), 36 | ], 37 | ), 38 | ), 39 | OUTPUT_DIR=osp.join( 40 | '/data/Outputs/model_logs/cvpods_playground', 41 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1] 42 | ), 43 | ) 44 | 45 | 46 | class CustomPointRendRCNNFPNConfig(PointRendRCNNFPNConfig): 47 | def __init__(self): 48 | super(CustomPointRendRCNNFPNConfig, self).__init__() 49 | self._register_configuration(_config_dict) 50 | 51 | 52 | config = CustomPointRendRCNNFPNConfig() 53 | -------------------------------------------------------------------------------- /cvpods/layers/csrc/sigmoid_focal_loss/SigmoidFocalLoss.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | namespace cvpods { 5 | #ifdef WITH_CUDA 6 | at::Tensor SigmoidFocalLoss_forward_cuda( 7 | const at::Tensor& logits, 8 | const at::Tensor& targets, 9 | const int num_classes, 10 | const float gamma, 11 | const float alpha); 12 | 13 | at::Tensor SigmoidFocalLoss_backward_cuda( 14 | const at::Tensor& logits, 15 | const at::Tensor& targets, 16 | const at::Tensor& d_losses, 17 | const int num_classes, 18 | const float gamma, 19 | const float alpha); 20 | #endif 21 | 22 | // 23 | // Interface for Python 24 | inline at::Tensor SigmoidFocalLoss_forward( 25 | const at::Tensor& logits, 26 | const at::Tensor& targets, 27 | const int num_classes, 28 | const float gamma, 29 | const float alpha) { 30 | if (logits.device().is_cuda()) { 31 | #ifdef WITH_CUDA 32 | return SigmoidFocalLoss_forward_cuda(logits, targets, num_classes, gamma, alpha); 33 | #else 34 | AT_ERROR("Not compiled with GPU support"); 35 | #endif 36 | } 37 | AT_ERROR("Not implemented on the CPU"); 38 | } 39 | 40 | inline at::Tensor SigmoidFocalLoss_backward( 41 | const at::Tensor& logits, 42 | const at::Tensor& targets, 43 | const at::Tensor& d_losses, 44 | const int num_classes, 45 | const float gamma, 46 | const float alpha) { 47 | if (logits.device().is_cuda()) { 48 | #ifdef WITH_CUDA 49 | return SigmoidFocalLoss_backward_cuda(logits, targets, d_losses, num_classes, gamma, alpha); 50 | #else 51 | AT_ERROR("Not compiled with GPU support"); 52 | #endif 53 | } 54 | AT_ERROR("Not implemented on the CPU"); 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /playground/panoptic_segmentation/coco/panoptic_fpn.res50.fpn.coco.800size.1x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.panoptic_seg_config import PanopticSegmentationConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | MASK_ON=True, 9 | RESNETS=dict(DEPTH=50), 10 | ), 11 | DATASETS=dict( 12 | TRAIN=("coco_2017_train_panoptic_separated",), 13 | TEST=("coco_2017_val_panoptic_separated",), 14 | ), 15 | SOLVER=dict( 16 | LR_SCHEDULER=dict( 17 | STEPS=(60000, 80000), 18 | MAX_ITER=90000, 19 | ), 20 | OPTIMIZER=dict( 21 | BASE_LR=0.01, 22 | ), 23 | IMS_PER_BATCH=16, 24 | ), 25 | INPUT=dict( 26 | AUG=dict( 27 | TRAIN_PIPELINES=[ 28 | ("ResizeShortestEdge", 29 | dict(short_edge_length=(800,), 30 | max_size=1333, sample_style="choice")), 31 | ("RandomFlip", dict()), 32 | ], 33 | TEST_PIPELINES=[ 34 | ("ResizeShortestEdge", 35 | dict(short_edge_length=800, max_size=1333, sample_style="choice")), 36 | ], 37 | ) 38 | ), 39 | OUTPUT_DIR=osp.join( 40 | '/data/Outputs/model_logs/cvpods_playground', 41 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1]), 42 | ) 43 | 44 | 45 | class CustomPanopticSegmentationConfig(PanopticSegmentationConfig): 46 | def __init__(self): 47 | super(CustomPanopticSegmentationConfig, self).__init__() 48 | self._register_configuration(_config_dict) 49 | 50 | 51 | config = CustomPanopticSegmentationConfig() 52 | -------------------------------------------------------------------------------- /playground/segmentation/cityscapes/rcnn/mask_rcnn.res50.fpn.cityscapes.multiscales.1x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.rcnn_fpn_config import RCNNFPNConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="cvpods/ImageNetPretrained/FAIR/maskrcnn_3x.pkl", 8 | MASK_ON=True, 9 | RESNETS=dict(DEPTH=50), 10 | ROI_HEADS=dict(NUM_CLASSES=8), 11 | ), 12 | DATASETS=dict( 13 | TRAIN=("cityscapes_fine_instance_seg_train",), 14 | TEST=("cityscapes_fine_instance_seg_val",), 15 | ), 16 | SOLVER=dict( 17 | IMS_PER_BATCH=8, 18 | LR_SCHEDULER=dict( 19 | STEPS=(18000,), 20 | MAX_ITER=24000, 21 | ), 22 | OPTIMIZER=dict( 23 | BASE_LR=0.01, 24 | ), 25 | ), 26 | INPUT=dict( 27 | AUG=dict( 28 | TRAIN_PIPELINES=[ 29 | ("ResizeShortestEdge", dict( 30 | short_edge_length=(800, 832, 864, 896, 928, 960, 992, 1024), 31 | max_size=2048, sample_style="choice")), 32 | ("RandomFlip", dict()), 33 | ], 34 | TEST_PIPELINES=[ 35 | ("ResizeShortestEdge", dict( 36 | short_edge_length=1024, max_size=2048, sample_style="choice")), 37 | ], 38 | ), 39 | ), 40 | OUTPUT_DIR=osp.join( 41 | '/data/Outputs/model_logs/cvpods_playground', 42 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1]), 43 | ) 44 | 45 | 46 | class MaskRCNNConfig(RCNNFPNConfig): 47 | def __init__(self): 48 | super(MaskRCNNConfig, self).__init__() 49 | self._register_configuration(_config_dict) 50 | 51 | 52 | config = MaskRCNNConfig() 53 | -------------------------------------------------------------------------------- /playground/detection/citypersons/fcos/fcos.res50.fpn.citypersons.640size.1x/README.md: -------------------------------------------------------------------------------- 1 | # fcos.res50.fpn.citypersons.640size.1x 2 | 3 | ## Evaluation results for bbox: 4 | 5 | ``` 6 | Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.357 7 | Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.580 8 | Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.379 9 | Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.106 10 | Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.443 11 | Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.630 12 | Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.061 13 | Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.298 14 | Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.426 15 | Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.177 16 | Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.527 17 | Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.685 18 | ``` 19 | | AP | AP50 | AP75 | APs | APm | APl | 20 | |:------:|:------:|:------:|:------:|:------:|:------:| 21 | | 35.700 | 58.008 | 37.924 | 10.595 | 44.315 | 63.037 | 22 | 23 | ### Per-category bbox AP: 24 | 25 | | category | AP | 26 | |:-----------|:-------| 27 | | person | 35.700 | 28 | 29 | 30 | ## Evaluation results for MR: 31 | 32 | | Reasonable | Reasonable_small | Reasonable_occ=heavy | All | 33 | |:------------:|:------------------:|:----------------------:|:-----:| 34 | | 0.153 | 0.210 | 0.468 | 0.400 | 35 | -------------------------------------------------------------------------------- /playground/panoptic_segmentation/coco/panoptic_fpn.res50.fpn.coco.multiscale.1x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.panoptic_seg_config import PanopticSegmentationConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | MASK_ON=True, 9 | RESNETS=dict(DEPTH=50), 10 | ), 11 | DATASETS=dict( 12 | TRAIN=("coco_2017_train_panoptic_separated",), 13 | TEST=("coco_2017_val_panoptic_separated",), 14 | ), 15 | SOLVER=dict( 16 | LR_SCHEDULER=dict( 17 | STEPS=(60000, 80000), 18 | MAX_ITER=90000, 19 | ), 20 | OPTIMIZER=dict( 21 | BASE_LR=0.01, 22 | ), 23 | IMS_PER_BATCH=16, 24 | ), 25 | INPUT=dict( 26 | AUG=dict( 27 | TRAIN_PIPELINES=[ 28 | ("ResizeShortestEdge", 29 | dict(short_edge_length=(640, 672, 704, 736, 768, 800), 30 | max_size=1333, sample_style="choice")), 31 | ("RandomFlip", dict()), 32 | ], 33 | TEST_PIPELINES=[ 34 | ("ResizeShortestEdge", 35 | dict(short_edge_length=800, max_size=1333, sample_style="choice")), 36 | ], 37 | ) 38 | ), 39 | OUTPUT_DIR=osp.join( 40 | '/data/Outputs/model_logs/cvpods_playground', 41 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1]), 42 | ) 43 | 44 | 45 | class CustomPanopticSegmentationConfig(PanopticSegmentationConfig): 46 | def __init__(self): 47 | super(CustomPanopticSegmentationConfig, self).__init__() 48 | self._register_configuration(_config_dict) 49 | 50 | 51 | config = CustomPanopticSegmentationConfig() 52 | -------------------------------------------------------------------------------- /playground/detection/citypersons/retinanet/retinanet.res50.fpn.citypersons.640size.1x/README.md: -------------------------------------------------------------------------------- 1 | # retinanet.res50.fpn.citypersons.640size.1x 2 | 3 | ## Evaluation results for bbox: 4 | 5 | ``` 6 | Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.336 7 | Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.564 8 | Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.352 9 | Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.098 10 | Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.420 11 | Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.589 12 | Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.060 13 | Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.284 14 | Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.403 15 | Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.177 16 | Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.493 17 | Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.645 18 | ``` 19 | | AP | AP50 | AP75 | APs | APm | APl | 20 | |:------:|:------:|:------:|:-----:|:------:|:------:| 21 | | 33.619 | 56.390 | 35.249 | 9.817 | 41.968 | 58.907 | 22 | 23 | ### Per-category bbox AP: 24 | 25 | | category | AP | 26 | |:-----------|:-------| 27 | | person | 33.619 | 28 | 29 | 30 | ## Evaluation results for MR: 31 | 32 | | Reasonable | Reasonable_small | Reasonable_occ=heavy | All | 33 | |:------------:|:------------------:|:----------------------:|:-----:| 34 | | 0.156 | 0.223 | 0.450 | 0.421 | 35 | -------------------------------------------------------------------------------- /playground/segmentation/lvis/rcnn/mask_rcnn.res50.fpn.lvis.800size.1x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.rcnn_fpn_config import RCNNFPNConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | MASK_ON=True, 9 | RESNETS=dict(DEPTH=50), 10 | ROI_HEADS=dict( 11 | NUM_CLASSES=1230, 12 | SCORE_THRESH_TEST=0, 13 | ) 14 | ), 15 | DATASETS=dict( 16 | TRAIN=("lvis_v0.5_train",), 17 | TEST=("lvis_v0.5_val",) 18 | ), 19 | SOLVER=dict( 20 | LR_SCHEDULER=dict( 21 | STEPS=(60000, 80000), 22 | MAX_ITER=90000, 23 | ), 24 | OPTIMIZER=dict( 25 | BASE_LR=0.02, 26 | ), 27 | IMS_PER_BATCH=16, 28 | ), 29 | INPUT=dict( 30 | AUG=dict( 31 | TRAIN_PIPELINES=[ 32 | ("ResizeShortestEdge", dict( 33 | short_edge_length=(800,), max_size=1333, sample_style="choice")), 34 | ("RandomFlip", dict()), 35 | ], 36 | TEST_PIPELINES=[ 37 | ("ResizeShortestEdge", dict( 38 | short_edge_length=800, max_size=1333, sample_style="choice")), 39 | ], 40 | ) 41 | ), 42 | TEST=dict( 43 | DETECTIONS_PER_IMAGE=300, 44 | ), 45 | OUTPUT_DIR=osp.join( 46 | '/data/Outputs/model_logs/cvpods_playground', 47 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1]), 48 | ) 49 | 50 | 51 | class MaskRCNNConfig(RCNNFPNConfig): 52 | def __init__(self): 53 | super(MaskRCNNConfig, self).__init__() 54 | self._register_configuration(_config_dict) 55 | 56 | 57 | config = MaskRCNNConfig() 58 | -------------------------------------------------------------------------------- /tests/structures/test_imagelist.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | 3 | import unittest 4 | from typing import List, Tuple 5 | import torch 6 | 7 | from cvpods.structures import ImageList 8 | from cvpods.utils.env import TORCH_VERSION 9 | 10 | 11 | class TestImageList(unittest.TestCase): 12 | def test_imagelist_padding_shape(self): 13 | ret = ImageList.from_tensors([torch.ones((3, 15, 20), dtype=torch.float32)], 4).tensor 14 | self.assertEqual(list(ret.shape), [1, 3, 16, 20], str(ret.shape)) 15 | 16 | ret = ImageList.from_tensors( 17 | [ 18 | torch.ones((3, 25, 20), dtype=torch.float32), 19 | torch.ones((3, 10, 10), dtype=torch.float32), 20 | ], 4 21 | ).tensor 22 | self.assertEqual(list(ret.shape), [2, 3, 28, 20], str(ret.shape)) 23 | 24 | # TODO: Make cvpods.structures.ImageList scriptable 25 | @unittest.skip("Don't support scriptable cvpods.structures.ImageList") 26 | @unittest.skipIf(TORCH_VERSION < (1, 6), "Insufficient pytorch version") 27 | def test_imagelist_scriptability(self): 28 | image_nums = 2 29 | image_tensor = torch.randn((image_nums, 10, 20), dtype=torch.float32) 30 | image_shape = [(10, 20)] * image_nums 31 | 32 | def f(image_tensor, image_shape: List[Tuple[int, int]]): 33 | return ImageList(image_tensor, image_shape) 34 | 35 | ret = f(image_tensor, image_shape) 36 | ret_script = torch.jit.script(f)(image_tensor, image_shape) 37 | 38 | self.assertEqual(len(ret), len(ret_script)) 39 | for i in range(image_nums): 40 | self.assertTrue(torch.equal(ret[i], ret_script[i])) 41 | 42 | 43 | if __name__ == "__main__": 44 | unittest.main() 45 | -------------------------------------------------------------------------------- /playground/detection/citypersons/rcnn/faster_rcnn.res50.fpn.citypersons.640size.1x/README.md: -------------------------------------------------------------------------------- 1 | # faster_rcnn.res50.fpn.citypersons.640size.1x 2 | 3 | ## Evaluation results for bbox: 4 | 5 | ``` 6 | Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.361 7 | Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.576 8 | Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.391 9 | Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.127 10 | Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.440 11 | Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.614 12 | Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.061 13 | Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.299 14 | Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.406 15 | Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.182 16 | Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.493 17 | Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.654 18 | ``` 19 | | AP | AP50 | AP75 | APs | APm | APl | 20 | |:------:|:------:|:------:|:------:|:------:|:------:| 21 | | 36.062 | 57.573 | 39.050 | 12.741 | 43.973 | 61.436 | 22 | 23 | ### Per-category bbox AP: 24 | 25 | | category | AP | 26 | |:-----------|:-------| 27 | | person | 36.062 | 28 | 29 | 30 | ## Evaluation results for MR: 31 | 32 | | Reasonable | Reasonable_small | Reasonable_occ=heavy | All | 33 | |:------------:|:------------------:|:----------------------:|:-----:| 34 | | 0.133 | 0.186 | 0.459 | 0.374 | 35 | -------------------------------------------------------------------------------- /tests/structures/test_masks.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import torch 3 | 4 | from cvpods.structures.masks import BitMasks, PolygonMasks, polygons_to_bitmask 5 | 6 | 7 | class TestBitMask(unittest.TestCase): 8 | # TODO: fix this 9 | @unittest.skip("WIP") 10 | def test_get_bounding_box(self): 11 | masks = torch.tensor( 12 | [ 13 | [ 14 | [False, False, False, True], 15 | [False, False, True, True], 16 | [False, True, True, False], 17 | [False, True, True, False], 18 | ], 19 | [ 20 | [False, False, False, False], 21 | [False, False, True, False], 22 | [False, True, True, False], 23 | [False, True, True, False], 24 | ], 25 | torch.zeros(4, 4), 26 | ] 27 | ) 28 | bitmask = BitMasks(masks) 29 | box_true = torch.tensor([[1, 0, 4, 4], [1, 1, 3, 4], [0, 0, 0, 0]], dtype=torch.float32) 30 | box = bitmask.get_bounding_boxes() 31 | self.assertTrue(torch.all(box.tensor == box_true).item(), 32 | "box: {}\nbox_true: {}".format(box, box_true)) 33 | 34 | for box in box_true: 35 | poly = box[[0, 1, 2, 1, 2, 3, 0, 3]].numpy() 36 | mask = polygons_to_bitmask([poly], 4, 4) 37 | reconstruct_box = BitMasks(mask[None, :, :]).get_bounding_boxes()[0].tensor 38 | self.assertTrue(torch.all(box == reconstruct_box).item()) 39 | 40 | reconstruct_box = PolygonMasks([[poly]]).get_bounding_boxes()[0].tensor 41 | self.assertTrue(torch.all(box == reconstruct_box).item()) 42 | 43 | 44 | if __name__ == "__main__": 45 | unittest.main() 46 | -------------------------------------------------------------------------------- /cvpods/configs/panoptic_seg_config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .rcnn_fpn_config import RCNNFPNConfig 6 | 7 | _config_dict = dict( 8 | MODEL=dict( 9 | SEM_SEG_HEAD=dict( 10 | # NAME="SemSegFPNHead", 11 | IN_FEATURES=["p2", "p3", "p4", "p5"], 12 | # Label in the semantic segmentation ground truth that is ignored, 13 | # i.e., no loss is calculated for the correposnding pixel. 14 | IGNORE_VALUE=255, 15 | # Number of classes in the semantic segmentation head 16 | NUM_CLASSES=54, 17 | # Number of channels in the 3x3 convs inside semantic-FPN heads. 18 | CONVS_DIM=128, 19 | # Outputs from semantic-FPN heads are up-scaled to the COMMON_STRIDE stride. 20 | COMMON_STRIDE=4, 21 | # Normalization method for the convolution layers. Options: "" (no norm), "GN". 22 | NORM="GN", 23 | LOSS_WEIGHT=0.5, 24 | ), 25 | PANOPTIC_FPN=dict( 26 | # Scaling of all losses from instance detection / segmentation head. 27 | INSTANCE_LOSS_WEIGHT=1.0, 28 | # options when combining instance & semantic segmentation outputs 29 | COMBINE=dict( 30 | ENABLED=True, 31 | OVERLAP_THRESH=0.5, 32 | STUFF_AREA_LIMIT=4096, 33 | INSTANCES_CONFIDENCE_THRESH=0.5, 34 | ), 35 | ), 36 | ) 37 | ) 38 | 39 | 40 | class PanopticSegmentationConfig(RCNNFPNConfig): 41 | def __init__(self, d=None, **kwargs): 42 | super().__init__(d, **kwargs) 43 | self._register_configuration(_config_dict) 44 | 45 | 46 | config = PanopticSegmentationConfig() 47 | -------------------------------------------------------------------------------- /playground/detection/coco/efficientdet/effdet0.effnet0.bifpn.coco.512size.300e/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import DefaultAnchorGenerator 5 | from cvpods.modeling.backbone import Backbone, build_efficientnet_bifpn_backbone 6 | from cvpods.modeling.meta_arch import EfficientDet 7 | from cvpods.modeling.nn_utils.parameter_count import parameter_count 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_efficientnet_bifpn_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_anchor_generator(cfg, input_shape): 26 | 27 | return DefaultAnchorGenerator(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_anchor_generator = build_anchor_generator 33 | 34 | model = EfficientDet(cfg) 35 | logger = logging.getLogger(__name__) 36 | logger.info("Model:\n{}".format(model)) 37 | # parameter count 38 | parameter_count_result = parameter_count(model=model) 39 | parameter_count_dict = dict( 40 | EfficientNet=parameter_count_result["backbone.bottom_up"], 41 | BiFPN=parameter_count_result["backbone"], 42 | EfficientDet=parameter_count_result[""] 43 | ) 44 | log_str = "\n".join([ 45 | " => {}: {:.7} M".format(name, count * 1e-6) 46 | for name, count in parameter_count_dict.items() 47 | ]) 48 | logger.info("Model #Params:\n{}".format(log_str)) 49 | return model 50 | -------------------------------------------------------------------------------- /playground/detection/coco/efficientdet/effdet1.effnet1.bifpn.coco.640size.300e/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import DefaultAnchorGenerator 5 | from cvpods.modeling.backbone import Backbone, build_efficientnet_bifpn_backbone 6 | from cvpods.modeling.meta_arch import EfficientDet 7 | from cvpods.modeling.nn_utils.parameter_count import parameter_count 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_efficientnet_bifpn_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_anchor_generator(cfg, input_shape): 26 | 27 | return DefaultAnchorGenerator(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_anchor_generator = build_anchor_generator 33 | 34 | model = EfficientDet(cfg) 35 | logger = logging.getLogger(__name__) 36 | logger.info("Model:\n{}".format(model)) 37 | # parameter count 38 | parameter_count_result = parameter_count(model=model) 39 | parameter_count_dict = dict( 40 | EfficientNet=parameter_count_result["backbone.bottom_up"], 41 | BiFPN=parameter_count_result["backbone"], 42 | EfficientDet=parameter_count_result[""] 43 | ) 44 | log_str = "\n".join([ 45 | " => {}: {:.7} M".format(name, count * 1e-6) 46 | for name, count in parameter_count_dict.items() 47 | ]) 48 | logger.info("Model #Params:\n{}".format(log_str)) 49 | return model 50 | -------------------------------------------------------------------------------- /playground/segmentation/coco/pointrend/pointrend.res50.fpn.coco.multiscale.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import PointRendROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | from cvpods.modeling.roi_heads.mask_head import CoarseMaskHead 9 | from cvpods.modeling.roi_heads.point_head import StandardPointHead 10 | 11 | 12 | def build_backbone(cfg, input_shape=None): 13 | if input_shape is None: 14 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 15 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 16 | assert isinstance(backbone, Backbone) 17 | return backbone 18 | 19 | 20 | def build_proposal_generator(cfg, input_shape): 21 | return RPN(cfg, input_shape) 22 | 23 | 24 | def build_roi_heads(cfg, input_shape): 25 | return PointRendROIHeads(cfg, input_shape) 26 | 27 | 28 | def build_box_head(cfg, input_shape): 29 | return FastRCNNConvFCHead(cfg, input_shape) 30 | 31 | 32 | def build_mask_head(cfg, input_shape): 33 | return CoarseMaskHead(cfg, input_shape) 34 | 35 | 36 | def build_point_head(cfg, input_shape): 37 | return StandardPointHead(cfg, input_shape) 38 | 39 | 40 | def build_model(cfg): 41 | cfg.build_backbone = build_backbone 42 | cfg.build_proposal_generator = build_proposal_generator 43 | cfg.build_roi_heads = build_roi_heads 44 | cfg.build_box_head = build_box_head 45 | cfg.build_mask_head = build_mask_head 46 | cfg.build_point_head = build_point_head 47 | 48 | model = GeneralizedRCNN(cfg) 49 | return model 50 | -------------------------------------------------------------------------------- /playground/segmentation/coco/pointrend/pointrend.res50.fpn.coco.multiscale.3x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import PointRendROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | from cvpods.modeling.roi_heads.mask_head import CoarseMaskHead 9 | from cvpods.modeling.roi_heads.point_head import StandardPointHead 10 | 11 | 12 | def build_backbone(cfg, input_shape=None): 13 | if input_shape is None: 14 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 15 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 16 | assert isinstance(backbone, Backbone) 17 | return backbone 18 | 19 | 20 | def build_proposal_generator(cfg, input_shape): 21 | return RPN(cfg, input_shape) 22 | 23 | 24 | def build_roi_heads(cfg, input_shape): 25 | return PointRendROIHeads(cfg, input_shape) 26 | 27 | 28 | def build_box_head(cfg, input_shape): 29 | return FastRCNNConvFCHead(cfg, input_shape) 30 | 31 | 32 | def build_mask_head(cfg, input_shape): 33 | return CoarseMaskHead(cfg, input_shape) 34 | 35 | 36 | def build_point_head(cfg, input_shape): 37 | return StandardPointHead(cfg, input_shape) 38 | 39 | 40 | def build_model(cfg): 41 | cfg.build_backbone = build_backbone 42 | cfg.build_proposal_generator = build_proposal_generator 43 | cfg.build_roi_heads = build_roi_heads 44 | cfg.build_box_head = build_box_head 45 | cfg.build_mask_head = build_mask_head 46 | cfg.build_point_head = build_point_head 47 | 48 | model = GeneralizedRCNN(cfg) 49 | return model 50 | -------------------------------------------------------------------------------- /playground/detection/coco/efficientdet/effdet0.effnet0.bifpn.coco.512size.300e.syncbn/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import DefaultAnchorGenerator 5 | from cvpods.modeling.backbone import Backbone, build_efficientnet_bifpn_backbone 6 | from cvpods.modeling.meta_arch import EfficientDet 7 | from cvpods.modeling.nn_utils.parameter_count import parameter_count 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_efficientnet_bifpn_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_anchor_generator(cfg, input_shape): 26 | 27 | return DefaultAnchorGenerator(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_anchor_generator = build_anchor_generator 33 | 34 | model = EfficientDet(cfg) 35 | logger = logging.getLogger(__name__) 36 | logger.info("Model:\n{}".format(model)) 37 | # parameter count 38 | parameter_count_result = parameter_count(model=model) 39 | parameter_count_dict = dict( 40 | EfficientNet=parameter_count_result["backbone.bottom_up"], 41 | BiFPN=parameter_count_result["backbone"], 42 | EfficientDet=parameter_count_result[""] 43 | ) 44 | log_str = "\n".join([ 45 | " => {}: {:.7} M".format(name, count * 1e-6) 46 | for name, count in parameter_count_dict.items() 47 | ]) 48 | logger.info("Model #Params:\n{}".format(log_str)) 49 | return model 50 | -------------------------------------------------------------------------------- /playground/detection/coco/efficientdet/effdet1.effnet1.bifpn.coco.640size.300e.syncbn/net.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from cvpods.layers import ShapeSpec 4 | from cvpods.modeling.anchor_generator import DefaultAnchorGenerator 5 | from cvpods.modeling.backbone import Backbone, build_efficientnet_bifpn_backbone 6 | from cvpods.modeling.meta_arch import EfficientDet 7 | from cvpods.modeling.nn_utils.parameter_count import parameter_count 8 | 9 | 10 | def build_backbone(cfg, input_shape=None): 11 | """ 12 | Build a backbone from `cfg.MODEL.BACKBONE.NAME`. 13 | 14 | Returns: 15 | an instance of :class:`Backbone` 16 | """ 17 | if input_shape is None: 18 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 19 | 20 | backbone = build_efficientnet_bifpn_backbone(cfg, input_shape) 21 | assert isinstance(backbone, Backbone) 22 | return backbone 23 | 24 | 25 | def build_anchor_generator(cfg, input_shape): 26 | 27 | return DefaultAnchorGenerator(cfg, input_shape) 28 | 29 | 30 | def build_model(cfg): 31 | cfg.build_backbone = build_backbone 32 | cfg.build_anchor_generator = build_anchor_generator 33 | 34 | model = EfficientDet(cfg) 35 | logger = logging.getLogger(__name__) 36 | logger.info("Model:\n{}".format(model)) 37 | # parameter count 38 | parameter_count_result = parameter_count(model=model) 39 | parameter_count_dict = dict( 40 | EfficientNet=parameter_count_result["backbone.bottom_up"], 41 | BiFPN=parameter_count_result["backbone"], 42 | EfficientDet=parameter_count_result[""] 43 | ) 44 | log_str = "\n".join([ 45 | " => {}: {:.7} M".format(name, count * 1e-6) 46 | for name, count in parameter_count_dict.items() 47 | ]) 48 | logger.info("Model #Params:\n{}".format(log_str)) 49 | return model 50 | -------------------------------------------------------------------------------- /playground/segmentation/cityscapes/pointrend/pointrend.res50.fpn.cityscapes.multiscale.1x/net.py: -------------------------------------------------------------------------------- 1 | from cvpods.layers import ShapeSpec 2 | from cvpods.modeling.backbone import Backbone 3 | from cvpods.modeling.backbone.fpn import build_resnet_fpn_backbone 4 | from cvpods.modeling.meta_arch.rcnn import GeneralizedRCNN 5 | from cvpods.modeling.proposal_generator import RPN 6 | from cvpods.modeling.roi_heads import PointRendROIHeads 7 | from cvpods.modeling.roi_heads.box_head import FastRCNNConvFCHead 8 | from cvpods.modeling.roi_heads.mask_head import CoarseMaskHead 9 | from cvpods.modeling.roi_heads.point_head import StandardPointHead 10 | 11 | 12 | def build_backbone(cfg, input_shape=None): 13 | if input_shape is None: 14 | input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) 15 | backbone = build_resnet_fpn_backbone(cfg, input_shape) 16 | assert isinstance(backbone, Backbone) 17 | return backbone 18 | 19 | 20 | def build_proposal_generator(cfg, input_shape): 21 | return RPN(cfg, input_shape) 22 | 23 | 24 | def build_roi_heads(cfg, input_shape): 25 | return PointRendROIHeads(cfg, input_shape) 26 | 27 | 28 | def build_box_head(cfg, input_shape): 29 | return FastRCNNConvFCHead(cfg, input_shape) 30 | 31 | 32 | def build_mask_head(cfg, input_shape): 33 | return CoarseMaskHead(cfg, input_shape) 34 | 35 | 36 | def build_point_head(cfg, input_shape): 37 | return StandardPointHead(cfg, input_shape) 38 | 39 | 40 | def build_model(cfg): 41 | cfg.build_backbone = build_backbone 42 | cfg.build_proposal_generator = build_proposal_generator 43 | cfg.build_roi_heads = build_roi_heads 44 | cfg.build_box_head = build_box_head 45 | cfg.build_mask_head = build_mask_head 46 | cfg.build_point_head = build_point_head 47 | 48 | model = GeneralizedRCNN(cfg) 49 | return model 50 | -------------------------------------------------------------------------------- /playground/detection/coco/retinanet/retinanet.res50.fpn.coco.multiscale.1x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.retinanet_config import RetinaNetConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | RESNETS=dict(DEPTH=50), 9 | RETINANET=dict( 10 | SMOOTH_L1_LOSS_BETA=0.0, 11 | ), 12 | ), 13 | DATASETS=dict( 14 | TRAIN=("coco_2017_train",), 15 | TEST=("coco_2017_val",), 16 | ), 17 | SOLVER=dict( 18 | CHECKPOINT_PERIOD=10000, 19 | LR_SCHEDULER=dict( 20 | STEPS=(60000, 80000), 21 | MAX_ITER=90000, 22 | ), 23 | OPTIMIZER=dict( 24 | BASE_LR=0.01, 25 | ), 26 | IMS_PER_BATCH=16, 27 | ), 28 | INPUT=dict( 29 | AUG=dict( 30 | TRAIN_PIPELINES=[ 31 | ("ResizeShortestEdge", 32 | dict(short_edge_length=(640, 672, 704, 736, 768, 800), 33 | max_size=1333, sample_style="choice")), 34 | ("RandomFlip", dict()), 35 | ], 36 | TEST_PIPELINES=[ 37 | ("ResizeShortestEdge", 38 | dict(short_edge_length=800, max_size=1333, sample_style="choice")), 39 | ], 40 | ) 41 | ), 42 | TEST=dict( 43 | EVAL_PERIOD=10000, 44 | ), 45 | OUTPUT_DIR=osp.join( 46 | '/data/Outputs/model_logs/cvpods_playground', 47 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1]), 48 | ) 49 | 50 | 51 | class CustomRetinaNetConfig(RetinaNetConfig): 52 | def __init__(self): 53 | super(CustomRetinaNetConfig, self).__init__() 54 | self._register_configuration(_config_dict) 55 | 56 | 57 | config = CustomRetinaNetConfig() 58 | -------------------------------------------------------------------------------- /tests/checkpoint/test_checkpoint.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | import unittest 3 | from collections import OrderedDict 4 | import torch 5 | from torch import nn 6 | 7 | from cvpods.checkpoint.c2_model_loading import align_and_update_state_dicts 8 | from cvpods.utils import setup_logger 9 | 10 | 11 | class TestCheckpointer(unittest.TestCase): 12 | def setUp(self): 13 | setup_logger() 14 | 15 | def create_complex_model(self): 16 | m = nn.Module() 17 | m.block1 = nn.Module() 18 | m.block1.layer1 = nn.Linear(2, 3) 19 | m.layer2 = nn.Linear(3, 2) 20 | m.res = nn.Module() 21 | m.res.layer2 = nn.Linear(3, 2) 22 | 23 | state_dict = OrderedDict() 24 | state_dict["layer1.weight"] = torch.rand(3, 2) 25 | state_dict["layer1.bias"] = torch.rand(3) 26 | state_dict["layer2.weight"] = torch.rand(2, 3) 27 | state_dict["layer2.bias"] = torch.rand(2) 28 | state_dict["res.layer2.weight"] = torch.rand(2, 3) 29 | state_dict["res.layer2.bias"] = torch.rand(2) 30 | return m, state_dict 31 | 32 | def test_complex_model_loaded(self): 33 | for add_data_parallel in [False, True]: 34 | model, state_dict = self.create_complex_model() 35 | if add_data_parallel: 36 | model = nn.DataParallel(model) 37 | model_sd = model.state_dict() 38 | 39 | align_and_update_state_dicts(model_sd, state_dict) 40 | for loaded, stored in zip(model_sd.values(), state_dict.values()): 41 | # different tensor references 42 | self.assertFalse(id(loaded) == id(stored)) 43 | # same content 44 | self.assertTrue(loaded.equal(stored)) 45 | 46 | 47 | if __name__ == "__main__": 48 | unittest.main() 49 | -------------------------------------------------------------------------------- /playground/detection/coco/rcnn/faster_rcnn.res50.fpn.coco.multiscale.1x.syncbn/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.rcnn_fpn_config import RCNNFPNConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | MASK_ON=False, 9 | BACKBONE=dict( 10 | FREEZE_AT=0, 11 | ), 12 | RESNETS=dict( 13 | DEPTH=50, 14 | NORM="SyncBN", 15 | ), 16 | ), 17 | DATASETS=dict( 18 | TRAIN=("coco_2017_train",), 19 | TEST=("coco_2017_val",), 20 | ), 21 | SOLVER=dict( 22 | LR_SCHEDULER=dict( 23 | STEPS=(60000, 80000), 24 | MAX_ITER=90000, 25 | ), 26 | OPTIMIZER=dict( 27 | BASE_LR=0.02, 28 | ), 29 | IMS_PER_BATCH=16, 30 | ), 31 | INPUT=dict( 32 | AUG=dict( 33 | TRAIN_PIPELINES=[ 34 | ("ResizeShortestEdge", 35 | dict(short_edge_length=(640, 672, 704, 736, 768, 800), 36 | max_size=1333, sample_style="choice")), 37 | ("RandomFlip", dict()), 38 | ], 39 | TEST_PIPELINES=[ 40 | ("ResizeShortestEdge", 41 | dict(short_edge_length=800, max_size=1333, sample_style="choice")), 42 | ], 43 | ) 44 | ), 45 | TEST=dict( 46 | EVAL_PEROID=10000, 47 | ), 48 | OUTPUT_DIR=osp.join( 49 | '/data/Outputs/model_logs/cvpods_playground', 50 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1]), 51 | ) 52 | 53 | 54 | class FasterRCNNConfig(RCNNFPNConfig): 55 | def __init__(self): 56 | super(FasterRCNNConfig, self).__init__() 57 | self._register_configuration(_config_dict) 58 | 59 | 60 | config = FasterRCNNConfig() 61 | -------------------------------------------------------------------------------- /playground/semantic_segmentation/coco/semanticfpn/semanticfpn.res50.fpn.coco.multiscale.1x/config.py: -------------------------------------------------------------------------------- 1 | import os.path as osp 2 | 3 | from cvpods.configs.segm_config import SegmentationConfig 4 | 5 | _config_dict = dict( 6 | MODEL=dict( 7 | WEIGHTS="detectron2://ImageNetPretrained/MSRA/R-50.pkl", 8 | RESNETS=dict( 9 | OUT_FEATURES=["res2", "res3", "res4", "res5"], 10 | DEPTH=50), 11 | FPN=dict( 12 | IN_FEATURES=["res2", "res3", "res4", "res5"], 13 | ) 14 | ), 15 | DATASETS=dict( 16 | TRAIN=("coco_2017_train_panoptic_stuffonly",), 17 | TEST=("coco_2017_val_panoptic_stuffonly",), 18 | ), 19 | SOLVER=dict( 20 | LR_SCHEDULER=dict( 21 | STEPS=(60000, 80000), 22 | MAX_ITER=90000, 23 | ), 24 | OPTIMIZER=dict( 25 | BASE_LR=0.02, 26 | ), 27 | ), 28 | INPUT=dict( 29 | AUG=dict( 30 | TRAIN_PIPELINES=[ 31 | ("ResizeShortestEdge", dict( 32 | short_edge_length=(640, 672, 704, 736, 768, 800), 33 | max_size=1333, sample_style="choice")), 34 | ("RandomFlip", dict()), 35 | ], 36 | TEST_PIPELINES=[ 37 | ("ResizeShortestEdge", dict( 38 | short_edge_length=800, max_size=1333, sample_style="choice")), 39 | ], 40 | ), 41 | ), 42 | OUTPUT_DIR=osp.join( 43 | '/data/Outputs/model_logs/cvpods_playground', 44 | osp.split(osp.realpath(__file__))[0].split("playground/")[-1] 45 | ), 46 | ) 47 | 48 | 49 | class SemanticFPNConfig(SegmentationConfig): 50 | def __init__(self): 51 | super(SemanticFPNConfig, self).__init__() 52 | self._register_configuration(_config_dict) 53 | 54 | 55 | config = SemanticFPNConfig() 56 | -------------------------------------------------------------------------------- /tools/rm_files.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding:utf-8 -*- 3 | 4 | import argparse 5 | import os 6 | import re 7 | from colorama import Fore, Style 8 | 9 | 10 | def remove_parser(): 11 | parser = argparse.ArgumentParser() 12 | parser.add_argument("--start-iter", "-s", type=int, default=0, help="start iter to remove") 13 | parser.add_argument("--end-iter", "-e", type=int, default=0, help="end iter to remove") 14 | parser.add_argument("--prefix", "-p", type=str, default="model_", 15 | help="prefix of model to remove") 16 | parser.add_argument("--dir", "-d", type=str, default="/data/Outputs", 17 | help="dir to remove pth model") 18 | parser.add_argument("--real", "-r", action="store_true", 19 | help="really delete or just show what you will delete") 20 | return parser 21 | 22 | 23 | def remove_files(args): 24 | start = args.start_iter 25 | end = args.end_iter 26 | prefix = args.prefix 27 | for folder, _, files in os.walk(args.dir): 28 | # l = [x for x in f if x.endswith(".pth")] 29 | models = [f for f in files if re.search(prefix + r"[0123456789]*\.pth", f)] 30 | delete = [os.path.join(folder, model) for model in models 31 | if start <= int(model[len(prefix):-len(".pth")]) <= end] 32 | if delete: 33 | for f in delete: 34 | if args.real: 35 | print(f"remove {f}") 36 | os.remove(f) 37 | else: 38 | print(f"you may remove {f}") 39 | if not args.real: 40 | print(Fore.RED + "use --real parameter to really delete models" + Style.RESET_ALL) 41 | 42 | 43 | def main(): 44 | args = remove_parser().parse_args() 45 | remove_files(args) 46 | 47 | 48 | if __name__ == "__main__": 49 | main() 50 | -------------------------------------------------------------------------------- /tests/layers/test_nms.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 2 | from __future__ import absolute_import, division, print_function, unicode_literals 3 | import unittest 4 | import torch 5 | 6 | from cvpods.layers import batched_nms 7 | from cvpods.utils.env import TORCH_VERSION 8 | 9 | 10 | class TestNMS(unittest.TestCase): 11 | def _create_tensors(self, N): 12 | boxes = torch.rand(N, 4) * 100 13 | # Note: the implementation of this function in torchvision is: 14 | # boxes[:, 2:] += torch.rand(N, 2) * 100 15 | # but it does not guarantee non-negative widths/heights constraints: 16 | # boxes[:, 2] >= boxes[:, 0] and boxes[:, 3] >= boxes[:, 1]: 17 | boxes[:, 2:] += boxes[:, :2] 18 | scores = torch.rand(N) 19 | return boxes, scores 20 | 21 | # TODO: make cvpods.layers.batched_nms scriptable 22 | @unittest.skip("Don't support scriptable cvpods.layers.batched_nms") 23 | @unittest.skipIf(TORCH_VERSION < (1, 6), "Insufficient pytorch version") 24 | def test_nms_scriptability(self): 25 | N = 2000 26 | num_classes = 50 27 | boxes, scores = self._create_tensors(N) 28 | idxs = torch.randint(0, num_classes, (N,)) 29 | scripted_batched_nms = torch.jit.script(batched_nms) 30 | err_msg = "NMS is incompatible with jit-scripted NMS for IoU={}" 31 | 32 | for iou in [0.2, 0.5, 0.8]: 33 | keep_ref = batched_nms(boxes, scores, idxs, iou) 34 | backup = boxes.clone() 35 | scripted_keep = scripted_batched_nms(boxes, scores, idxs, iou) 36 | assert torch.allclose(boxes, backup), "boxes modified by jit-scripted batched_nms" 37 | self.assertTrue(torch.equal(keep_ref, scripted_keep), err_msg.format(iou)) 38 | 39 | 40 | if __name__ == "__main__": 41 | unittest.main() 42 | -------------------------------------------------------------------------------- /cvpods/configs/segm_config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding: utf-8 -*- 3 | # Copyright (C) 2019-2021 Megvii Inc. All rights reserved. 4 | 5 | from .base_detection_config import BaseDetectionConfig 6 | 7 | _config_dict = dict( 8 | MODEL=dict( 9 | SEM_SEG_HEAD=dict( 10 | # NAME="SemSegFPNHead", 11 | IN_FEATURES=["p2", "p3", "p4", "p5"], 12 | # Label in the semantic segmentation ground truth that is ignored, 13 | # i.e., no loss is calculated for the correposnding pixel. 14 | IGNORE_VALUE=255, 15 | # Number of classes in the semantic segmentation head 16 | NUM_CLASSES=54, 17 | # Number of channels in the 3x3 convs inside semantic-FPN heads. 18 | CONVS_DIM=128, 19 | # Outputs from semantic-FPN heads are up-scaled to the COMMON_STRIDE stride. 20 | COMMON_STRIDE=4, 21 | # Normalization method for the convolution layers. Options: "" (no norm), "GN". 22 | NORM="GN", 23 | LOSS_WEIGHT=1.0, 24 | ), 25 | PANOPTIC_FPN=dict( 26 | # Scaling of all losses from instance detection / segmentation head. 27 | INSTANCE_LOSS_WEIGHT=1.0, 28 | # options when combining instance & semantic segmentation outputs 29 | COMBINE=dict( 30 | ENABLED=True, 31 | OVERLAP_THRESH=0.5, 32 | STUFF_AREA_LIMIT=4096, 33 | INSTANCES_CONFIDENCE_THRESH=0.5, 34 | ), 35 | ), 36 | ), 37 | DATALOADER=dict(FILTER_EMPTY_ANNOTATIONS=False,), 38 | ) 39 | 40 | 41 | class SegmentationConfig(BaseDetectionConfig): 42 | def __init__(self, d=None, **kwargs): 43 | super().__init__(d, **kwargs) 44 | self._register_configuration(_config_dict) 45 | 46 | 47 | config = SegmentationConfig() 48 | --------------------------------------------------------------------------------