diff --git a/configs/imvoxelnet/imvoxelnet_8xb4_kitti-3d-car.py b/configs/imvoxelnet/imvoxelnet_8xb4_kitti-3d-car.py index 3187fcd1a4..a6baf7a985 100644 --- a/configs/imvoxelnet/imvoxelnet_8xb4_kitti-3d-car.py +++ b/configs/imvoxelnet/imvoxelnet_8xb4_kitti-3d-car.py @@ -1,3 +1,7 @@ +_base_ = [ + '../_base_/schedules/mmdet-schedule-1x.py', '../_base_/default_runtime.py' +] + model = dict( type='ImVoxelNet', data_preprocessor=dict( @@ -151,7 +155,8 @@ # optimizer optim_wrapper = dict( type='OptimWrapper', - optimizer=dict(type='AdamW', lr=0.0001, weight_decay=0.0001), + optimizer=dict( + _delete_=True, type='AdamW', lr=0.0001, weight_decay=0.0001), paramwise_cfg=dict( custom_keys={'backbone': dict(lr_mult=0.1, decay_mult=1.0)}), clip_grad=dict(max_norm=35., norm_type=2)) @@ -166,30 +171,7 @@ ] # hooks -default_hooks = dict( - timer=dict(type='IterTimerHook'), - logger=dict(type='LoggerHook', interval=50), - param_scheduler=dict(type='ParamSchedulerHook'), - checkpoint=dict(type='CheckpointHook', interval=1, max_keep_ckpts=1), - sampler_seed=dict(type='DistSamplerSeedHook'), -) - -# training schedule for 2x -train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=12, val_interval=1) -val_cfg = dict(type='ValLoop') -test_cfg = dict(type='TestLoop') +default_hooks = dict(checkpoint=dict(type='CheckpointHook', max_keep_ckpts=1)) # runtime -default_scope = 'mmdet3d' - -env_cfg = dict( - cudnn_benchmark=False, - mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), - dist_cfg=dict(backend='nccl'), -) - -log_level = 'INFO' -load_from = None -resume = False -dist_params = dict(backend='nccl') find_unused_parameters = True # only 1 of 4 FPN outputs is used diff --git a/mmdet3d/evaluation/metrics/kitti_metric.py b/mmdet3d/evaluation/metrics/kitti_metric.py index c083872586..0a48ad2282 100644 --- a/mmdet3d/evaluation/metrics/kitti_metric.py +++ b/mmdet3d/evaluation/metrics/kitti_metric.py @@ -575,7 +575,7 @@ def convert_valid_bboxes(self, box_dict: dict, info: dict): box_preds = box_dict['bboxes_3d'] scores = box_dict['scores_3d'] labels = box_dict['labels_3d'] - sample_idx = info['sample_id'] + sample_idx = info['sample_idx'] box_preds.limit_yaw(offset=0.5, period=np.pi * 2) if len(box_preds) == 0: diff --git a/mmdet3d/models/detectors/base.py b/mmdet3d/models/detectors/base.py index 8b8579489e..ec0d360359 100644 --- a/mmdet3d/models/detectors/base.py +++ b/mmdet3d/models/detectors/base.py @@ -89,7 +89,7 @@ def forward(self, raise RuntimeError(f'Invalid mode "{mode}". ' 'Only supports loss, predict and tensor mode') - def convert_to_datasample( + def add_pred_to_datasample( self, data_samples: SampleList, data_instances_3d: OptInstanceList = None, diff --git a/mmdet3d/models/detectors/fcos_mono3d.py b/mmdet3d/models/detectors/fcos_mono3d.py index 997c5991d6..c425ae8993 100644 --- a/mmdet3d/models/detectors/fcos_mono3d.py +++ b/mmdet3d/models/detectors/fcos_mono3d.py @@ -95,6 +95,7 @@ def predict(self, x = self.extract_feat(batch_inputs_dict) results_list, results_list_2d = self.bbox_head.predict( x, batch_data_samples, rescale=rescale) - predictions = self.convert_to_datasample(batch_data_samples, - results_list, results_list_2d) + predictions = self.add_pred_to_datasample(batch_data_samples, + results_list, + results_list_2d) return predictions diff --git a/mmdet3d/models/detectors/groupfree3dnet.py b/mmdet3d/models/detectors/groupfree3dnet.py index 0083e44b25..935f3cef3b 100644 --- a/mmdet3d/models/detectors/groupfree3dnet.py +++ b/mmdet3d/models/detectors/groupfree3dnet.py @@ -82,6 +82,6 @@ def predict(self, batch_inputs_dict: dict, batch_data_samples: SampleList, points = batch_inputs_dict['points'] results_list = self.bbox_head.predict(points, x, batch_data_samples, **kwargs) - predictions = self.convert_to_datasample(batch_data_samples, - results_list) + predictions = self.add_pred_to_datasample(batch_data_samples, + results_list) return predictions diff --git a/mmdet3d/models/detectors/h3dnet.py b/mmdet3d/models/detectors/h3dnet.py index aec3ddf5b2..3ce6e92eea 100644 --- a/mmdet3d/models/detectors/h3dnet.py +++ b/mmdet3d/models/detectors/h3dnet.py @@ -154,4 +154,4 @@ def predict( feats_dict, batch_data_samples, suffix='_optimized') - return self.convert_to_datasample(batch_data_samples, results_list) + return self.add_pred_to_datasample(batch_data_samples, results_list) diff --git a/mmdet3d/models/detectors/imvotenet.py b/mmdet3d/models/detectors/imvotenet.py index 2be1ff61dd..0f02a599ae 100644 --- a/mmdet3d/models/detectors/imvotenet.py +++ b/mmdet3d/models/detectors/imvotenet.py @@ -433,7 +433,7 @@ def predict(self, batch_inputs_dict: Dict[str, Optional[Tensor]], if points is None: assert imgs is not None results_2d = self.predict_img_only(imgs, batch_data_samples) - return self.convert_to_datasample( + return self.add_pred_to_datasample( batch_data_samples, data_instances_2d=results_2d) else: @@ -488,7 +488,7 @@ def predict(self, batch_inputs_dict: Dict[str, Optional[Tensor]], batch_data_samples, rescale=True) - return self.convert_to_datasample(batch_data_samples, results_3d) + return self.add_pred_to_datasample(batch_data_samples, results_3d) def predict_img_only(self, imgs: Tensor, diff --git a/mmdet3d/models/detectors/imvoxelnet.py b/mmdet3d/models/detectors/imvoxelnet.py index 6e83cb6dd8..8d2fd336b7 100644 --- a/mmdet3d/models/detectors/imvoxelnet.py +++ b/mmdet3d/models/detectors/imvoxelnet.py @@ -3,15 +3,15 @@ import torch +from mmdet3d.models.detectors import Base3DDetector from mmdet3d.models.layers.fusion_layers.point_fusion import point_sample from mmdet3d.registry import MODELS, TASK_UTILS from mmdet3d.structures.det3d_data_sample import SampleList -from mmdet3d.utils import ConfigType, InstanceList, OptConfigType -from mmdet.models.detectors import BaseDetector +from mmdet3d.utils import ConfigType, OptConfigType @MODELS.register_module() -class ImVoxelNet(BaseDetector): +class ImVoxelNet(Base3DDetector): r"""`ImVoxelNet `_. Args: @@ -57,31 +57,6 @@ def __init__(self, self.train_cfg = train_cfg self.test_cfg = test_cfg - def convert_to_datasample(self, data_samples: SampleList, - data_instances: InstanceList) -> SampleList: - """ Convert results list to `Det3DDataSample`. - Args: - inputs (list[:obj:`Det3DDataSample`]): The input data. - data_instances (list[:obj:`InstanceData`]): 3D Detection - results of each image. - Returns: - list[:obj:`Det3DDataSample`]: 3D Detection results of the - input images. Each Det3DDataSample usually contain - 'pred_instances_3d'. And the ``pred_instances_3d`` usually - contains following keys. - - - scores_3d (Tensor): Classification scores, has a shape - (num_instance, ) - - labels_3d (Tensor): Labels of bboxes, has a shape - (num_instances, ). - - bboxes_3d (Tensor): Contains a tensor with shape - (num_instances, C) where C >=7. - """ - for data_sample, pred_instances_3d in zip(data_samples, - data_instances): - data_sample.pred_instances_3d = pred_instances_3d - return data_samples - def extract_feat(self, batch_inputs_dict: dict, batch_data_samples: SampleList): """Extract 3d features from the backbone -> fpn -> 3d projection. @@ -185,8 +160,8 @@ def predict(self, batch_inputs_dict: dict, batch_data_samples: SampleList, """ x = self.extract_feat(batch_inputs_dict, batch_data_samples) results_list = self.bbox_head.predict(x, batch_data_samples, **kwargs) - predictions = self.convert_to_datasample(batch_data_samples, - results_list) + predictions = self.add_pred_to_datasample(batch_data_samples, + results_list) return predictions def _forward(self, batch_inputs_dict: dict, batch_data_samples: SampleList, diff --git a/mmdet3d/models/detectors/mvx_two_stage.py b/mmdet3d/models/detectors/mvx_two_stage.py index 43d97a0cd7..537d82144b 100644 --- a/mmdet3d/models/detectors/mvx_two_stage.py +++ b/mmdet3d/models/detectors/mvx_two_stage.py @@ -401,7 +401,7 @@ def predict(self, batch_inputs_dict: Dict[str, Optional[Tensor]], else: results_list_2d = None - detsamples = self.convert_to_datasample(batch_data_samples, - results_list_3d, - results_list_2d) + detsamples = self.add_pred_to_datasample(batch_data_samples, + results_list_3d, + results_list_2d) return detsamples diff --git a/mmdet3d/models/detectors/single_stage.py b/mmdet3d/models/detectors/single_stage.py index db6a4fa6e7..0e4b3091e8 100644 --- a/mmdet3d/models/detectors/single_stage.py +++ b/mmdet3d/models/detectors/single_stage.py @@ -108,8 +108,8 @@ def predict(self, batch_inputs_dict: dict, batch_data_samples: SampleList, """ x = self.extract_feat(batch_inputs_dict) results_list = self.bbox_head.predict(x, batch_data_samples, **kwargs) - predictions = self.convert_to_datasample(batch_data_samples, - results_list) + predictions = self.add_pred_to_datasample(batch_data_samples, + results_list) return predictions def _forward(self, diff --git a/mmdet3d/models/detectors/single_stage_mono3d.py b/mmdet3d/models/detectors/single_stage_mono3d.py index 99116a76a3..475e80a664 100644 --- a/mmdet3d/models/detectors/single_stage_mono3d.py +++ b/mmdet3d/models/detectors/single_stage_mono3d.py @@ -18,7 +18,7 @@ class SingleStageMono3DDetector(SingleStageDetector): boxes on the output features of the backbone+neck. """ - def convert_to_datasample( + def add_pred_to_datasample( self, data_samples: SampleList, data_instances_3d: OptInstanceList = None, diff --git a/mmdet3d/models/detectors/two_stage.py b/mmdet3d/models/detectors/two_stage.py index 8817a355c1..5ecce9b170 100644 --- a/mmdet3d/models/detectors/two_stage.py +++ b/mmdet3d/models/detectors/two_stage.py @@ -161,8 +161,8 @@ def predict(self, batch_inputs_dict: dict, batch_data_samples: SampleList, batch_data_samples) # connvert to Det3DDataSample - results_list = self.convert_to_datasample(batch_data_samples, - results_list) + results_list = self.add_pred_to_datasample(batch_data_samples, + results_list) return results_list diff --git a/mmdet3d/models/detectors/votenet.py b/mmdet3d/models/detectors/votenet.py index 77e898c4a1..ae7088974d 100644 --- a/mmdet3d/models/detectors/votenet.py +++ b/mmdet3d/models/detectors/votenet.py @@ -99,8 +99,8 @@ def predict(self, batch_inputs_dict: Dict[str, Optional[Tensor]], points = batch_inputs_dict['points'] results_list = self.bbox_head.predict(points, feats_dict, batch_data_samples, **kwargs) - data_3d_samples = self.convert_to_datasample(batch_data_samples, - results_list) + data_3d_samples = self.add_pred_to_datasample(batch_data_samples, + results_list) return data_3d_samples def aug_test(self, aug_inputs_list: List[dict], @@ -143,6 +143,6 @@ def aug_test(self, aug_inputs_list: List[dict], self.bbox_head.test_cfg) merged_results = InstanceData(**merged_results_dict) - data_3d_samples = self.convert_to_datasample(batch_data_samples, - [merged_results]) + data_3d_samples = self.add_pred_to_datasample(batch_data_samples, + [merged_results]) return data_3d_samples