From 9488cccc48a52a0edc0c9d23586182b4b266251f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=9B=A6?= Date: Mon, 29 Mar 2021 16:03:34 +0800 Subject: [PATCH 1/4] modify vote_head to support 3dssd --- mmdet3d/models/dense_heads/vote_head.py | 16 +++++++++++++--- mmdet3d/models/detectors/votenet.py | 22 ---------------------- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/mmdet3d/models/dense_heads/vote_head.py b/mmdet3d/models/dense_heads/vote_head.py index 7fd54cfdcd..17c23789c9 100644 --- a/mmdet3d/models/dense_heads/vote_head.py +++ b/mmdet3d/models/dense_heads/vote_head.py @@ -119,9 +119,19 @@ def _extract_input(self, feat_dict): torch.Tensor: Features of input points. torch.Tensor: Indices of input points. """ - seed_points = feat_dict['seed_points'] - seed_features = feat_dict['seed_features'] - seed_indices = feat_dict['seed_indices'] + + # for imvotenet + if 'seed_points' in feat_dict.keys() and \ + 'seed_features' in feat_dict.keys() and \ + 'seed_indices' in feat_dict.keys(): + seed_points = feat_dict['seed_points'] + seed_features = feat_dict['seed_features'] + seed_indices = feat_dict['seed_indices'] + # for votenet + else: + seed_points = feat_dict['fp_xyz'][-1] + seed_features = feat_dict['fp_features'][-1] + seed_indices = feat_dict['fp_indices'][-1] return seed_points, seed_features, seed_indices diff --git a/mmdet3d/models/detectors/votenet.py b/mmdet3d/models/detectors/votenet.py index 706a35fad2..6c389d5bc8 100644 --- a/mmdet3d/models/detectors/votenet.py +++ b/mmdet3d/models/detectors/votenet.py @@ -22,28 +22,6 @@ def __init__(self, test_cfg=test_cfg, pretrained=pretrained) - def extract_feat(self, points, img_metas=None): - """Directly extract features from the backbone+neck. - - Args: - points (torch.Tensor): Input points. - """ - x = self.backbone(points) - if self.with_neck: - x = self.neck(x) - - seed_points = x['fp_xyz'][-1] - seed_features = x['fp_features'][-1] - seed_indices = x['fp_indices'][-1] - - feat_dict = { - 'seed_points': seed_points, - 'seed_features': seed_features, - 'seed_indices': seed_indices - } - - return feat_dict - def forward_train(self, points, img_metas, From 5b70d6627afc33eac0c3cf7424b0d171663b5fde Mon Sep 17 00:00:00 2001 From: xiliu8006 Date: Wed, 31 Mar 2021 10:54:27 +0800 Subject: [PATCH 2/4] delete .keys() --- mmdet3d/models/dense_heads/vote_head.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mmdet3d/models/dense_heads/vote_head.py b/mmdet3d/models/dense_heads/vote_head.py index 17c23789c9..2bb2262d4c 100644 --- a/mmdet3d/models/dense_heads/vote_head.py +++ b/mmdet3d/models/dense_heads/vote_head.py @@ -121,9 +121,9 @@ def _extract_input(self, feat_dict): """ # for imvotenet - if 'seed_points' in feat_dict.keys() and \ - 'seed_features' in feat_dict.keys() and \ - 'seed_indices' in feat_dict.keys(): + if 'seed_points' in feat_dict and \ + 'seed_features' in feat_dict and \ + 'seed_indices' in feat_dict: seed_points = feat_dict['seed_points'] seed_features = feat_dict['seed_features'] seed_indices = feat_dict['seed_indices'] From 59694fa495907d56d5ccfdabc6536f223bf36b07 Mon Sep 17 00:00:00 2001 From: xiliu8006 Date: Wed, 31 Mar 2021 13:33:45 +0800 Subject: [PATCH 3/4] add 3dssd unittest --- tests/test_models/test_detectors.py | 44 +++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/test_models/test_detectors.py b/tests/test_models/test_detectors.py index 90ad69566f..92df1b5aed 100644 --- a/tests/test_models/test_detectors.py +++ b/tests/test_models/test_detectors.py @@ -121,6 +121,50 @@ def test_voxel_net(): assert labels_3d.shape == torch.Size([50]) +def test_3dssd(): + if not torch.cuda.is_available(): + pytest.skip('test requires GPU and torch+cuda') + + _setup_seed(0) + 3dssd_cfg = _get_detector_cfg( + '3dssd/3dssd_kitti-3d-car.py' + ) + self = build_detector(3dssd_cfg).cuda() + points_0 = torch.rand([2000, 4], device='cuda') + points_1 = torch.rand([2000, 4], device='cuda') + points = [points_0, points_1] + img_meta_0 = dict(box_type_3d=DepthInstance3DBoxes) + img_meta_1 = dict(box_type_3d=DepthInstance3DBoxes) + img_metas = [img_meta_0, img_meta_1] + gt_bbox_0 = DepthInstance3DBoxes(torch.rand([10, 7], device='cuda')) + gt_bbox_1 = DepthInstance3DBoxes(torch.rand([10, 7], device='cuda')) + gt_bboxes = [gt_bbox_0, gt_bbox_1] + gt_labels_0 = torch.randint(0, 10, [10], device='cuda') + gt_labels_1 = torch.randint(0, 10, [10], device='cuda') + gt_labels = [gt_labels_0, gt_labels_1] + + # test forward_train + losses = self.forward_train(points, img_metas, gt_bboxes, gt_labels) + assert losses['vote_loss'] >= 0 + assert losses['objectness_loss'] >= 0 + assert losses['semantic_loss'] >= 0 + assert losses['center_loss'] >= 0 + assert losses['dir_class_loss'] >= 0 + assert losses['dir_res_loss'] >= 0 + assert losses['size_class_loss'] >= 0 + assert losses['size_res_loss'] >= 0 + + # test simple_test + results = self.simple_test(points, img_metas) + boxes_3d = results[0]['boxes_3d'] + scores_3d = results[0]['scores_3d'] + labels_3d = results[0]['labels_3d'] + assert boxes_3d.tensor.shape[0] >= 0 + assert boxes_3d.tensor.shape[1] == 7 + assert scores_3d.shape[0] >= 0 + assert labels_3d.shape[0] >= 0 + + def test_vote_net(): if not torch.cuda.is_available(): pytest.skip('test requires GPU and torch+cuda') From 12abbb4e08e188fd2b2dbb883e36d305a839ca95 Mon Sep 17 00:00:00 2001 From: xiliu8006 Date: Wed, 31 Mar 2021 14:59:24 +0800 Subject: [PATCH 4/4] 3dssd->ssd3d --- tests/test_models/test_detectors.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/test_models/test_detectors.py b/tests/test_models/test_detectors.py index 92df1b5aed..fe9101691c 100644 --- a/tests/test_models/test_detectors.py +++ b/tests/test_models/test_detectors.py @@ -124,12 +124,9 @@ def test_voxel_net(): def test_3dssd(): if not torch.cuda.is_available(): pytest.skip('test requires GPU and torch+cuda') - _setup_seed(0) - 3dssd_cfg = _get_detector_cfg( - '3dssd/3dssd_kitti-3d-car.py' - ) - self = build_detector(3dssd_cfg).cuda() + ssd3d_cfg = _get_detector_cfg('3dssd/3dssd_kitti-3d-car.py') + self = build_detector(ssd3d_cfg).cuda() points_0 = torch.rand([2000, 4], device='cuda') points_1 = torch.rand([2000, 4], device='cuda') points = [points_0, points_1]