Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Fix] Fix ImVoxelNet and KittiMetric & refactor configs of ImVoxelNet #1843

Merged
merged 4 commits into from
Sep 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 7 additions & 25 deletions configs/imvoxelnet/imvoxelnet_8xb4_kitti-3d-car.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
_base_ = [
'../_base_/schedules/mmdet-schedule-1x.py', '../_base_/default_runtime.py'
]

model = dict(
type='ImVoxelNet',
data_preprocessor=dict(
Expand Down Expand Up @@ -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))
Expand All @@ -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
2 changes: 1 addition & 1 deletion mmdet3d/evaluation/metrics/kitti_metric.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion mmdet3d/models/detectors/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
5 changes: 3 additions & 2 deletions mmdet3d/models/detectors/fcos_mono3d.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions mmdet3d/models/detectors/groupfree3dnet.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion mmdet3d/models/detectors/h3dnet.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
4 changes: 2 additions & 2 deletions mmdet3d/models/detectors/imvotenet.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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,
Expand Down
35 changes: 5 additions & 30 deletions mmdet3d/models/detectors/imvoxelnet.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 <https://arxiv.org/abs/2106.01178>`_.

Args:
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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,
Expand Down
6 changes: 3 additions & 3 deletions mmdet3d/models/detectors/mvx_two_stage.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions mmdet3d/models/detectors/single_stage.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion mmdet3d/models/detectors/single_stage_mono3d.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
4 changes: 2 additions & 2 deletions mmdet3d/models/detectors/two_stage.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
8 changes: 4 additions & 4 deletions mmdet3d/models/detectors/votenet.py
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand Down Expand Up @@ -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