"examples/vscode:/vscode.git/clone" did not exist on "cdf7334cc6e0972e992b4339e1611b0dcb14804e"
Unverified Commit 5e2fa8ce authored by ChaimZhu's avatar ChaimZhu Committed by GitHub
Browse files

[Refactor]: remove legacy builder.py and update corresponding unit tests (#2161)

* fix circle ci

* delete model builder

* fix comments
parent 9a425a11
# Copyright (c) OpenMMLab. All rights reserved. # Copyright (c) OpenMMLab. All rights reserved.
from .builder import DATASETS, PIPELINES, build_dataset
from .dataset_wrappers import CBGSDataset from .dataset_wrappers import CBGSDataset
from .det3d_dataset import Det3DDataset from .det3d_dataset import Det3DDataset
from .kitti_dataset import KittiDataset from .kitti_dataset import KittiDataset
...@@ -27,8 +26,7 @@ from .utils import get_loading_pipeline ...@@ -27,8 +26,7 @@ from .utils import get_loading_pipeline
from .waymo_dataset import WaymoDataset from .waymo_dataset import WaymoDataset
__all__ = [ __all__ = [
'KittiDataset', 'DATASETS', 'CBGSDataset', 'KittiDataset', 'CBGSDataset', 'NuScenesDataset', 'LyftDataset',
'build_dataset', 'NuScenesDataset', 'LyftDataset',
'ObjectSample', 'RandomFlip3D', 'ObjectNoise', 'GlobalRotScaleTrans', 'ObjectSample', 'RandomFlip3D', 'ObjectNoise', 'GlobalRotScaleTrans',
'PointShuffle', 'ObjectRangeFilter', 'PointsRangeFilter', 'PointShuffle', 'ObjectRangeFilter', 'PointsRangeFilter',
'LoadPointsFromFile', 'S3DISSegDataset', 'S3DISDataset', 'LoadPointsFromFile', 'S3DISSegDataset', 'S3DISDataset',
...@@ -39,6 +37,5 @@ __all__ = [ ...@@ -39,6 +37,5 @@ __all__ = [
'LoadPointsFromMultiSweeps', 'WaymoDataset', 'BackgroundPointsFilter', 'LoadPointsFromMultiSweeps', 'WaymoDataset', 'BackgroundPointsFilter',
'VoxelBasedPointSampler', 'get_loading_pipeline', 'RandomDropPointsColor', 'VoxelBasedPointSampler', 'get_loading_pipeline', 'RandomDropPointsColor',
'RandomJitterPoints', 'ObjectNameFilter', 'AffineResize', 'RandomJitterPoints', 'ObjectNameFilter', 'AffineResize',
'RandomShiftScale', 'LoadPointsFromDict', 'PIPELINES', 'RandomShiftScale', 'LoadPointsFromDict', 'Resize3D', 'RandomResize3D',
'Resize3D', 'RandomResize3D',
] ]
# Copyright (c) OpenMMLab. All rights reserved.
import platform
from mmdet.datasets.builder import _concat_dataset
from mmdet3d.registry import DATASETS, TRANSFORMS
if platform.system() != 'Windows':
# https://github.com/pytorch/pytorch/issues/973
import resource
rlimit = resource.getrlimit(resource.RLIMIT_NOFILE)
base_soft_limit = rlimit[0]
hard_limit = rlimit[1]
soft_limit = min(max(4096, base_soft_limit), hard_limit)
resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, hard_limit))
OBJECTSAMPLERS = TRANSFORMS
PIPELINES = TRANSFORMS
def build_dataset(cfg, default_args=None):
from mmengine.dataset import (ClassBalancedDataset, ConcatDataset,
RepeatDataset)
from mmdet3d.datasets.dataset_wrappers import CBGSDataset
if isinstance(cfg, (list, tuple)):
dataset = ConcatDataset([build_dataset(c, default_args) for c in cfg])
elif cfg['type'] == 'ConcatDataset':
dataset = ConcatDataset(
[build_dataset(c, default_args) for c in cfg['datasets']],
cfg.get('separate_eval', True))
elif cfg['type'] == 'RepeatDataset':
dataset = RepeatDataset(
build_dataset(cfg['dataset'], default_args), cfg['times'])
elif cfg['type'] == 'ClassBalancedDataset':
dataset = ClassBalancedDataset(
build_dataset(cfg['dataset'], default_args), cfg['oversample_thr'])
elif cfg['type'] == 'CBGSDataset':
dataset = CBGSDataset(build_dataset(cfg['dataset'], default_args))
elif isinstance(cfg.get('ann_file'), (list, tuple)):
dataset = _concat_dataset(cfg, default_args)
else:
dataset = DATASETS.build(cfg, default_args=default_args)
return dataset
...@@ -11,7 +11,7 @@ from mmengine.dataset import BaseDataset ...@@ -11,7 +11,7 @@ from mmengine.dataset import BaseDataset
from mmengine.logging import print_log from mmengine.logging import print_log
from terminaltables import AsciiTable from terminaltables import AsciiTable
from mmdet3d.datasets import DATASETS from mmdet3d.registry import DATASETS
from mmdet3d.structures import get_box_type from mmdet3d.structures import get_box_type
......
...@@ -3,7 +3,7 @@ from typing import Callable, List, Union ...@@ -3,7 +3,7 @@ from typing import Callable, List, Union
import numpy as np import numpy as np
from mmdet3d.datasets import DATASETS from mmdet3d.registry import DATASETS
from mmdet3d.structures import CameraInstance3DBoxes from mmdet3d.structures import CameraInstance3DBoxes
from .det3d_dataset import Det3DDataset from .det3d_dataset import Det3DDataset
......
# Copyright (c) OpenMMLab. All rights reserved. # Copyright (c) OpenMMLab. All rights reserved.
from mmdet3d.models.layers.fusion_layers import * # noqa: F401,F403 from mmdet3d.models.layers.fusion_layers import * # noqa: F401,F403
from .backbones import * # noqa: F401,F403 from .backbones import * # noqa: F401,F403
from .builder import (BACKBONES, DETECTORS, FUSION_LAYERS, HEADS, LOSSES,
MIDDLE_ENCODERS, NECKS, ROI_EXTRACTORS, SEGMENTORS,
SHARED_HEADS, VOXEL_ENCODERS, build_backbone,
build_detector, build_fusion_layer, build_head,
build_loss, build_middle_encoder, build_model,
build_neck, build_roi_extractor, build_shared_head,
build_voxel_encoder)
from .data_preprocessors import * # noqa: F401,F403 from .data_preprocessors import * # noqa: F401,F403
from .decode_heads import * # noqa: F401,F403 from .decode_heads import * # noqa: F401,F403
from .dense_heads import * # noqa: F401,F403 from .dense_heads import * # noqa: F401,F403
...@@ -21,12 +14,3 @@ from .segmentors import * # noqa: F401,F403 ...@@ -21,12 +14,3 @@ from .segmentors import * # noqa: F401,F403
from .test_time_augs import * # noqa: F401,F403 from .test_time_augs import * # noqa: F401,F403
from .utils import * # noqa: F401,F403 from .utils import * # noqa: F401,F403
from .voxel_encoders import * # noqa: F401,F403 from .voxel_encoders import * # noqa: F401,F403
__all__ = [
'BACKBONES', 'NECKS', 'ROI_EXTRACTORS', 'SHARED_HEADS', 'HEADS', 'LOSSES',
'DETECTORS', 'SEGMENTORS', 'VOXEL_ENCODERS', 'MIDDLE_ENCODERS',
'FUSION_LAYERS', 'build_backbone', 'build_neck', 'build_roi_extractor',
'build_shared_head', 'build_head', 'build_loss', 'build_detector',
'build_fusion_layer', 'build_model', 'build_middle_encoder',
'build_voxel_encoder'
]
...@@ -7,7 +7,6 @@ from mmcv.cnn import ConvModule ...@@ -7,7 +7,6 @@ from mmcv.cnn import ConvModule
from mmengine.model import BaseModule from mmengine.model import BaseModule
from torch import nn as nn from torch import nn as nn
from mmdet3d.models.builder import build_backbone
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
...@@ -57,7 +56,7 @@ class MultiBackbone(BaseModule): ...@@ -57,7 +56,7 @@ class MultiBackbone(BaseModule):
for backbone_cfg in backbones: for backbone_cfg in backbones:
out_channels += backbone_cfg['fp_channels'][-1][-1] out_channels += backbone_cfg['fp_channels'][-1][-1]
self.backbone_list.append(build_backbone(backbone_cfg)) self.backbone_list.append(MODELS.build(backbone_cfg))
# Feature aggregation layers # Feature aggregation layers
if aggregation_mlp_channels is None: if aggregation_mlp_channels is None:
......
# Copyright (c) OpenMMLab. All rights reserved.
import warnings
from mmdet3d.registry import MODELS
BACKBONES = MODELS
NECKS = MODELS
ROI_EXTRACTORS = MODELS
SHARED_HEADS = MODELS
HEADS = MODELS
LOSSES = MODELS
DETECTORS = MODELS
SEGMENTORS = MODELS
VOXEL_ENCODERS = MODELS
MIDDLE_ENCODERS = MODELS
FUSION_LAYERS = MODELS
SEGMENTORS = MODELS
def build_backbone(cfg):
"""Build backbone."""
warnings.warn('``build_backbone`` would be deprecated soon, please use '
'``mmdet3d.registry.MODELS.build()`` ')
return BACKBONES.build(cfg)
def build_neck(cfg):
"""Build neck."""
warnings.warn('``build_neck`` would be deprecated soon, please use '
'``mmdet3d.registry.MODELS.build()`` ')
return NECKS.build(cfg)
def build_roi_extractor(cfg):
"""Build roi extractor."""
warnings.warn(
'``build_roi_extractor`` would be deprecated soon, please use '
'``mmdet3d.registry.MODELS.build()`` ')
return ROI_EXTRACTORS.build(cfg)
def build_shared_head(cfg):
"""Build shared head."""
warnings.warn('``build_shared_head`` would be deprecated soon, please use '
'``mmdet3d.registry.MODELS.build()`` ')
return SHARED_HEADS.build(cfg)
def build_head(cfg):
"""Build head."""
warnings.warn('``build_head`` would be deprecated soon, please use '
'``mmdet3d.registry.MODELS.build()`` ')
return HEADS.build(cfg)
def build_loss(cfg):
"""Build loss."""
warnings.warn('``build_loss`` would be deprecated soon, please use '
'``mmdet3d.registry.MODELS.build()`` ')
return LOSSES.build(cfg)
def build_detector(cfg, train_cfg=None, test_cfg=None):
"""Build detector."""
if train_cfg is not None or test_cfg is not None:
warnings.warn(
'train_cfg and test_cfg is deprecated, '
'please specify them in model', UserWarning)
assert cfg.get('train_cfg') is None or train_cfg is None, \
'train_cfg specified in both outer field and model field '
assert cfg.get('test_cfg') is None or test_cfg is None, \
'test_cfg specified in both outer field and model field '
if cfg['type'] in DETECTORS._module_dict.keys():
return DETECTORS.build(
cfg, default_args=dict(train_cfg=train_cfg, test_cfg=test_cfg))
def build_segmentor(cfg, train_cfg=None, test_cfg=None):
"""Build segmentor."""
if train_cfg is not None or test_cfg is not None:
warnings.warn(
'train_cfg and test_cfg is deprecated, '
'please specify them in model', UserWarning)
assert cfg.get('train_cfg') is None or train_cfg is None, \
'train_cfg specified in both outer field and model field '
assert cfg.get('test_cfg') is None or test_cfg is None, \
'test_cfg specified in both outer field and model field '
return SEGMENTORS.build(
cfg, default_args=dict(train_cfg=train_cfg, test_cfg=test_cfg))
def build_model(cfg, train_cfg=None, test_cfg=None):
"""A function wrapper for building 3D detector or segmentor according to
cfg.
Should be deprecated in the future.
"""
if cfg.type in ['EncoderDecoder3D']:
return build_segmentor(cfg, train_cfg=train_cfg, test_cfg=test_cfg)
else:
return build_detector(cfg, train_cfg=train_cfg, test_cfg=test_cfg)
def build_voxel_encoder(cfg):
"""Build voxel encoder."""
warnings.warn('``build_voxel_encoder`` would be deprecated soon, please '
'use ``mmdet3d.registry.MODELS.build()`` ')
return VOXEL_ENCODERS.build(cfg)
def build_middle_encoder(cfg):
"""Build middle level encoder."""
warnings.warn('``build_middle_encoder`` would be deprecated soon, please '
'use ``mmdet3d.registry.MODELS.build()`` ')
return MIDDLE_ENCODERS.build(cfg)
def build_fusion_layer(cfg):
"""Build fusion layer."""
warnings.warn('``build_fusion_layer`` would be deprecated soon, please '
'use ``mmdet3d.registry.MODELS.build()`` ')
return FUSION_LAYERS.build(cfg)
...@@ -13,7 +13,6 @@ from mmdet3d.models.utils import (clip_sigmoid, draw_heatmap_gaussian, ...@@ -13,7 +13,6 @@ from mmdet3d.models.utils import (clip_sigmoid, draw_heatmap_gaussian,
gaussian_radius) gaussian_radius)
from mmdet3d.registry import MODELS, TASK_UTILS from mmdet3d.registry import MODELS, TASK_UTILS
from mmdet3d.structures import Det3DDataSample, xywhr2xyxyr from mmdet3d.structures import Det3DDataSample, xywhr2xyxyr
from .. import builder
from ..layers import circle_nms, nms_bev from ..layers import circle_nms, nms_bev
...@@ -337,7 +336,7 @@ class CenterHead(BaseModule): ...@@ -337,7 +336,7 @@ class CenterHead(BaseModule):
heads.update(dict(heatmap=(num_cls, num_heatmap_convs))) heads.update(dict(heatmap=(num_cls, num_heatmap_convs)))
separate_head.update( separate_head.update(
in_channels=share_conv_channel, heads=heads, num_cls=num_cls) in_channels=share_conv_channel, heads=heads, num_cls=num_cls)
self.task_heads.append(builder.build_head(separate_head)) self.task_heads.append(MODELS.build(separate_head))
def forward_single(self, x: Tensor) -> dict: def forward_single(self, x: Tensor) -> dict:
"""Forward function for CenterPoint. """Forward function for CenterPoint.
......
...@@ -15,7 +15,6 @@ from mmdet3d.models.layers import box3d_multiclass_nms ...@@ -15,7 +15,6 @@ from mmdet3d.models.layers import box3d_multiclass_nms
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
from mmdet3d.structures import limit_period, xywhr2xyxyr from mmdet3d.structures import limit_period, xywhr2xyxyr
from mmdet3d.utils import InstanceList, OptInstanceList from mmdet3d.utils import InstanceList, OptInstanceList
from ..builder import build_head
from .anchor3d_head import Anchor3DHead from .anchor3d_head import Anchor3DHead
...@@ -220,7 +219,7 @@ class ShapeAwareHead(Anchor3DHead): ...@@ -220,7 +219,7 @@ class ShapeAwareHead(Anchor3DHead):
in_channels=self.in_channels, in_channels=self.in_channels,
shared_conv_channels=task['shared_conv_channels'], shared_conv_channels=task['shared_conv_channels'],
shared_conv_strides=task['shared_conv_strides']) shared_conv_strides=task['shared_conv_strides'])
self.heads.append(build_head(branch)) self.heads.append(MODELS.build(branch))
cls_ptr += task['num_class'] cls_ptr += task['num_class']
def forward_single(self, x: Tensor) -> Tuple[Tensor]: def forward_single(self, x: Tensor) -> Tuple[Tensor]:
......
...@@ -5,7 +5,6 @@ from mmdet.models.detectors import BaseDetector ...@@ -5,7 +5,6 @@ from mmdet.models.detectors import BaseDetector
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
from mmdet3d.structures.ops import bbox3d2result from mmdet3d.structures.ops import bbox3d2result
from mmdet3d.utils import ConfigType from mmdet3d.utils import ConfigType
from ..builder import build_backbone, build_head, build_neck
@MODELS.register_module() @MODELS.register_module()
...@@ -55,34 +54,34 @@ class DfM(BaseDetector): ...@@ -55,34 +54,34 @@ class DfM(BaseDetector):
pretrained=None, pretrained=None,
init_cfg=None): init_cfg=None):
super().__init__(init_cfg=init_cfg) super().__init__(init_cfg=init_cfg)
self.backbone = build_backbone(backbone) self.backbone = MODELS.build(backbone)
self.neck = build_neck(neck) self.neck = MODELS.build(neck)
if backbone_stereo is not None: if backbone_stereo is not None:
backbone_stereo.update(cat_img_feature=self.neck.cat_img_feature) backbone_stereo.update(cat_img_feature=self.neck.cat_img_feature)
backbone_stereo.update(in_sem_channels=self.neck.sem_channels[-1]) backbone_stereo.update(in_sem_channels=self.neck.sem_channels[-1])
self.backbone_stereo = build_backbone(backbone_stereo) self.backbone_stereo = MODELS.build(backbone_stereo)
assert self.neck.cat_img_feature == \ assert self.neck.cat_img_feature == \
self.backbone_stereo.cat_img_feature self.backbone_stereo.cat_img_feature
assert self.neck.sem_channels[ assert self.neck.sem_channels[
-1] == self.backbone_stereo.in_sem_channels -1] == self.backbone_stereo.in_sem_channels
if backbone_3d is not None: if backbone_3d is not None:
self.backbone_3d = build_backbone(backbone_3d) self.backbone_3d = MODELS.build(backbone_3d)
if neck_3d is not None: if neck_3d is not None:
self.neck_3d = build_neck(neck_3d) self.neck_3d = MODELS.build(neck_3d)
if neck_2d is not None: if neck_2d is not None:
self.neck_2d = build_neck(neck_2d) self.neck_2d = MODELS.build(neck_2d)
if bbox_head_2d is not None: if bbox_head_2d is not None:
self.bbox_head_2d = build_head(bbox_head_2d) self.bbox_head_2d = MODELS.build(bbox_head_2d)
if depth_head_2d is not None: if depth_head_2d is not None:
self.depth_head_2d = build_head(depth_head_2d) self.depth_head_2d = MODELS.build(depth_head_2d)
if depth_head is not None: if depth_head is not None:
self.depth_head = build_head(depth_head) self.depth_head = MODELS.build(depth_head)
self.depth_samples = self.depth_head.depth_samples self.depth_samples = self.depth_head.depth_samples
self.train_cfg = train_cfg self.train_cfg = train_cfg
self.test_cfg = test_cfg self.test_cfg = test_cfg
bbox_head_3d.update(train_cfg=train_cfg) bbox_head_3d.update(train_cfg=train_cfg)
bbox_head_3d.update(test_cfg=test_cfg) bbox_head_3d.update(test_cfg=test_cfg)
self.bbox_head_3d = build_head(bbox_head_3d) self.bbox_head_3d = MODELS.build(bbox_head_3d)
@property @property
def with_backbone_3d(self): def with_backbone_3d(self):
......
...@@ -10,7 +10,6 @@ from mmengine.model import BaseModule ...@@ -10,7 +10,6 @@ from mmengine.model import BaseModule
from mmengine.structures import InstanceData from mmengine.structures import InstanceData
from torch import nn as nn from torch import nn as nn
from mmdet3d.models.builder import build_loss
from mmdet3d.models.layers import nms_bev, nms_normal_bev from mmdet3d.models.layers import nms_bev, nms_normal_bev
from mmdet3d.registry import MODELS, TASK_UTILS from mmdet3d.registry import MODELS, TASK_UTILS
from mmdet3d.structures.bbox_3d import (LiDARInstance3DBoxes, from mmdet3d.structures.bbox_3d import (LiDARInstance3DBoxes,
...@@ -76,8 +75,8 @@ class PVRCNNBBoxHead(BaseModule): ...@@ -76,8 +75,8 @@ class PVRCNNBBoxHead(BaseModule):
self.with_corner_loss = with_corner_loss self.with_corner_loss = with_corner_loss
self.class_agnostic = class_agnostic self.class_agnostic = class_agnostic
self.bbox_coder = TASK_UTILS.build(bbox_coder) self.bbox_coder = TASK_UTILS.build(bbox_coder)
self.loss_bbox = build_loss(loss_bbox) self.loss_bbox = MODELS.build(loss_bbox)
self.loss_cls = build_loss(loss_cls) self.loss_cls = MODELS.build(loss_cls)
self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False) self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False)
cls_out_channels = 1 if class_agnostic else num_classes cls_out_channels = 1 if class_agnostic else num_classes
......
...@@ -8,7 +8,6 @@ from mmengine.model import BaseModule ...@@ -8,7 +8,6 @@ from mmengine.model import BaseModule
from mmengine.structures import InstanceData from mmengine.structures import InstanceData
from torch import nn as nn from torch import nn as nn
from mmdet3d.models.builder import build_loss
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
from mmdet3d.utils import InstanceList from mmdet3d.utils import InstanceList
...@@ -72,7 +71,7 @@ class ForegroundSegmentationHead(BaseModule): ...@@ -72,7 +71,7 @@ class ForegroundSegmentationHead(BaseModule):
self.seg_cls_layer = nn.Sequential(*mlps_layers) self.seg_cls_layer = nn.Sequential(*mlps_layers)
self.loss_seg = build_loss(loss_seg) self.loss_seg = MODELS.build(loss_seg)
def forward(self, feats: torch.Tensor) -> dict: def forward(self, feats: torch.Tensor) -> dict:
"""Forward head. """Forward head.
......
...@@ -5,7 +5,6 @@ from mmcv.ops import DynamicScatter ...@@ -5,7 +5,6 @@ from mmcv.ops import DynamicScatter
from torch import Tensor, nn from torch import Tensor, nn
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
from .. import builder
from .utils import VFELayer, get_paddings_indicator from .utils import VFELayer, get_paddings_indicator
...@@ -172,7 +171,7 @@ class DynamicVFE(nn.Module): ...@@ -172,7 +171,7 @@ class DynamicVFE(nn.Module):
voxel_size, point_cloud_range, average_points=True) voxel_size, point_cloud_range, average_points=True)
self.fusion_layer = None self.fusion_layer = None
if fusion_layer is not None: if fusion_layer is not None:
self.fusion_layer = builder.build_fusion_layer(fusion_layer) self.fusion_layer = MODELS.build(fusion_layer)
def map_voxel_center_to_point(self, pts_coors, voxel_mean, voxel_coors): def map_voxel_center_to_point(self, pts_coors, voxel_mean, voxel_coors):
"""Map voxel features to its corresponding points. """Map voxel features to its corresponding points.
...@@ -381,7 +380,7 @@ class HardVFE(nn.Module): ...@@ -381,7 +380,7 @@ class HardVFE(nn.Module):
self.fusion_layer = None self.fusion_layer = None
if fusion_layer is not None: if fusion_layer is not None:
self.fusion_layer = builder.build_fusion_layer(fusion_layer) self.fusion_layer = MODELS.build(fusion_layer)
def forward(self, def forward(self,
features, features,
......
...@@ -3,7 +3,7 @@ import numpy as np ...@@ -3,7 +3,7 @@ import numpy as np
import pytest import pytest
import torch import torch
from mmdet3d.models import build_backbone from mmdet3d.registry import MODELS
def test_dgcnn_gf(): def test_dgcnn_gf():
...@@ -21,7 +21,7 @@ def test_dgcnn_gf(): ...@@ -21,7 +21,7 @@ def test_dgcnn_gf():
fa_channels=(1024, ), fa_channels=(1024, ),
act_cfg=dict(type='ReLU')) act_cfg=dict(type='ReLU'))
self = build_backbone(cfg) self = MODELS.build(cfg)
self.cuda() self.cuda()
xyz = np.fromfile('tests/data/sunrgbd/points/000001.bin', dtype=np.float32) xyz = np.fromfile('tests/data/sunrgbd/points/000001.bin', dtype=np.float32)
......
import torch import torch
from mmdet3d.models import build_backbone from mmdet3d.registry import MODELS
def test_dla_net(): def test_dla_net():
...@@ -13,7 +13,7 @@ def test_dla_net(): ...@@ -13,7 +13,7 @@ def test_dla_net():
norm_cfg=dict(type='GN', num_groups=32)) norm_cfg=dict(type='GN', num_groups=32))
img = torch.randn((4, 3, 32, 32)) img = torch.randn((4, 3, 32, 32))
self = build_backbone(cfg) self = MODELS.build(cfg)
self.init_weights() self.init_weights()
results = self(img) results = self(img)
......
...@@ -3,7 +3,7 @@ import numpy as np ...@@ -3,7 +3,7 @@ import numpy as np
import pytest import pytest
import torch import torch
from mmdet3d.models import build_backbone from mmdet3d.registry import MODELS
def test_mink_resnet(): def test_mink_resnet():
...@@ -30,7 +30,7 @@ def test_mink_resnet(): ...@@ -30,7 +30,7 @@ def test_mink_resnet():
# MinkResNet34 with 4 outputs # MinkResNet34 with 4 outputs
cfg = dict(type='MinkResNet', depth=34, in_channels=3) cfg = dict(type='MinkResNet', depth=34, in_channels=3)
self = build_backbone(cfg).cuda() self = MODELS.build(cfg).cuda()
self.init_weights() self.init_weights()
y = self(x) y = self(x)
...@@ -47,7 +47,7 @@ def test_mink_resnet(): ...@@ -47,7 +47,7 @@ def test_mink_resnet():
# MinkResNet50 with 2 outputs # MinkResNet50 with 2 outputs
cfg = dict( cfg = dict(
type='MinkResNet', depth=34, in_channels=3, num_stages=2, pool=False) type='MinkResNet', depth=34, in_channels=3, num_stages=2, pool=False)
self = build_backbone(cfg).cuda() self = MODELS.build(cfg).cuda()
self.init_weights() self.init_weights()
y = self(x) y = self(x)
......
...@@ -3,7 +3,7 @@ import numpy as np ...@@ -3,7 +3,7 @@ import numpy as np
import pytest import pytest
import torch import torch
from mmdet3d.models import build_backbone from mmdet3d.registry import MODELS
def test_multi_backbone(): def test_multi_backbone():
...@@ -58,7 +58,7 @@ def test_multi_backbone(): ...@@ -58,7 +58,7 @@ def test_multi_backbone():
norm_cfg=dict(type='BN2d')) norm_cfg=dict(type='BN2d'))
]) ])
self = build_backbone(cfg_list) self = MODELS.build(cfg_list)
self.cuda() self.cuda()
assert len(self.backbone_list) == 4 assert len(self.backbone_list) == 4
...@@ -89,7 +89,7 @@ def test_multi_backbone(): ...@@ -89,7 +89,7 @@ def test_multi_backbone():
fp_channels=((256, 256), (256, 256)), fp_channels=((256, 256), (256, 256)),
norm_cfg=dict(type='BN2d'))) norm_cfg=dict(type='BN2d')))
self = build_backbone(cfg_dict) self = MODELS.build(cfg_dict)
self.cuda() self.cuda()
assert len(self.backbone_list) == 2 assert len(self.backbone_list) == 2
...@@ -104,14 +104,14 @@ def test_multi_backbone(): ...@@ -104,14 +104,14 @@ def test_multi_backbone():
# Length of backbone configs list should be equal to num_streams # Length of backbone configs list should be equal to num_streams
with pytest.raises(AssertionError): with pytest.raises(AssertionError):
cfg_list['num_streams'] = 3 cfg_list['num_streams'] = 3
build_backbone(cfg_list) MODELS.build(cfg_list)
# Length of suffixes list should be equal to num_streams # Length of suffixes list should be equal to num_streams
with pytest.raises(AssertionError): with pytest.raises(AssertionError):
cfg_dict['suffixes'] = ['net0', 'net1', 'net2'] cfg_dict['suffixes'] = ['net0', 'net1', 'net2']
build_backbone(cfg_dict) MODELS.build(cfg_dict)
# Type of 'backbones' should be Dict or List[Dict]. # Type of 'backbones' should be Dict or List[Dict].
with pytest.raises(AssertionError): with pytest.raises(AssertionError):
cfg_dict['backbones'] = 'PointNet2SASSG' cfg_dict['backbones'] = 'PointNet2SASSG'
build_backbone(cfg_dict) MODELS.build(cfg_dict)
...@@ -3,7 +3,7 @@ import numpy as np ...@@ -3,7 +3,7 @@ import numpy as np
import pytest import pytest
import torch import torch
from mmdet3d.models import build_backbone from mmdet3d.registry import MODELS
def test_pointnet2_sa_msg(): def test_pointnet2_sa_msg():
...@@ -30,7 +30,7 @@ def test_pointnet2_sa_msg(): ...@@ -30,7 +30,7 @@ def test_pointnet2_sa_msg():
use_xyz=True, use_xyz=True,
normalize_xyz=False)) normalize_xyz=False))
self = build_backbone(cfg) self = MODELS.build(cfg)
self.cuda() self.cuda()
assert self.SA_modules[0].mlps[0].layer0.conv.in_channels == 4 assert self.SA_modules[0].mlps[0].layer0.conv.in_channels == 4
assert self.SA_modules[0].mlps[0].layer0.conv.out_channels == 8 assert self.SA_modules[0].mlps[0].layer0.conv.out_channels == 8
...@@ -51,7 +51,7 @@ def test_pointnet2_sa_msg(): ...@@ -51,7 +51,7 @@ def test_pointnet2_sa_msg():
# out_indices should smaller than the length of SA Modules. # out_indices should smaller than the length of SA Modules.
with pytest.raises(AssertionError): with pytest.raises(AssertionError):
build_backbone( MODELS.build(
dict( dict(
type='PointNet2SAMSG', type='PointNet2SAMSG',
in_channels=4, in_channels=4,
...@@ -95,7 +95,7 @@ def test_pointnet2_sa_msg(): ...@@ -95,7 +95,7 @@ def test_pointnet2_sa_msg():
use_xyz=True, use_xyz=True,
normalize_xyz=False)) normalize_xyz=False))
self = build_backbone(cfg) self = MODELS.build(cfg)
self.cuda() self.cuda()
ret_dict = self(xyz) ret_dict = self(xyz)
sa_xyz = ret_dict['sa_xyz'] sa_xyz = ret_dict['sa_xyz']
......
...@@ -3,7 +3,7 @@ import numpy as np ...@@ -3,7 +3,7 @@ import numpy as np
import pytest import pytest
import torch import torch
from mmdet3d.models import build_backbone from mmdet3d.registry import MODELS
def test_pointnet2_sa_ssg(): def test_pointnet2_sa_ssg():
...@@ -18,7 +18,7 @@ def test_pointnet2_sa_ssg(): ...@@ -18,7 +18,7 @@ def test_pointnet2_sa_ssg():
num_samples=(16, 8), num_samples=(16, 8),
sa_channels=((8, 16), (16, 16)), sa_channels=((8, 16), (16, 16)),
fp_channels=((16, 16), (16, 16))) fp_channels=((16, 16), (16, 16)))
self = build_backbone(cfg) self = MODELS.build(cfg)
self.cuda() self.cuda()
assert self.SA_modules[0].mlps[0].layer0.conv.in_channels == 6 assert self.SA_modules[0].mlps[0].layer0.conv.in_channels == 6
assert self.SA_modules[0].mlps[0].layer0.conv.out_channels == 8 assert self.SA_modules[0].mlps[0].layer0.conv.out_channels == 8
...@@ -61,7 +61,7 @@ def test_pointnet2_sa_ssg(): ...@@ -61,7 +61,7 @@ def test_pointnet2_sa_ssg():
# test only xyz input without features # test only xyz input without features
cfg['in_channels'] = 3 cfg['in_channels'] = 3
self = build_backbone(cfg) self = MODELS.build(cfg)
self.cuda() self.cuda()
ret_dict = self(xyz[..., :3]) ret_dict = self(xyz[..., :3])
assert len(fp_xyz) == len(fp_features) == len(fp_indices) == 3 assert len(fp_xyz) == len(fp_features) == len(fp_indices) == 3
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import pytest import pytest
import torch import torch
from mmdet3d.models.builder import build_loss from mmdet3d.registry import MODELS
def test_multibin_loss(): def test_multibin_loss():
...@@ -24,7 +24,7 @@ def test_multibin_loss(): ...@@ -24,7 +24,7 @@ def test_multibin_loss():
[1, 1, 0, 0, 3.12, 3.12, 2.34, 1.23]]) [1, 1, 0, 0, 3.12, 3.12, 2.34, 1.23]])
multibin_loss_cfg = dict( multibin_loss_cfg = dict(
type='MultiBinLoss', reduction='none', loss_weight=1.0) type='MultiBinLoss', reduction='none', loss_weight=1.0)
multibin_loss = build_loss(multibin_loss_cfg) multibin_loss = MODELS.build(multibin_loss_cfg)
output_multibin_loss = multibin_loss(pred, target, num_dir_bins=4) output_multibin_loss = multibin_loss(pred, target, num_dir_bins=4)
expected_multibin_loss = torch.tensor(2.1120) expected_multibin_loss = torch.tensor(2.1120)
assert torch.allclose( assert torch.allclose(
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment