Refine docs and fix format issues (#3349)

* Refine docs and fix format issues

* reformat

* fix mock

* Refine format

* Reorganize tutorials
pull/3360/head
Wenwei Zhang 5 years ago committed by GitHub
parent adc65ffc3e
commit ec7d83bb4c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      .dev_scripts/linter.sh
  2. 2
      .github/CONTRIBUTING.md
  3. 4
      .style.yapf
  4. 5
      docs/conf.py
  5. 14
      docs/index.rst
  6. 7
      docs/tutorials/index.rst
  7. 23
      mmdet/core/anchor/anchor_generator.py
  8. 2
      mmdet/core/anchor/utils.py
  9. 33
      mmdet/core/bbox/assigners/center_region_assigner.py
  10. 4
      mmdet/core/bbox/samplers/sampling_result.py
  11. 6
      mmdet/core/mask/structures.py
  12. 4
      mmdet/core/mask/utils.py
  13. 2
      mmdet/core/post_processing/bbox_nms.py
  14. 2
      mmdet/core/utils/misc.py
  15. 14
      mmdet/datasets/cityscapes.py
  16. 10
      mmdet/datasets/coco.py
  17. 6
      mmdet/datasets/custom.py
  18. 18
      mmdet/datasets/pipelines/formating.py
  19. 69
      mmdet/datasets/pipelines/transforms.py
  20. 4
      mmdet/models/backbones/regnet.py
  21. 41
      mmdet/models/dense_heads/anchor_head.py
  22. 33
      mmdet/models/dense_heads/fcos_head.py
  23. 1
      mmdet/models/detectors/atss.py
  24. 15
      mmdet/models/detectors/base.py
  25. 8
      mmdet/models/losses/ghm_loss.py
  26. 4
      mmdet/models/losses/iou_loss.py
  27. 3
      mmdet/models/necks/bfp.py
  28. 6
      mmdet/models/necks/fpn.py
  29. 3
      mmdet/models/necks/hrfpn.py
  30. 5
      setup.cfg

@ -1,3 +1,3 @@
yapf -r -i --style .style.yapf mmdet/ configs/ tests/ tools/ yapf -r -i --style mmdet/ configs/ tests/ tools/
isort -rc mmdet/ configs/ tests/ tools/ isort -rc mmdet/ configs/ tests/ tools/
flake8 . flake8 .

@ -27,7 +27,7 @@ We use the following tools for linting and formatting:
- [yapf](https://github.com/google/yapf): formatter - [yapf](https://github.com/google/yapf): formatter
- [isort](https://github.com/timothycrosley/isort): sort imports - [isort](https://github.com/timothycrosley/isort): sort imports
Style configurations of yapf and isort can be found in [.style.yapf](../.style.yapf) and [.isort.cfg](../.isort.cfg). Style configurations of yapf and isort can be found in [setup.cfg](../setup.cfg).
We use [pre-commit hook](https://pre-commit.com/) that checks and formats for `flake8`, `yapf`, `isort`, `trailing whitespaces`, We use [pre-commit hook](https://pre-commit.com/) that checks and formats for `flake8`, `yapf`, `isort`, `trailing whitespaces`,
fixes `end-of-files`, sorts `requirments.txt` automatically on every commit. fixes `end-of-files`, sorts `requirments.txt` automatically on every commit.

@ -1,4 +0,0 @@
[style]
BASED_ON_STYLE = pep8
BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF = true
SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN = true

@ -39,10 +39,7 @@ extensions = [
] ]
autodoc_mock_imports = [ autodoc_mock_imports = [
'matplotlib', 'pycocotools', 'terminaltables', 'mmdet.version', 'matplotlib', 'pycocotools', 'terminaltables', 'mmdet.version', 'mmcv.ops'
'mmdet.ops.corner_pool', 'mmdet.ops.dcn', 'mmdet.ops.masked_conv',
'mmdet.ops.nms', 'mmdet.ops.roi_align', 'mmdet.ops.roi_pool',
'mmdet.ops.sigmoid_focal_loss', 'mmdet.ops.carafe', 'mmdet.ops.utils'
] ]
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.

@ -8,13 +8,19 @@ Welcome to MMDetection's documentation!
getting_started.md getting_started.md
config.md config.md
model_zoo.md model_zoo.md
tutorials/finetune.md
tutorials/new_dataset.md
tutorials/data_pipeline.md
tutorials/new_modules.md
compatibility.md compatibility.md
changelog.md changelog.md
projects.md projects.md
.. toctree::
:maxdepth: 2
:caption: Tutorials
tutorials/index.rst
.. toctree::
:caption: API Reference
api.rst api.rst

@ -0,0 +1,7 @@
.. toctree::
:maxdepth: 2
finetune.md
new_dataset.md
data_pipeline.md
new_modules.md

@ -123,7 +123,7 @@ class AnchorGenerator(object):
"""Generate base anchors. """Generate base anchors.
Returns: Returns:
list(torch.Tensor): Base anchors of a feature grid in multiple list(torch.Tensor): Base anchors of a feature grid in multiple \
feature levels. feature levels.
""" """
multi_level_base_anchors = [] multi_level_base_anchors = []
@ -155,7 +155,7 @@ class AnchorGenerator(object):
related to a single feature grid. Defaults to None. related to a single feature grid. Defaults to None.
Returns: Returns:
torch.Tensor: Anchors in a single-level feature maps torch.Tensor: Anchors in a single-level feature maps.
""" """
w = base_size w = base_size
h = base_size h = base_size
@ -212,10 +212,10 @@ class AnchorGenerator(object):
device (str): Device where the anchors will be put on. device (str): Device where the anchors will be put on.
Return: Return:
list[torch.Tensor]: Anchors in multiple feature levels. list[torch.Tensor]: Anchors in multiple feature levels. \
The sizes of each tensor should be [N, 4], where The sizes of each tensor should be [N, 4], where \
N = width * height * num_base_anchors, width and height N = width * height * num_base_anchors, width and height \
are the sizes of the corresponding feature lavel, are the sizes of the corresponding feature lavel, \
num_base_anchors is the number of anchors for that level. num_base_anchors is the number of anchors for that level.
""" """
assert self.num_levels == len(featmap_sizes) assert self.num_levels == len(featmap_sizes)
@ -308,7 +308,7 @@ class AnchorGenerator(object):
Defaults to 'cuda'. Defaults to 'cuda'.
Returns: Returns:
torch.Tensor: The valid flags of each anchor in a single level torch.Tensor: The valid flags of each anchor in a single level \
feature map. feature map.
""" """
feat_h, feat_w = featmap_size feat_h, feat_w = featmap_size
@ -433,7 +433,7 @@ class SSDAnchorGenerator(AnchorGenerator):
"""Generate base anchors. """Generate base anchors.
Returns: Returns:
list(torch.Tensor): Base anchors of a feature grid in multiple list(torch.Tensor): Base anchors of a feature grid in multiple \
feature levels. feature levels.
""" """
multi_level_base_anchors = [] multi_level_base_anchors = []
@ -471,11 +471,12 @@ class SSDAnchorGenerator(AnchorGenerator):
class LegacyAnchorGenerator(AnchorGenerator): class LegacyAnchorGenerator(AnchorGenerator):
"""Legacy anchor generator used in MMDetection V1.x. """Legacy anchor generator used in MMDetection V1.x.
Note:
Difference to the V2.0 anchor generator: Difference to the V2.0 anchor generator:
1. The center offset of V1.x anchors are set to be 0.5 rather than 0. 1. The center offset of V1.x anchors are set to be 0.5 rather than 0.
2. The width/height are minused by 1 when calculating the anchors' centers 2. The width/height are minused by 1 when calculating the anchors' \
and corners to meet the V1.x coordinate system. centers and corners to meet the V1.x coordinate system.
3. The anchors' corners are quantized. 3. The anchors' corners are quantized.
Args: Args:
@ -523,7 +524,7 @@ class LegacyAnchorGenerator(AnchorGenerator):
"""Generate base anchors of a single level. """Generate base anchors of a single level.
Note: Note:
The width/height of anchors are minused by 1 when calculating The width/height of anchors are minused by 1 when calculating \
the centers and corners to meet the V1.x coordinate system. the centers and corners to meet the V1.x coordinate system.
Args: Args:

@ -31,7 +31,7 @@ def anchor_inside_flags(flat_anchors,
Defaults to 0. Defaults to 0.
Returns: Returns:
torch.Tensor: Flags indicating whether the anchors are inside a torch.Tensor: Flags indicating whether the anchors are inside a \
valid range. valid range.
""" """
img_h, img_w = img_shape[:2] img_h, img_w = img_shape[:2]

@ -108,7 +108,7 @@ class CenterRegionAssigner(BaseAssigner):
gt_bboxes (Tensor): Ground truth boxes, shape (k, 4). gt_bboxes (Tensor): Ground truth boxes, shape (k, 4).
Returns: Returns:
Tensor: The priority of gts so that gts with larger priority is Tensor: The priority of gts so that gts with larger priority is \
more likely to be assigned. Shape (k, ) more likely to be assigned. Shape (k, )
""" """
gt_areas = bboxes_area(gt_bboxes) gt_areas = bboxes_area(gt_bboxes)
@ -119,9 +119,10 @@ class CenterRegionAssigner(BaseAssigner):
def assign(self, bboxes, gt_bboxes, gt_bboxes_ignore=None, gt_labels=None): def assign(self, bboxes, gt_bboxes, gt_bboxes_ignore=None, gt_labels=None):
"""Assign gt to bboxes. """Assign gt to bboxes.
This method assigns gts to every bbox (proposal/anchor), each bbox will This method assigns gts to every bbox (proposal/anchor), each bbox \
be assigned with -1, or a semi-positive number. -1 means negative will be assigned with -1, or a semi-positive number. -1 means \
sample, semi-positive number is the index (0-based) of assigned gt. negative sample, semi-positive number is the index (0-based) of \
assigned gt.
Args: Args:
bboxes (Tensor): Bounding boxes to be assigned, shape(n, 4). bboxes (Tensor): Bounding boxes to be assigned, shape(n, 4).
@ -131,12 +132,13 @@ class CenterRegionAssigner(BaseAssigner):
gt_labels (tensor, optional): Label of gt_bboxes, shape (num_gts,). gt_labels (tensor, optional): Label of gt_bboxes, shape (num_gts,).
Returns: Returns:
:obj:`AssignResult`: The assigned result. Note that shadowed_labels :obj:`AssignResult`: The assigned result. Note that \
of shape (N, 2) is also added as an `assign_result` attribute. shadowed_labels of shape (N, 2) is also added as an \
`shadowed_labels` is a tensor composed of N pairs of `assign_result` attribute. `shadowed_labels` is a tensor \
[anchor_ind, class_label], where N is the number of anchors that composed of N pairs of anchor_ind, class_label], where N \
lie in the outer region of a gt, anchor_ind is the shadowed is the number of anchors that lie in the outer region of a \
anchor index and class_label is the shadowed class label. gt, anchor_ind is the shadowed anchor index and class_label \
is the shadowed class label.
Example: Example:
>>> self = CenterRegionAssigner(0.2, 0.2) >>> self = CenterRegionAssigner(0.2, 0.2)
@ -261,11 +263,14 @@ class CenterRegionAssigner(BaseAssigner):
match with multiple gts. Shape: (num_gt, ). match with multiple gts. Shape: (num_gt, ).
Returns: Returns:
assigned_gt_inds: The assigned gt index of each prior bbox tuple: Returns (assigned_gt_inds, shadowed_gt_inds).
- assigned_gt_inds: The assigned gt index of each prior bbox \
(i.e. index from 1 to num_gts). Shape: (num_prior, ). (i.e. index from 1 to num_gts). Shape: (num_prior, ).
shadowed_gt_inds: shadowed gt indices. It is a tensor of shape - shadowed_gt_inds: shadowed gt indices. It is a tensor of \
(num_ignore, 2) with first column being the shadowed prior bbox shape (num_ignore, 2) with first column being the \
indices and the second column the shadowed gt indices (1-based) shadowed prior bbox indices and the second column the \
shadowed gt indices (1-based).
""" """
num_bboxes, num_gts = is_bbox_in_gt_core.shape num_bboxes, num_gts = is_bbox_in_gt_core.shape

@ -97,9 +97,9 @@ class SamplingResult(util_mixins.NiceRepr):
kwargs (keyword arguments): kwargs (keyword arguments):
- num_preds: number of predicted boxes - num_preds: number of predicted boxes
- num_gts: number of true boxes - num_gts: number of true boxes
- p_ignore (float): probability of a predicted box assinged to - p_ignore (float): probability of a predicted box assinged to \
an ignored truth. an ignored truth.
- p_assigned (float): probability of a predicted box not being - p_assigned (float): probability of a predicted box not being \
assigned. assigned.
- p_use_label (float | bool): with labels or not. - p_use_label (float | bool): with labels or not.

@ -507,9 +507,9 @@ class PolygonMasks(BaseInstanceMasks):
def areas(self): def areas(self):
"""Compute areas of masks. """Compute areas of masks.
This func is modified from This func is modified from `detectron2
https://github.com/facebookresearch/detectron2/blob/ffff8acc35ea88ad1cb1806ab0f00b4c1c5dbfd9/detectron2/structures/masks.py#L387 <https://github.com/facebookresearch/detectron2/blob/ffff8acc35ea88ad1cb1806ab0f00b4c1c5dbfd9/detectron2/structures/masks.py#L387>`_.
Only works with Polygons, using the shoelace formula The function only works with Polygons using the shoelace formula.
Return: Return:
ndarray: areas of each instance ndarray: areas of each instance

@ -17,8 +17,8 @@ def split_combined_polys(polys, poly_lens, polys_per_mask):
of each mask of each mask
Returns: Returns:
list: a list (length = image num) of list (length = mask num) of list: a list (length = image num) of list (length = mask num) of \
list (length = poly num) of numpy array list (length = poly num) of numpy array.
""" """
mask_polys_list = [] mask_polys_list = []
for img_id in range(len(polys)): for img_id in range(len(polys)):

@ -23,7 +23,7 @@ def multiclass_nms(multi_bboxes,
applying NMS applying NMS
Returns: Returns:
tuple: (bboxes, labels), tensors of shape (k, 5) and (k, 1). Labels tuple: (bboxes, labels), tensors of shape (k, 5) and (k, 1). Labels \
are 0-based. are 0-based.
""" """
num_classes = multi_scores.size(1) - 1 num_classes = multi_scores.size(1) - 1

@ -46,7 +46,7 @@ def multi_apply(func, *args, **kwargs):
arguments arguments
Returns: Returns:
tuple(list): A tuple containing multiple list, each list contains tuple(list): A tuple containing multiple list, each list contains \
a kind of returned results by the function a kind of returned results by the function
""" """
pfunc = partial(func, **kwargs) if kwargs else func pfunc = partial(func, **kwargs) if kwargs else func

@ -45,8 +45,8 @@ class CityscapesDataset(CocoDataset):
ann_info (list[dict]): Annotation info of an image. ann_info (list[dict]): Annotation info of an image.
Returns: Returns:
dict: A dict containing the following keys: bboxes, bboxes_ignore, dict: A dict containing the following keys: bboxes, \
labels, masks, seg_map. bboxes_ignore, labels, masks, seg_map. \
"masks" are already decoded into binary masks. "masks" are already decoded into binary masks.
""" """
gt_bboxes = [] gt_bboxes = []
@ -102,7 +102,7 @@ class CityscapesDataset(CocoDataset):
the txt files will be named "somepath/xxx.txt". the txt files will be named "somepath/xxx.txt".
Returns: Returns:
list[str: str]: result txt files which contains corresponding list[str]: Result txt files which contains corresponding \
instance segmentation images. instance segmentation images.
""" """
try: try:
@ -168,8 +168,8 @@ class CityscapesDataset(CocoDataset):
If not specified, a temp file will be created. Default: None. If not specified, a temp file will be created. Default: None.
Returns: Returns:
tuple: (result_files, tmp_dir), result_files is a dict containing tuple: (result_files, tmp_dir), result_files is a dict containing \
the json filepaths, tmp_dir is the temporal directory created the json filepaths, tmp_dir is the temporal directory created \
for saving txt/png files when txtfile_prefix is not specified. for saving txt/png files when txtfile_prefix is not specified.
""" """
assert isinstance(results, list), 'results must be a list' assert isinstance(results, list), 'results must be a list'
@ -229,7 +229,7 @@ class CityscapesDataset(CocoDataset):
also be computed. Default: 0.5. also be computed. Default: 0.5.
Returns: Returns:
dict[str, float]: COCO style evaluation metric or cityscapes mAP dict[str, float]: COCO style evaluation metric or cityscapes mAP \
and AP@50. and AP@50.
""" """
eval_results = dict() eval_results = dict()
@ -268,7 +268,7 @@ class CityscapesDataset(CocoDataset):
related information during evaluation. Default: None. related information during evaluation. Default: None.
Returns: Returns:
dict[str: float]: Cityscapes evaluation results, contains 'mAP' dict[str: float]: Cityscapes evaluation results, contains 'mAP' \
and 'AP@50'. and 'AP@50'.
""" """

@ -128,8 +128,8 @@ class CocoDataset(CustomDataset):
with_mask (bool): Whether to parse mask annotations. with_mask (bool): Whether to parse mask annotations.
Returns: Returns:
dict: A dict containing the following keys: bboxes, bboxes_ignore, dict: A dict containing the following keys: bboxes, bboxes_ignore,\
labels, masks, seg_map. "masks" are raw annotations and not labels, masks, seg_map. "masks" are raw annotations and not \
decoded into binary masks. decoded into binary masks.
""" """
gt_bboxes = [] gt_bboxes = []
@ -285,7 +285,7 @@ class CocoDataset(CustomDataset):
"somepath/xxx.proposal.json". "somepath/xxx.proposal.json".
Returns: Returns:
dict[str: str]: Possible keys are "bbox", "segm", "proposal", and dict[str: str]: Possible keys are "bbox", "segm", "proposal", and \
values are corresponding filenames. values are corresponding filenames.
""" """
result_files = dict() result_files = dict()
@ -344,8 +344,8 @@ class CocoDataset(CustomDataset):
If not specified, a temp file will be created. Default: None. If not specified, a temp file will be created. Default: None.
Returns: Returns:
tuple: (result_files, tmp_dir), result_files is a dict containing tuple: (result_files, tmp_dir), result_files is a dict containing \
the json filepaths, tmp_dir is the temporal directory created the json filepaths, tmp_dir is the temporal directory created \
for saving json files when jsonfile_prefix is not specified. for saving json files when jsonfile_prefix is not specified.
""" """
assert isinstance(results, list), 'results must be a list' assert isinstance(results, list), 'results must be a list'

@ -177,7 +177,7 @@ class CustomDataset(Dataset):
idx (int): Index of data. idx (int): Index of data.
Returns: Returns:
dict: Training/test data (with annotation if `test_mode` is set dict: Training/test data (with annotation if `test_mode` is set \
True). True).
""" """
@ -197,7 +197,7 @@ class CustomDataset(Dataset):
idx (int): Index of data. idx (int): Index of data.
Returns: Returns:
dict: Training data and annotation after pipeline with new keys dict: Training data and annotation after pipeline with new keys \
introduced by pipeline. introduced by pipeline.
""" """
@ -216,7 +216,7 @@ class CustomDataset(Dataset):
idx (int): Index of data. idx (int): Index of data.
Returns: Returns:
dict: Testing data after pipeline with new keys intorduced by dict: Testing data after pipeline with new keys intorduced by \
piepline. piepline.
""" """

@ -119,7 +119,7 @@ class Transpose(object):
results (dict): Result dict contains the data to transpose. results (dict): Result dict contains the data to transpose.
Returns: Returns:
dict: The result dict contains the data transposed to dict: The result dict contains the data transposed to \
``self.order``. ``self.order``.
""" """
for key in self.keys: for key in self.keys:
@ -156,7 +156,7 @@ class ToDataContainer(object):
results (dict): Result dict contains the data to convert. results (dict): Result dict contains the data to convert.
Returns: Returns:
dict: The result dict contains the data converted to dict: The result dict contains the data converted to \
:obj:`mmcv.DataContainer`. :obj:`mmcv.DataContainer`.
""" """
@ -184,7 +184,7 @@ class DefaultFormatBundle(object):
- gt_bboxes_ignore: (1)to tensor, (2)to DataContainer - gt_bboxes_ignore: (1)to tensor, (2)to DataContainer
- gt_labels: (1)to tensor, (2)to DataContainer - gt_labels: (1)to tensor, (2)to DataContainer
- gt_masks: (1)to tensor, (2)to DataContainer (cpu_only=True) - gt_masks: (1)to tensor, (2)to DataContainer (cpu_only=True)
- gt_semantic_seg: (1)unsqueeze dim-0 (2)to tensor, - gt_semantic_seg: (1)unsqueeze dim-0 (2)to tensor, \
(3)to DataContainer (stack=True) (3)to DataContainer (stack=True)
""" """
@ -195,7 +195,7 @@ class DefaultFormatBundle(object):
results (dict): Result dict contains the data to convert. results (dict): Result dict contains the data to convert.
Returns: Returns:
dict: The result dict contains the data that is formatted with dict: The result dict contains the data that is formatted with \
default bundle. default bundle.
""" """
@ -258,9 +258,9 @@ class Collect(object):
The "img_meta" item is always populated. The contents of the "img_meta" The "img_meta" item is always populated. The contents of the "img_meta"
dictionary depends on "meta_keys". By default this includes: dictionary depends on "meta_keys". By default this includes:
- "img_shape": shape of the image input to the network as a tuple - "img_shape": shape of the image input to the network as a tuple \
(h, w, c). Note that images may be zero padded on the bottom/right (h, w, c). Note that images may be zero padded on the \
if the batch tensor is larger than this shape. bottom/right if the batch tensor is larger than this shape.
- "scale_factor": a float indicating the preprocessing scale - "scale_factor": a float indicating the preprocessing scale
@ -273,6 +273,7 @@ class Collect(object):
- "pad_shape": image shape after padding - "pad_shape": image shape after padding
- "img_norm_cfg": a dict of normalization information: - "img_norm_cfg": a dict of normalization information:
- mean - per channel mean subtraction - mean - per channel mean subtraction
- std - per channel std divisor - std - per channel std divisor
- to_rgb - bool indicating if bgr was converted to rgb - to_rgb - bool indicating if bgr was converted to rgb
@ -303,6 +304,7 @@ class Collect(object):
Returns: Returns:
dict: The result dict contains the following keys dict: The result dict contains the following keys
- keys in``self.keys`` - keys in``self.keys``
- ``img_metas`` - ``img_metas``
""" """
@ -349,7 +351,7 @@ class WrapFieldsToLists(object):
results (dict): Result dict contains the data to wrap. results (dict): Result dict contains the data to wrap.
Returns: Returns:
dict: The result dict where value of ``self.keys`` are wrapped dict: The result dict where value of ``self.keys`` are wrapped \
into list. into list.
""" """

@ -36,11 +36,11 @@ class Resize(object):
`img_scale` can either be a tuple (single-scale) or a list of tuple `img_scale` can either be a tuple (single-scale) or a list of tuple
(multi-scale). There are 3 multiscale modes: (multi-scale). There are 3 multiscale modes:
- ``ratio_range is not None``: randomly sample a ratio from the ratio range - ``ratio_range is not None``: randomly sample a ratio from the ratio \
and multiply it with the image scale. range and multiply it with the image scale.
- ``ratio_range is None`` and ``multiscale_mode == "range"``: randomly - ``ratio_range is None`` and ``multiscale_mode == "range"``: randomly \
sample a scale from the multiscale range. sample a scale from the multiscale range.
- ``ratio_range is None`` and ``multiscale_mode == "value"``: randomly - ``ratio_range is None`` and ``multiscale_mode == "value"``: randomly \
sample a scale from multiple scales. sample a scale from multiple scales.
Args: Args:
@ -84,8 +84,8 @@ class Resize(object):
img_scales (list[tuple]): Images scales for selection. img_scales (list[tuple]): Images scales for selection.
Returns: Returns:
(tuple, int): Returns a tuple ``(img_scale, scale_dix)``, (tuple, int): Returns a tuple ``(img_scale, scale_dix)``, \
where ``img_scale`` is the selected image scale and where ``img_scale`` is the selected image scale and \
``scale_idx`` is the selected index in the given candidates. ``scale_idx`` is the selected index in the given candidates.
""" """
@ -104,8 +104,8 @@ class Resize(object):
and uper bound of image scales. and uper bound of image scales.
Returns: Returns:
(tuple, None): Returns a tuple ``(img_scale, None)``, where (tuple, None): Returns a tuple ``(img_scale, None)``, where \
``img_scale`` is sampled scale and None is just a placeholder ``img_scale`` is sampled scale and None is just a placeholder \
to be consistent with :func:`random_select`. to be consistent with :func:`random_select`.
""" """
@ -135,9 +135,9 @@ class Resize(object):
the ``img_scale``. the ``img_scale``.
Returns: Returns:
(tuple, None): Returns a tuple ``(scale, None)``, where (tuple, None): Returns a tuple ``(scale, None)``, where \
``scale`` is sampled ratio multiplied with ``img_scale`` and ``scale`` is sampled ratio multiplied with ``img_scale`` and \
None is just a placeholder to be consistent with None is just a placeholder to be consistent with \
:func:`random_select`. :func:`random_select`.
""" """
@ -162,7 +162,7 @@ class Resize(object):
results (dict): Result dict from :obj:`dataset`. results (dict): Result dict from :obj:`dataset`.
Returns: Returns:
dict: Two new keys 'scale` and 'scale_idx` are added into dict: Two new keys 'scale` and 'scale_idx` are added into \
``results``, which would be used by subsequent pipelines. ``results``, which would be used by subsequent pipelines.
""" """
@ -244,7 +244,7 @@ class Resize(object):
results (dict): Result dict from loading pipeline. results (dict): Result dict from loading pipeline.
Returns: Returns:
dict: Resized results, 'img_shape', 'pad_shape', 'scale_factor', dict: Resized results, 'img_shape', 'pad_shape', 'scale_factor', \
'keep_ratio' keys are added into result dict. 'keep_ratio' keys are added into result dict.
""" """
@ -332,8 +332,8 @@ class RandomFlip(object):
results (dict): Result dict from loading pipeline. results (dict): Result dict from loading pipeline.
Returns: Returns:
dict: Flipped results, 'flip', 'flip_direction' keys are added into dict: Flipped results, 'flip', 'flip_direction' keys are added \
result dict. into result dict.
""" """
if 'flip' not in results: if 'flip' not in results:
@ -486,7 +486,7 @@ class RandomCrop(object):
allow_negative_crop (bool): Whether to allow a crop that does not allow_negative_crop (bool): Whether to allow a crop that does not
contain any bbox area. Default to False. contain any bbox area. Default to False.
Notes: Note:
- If the image is smaller than the crop size, return the original image - If the image is smaller than the crop size, return the original image
- The keys for bboxes, labels and masks must be aligned. That is, - The keys for bboxes, labels and masks must be aligned. That is,
`gt_bboxes` corresponds to `gt_labels` and `gt_masks`, and `gt_bboxes` corresponds to `gt_labels` and `gt_masks`, and
@ -810,9 +810,9 @@ class MinIoURandomCrop(object):
min_crop_size (float): minimum crop's size (i.e. h,w := a*h, a*w, min_crop_size (float): minimum crop's size (i.e. h,w := a*h, a*w,
where a >= min_crop_size). where a >= min_crop_size).
Notes: Note:
The keys for bboxes, labels and masks should be paired. That is, The keys for bboxes, labels and masks should be paired. That is, \
`gt_bboxes` corresponds to `gt_labels` and `gt_masks`, and `gt_bboxes` corresponds to `gt_labels` and `gt_masks`, and \
`gt_bboxes_ignore` to `gt_labels_ignore` and `gt_masks_ignore`. `gt_bboxes_ignore` to `gt_labels_ignore` and `gt_masks_ignore`.
""" """
@ -838,7 +838,7 @@ class MinIoURandomCrop(object):
results (dict): Result dict from loading pipeline. results (dict): Result dict from loading pipeline.
Returns: Returns:
dict: Result dict with images and bounding boxes cropped, dict: Result dict with images and bounding boxes cropped, \
'img_shape' key is updated. 'img_shape' key is updated.
""" """
@ -1174,15 +1174,15 @@ class RandomCenterCropPad(object):
"""Random center crop and random around padding for CornerNet. """Random center crop and random around padding for CornerNet.
This operation generates randomly cropped image from the original image and This operation generates randomly cropped image from the original image and
pads it simultaneously. Different from `RandomCrop`, the output shape may pads it simultaneously. Different from :class:`RandomCrop`, the output
not equal to `crop_size` strictly. We choose a random value from `ratios` shape may not equal to ``crop_size`` strictly. We choose a random value
and the output shape could be larger or smaller than `crop_size`. Also the from ``ratios`` and the output shape could be larger or smaller than
pad in this operation is different from `Pad`, actually we use around ``crop_size``. The padding operation is also different from :class:`Pad`,
padding instead of right-bottom padding. here we use around padding instead of right-bottom padding.
The relation between output image (padding image) and original image: The relation between output image (padding image) and original image:
.. code-block: text .. code-block::
output image output image
+----------------------------+ +----------------------------+
@ -1198,20 +1198,22 @@ class RandomCenterCropPad(object):
+----------------------------+ +----------------------------+
There are 5 main areas in the figure: There are 5 main areas in the figure:
- output image: output image of this operation, also called padding
- output image: output image of this operation, also called padding \
image in following instruction. image in following instruction.
- original image: input image of this operation. - original image: input image of this operation.
- padded area: non-intersect area of output image and original image. - padded area: non-intersect area of output image and original image.
- cropped area: the overlap of output image and original image. - cropped area: the overlap of output image and original image.
- center range: a smaller area where random center chosen from. - center range: a smaller area where random center chosen from. \
center range is computed by `border` and original image's shape center range is computed by `border` and original image's shape \
to avoid our random center is too close to original image's border. to avoid our random center is too close to original image's border.
Also this operation act differently in train and test mode, the summary Also this operation act differently in train and test mode, the summary
pipeline is listed below. pipeline is listed below.
Train pipeline: Train pipeline:
1. Choose a `random_ratio` from `ratios`, the shape of padding image
1. Choose a `random_ratio` from `ratios`, the shape of padding image \
will be `random_ratio * crop_size`. will be `random_ratio * crop_size`.
2. Choose a `random_center` in `center range`. 2. Choose a `random_center` in `center range`.
3. Generate padding image with center matches the `random_center`. 3. Generate padding image with center matches the `random_center`.
@ -1220,8 +1222,9 @@ class RandomCenterCropPad(object):
6. Refine annotations. 6. Refine annotations.
Test pipeline: Test pipeline:
1. Compute output shape according to `test_pad_mode`. 1. Compute output shape according to `test_pad_mode`.
2. Generate padding image with center matches the original image 2. Generate padding image with center matches the original image \
center. center.
3. Initialize the padding image with pixel value equals to `mean`. 3. Initialize the padding image with pixel value equals to `mean`.
4. Copy the `cropped area` to padding image. 4. Copy the `cropped area` to padding image.
@ -1247,7 +1250,7 @@ class RandomCenterCropPad(object):
127 as padding shape value. 127 as padding shape value.
- 'logical_or': final_shape = input_shape | padding_shape_value - 'logical_or': final_shape = input_shape | padding_shape_value
- 'size_divisor': final_shape = int( - 'size_divisor': final_shape = int( \
ceil(input_shape / padding_shape_value) * padding_shape_value) ceil(input_shape / padding_shape_value) * padding_shape_value)
""" """
@ -1316,6 +1319,7 @@ class RandomCenterCropPad(object):
Args: Args:
patch (list[int]): The cropped area, [left, top, right, bottom]. patch (list[int]): The cropped area, [left, top, right, bottom].
boxes (numpy array, (N x 4)): Ground truth boxes. boxes (numpy array, (N x 4)): Ground truth boxes.
Returns: Returns:
mask (numpy array, (N,)): Each box is inside or outside the patch. mask (numpy array, (N,)): Each box is inside or outside the patch.
""" """
@ -1339,6 +1343,7 @@ class RandomCenterCropPad(object):
image (np array, H x W x C): Original image. image (np array, H x W x C): Original image.
center (list[int]): Target crop center coord. center (list[int]): Target crop center coord.
size (list[int]): Target crop size. [target_h, target_w] size (list[int]): Target crop size. [target_h, target_w]
Returns: Returns:
cropped_img (np array, target_h x target_w x C): Cropped image. cropped_img (np array, target_h x target_w x C): Cropped image.
border (np array, 4): The distance of four border of `cropped_img` border (np array, 4): The distance of four border of `cropped_img`

@ -234,8 +234,8 @@ class RegNet(ResNet):
divisor (int, optional): The divisor of channels. Defaults to 8. divisor (int, optional): The divisor of channels. Defaults to 8.
Returns: Returns:
list, int: return a list of widths of each stage and the number of list, int: return a list of widths of each stage and the number \
stages of stages
""" """
assert width_slope >= 0 assert width_slope >= 0
assert initial_width > 0 assert initial_width > 0

@ -119,9 +119,9 @@ class AnchorHead(BaseDenseHead):
Returns: Returns:
tuple: tuple:
cls_score (Tensor): Cls scores for a single scale level cls_score (Tensor): Cls scores for a single scale level \
the channels number is num_anchors * num_classes. the channels number is num_anchors * num_classes.
bbox_pred (Tensor): Box energies / deltas for a single scale bbox_pred (Tensor): Box energies / deltas for a single scale \
level, the channels number is num_anchors * 4. level, the channels number is num_anchors * 4.
""" """
cls_score = self.conv_cls(x) cls_score = self.conv_cls(x)
@ -136,13 +136,14 @@ class AnchorHead(BaseDenseHead):
a 4D-tensor. a 4D-tensor.
Returns: Returns:
tuple: Usually a tuple of classification scores and bbox prediction tuple: A tuple of classification scores and bbox prediction.
cls_scores (list[Tensor]): Classification scores for all scale
levels, each is a 4D-tensor, the channels number is - cls_scores (list[Tensor]): Classification scores for all \
num_anchors * num_classes. scale levels, each is a 4D-tensor, the channels number \
bbox_preds (list[Tensor]): Box energies / deltas for all scale is num_anchors * num_classes.
levels, each is a 4D-tensor, the channels number is - bbox_preds (list[Tensor]): Box energies / deltas for all \
num_anchors * 4. scale levels, each is a 4D-tensor, the channels number \
is num_anchors * 4.
""" """
return multi_apply(self.forward_single, feats) return multi_apply(self.forward_single, feats)
@ -156,8 +157,8 @@ class AnchorHead(BaseDenseHead):
Returns: Returns:
tuple: tuple:
anchor_list (list[Tensor]): Anchors of each image anchor_list (list[Tensor]): Anchors of each image.
valid_flag_list (list[Tensor]): Valid flags of each image valid_flag_list (list[Tensor]): Valid flags of each image.
""" """
num_imgs = len(img_metas) num_imgs = len(img_metas)
@ -308,13 +309,17 @@ class AnchorHead(BaseDenseHead):
set of anchors. set of anchors.
Returns: Returns:
tuple: tuple: Usually returns a tuple containing learning targets.
labels_list (list[Tensor]): Labels of each level
label_weights_list (list[Tensor]): Label weights of each level - labels_list (list[Tensor]): Labels of each level.
bbox_targets_list (list[Tensor]): BBox targets of each level - label_weights_list (list[Tensor]): Label weights of each \
bbox_weights_list (list[Tensor]): BBox weights of each level level.
num_total_pos (int): Number of positive samples in all images - bbox_targets_list (list[Tensor]): BBox targets of each level.
num_total_neg (int): Number of negative samples in all images - bbox_weights_list (list[Tensor]): BBox weights of each level.
- num_total_pos (int): Number of positive samples in all \
images.
- num_total_neg (int): Number of negative samples in all \
images.
additional_returns: This function enables user-defined returns from additional_returns: This function enables user-defined returns from
`self._get_targets_single`. These returns are currently refined `self._get_targets_single`. These returns are currently refined
to properties at each feature map (i.e. having HxW dimension). to properties at each feature map (i.e. having HxW dimension).

@ -45,6 +45,7 @@ class FCOSHead(AnchorFreeHead):
loss_centerness (dict): Config of centerness loss. loss_centerness (dict): Config of centerness loss.
norm_cfg (dict): dictionary to construct and config norm layer. norm_cfg (dict): dictionary to construct and config norm layer.
Default: norm_cfg=dict(type='GN', num_groups=32, requires_grad=True). Default: norm_cfg=dict(type='GN', num_groups=32, requires_grad=True).
Example: Example:
>>> self = FCOSHead(11, 7) >>> self = FCOSHead(11, 7)
>>> feats = [torch.rand(1, 7, s, s) for s in [4, 8, 16, 32, 64]] >>> feats = [torch.rand(1, 7, s, s) for s in [4, 8, 16, 32, 64]]
@ -108,13 +109,13 @@ class FCOSHead(AnchorFreeHead):
Returns: Returns:
tuple: tuple:
cls_scores (list[Tensor]): Box scores for each scale level, cls_scores (list[Tensor]): Box scores for each scale level, \
each is a 4D-tensor, the channel number is each is a 4D-tensor, the channel number is \
num_points * num_classes. num_points * num_classes.
bbox_preds (list[Tensor]): Box energies / deltas for each scale bbox_preds (list[Tensor]): Box energies / deltas for each \
level, each is a 4D-tensor, the channel number is scale level, each is a 4D-tensor, the channel number is \
num_points * 4. num_points * 4.
centernesses (list[Tensor]): Centerss for each scale level, centernesses (list[Tensor]): Centerss for each scale level, \
each is a 4D-tensor, the channel number is num_points * 1. each is a 4D-tensor, the channel number is num_points * 1.
""" """
return multi_apply(self.forward_single, feats, self.scales, return multi_apply(self.forward_single, feats, self.scales,
@ -132,7 +133,7 @@ class FCOSHead(AnchorFreeHead):
is True. is True.
Returns: Returns:
tuple: scores for each class, bbox predictions and centerness tuple: scores for each class, bbox predictions and centerness \
predictions of input feature maps. predictions of input feature maps.
""" """
cls_score, bbox_pred, cls_feat, reg_feat = super().forward_single(x) cls_score, bbox_pred, cls_feat, reg_feat = super().forward_single(x)
@ -272,12 +273,12 @@ class FCOSHead(AnchorFreeHead):
rescale (bool): If True, return boxes in original image space rescale (bool): If True, return boxes in original image space
Returns: Returns:
list[tuple[Tensor, Tensor]]: Each item in result_list is 2-tuple. list[tuple[Tensor, Tensor]]: Each item in result_list is 2-tuple. \
The first item is an (n, 5) tensor, where the first 4 columns The first item is an (n, 5) tensor, where the first 4 columns \
are bounding box positions (tl_x, tl_y, br_x, br_y) and the are bounding box positions (tl_x, tl_y, br_x, br_y) and the \
5-th column is a score between 0 and 1. The second item is a 5-th column is a score between 0 and 1. The second item is a \
(n,) tensor where each item is the predicted class label of the (n,) tensor where each item is the predicted class label of \
corresponding box. the corresponding box.
""" """
assert len(cls_scores) == len(bbox_preds) assert len(cls_scores) == len(bbox_preds)
num_levels = len(cls_scores) num_levels = len(cls_scores)
@ -335,8 +336,8 @@ class FCOSHead(AnchorFreeHead):
rescale (bool): If True, return boxes in original image space. rescale (bool): If True, return boxes in original image space.
Returns: Returns:
Tensor: Labeled boxes in shape (n, 5), where the first 4 columns Tensor: Labeled boxes in shape (n, 5), where the first 4 columns \
are bounding box positions (tl_x, tl_y, br_x, br_y) and the are bounding box positions (tl_x, tl_y, br_x, br_y) and the \
5-th column is a score between 0 and 1. 5-th column is a score between 0 and 1.
""" """
cfg = self.test_cfg if cfg is None else cfg cfg = self.test_cfg if cfg is None else cfg
@ -408,8 +409,8 @@ class FCOSHead(AnchorFreeHead):
Returns: Returns:
tuple: tuple:
concat_lvl_labels (list[Tensor]): Labels of each level. concat_lvl_labels (list[Tensor]): Labels of each level. \
concat_lvl_bbox_targets (list[Tensor]): BBox targets of each concat_lvl_bbox_targets (list[Tensor]): BBox targets of each \
level. level.
""" """
assert len(points) == len(self.regress_ranges) assert len(points) == len(self.regress_ranges)

@ -4,6 +4,7 @@ from .single_stage import SingleStageDetector
@DETECTORS.register_module() @DETECTORS.register_module()
class ATSS(SingleStageDetector): class ATSS(SingleStageDetector):
"""Implementation of `ATSS <https://arxiv.org/abs/1912.02424>`_."""
def __init__(self, def __init__(self,
backbone, backbone,

@ -180,8 +180,8 @@ class BaseDetector(nn.Module, metaclass=ABCMeta):
losses and other necessary infomation. losses and other necessary infomation.
Returns: Returns:
tuple[Tensor, dict]: (loss, log_vars), loss is the loss tensor tuple[Tensor, dict]: (loss, log_vars), loss is the loss tensor \
which may be a weighted sum of all losses, log_vars contains which may be a weighted sum of all losses, log_vars contains \
all the variables to be sent to the logger. all the variables to be sent to the logger.
""" """
log_vars = OrderedDict() log_vars = OrderedDict()
@ -223,14 +223,15 @@ class BaseDetector(nn.Module, metaclass=ABCMeta):
and reserved. and reserved.
Returns: Returns:
dict: It should contain at least 3 keys: ``loss``, ``log_vars``, dict: It should contain at least 3 keys: ``loss``, ``log_vars``, \
``num_samples``. ``num_samples``.
``loss`` is a tensor for back propagation, which can be a
- ``loss`` is a tensor for back propagation, which can be a \
weighted sum of multiple losses. weighted sum of multiple losses.
``log_vars`` contains all the variables to be sent to the - ``log_vars`` contains all the variables to be sent to the
logger. logger.
``num_samples`` indicates the batch size (when the model is - ``num_samples`` indicates the batch size (when the model is \
DDP, it means the batch size on each GPU), which is used for DDP, it means the batch size on each GPU), which is used for \
averaging the logs. averaging the logs.
""" """
losses = self(**data) losses = self(**data)

@ -22,8 +22,8 @@ class GHMC(nn.Module):
"""GHM Classification Loss. """GHM Classification Loss.
Details of the theorem can be viewed in the paper Details of the theorem can be viewed in the paper
"Gradient Harmonized Single-stage Detector". `Gradient Harmonized Single-stage Detector
https://arxiv.org/abs/1811.05181 <https://arxiv.org/abs/1811.05181>`_.
Args: Args:
bins (int): Number of the unit regions for distribution calculation. bins (int): Number of the unit regions for distribution calculation.
@ -100,8 +100,8 @@ class GHMR(nn.Module):
"""GHM Regression Loss. """GHM Regression Loss.
Details of the theorem can be viewed in the paper Details of the theorem can be viewed in the paper
"Gradient Harmonized Single-stage Detector" `Gradient Harmonized Single-stage Detector
https://arxiv.org/abs/1811.05181 <https://arxiv.org/abs/1811.05181>`_.
Args: Args:
mu (float): The parameter for the Authentic Smooth L1 loss. mu (float): The parameter for the Authentic Smooth L1 loss.

@ -29,8 +29,10 @@ def iou_loss(pred, target, eps=1e-6):
@weighted_loss @weighted_loss
def bounded_iou_loss(pred, target, beta=0.2, eps=1e-3): def bounded_iou_loss(pred, target, beta=0.2, eps=1e-3):
"""`Improving Object Localization with Fitness NMS and Bounded IoU Loss. """BIoULoss.
This is an implementation of paper
`Improving Object Localization with Fitness NMS and Bounded IoU Loss.
<https://arxiv.org/abs/1711.00164>`_. <https://arxiv.org/abs/1711.00164>`_.
Args: Args:

@ -13,7 +13,8 @@ class BFP(nn.Module):
BFP takes multi-level features as inputs and gather them into a single one, BFP takes multi-level features as inputs and gather them into a single one,
then refine the gathered feature and scatter the refined results to then refine the gathered feature and scatter the refined results to
multi-level features. This module is used in Libra R-CNN (CVPR 2019), see multi-level features. This module is used in Libra R-CNN (CVPR 2019), see
https://arxiv.org/pdf/1904.02701.pdf for details. the paper `Libra R-CNN: Towards Balanced Learning for Object Detection
<https://arxiv.org/abs/1904.02701>`_ for details.
Args: Args:
in_channels (int): Number of input channels (feature maps of all levels in_channels (int): Number of input channels (feature maps of all levels

@ -8,10 +8,10 @@ from ..builder import NECKS
@NECKS.register_module() @NECKS.register_module()
class FPN(nn.Module): class FPN(nn.Module):
"""Feature Pyramid Network. r"""Feature Pyramid Network.
This is an implementation of - Feature Pyramid Networks for Object This is an implementation of paper `Feature Pyramid Networks for Object
Detection (https://arxiv.org/abs/1612.03144) Detection <https://arxiv.org/abs/1612.03144>`_.
Args: Args:
in_channels (List[int]): Number of input channels per scale. in_channels (List[int]): Number of input channels per scale.

@ -11,7 +11,8 @@ from ..builder import NECKS
class HRFPN(nn.Module): class HRFPN(nn.Module):
"""HRFPN (High Resolution Feature Pyrmamids) """HRFPN (High Resolution Feature Pyrmamids)
arXiv: https://arxiv.org/abs/1904.04514 paper: `High-Resolution Representations for Labeling Pixels and Regions
<https://arxiv.org/abs/1904.04514>`_.
Args: Args:
in_channels (list): number of channels for each branch. in_channels (list): number of channels for each branch.

@ -6,3 +6,8 @@ known_first_party = mmdet
known_third_party = PIL,asynctest,cityscapesscripts,cv2,matplotlib,mmcv,numpy,onnx,pycocotools,pytest,robustness_eval,seaborn,six,terminaltables,torch,torchvision known_third_party = PIL,asynctest,cityscapesscripts,cv2,matplotlib,mmcv,numpy,onnx,pycocotools,pytest,robustness_eval,seaborn,six,terminaltables,torch,torchvision
no_lines_before = STDLIB,LOCALFOLDER no_lines_before = STDLIB,LOCALFOLDER
default_section = THIRDPARTY default_section = THIRDPARTY
[yapf]
BASED_ON_STYLE = pep8
BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF = true
SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN = true
Loading…
Cancel
Save