"git@developer.sourcefind.cn:OpenDAS/nerfacc.git" did not exist on "8c58be5075b569be3d7d7f7e7b3f36fdd46cd63c"
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.
from .builder import DATASETS, PIPELINES, build_dataset
from .dataset_wrappers import CBGSDataset
from .det3d_dataset import Det3DDataset
from .kitti_dataset import KittiDataset
......@@ -27,8 +26,7 @@ from .utils import get_loading_pipeline
from .waymo_dataset import WaymoDataset
__all__ = [
'KittiDataset', 'DATASETS', 'CBGSDataset',
'build_dataset', 'NuScenesDataset', 'LyftDataset',
'KittiDataset', 'CBGSDataset', 'NuScenesDataset', 'LyftDataset',
'ObjectSample', 'RandomFlip3D', 'ObjectNoise', 'GlobalRotScaleTrans',
'PointShuffle', 'ObjectRangeFilter', 'PointsRangeFilter',
'LoadPointsFromFile', 'S3DISSegDataset', 'S3DISDataset',
......@@ -39,6 +37,5 @@ __all__ = [
'LoadPointsFromMultiSweeps', 'WaymoDataset', 'BackgroundPointsFilter',
'VoxelBasedPointSampler', 'get_loading_pipeline', 'RandomDropPointsColor',
'RandomJitterPoints', 'ObjectNameFilter', 'AffineResize',
'RandomShiftScale', 'LoadPointsFromDict', 'PIPELINES',
'Resize3D', 'RandomResize3D',
'RandomShiftScale', 'LoadPointsFromDict', '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
from mmengine.logging import print_log
from terminaltables import AsciiTable
from mmdet3d.datasets import DATASETS
from mmdet3d.registry import DATASETS
from mmdet3d.structures import get_box_type
......
......@@ -3,7 +3,7 @@ from typing import Callable, List, Union
import numpy as np
from mmdet3d.datasets import DATASETS
from mmdet3d.registry import DATASETS
from mmdet3d.structures import CameraInstance3DBoxes
from .det3d_dataset import Det3DDataset
......
# Copyright (c) OpenMMLab. All rights reserved.
from mmdet3d.models.layers.fusion_layers 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 .decode_heads import * # noqa: F401,F403
from .dense_heads import * # noqa: F401,F403
......@@ -21,12 +14,3 @@ from .segmentors import * # noqa: F401,F403
from .test_time_augs import * # noqa: F401,F403
from .utils 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
from mmengine.model import BaseModule
from torch import nn as nn
from mmdet3d.models.builder import build_backbone
from mmdet3d.registry import MODELS
......@@ -57,7 +56,7 @@ class MultiBackbone(BaseModule):
for backbone_cfg in backbones:
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
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,
gaussian_radius)
from mmdet3d.registry import MODELS, TASK_UTILS
from mmdet3d.structures import Det3DDataSample, xywhr2xyxyr
from .. import builder
from ..layers import circle_nms, nms_bev
......@@ -337,7 +336,7 @@ class CenterHead(BaseModule):
heads.update(dict(heatmap=(num_cls, num_heatmap_convs)))
separate_head.update(
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:
"""Forward function for CenterPoint.
......
......@@ -15,7 +15,6 @@ from mmdet3d.models.layers import box3d_multiclass_nms
from mmdet3d.registry import MODELS
from mmdet3d.structures import limit_period, xywhr2xyxyr
from mmdet3d.utils import InstanceList, OptInstanceList
from ..builder import build_head
from .anchor3d_head import Anchor3DHead
......@@ -220,7 +219,7 @@ class ShapeAwareHead(Anchor3DHead):
in_channels=self.in_channels,
shared_conv_channels=task['shared_conv_channels'],
shared_conv_strides=task['shared_conv_strides'])
self.heads.append(build_head(branch))
self.heads.append(MODELS.build(branch))
cls_ptr += task['num_class']
def forward_single(self, x: Tensor) -> Tuple[Tensor]:
......
......@@ -5,7 +5,6 @@ from mmdet.models.detectors import BaseDetector
from mmdet3d.registry import MODELS
from mmdet3d.structures.ops import bbox3d2result
from mmdet3d.utils import ConfigType
from ..builder import build_backbone, build_head, build_neck
@MODELS.register_module()
......@@ -55,34 +54,34 @@ class DfM(BaseDetector):
pretrained=None,
init_cfg=None):
super().__init__(init_cfg=init_cfg)
self.backbone = build_backbone(backbone)
self.neck = build_neck(neck)
self.backbone = MODELS.build(backbone)
self.neck = MODELS.build(neck)
if backbone_stereo is not None:
backbone_stereo.update(cat_img_feature=self.neck.cat_img_feature)
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 == \
self.backbone_stereo.cat_img_feature
assert self.neck.sem_channels[
-1] == self.backbone_stereo.in_sem_channels
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:
self.neck_3d = build_neck(neck_3d)
self.neck_3d = MODELS.build(neck_3d)
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:
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:
self.depth_head_2d = build_head(depth_head_2d)
self.depth_head_2d = MODELS.build(depth_head_2d)
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.train_cfg = train_cfg
self.test_cfg = test_cfg
bbox_head_3d.update(train_cfg=train_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
def with_backbone_3d(self):
......
......@@ -10,7 +10,6 @@ from mmengine.model import BaseModule
from mmengine.structures import InstanceData
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.registry import MODELS, TASK_UTILS
from mmdet3d.structures.bbox_3d import (LiDARInstance3DBoxes,
......@@ -76,8 +75,8 @@ class PVRCNNBBoxHead(BaseModule):
self.with_corner_loss = with_corner_loss
self.class_agnostic = class_agnostic
self.bbox_coder = TASK_UTILS.build(bbox_coder)
self.loss_bbox = build_loss(loss_bbox)
self.loss_cls = build_loss(loss_cls)
self.loss_bbox = MODELS.build(loss_bbox)
self.loss_cls = MODELS.build(loss_cls)
self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False)
cls_out_channels = 1 if class_agnostic else num_classes
......
......@@ -8,7 +8,6 @@ from mmengine.model import BaseModule
from mmengine.structures import InstanceData
from torch import nn as nn
from mmdet3d.models.builder import build_loss
from mmdet3d.registry import MODELS
from mmdet3d.utils import InstanceList
......@@ -72,7 +71,7 @@ class ForegroundSegmentationHead(BaseModule):
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:
"""Forward head.
......
......@@ -5,7 +5,6 @@ from mmcv.ops import DynamicScatter
from torch import Tensor, nn
from mmdet3d.registry import MODELS
from .. import builder
from .utils import VFELayer, get_paddings_indicator
......@@ -172,7 +171,7 @@ class DynamicVFE(nn.Module):
voxel_size, point_cloud_range, average_points=True)
self.fusion_layer = 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):
"""Map voxel features to its corresponding points.
......@@ -381,7 +380,7 @@ class HardVFE(nn.Module):
self.fusion_layer = 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,
features,
......
......@@ -3,7 +3,7 @@ import numpy as np
import pytest
import torch
from mmdet3d.models import build_backbone
from mmdet3d.registry import MODELS
def test_dgcnn_gf():
......@@ -21,7 +21,7 @@ def test_dgcnn_gf():
fa_channels=(1024, ),
act_cfg=dict(type='ReLU'))
self = build_backbone(cfg)
self = MODELS.build(cfg)
self.cuda()
xyz = np.fromfile('tests/data/sunrgbd/points/000001.bin', dtype=np.float32)
......
import torch
from mmdet3d.models import build_backbone
from mmdet3d.registry import MODELS
def test_dla_net():
......@@ -13,7 +13,7 @@ def test_dla_net():
norm_cfg=dict(type='GN', num_groups=32))
img = torch.randn((4, 3, 32, 32))
self = build_backbone(cfg)
self = MODELS.build(cfg)
self.init_weights()
results = self(img)
......
......@@ -3,7 +3,7 @@ import numpy as np
import pytest
import torch
from mmdet3d.models import build_backbone
from mmdet3d.registry import MODELS
def test_mink_resnet():
......@@ -30,7 +30,7 @@ def test_mink_resnet():
# MinkResNet34 with 4 outputs
cfg = dict(type='MinkResNet', depth=34, in_channels=3)
self = build_backbone(cfg).cuda()
self = MODELS.build(cfg).cuda()
self.init_weights()
y = self(x)
......@@ -47,7 +47,7 @@ def test_mink_resnet():
# MinkResNet50 with 2 outputs
cfg = dict(
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()
y = self(x)
......
......@@ -3,7 +3,7 @@ import numpy as np
import pytest
import torch
from mmdet3d.models import build_backbone
from mmdet3d.registry import MODELS
def test_multi_backbone():
......@@ -58,7 +58,7 @@ def test_multi_backbone():
norm_cfg=dict(type='BN2d'))
])
self = build_backbone(cfg_list)
self = MODELS.build(cfg_list)
self.cuda()
assert len(self.backbone_list) == 4
......@@ -89,7 +89,7 @@ def test_multi_backbone():
fp_channels=((256, 256), (256, 256)),
norm_cfg=dict(type='BN2d')))
self = build_backbone(cfg_dict)
self = MODELS.build(cfg_dict)
self.cuda()
assert len(self.backbone_list) == 2
......@@ -104,14 +104,14 @@ def test_multi_backbone():
# Length of backbone configs list should be equal to num_streams
with pytest.raises(AssertionError):
cfg_list['num_streams'] = 3
build_backbone(cfg_list)
MODELS.build(cfg_list)
# Length of suffixes list should be equal to num_streams
with pytest.raises(AssertionError):
cfg_dict['suffixes'] = ['net0', 'net1', 'net2']
build_backbone(cfg_dict)
MODELS.build(cfg_dict)
# Type of 'backbones' should be Dict or List[Dict].
with pytest.raises(AssertionError):
cfg_dict['backbones'] = 'PointNet2SASSG'
build_backbone(cfg_dict)
MODELS.build(cfg_dict)
......@@ -3,7 +3,7 @@ import numpy as np
import pytest
import torch
from mmdet3d.models import build_backbone
from mmdet3d.registry import MODELS
def test_pointnet2_sa_msg():
......@@ -30,7 +30,7 @@ def test_pointnet2_sa_msg():
use_xyz=True,
normalize_xyz=False))
self = build_backbone(cfg)
self = MODELS.build(cfg)
self.cuda()
assert self.SA_modules[0].mlps[0].layer0.conv.in_channels == 4
assert self.SA_modules[0].mlps[0].layer0.conv.out_channels == 8
......@@ -51,7 +51,7 @@ def test_pointnet2_sa_msg():
# out_indices should smaller than the length of SA Modules.
with pytest.raises(AssertionError):
build_backbone(
MODELS.build(
dict(
type='PointNet2SAMSG',
in_channels=4,
......@@ -95,7 +95,7 @@ def test_pointnet2_sa_msg():
use_xyz=True,
normalize_xyz=False))
self = build_backbone(cfg)
self = MODELS.build(cfg)
self.cuda()
ret_dict = self(xyz)
sa_xyz = ret_dict['sa_xyz']
......
......@@ -3,7 +3,7 @@ import numpy as np
import pytest
import torch
from mmdet3d.models import build_backbone
from mmdet3d.registry import MODELS
def test_pointnet2_sa_ssg():
......@@ -18,7 +18,7 @@ def test_pointnet2_sa_ssg():
num_samples=(16, 8),
sa_channels=((8, 16), (16, 16)),
fp_channels=((16, 16), (16, 16)))
self = build_backbone(cfg)
self = MODELS.build(cfg)
self.cuda()
assert self.SA_modules[0].mlps[0].layer0.conv.in_channels == 6
assert self.SA_modules[0].mlps[0].layer0.conv.out_channels == 8
......@@ -61,7 +61,7 @@ def test_pointnet2_sa_ssg():
# test only xyz input without features
cfg['in_channels'] = 3
self = build_backbone(cfg)
self = MODELS.build(cfg)
self.cuda()
ret_dict = self(xyz[..., :3])
assert len(fp_xyz) == len(fp_features) == len(fp_indices) == 3
......
......@@ -2,7 +2,7 @@
import pytest
import torch
from mmdet3d.models.builder import build_loss
from mmdet3d.registry import MODELS
def test_multibin_loss():
......@@ -24,7 +24,7 @@ def test_multibin_loss():
[1, 1, 0, 0, 3.12, 3.12, 2.34, 1.23]])
multibin_loss_cfg = dict(
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)
expected_multibin_loss = torch.tensor(2.1120)
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