Unverified Commit d7067e44 authored by Wenwei Zhang's avatar Wenwei Zhang Committed by GitHub
Browse files

Bump version to v1.1.0rc2

Bump to v1.1.0rc2
parents 28fe73d2 fb0e57e5
...@@ -4,8 +4,8 @@ import torch ...@@ -4,8 +4,8 @@ import torch
from mmengine import DefaultScope from mmengine import DefaultScope
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs, from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
_get_detector_cfg, _setup_seed) setup_seed)
class TestImvoteNet(unittest.TestCase): class TestImvoteNet(unittest.TestCase):
...@@ -15,12 +15,12 @@ class TestImvoteNet(unittest.TestCase): ...@@ -15,12 +15,12 @@ class TestImvoteNet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'ImVoteNet') assert hasattr(mmdet3d.models, 'ImVoteNet')
DefaultScope.get_instance('test_imvotenet_img', scope_name='mmdet3d') DefaultScope.get_instance('test_imvotenet_img', scope_name='mmdet3d')
_setup_seed(0) setup_seed(0)
votenet_net_cfg = _get_detector_cfg( votenet_net_cfg = get_detector_cfg(
'imvotenet/imvotenet_faster-rcnn-r50_fpn_4xb2_sunrgbd-3d.py') 'imvotenet/imvotenet_faster-rcnn-r50_fpn_4xb2_sunrgbd-3d.py')
model = MODELS.build(votenet_net_cfg) model = MODELS.build(votenet_net_cfg)
packed_inputs = _create_detector_inputs( packed_inputs = create_detector_inputs(
with_points=False, with_img=True, img_size=128) with_points=False, with_img=True, img_size=128)
if torch.cuda.is_available(): if torch.cuda.is_available():
...@@ -49,12 +49,12 @@ class TestImvoteNet(unittest.TestCase): ...@@ -49,12 +49,12 @@ class TestImvoteNet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'ImVoteNet') assert hasattr(mmdet3d.models, 'ImVoteNet')
DefaultScope.get_instance('test_imvotenet', scope_name='mmdet3d') DefaultScope.get_instance('test_imvotenet', scope_name='mmdet3d')
_setup_seed(0) setup_seed(0)
votenet_net_cfg = _get_detector_cfg( votenet_net_cfg = get_detector_cfg(
'imvotenet/imvotenet_stage2_8xb16_sunrgbd-3d.py') 'imvotenet/imvotenet_stage2_8xb16_sunrgbd-3d.py')
model = MODELS.build(votenet_net_cfg) model = MODELS.build(votenet_net_cfg)
packed_inputs = _create_detector_inputs( packed_inputs = create_detector_inputs(
with_points=True, with_points=True,
with_img=True, with_img=True,
img_size=128, img_size=128,
......
...@@ -4,8 +4,8 @@ import torch ...@@ -4,8 +4,8 @@ import torch
from mmengine import DefaultScope from mmengine import DefaultScope
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs, from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
_get_detector_cfg, _setup_seed) setup_seed)
class TestImVoxelNet(unittest.TestCase): class TestImVoxelNet(unittest.TestCase):
...@@ -15,12 +15,12 @@ class TestImVoxelNet(unittest.TestCase): ...@@ -15,12 +15,12 @@ class TestImVoxelNet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'ImVoxelNet') assert hasattr(mmdet3d.models, 'ImVoxelNet')
DefaultScope.get_instance('test_ImVoxelNet', scope_name='mmdet3d') DefaultScope.get_instance('test_ImVoxelNet', scope_name='mmdet3d')
_setup_seed(0) setup_seed(0)
imvoxel_net_cfg = _get_detector_cfg( imvoxel_net_cfg = get_detector_cfg(
'imvoxelnet/imvoxelnet_8xb4_kitti-3d-car.py') 'imvoxelnet/imvoxelnet_8xb4_kitti-3d-car.py')
model = MODELS.build(imvoxel_net_cfg) model = MODELS.build(imvoxel_net_cfg)
num_gt_instance = 1 num_gt_instance = 1
packed_inputs = _create_detector_inputs( packed_inputs = create_detector_inputs(
with_points=False, with_points=False,
with_img=True, with_img=True,
img_size=(128, 128), img_size=(128, 128),
......
...@@ -4,8 +4,8 @@ import torch ...@@ -4,8 +4,8 @@ import torch
from mmengine import DefaultScope from mmengine import DefaultScope
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs, from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
_get_detector_cfg, _setup_seed) setup_seed)
class TestMVXNet(unittest.TestCase): class TestMVXNet(unittest.TestCase):
...@@ -15,14 +15,14 @@ class TestMVXNet(unittest.TestCase): ...@@ -15,14 +15,14 @@ class TestMVXNet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'DynamicMVXFasterRCNN') assert hasattr(mmdet3d.models, 'DynamicMVXFasterRCNN')
_setup_seed(0) setup_seed(0)
DefaultScope.get_instance('test_mvxnet', scope_name='mmdet3d') DefaultScope.get_instance('test_mvxnet', scope_name='mmdet3d')
mvx_net_cfg = _get_detector_cfg( mvx_net_cfg = get_detector_cfg(
'mvxnet/mvxnet_fpn_dv_second_secfpn_8xb2-80e_kitti-3d-3class.py' # noqa 'mvxnet/mvxnet_fpn_dv_second_secfpn_8xb2-80e_kitti-3d-3class.py' # noqa
) )
model = MODELS.build(mvx_net_cfg) model = MODELS.build(mvx_net_cfg)
num_gt_instance = 1 num_gt_instance = 1
packed_inputs = _create_detector_inputs( packed_inputs = create_detector_inputs(
with_img=False, num_gt_instance=num_gt_instance, points_feat_dim=4) with_img=False, num_gt_instance=num_gt_instance, points_feat_dim=4)
if torch.cuda.is_available(): if torch.cuda.is_available():
......
...@@ -4,8 +4,8 @@ import torch ...@@ -4,8 +4,8 @@ import torch
from mmengine import DefaultScope from mmengine import DefaultScope
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs, from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
_get_detector_cfg, _setup_seed) setup_seed)
class TestPartA2(unittest.TestCase): class TestPartA2(unittest.TestCase):
...@@ -15,18 +15,17 @@ class TestPartA2(unittest.TestCase): ...@@ -15,18 +15,17 @@ class TestPartA2(unittest.TestCase):
assert hasattr(mmdet3d.models, 'PartA2') assert hasattr(mmdet3d.models, 'PartA2')
DefaultScope.get_instance('test_parta2', scope_name='mmdet3d') DefaultScope.get_instance('test_parta2', scope_name='mmdet3d')
_setup_seed(0) setup_seed(0)
parta2_cfg = _get_detector_cfg( parta2_cfg = get_detector_cfg(
'parta2/PartA2_hv_secfpn_8xb2-cyclic-80e_kitti-3d-3class.py') 'parta2/parta2_hv_secfpn_8xb2-cyclic-80e_kitti-3d-3class.py')
model = MODELS.build(parta2_cfg) model = MODELS.build(parta2_cfg)
num_gt_instance = 2 num_gt_instance = 2
packed_inputs = _create_detector_inputs( packed_inputs = create_detector_inputs(num_gt_instance=num_gt_instance)
num_gt_instance=num_gt_instance)
# TODO: Support aug data test # TODO: Support aug data test
# aug_packed_inputs = [ # aug_packed_inputs = [
# _create_detector_inputs(num_gt_instance=num_gt_instance), # create_detector_inputs(num_gt_instance=num_gt_instance),
# _create_detector_inputs(num_gt_instance=num_gt_instance + 1) # create_detector_inputs(num_gt_instance=num_gt_instance + 1)
# ] # ]
# test_aug_test # test_aug_test
# metainfo = { # metainfo = {
......
...@@ -4,8 +4,8 @@ import torch ...@@ -4,8 +4,8 @@ import torch
from mmengine import DefaultScope from mmengine import DefaultScope
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs, from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
_get_detector_cfg, _setup_seed) setup_seed)
class TestPointRCNN(unittest.TestCase): class TestPointRCNN(unittest.TestCase):
...@@ -15,12 +15,12 @@ class TestPointRCNN(unittest.TestCase): ...@@ -15,12 +15,12 @@ class TestPointRCNN(unittest.TestCase):
assert hasattr(mmdet3d.models, 'PointRCNN') assert hasattr(mmdet3d.models, 'PointRCNN')
DefaultScope.get_instance('test_pointrcnn', scope_name='mmdet3d') DefaultScope.get_instance('test_pointrcnn', scope_name='mmdet3d')
_setup_seed(0) setup_seed(0)
pointrcnn_cfg = _get_detector_cfg( pointrcnn_cfg = get_detector_cfg(
'point_rcnn/point-rcnn_8xb2_kitti-3d-3class.py') 'point_rcnn/point-rcnn_8xb2_kitti-3d-3class.py')
model = MODELS.build(pointrcnn_cfg) model = MODELS.build(pointrcnn_cfg)
num_gt_instance = 2 num_gt_instance = 2
packed_inputs = _create_detector_inputs( packed_inputs = create_detector_inputs(
num_points=10101, num_gt_instance=num_gt_instance) num_points=10101, num_gt_instance=num_gt_instance)
if torch.cuda.is_available(): if torch.cuda.is_available():
......
import unittest
import torch
from mmengine import DefaultScope
from mmdet3d.registry import MODELS
from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
setup_seed)
class TestPVRCNN(unittest.TestCase):
def test_pvrcnn(self):
import mmdet3d.models
assert hasattr(mmdet3d.models, 'PointVoxelRCNN')
DefaultScope.get_instance('test_pvrcnn', scope_name='mmdet3d')
setup_seed(0)
pvrcnn_cfg = get_detector_cfg(
'pv_rcnn/pv_rcnn_8xb2-80e_kitti-3d-3class.py')
model = MODELS.build(pvrcnn_cfg)
num_gt_instance = 2
packed_inputs = create_detector_inputs(num_gt_instance=num_gt_instance)
# TODO: Support aug data test
# aug_packed_inputs = [
# create_detector_inputs(num_gt_instance=num_gt_instance),
# create_detector_inputs(num_gt_instance=num_gt_instance + 1)
# ]
# test_aug_test
# metainfo = {
# 'pcd_scale_factor': 1,
# 'pcd_horizontal_flip': 1,
# 'pcd_vertical_flip': 1,
# 'box_type_3d': LiDARInstance3DBoxes
# }
# for item in aug_packed_inputs:
# for batch_id in len(item['data_samples']):
# item['data_samples'][batch_id].set_metainfo(metainfo)
if torch.cuda.is_available():
model = model.cuda()
# test simple_test
with torch.no_grad():
data = model.data_preprocessor(packed_inputs, True)
torch.cuda.empty_cache()
results = model.forward(**data, mode='predict')
self.assertEqual(len(results), 1)
self.assertIn('bboxes_3d', results[0].pred_instances_3d)
self.assertIn('scores_3d', results[0].pred_instances_3d)
self.assertIn('labels_3d', results[0].pred_instances_3d)
# save the memory
with torch.no_grad():
losses = model.forward(**data, mode='loss')
torch.cuda.empty_cache()
self.assertGreater(losses['loss_rpn_cls'][0], 0)
self.assertGreaterEqual(losses['loss_rpn_bbox'][0], 0)
self.assertGreaterEqual(losses['loss_rpn_dir'][0], 0)
self.assertGreater(losses['loss_semantic'], 0)
self.assertGreaterEqual(losses['loss_bbox'], 0)
self.assertGreaterEqual(losses['loss_cls'], 0)
self.assertGreaterEqual(losses['loss_corner'], 0)
import unittest
import torch
from mmengine import DefaultScope
from mmdet3d.registry import MODELS
from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
setup_seed)
class TestSDSSD(unittest.TestCase):
def test_3dssd(self):
import mmdet3d.models
assert hasattr(mmdet3d.models, 'SASSD')
DefaultScope.get_instance('test_sassd', scope_name='mmdet3d')
setup_seed(0)
voxel_net_cfg = get_detector_cfg(
'sassd/sassd_8xb6-80e_kitti-3d-3class.py')
model = MODELS.build(voxel_net_cfg)
num_gt_instance = 3
packed_inputs = create_detector_inputs(
num_gt_instance=num_gt_instance, num_classes=1)
if torch.cuda.is_available():
model = model.cuda()
# test simple_test
with torch.no_grad():
data = model.data_preprocessor(packed_inputs, True)
torch.cuda.empty_cache()
results = model.forward(**data, mode='predict')
self.assertEqual(len(results), 1)
self.assertIn('bboxes_3d', results[0].pred_instances_3d)
self.assertIn('scores_3d', results[0].pred_instances_3d)
self.assertIn('labels_3d', results[0].pred_instances_3d)
losses = model.forward(**data, mode='loss')
self.assertGreaterEqual(losses['loss_dir'][0], 0)
self.assertGreaterEqual(losses['loss_bbox'][0], 0)
self.assertGreaterEqual(losses['loss_cls'][0], 0)
self.assertGreater(losses['aux_loss_cls'][0], 0)
self.assertGreater(losses['aux_loss_reg'][0], 0)
...@@ -4,8 +4,8 @@ import torch ...@@ -4,8 +4,8 @@ import torch
from mmengine import DefaultScope from mmengine import DefaultScope
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs, from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
_get_detector_cfg, _setup_seed) setup_seed)
class TestVotenet(unittest.TestCase): class TestVotenet(unittest.TestCase):
...@@ -15,18 +15,16 @@ class TestVotenet(unittest.TestCase): ...@@ -15,18 +15,16 @@ class TestVotenet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'VoteNet') assert hasattr(mmdet3d.models, 'VoteNet')
DefaultScope.get_instance('test_vote_net', scope_name='mmdet3d') DefaultScope.get_instance('test_vote_net', scope_name='mmdet3d')
_setup_seed(0) setup_seed(0)
voxel_net_cfg = _get_detector_cfg( voxel_net_cfg = get_detector_cfg('votenet/votenet_8xb16_sunrgbd-3d.py')
'votenet/votenet_8xb16_sunrgbd-3d.py')
model = MODELS.build(voxel_net_cfg) model = MODELS.build(voxel_net_cfg)
num_gt_instance = 50 num_gt_instance = 50
packed_inputs = _create_detector_inputs( packed_inputs = create_detector_inputs(num_gt_instance=num_gt_instance)
num_gt_instance=num_gt_instance)
# TODO: Support aug test # TODO: Support aug test
# aug_data = [ # aug_data = [
# _create_detector_inputs(num_gt_instance=num_gt_instance), # create_detector_inputs(num_gt_instance=num_gt_instance),
# _create_detector_inputs(num_gt_instance=num_gt_instance + 1) # create_detector_inputs(num_gt_instance=num_gt_instance + 1)
# ] # ]
# # test_aug_test # # test_aug_test
# metainfo = { # metainfo = {
......
...@@ -5,8 +5,8 @@ import torch ...@@ -5,8 +5,8 @@ import torch
from mmengine import DefaultScope from mmengine import DefaultScope
from mmdet3d.registry import MODELS from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs, from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
_get_detector_cfg, _setup_seed) setup_seed)
class TestVoxelNet(unittest.TestCase): class TestVoxelNet(unittest.TestCase):
...@@ -16,18 +16,17 @@ class TestVoxelNet(unittest.TestCase): ...@@ -16,18 +16,17 @@ class TestVoxelNet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'VoxelNet') assert hasattr(mmdet3d.models, 'VoxelNet')
DefaultScope.get_instance('test_voxelnet', scope_name='mmdet3d') DefaultScope.get_instance('test_voxelnet', scope_name='mmdet3d')
_setup_seed(0) setup_seed(0)
pointpillars_cfg = _get_detector_cfg( pointpillars_cfg = get_detector_cfg(
'pointpillars/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class.py') 'pointpillars/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class.py')
model = MODELS.build(pointpillars_cfg) model = MODELS.build(pointpillars_cfg)
num_gt_instance = 2 num_gt_instance = 2
packed_inputs = _create_detector_inputs( packed_inputs = create_detector_inputs(num_gt_instance=num_gt_instance)
num_gt_instance=num_gt_instance)
# TODO: Support aug_test # TODO: Support aug_test
# aug_data = [ # aug_data = [
# _create_detector_inputs(num_gt_instance=num_gt_instance), # create_detector_inputs(num_gt_instance=num_gt_instance),
# _create_detector_inputs(num_gt_instance=num_gt_instance + 1) # create_detector_inputs(num_gt_instance=num_gt_instance + 1)
# ] # ]
# # test_aug_test # # test_aug_test
# metainfo = { # metainfo = {
......
# Copyright (c) OpenMMLab. All rights reserved.
import numpy as np
import torch
from mmdet3d.models.losses import RotatedIoU3DLoss
def test_rotated_iou_3d_loss():
if not torch.cuda.is_available():
return
boxes1 = torch.tensor([[.5, .5, .5, 1., 1., 1., .0],
[.5, .5, .5, 1., 1., 1., .0],
[.5, .5, .5, 1., 1., 1., .0],
[.5, .5, .5, 1., 1., 1., .0],
[.5, .5, .5, 1., 1., 1., .0]]).cuda()
boxes2 = torch.tensor([[.5, .5, .5, 1., 1., 1., .0],
[.5, .5, .5, 1., 1., 2., np.pi / 2],
[.5, .5, .5, 1., 1., 1., np.pi / 4],
[1., 1., 1., 1., 1., 1., .0],
[-1.5, -1.5, -1.5, 2.5, 2.5, 2.5, .0]]).cuda()
expect_ious = 1 - torch.tensor([[1., .5, .7071, 1 / 15, .0]]).cuda()
ious = RotatedIoU3DLoss(reduction='none')(boxes1, boxes2)
assert torch.allclose(ious, expect_ious, atol=1e-4)
...@@ -45,8 +45,8 @@ def test_centerpoint_fpn(): ...@@ -45,8 +45,8 @@ def test_centerpoint_fpn():
second_cfg = dict( second_cfg = dict(
type='SECOND', type='SECOND',
in_channels=64, in_channels=2,
out_channels=[64, 128, 256], out_channels=[2, 2, 2],
layer_nums=[3, 5, 5], layer_nums=[3, 5, 5],
layer_strides=[2, 2, 2], layer_strides=[2, 2, 2],
norm_cfg=dict(type='BN', eps=1e-3, momentum=0.01), norm_cfg=dict(type='BN', eps=1e-3, momentum=0.01),
...@@ -57,8 +57,8 @@ def test_centerpoint_fpn(): ...@@ -57,8 +57,8 @@ def test_centerpoint_fpn():
# centerpoint usage of fpn # centerpoint usage of fpn
centerpoint_fpn_cfg = dict( centerpoint_fpn_cfg = dict(
type='SECONDFPN', type='SECONDFPN',
in_channels=[64, 128, 256], in_channels=[2, 2, 2],
out_channels=[128, 128, 128], out_channels=[2, 2, 2],
upsample_strides=[0.5, 1, 2], upsample_strides=[0.5, 1, 2],
norm_cfg=dict(type='BN', eps=1e-3, momentum=0.01), norm_cfg=dict(type='BN', eps=1e-3, momentum=0.01),
upsample_cfg=dict(type='deconv', bias=False), upsample_cfg=dict(type='deconv', bias=False),
...@@ -67,17 +67,17 @@ def test_centerpoint_fpn(): ...@@ -67,17 +67,17 @@ def test_centerpoint_fpn():
# original usage of fpn # original usage of fpn
fpn_cfg = dict( fpn_cfg = dict(
type='SECONDFPN', type='SECONDFPN',
in_channels=[64, 128, 256], in_channels=[2, 2, 2],
upsample_strides=[1, 2, 4], upsample_strides=[1, 2, 4],
out_channels=[128, 128, 128]) out_channels=[2, 2, 2])
second_fpn = build_neck(fpn_cfg) second_fpn = build_neck(fpn_cfg)
centerpoint_second_fpn = build_neck(centerpoint_fpn_cfg) centerpoint_second_fpn = build_neck(centerpoint_fpn_cfg)
input = torch.rand([4, 64, 512, 512]) input = torch.rand([2, 2, 32, 32])
sec_output = second(input) sec_output = second(input)
centerpoint_output = centerpoint_second_fpn(sec_output) centerpoint_output = centerpoint_second_fpn(sec_output)
second_output = second_fpn(sec_output) second_output = second_fpn(sec_output)
assert centerpoint_output[0].shape == torch.Size([4, 384, 128, 128]) assert centerpoint_output[0].shape == torch.Size([2, 6, 8, 8])
assert second_output[0].shape == torch.Size([4, 384, 256, 256]) assert second_output[0].shape == torch.Size([2, 6, 16, 16])
...@@ -45,10 +45,10 @@ def test_anchor_3d_range_generator(): ...@@ -45,10 +45,10 @@ def test_anchor_3d_range_generator():
'\nrotations=[0, 1.57],\nreshape_out=False,' \ '\nrotations=[0, 1.57],\nreshape_out=False,' \
'\nsize_per_range=True)' '\nsize_per_range=True)'
assert repr_str == expected_repr_str assert repr_str == expected_repr_str
featmap_size = (256, 256) featmap_size = (8, 8)
mr_anchors = anchor_generator.single_level_grid_anchors( mr_anchors = anchor_generator.single_level_grid_anchors(
featmap_size, 1.1, device=device) featmap_size, 1.1, device=device)
assert mr_anchors.shape == torch.Size([1, 256, 256, 3, 2, 7]) assert mr_anchors.shape == torch.Size([1, 8, 8, 3, 2, 7])
def test_aligned_anchor_generator(): def test_aligned_anchor_generator():
...@@ -80,108 +80,108 @@ def test_aligned_anchor_generator(): ...@@ -80,108 +80,108 @@ def test_aligned_anchor_generator():
size_per_range=False, size_per_range=False,
reshape_out=True) reshape_out=True)
featmap_sizes = [(256, 256), (128, 128), (64, 64)] featmap_sizes = [(16, 16), (8, 8), (4, 4)]
anchor_generator = TASK_UTILS.build(anchor_generator_cfg) anchor_generator = TASK_UTILS.build(anchor_generator_cfg)
assert anchor_generator.num_base_anchors == 8 assert anchor_generator.num_base_anchors == 8
# check base anchors # check base anchors
expected_grid_anchors = [ expected_grid_anchors = [
torch.tensor([[ torch.tensor([[
-51.0000, -51.0000, -1.8000, 2.5981, 0.8660, 1.0000, 0.0000, -48.0000, -48.0000, -1.8000, 2.5981, 0.8660, 1.0000, 0.0000,
0.0000, 0.0000 0.0000, 0.0000
], ],
[ [
-51.0000, -51.0000, -1.8000, 0.4000, 0.4000, 1.0000, -48.0000, -48.0000, -1.8000, 0.4000, 0.4000, 1.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
], ],
[ [
-50.6000, -51.0000, -1.8000, 0.4000, 0.4000, 1.0000, -41.6000, -48.0000, -1.8000, 0.4000, 0.4000, 1.0000,
0.0000, 0.0000, 0.0000 0.0000, 0.0000, 0.0000
], ],
[ [
-50.2000, -51.0000, -1.8000, 1.0000, 1.0000, 1.0000, -35.2000, -48.0000, -1.8000, 1.0000, 1.0000, 1.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
], ],
[ [
-49.8000, -51.0000, -1.8000, 1.0000, 1.0000, 1.0000, -28.8000, -48.0000, -1.8000, 1.0000, 1.0000, 1.0000,
0.0000, 0.0000, 0.0000 0.0000, 0.0000, 0.0000
], ],
[ [
-49.4000, -51.0000, -1.8000, 1.7321, 0.5774, 1.0000, -22.4000, -48.0000, -1.8000, 1.7321, 0.5774, 1.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
], ],
[ [
-49.0000, -51.0000, -1.8000, 1.7321, 0.5774, 1.0000, -16.0000, -48.0000, -1.8000, 1.7321, 0.5774, 1.0000,
0.0000, 0.0000, 0.0000 0.0000, 0.0000, 0.0000
], ],
[ [
-48.6000, -51.0000, -1.8000, 2.5981, 0.8660, 1.0000, -9.6000, -48.0000, -1.8000, 2.5981, 0.8660, 1.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
]], ]],
device=device), device=device),
torch.tensor([[ torch.tensor([[
-50.8000, -50.8000, -1.8000, 5.1962, 1.7320, 2.0000, 0.0000, -44.8000, -44.8000, -1.8000, 5.1962, 1.7320, 2.0000, 0.0000,
0.0000, 0.0000 0.0000, 0.0000
], ],
[ [
-50.8000, -50.8000, -1.8000, 0.8000, 0.8000, 2.0000, -44.8000, -44.8000, -1.8000, 0.8000, 0.8000, 2.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
], ],
[ [
-50.0000, -50.8000, -1.8000, 0.8000, 0.8000, 2.0000, -32.0000, -44.8000, -1.8000, 0.8000, 0.8000, 2.0000,
0.0000, 0.0000, 0.0000 0.0000, 0.0000, 0.0000
], ],
[ [
-49.2000, -50.8000, -1.8000, 2.0000, 2.0000, 2.0000, -19.2000, -44.8000, -1.8000, 2.0000, 2.0000, 2.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
], ],
[ [
-48.4000, -50.8000, -1.8000, 2.0000, 2.0000, 2.0000, -6.4000, -44.8000, -1.8000, 2.0000, 2.0000, 2.0000,
0.0000, 0.0000, 0.0000 0.0000, 0.0000, 0.0000
], ],
[ [
-47.6000, -50.8000, -1.8000, 3.4642, 1.1548, 2.0000, 6.4000, -44.8000, -1.8000, 3.4642, 1.1548, 2.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
], ],
[ [
-46.8000, -50.8000, -1.8000, 3.4642, 1.1548, 2.0000, 19.2000, -44.8000, -1.8000, 3.4642, 1.1548, 2.0000,
0.0000, 0.0000, 0.0000 0.0000, 0.0000, 0.0000
], ],
[ [
-46.0000, -50.8000, -1.8000, 5.1962, 1.7320, 2.0000, 32.0000, -44.8000, -1.8000, 5.1962, 1.7320, 2.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
]], ]],
device=device), device=device),
torch.tensor([[ torch.tensor([[
-50.4000, -50.4000, -1.8000, 10.3924, 3.4640, 4.0000, 0.0000, -38.4000, -38.4000, -1.8000, 10.3924, 3.4640, 4.0000, 0.0000,
0.0000, 0.0000 0.0000, 0.0000
], ],
[ [
-50.4000, -50.4000, -1.8000, 1.6000, 1.6000, 4.0000, -38.4000, -38.4000, -1.8000, 1.6000, 1.6000, 4.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
], ],
[ [
-48.8000, -50.4000, -1.8000, 1.6000, 1.6000, 4.0000, -12.8000, -38.4000, -1.8000, 1.6000, 1.6000, 4.0000,
0.0000, 0.0000, 0.0000 0.0000, 0.0000, 0.0000
], ],
[ [
-47.2000, -50.4000, -1.8000, 4.0000, 4.0000, 4.0000, 12.8000, -38.4000, -1.8000, 4.0000, 4.0000, 4.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
], ],
[ [
-45.6000, -50.4000, -1.8000, 4.0000, 4.0000, 4.0000, 38.4000, -38.4000, -1.8000, 4.0000, 4.0000, 4.0000,
0.0000, 0.0000, 0.0000 0.0000, 0.0000, 0.0000
], ],
[ [
-44.0000, -50.4000, -1.8000, 6.9284, 2.3096, 4.0000, -38.4000, -12.8000, -1.8000, 6.9284, 2.3096, 4.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
], ],
[ [
-42.4000, -50.4000, -1.8000, 6.9284, 2.3096, 4.0000, -12.8000, -12.8000, -1.8000, 6.9284, 2.3096, 4.0000,
0.0000, 0.0000, 0.0000 0.0000, 0.0000, 0.0000
], ],
[ [
-40.8000, -50.4000, -1.8000, 10.3924, 3.4640, 4.0000, 12.8000, -12.8000, -1.8000, 10.3924, 3.4640, 4.0000,
1.5700, 0.0000, 0.0000 1.5700, 0.0000, 0.0000
]], ]],
device=device) device=device)
...@@ -189,9 +189,9 @@ def test_aligned_anchor_generator(): ...@@ -189,9 +189,9 @@ def test_aligned_anchor_generator():
multi_level_anchors = anchor_generator.grid_anchors( multi_level_anchors = anchor_generator.grid_anchors(
featmap_sizes, device=device) featmap_sizes, device=device)
expected_multi_level_shapes = [ expected_multi_level_shapes = [
torch.Size([524288, 9]), torch.Size([2048, 9]),
torch.Size([131072, 9]), torch.Size([512, 9]),
torch.Size([32768, 9]) torch.Size([128, 9])
] ]
for i, single_level_anchor in enumerate(multi_level_anchors): for i, single_level_anchor in enumerate(multi_level_anchors):
assert single_level_anchor.shape == expected_multi_level_shapes[i] assert single_level_anchor.shape == expected_multi_level_shapes[i]
......
...@@ -6,17 +6,15 @@ from mmdet3d.models.task_modules.voxel import VoxelGenerator ...@@ -6,17 +6,15 @@ from mmdet3d.models.task_modules.voxel import VoxelGenerator
def test_voxel_generator(): def test_voxel_generator():
np.random.seed(0) np.random.seed(0)
voxel_size = [0.5, 0.5, 0.5] voxel_size = [5, 5, 1]
point_cloud_range = [0, -40, -3, 70.4, 40, 1] point_cloud_range = [0, 0, 0, 20, 40, 4]
max_num_points = 1000 max_num_points = 5
self = VoxelGenerator(voxel_size, point_cloud_range, max_num_points) self = VoxelGenerator(voxel_size, point_cloud_range, max_num_points)
points = np.random.rand(1000, 4) points = np.random.uniform(0, 4, (20, 3))
voxels = self.generate(points) voxels = self.generate(points)
voxels, coors, num_points_per_voxel = voxels voxels, coors, num_points_per_voxel = voxels
expected_coors = np.array([[7, 81, 1], [6, 81, 0], [7, 80, 1], [6, 81, 1], expected_coors = np.array([[2, 0, 0], [3, 0, 0], [0, 0, 0], [1, 0, 0]])
[7, 81, 0], [6, 80, 1], [7, 80, 0], [6, 80, 0]]) expected_num_points_per_voxel = np.array([5, 5, 5, 3])
expected_num_points_per_voxel = np.array( assert voxels.shape == (4, 5, 3)
[120, 121, 127, 134, 115, 127, 125, 131])
assert voxels.shape == (8, 1000, 4)
assert np.all(coors == expected_coors) assert np.all(coors == expected_coors)
assert np.all(num_points_per_voxel == expected_num_points_per_voxel) assert np.all(num_points_per_voxel == expected_num_points_per_voxel)
...@@ -35,9 +35,6 @@ def kitti_data_prep(root_path, ...@@ -35,9 +35,6 @@ def kitti_data_prep(root_path,
info_train_path = osp.join(out_dir, f'{info_prefix}_infos_train.pkl') info_train_path = osp.join(out_dir, f'{info_prefix}_infos_train.pkl')
info_val_path = osp.join(out_dir, f'{info_prefix}_infos_val.pkl') info_val_path = osp.join(out_dir, f'{info_prefix}_infos_val.pkl')
info_trainval_path = osp.join(out_dir, f'{info_prefix}_infos_trainval.pkl') info_trainval_path = osp.join(out_dir, f'{info_prefix}_infos_trainval.pkl')
kitti.export_2d_annotation(root_path, info_train_path)
kitti.export_2d_annotation(root_path, info_val_path)
kitti.export_2d_annotation(root_path, info_trainval_path)
update_pkl_infos('kitti', out_dir=out_dir, pkl_path=info_train_path) update_pkl_infos('kitti', out_dir=out_dir, pkl_path=info_train_path)
update_pkl_infos('kitti', out_dir=out_dir, pkl_path=info_val_path) update_pkl_infos('kitti', out_dir=out_dir, pkl_path=info_val_path)
update_pkl_infos('kitti', out_dir=out_dir, pkl_path=info_trainval_path) update_pkl_infos('kitti', out_dir=out_dir, pkl_path=info_trainval_path)
...@@ -76,17 +73,11 @@ def nuscenes_data_prep(root_path, ...@@ -76,17 +73,11 @@ def nuscenes_data_prep(root_path,
if version == 'v1.0-test': if version == 'v1.0-test':
info_test_path = osp.join(out_dir, f'{info_prefix}_infos_test.pkl') info_test_path = osp.join(out_dir, f'{info_prefix}_infos_test.pkl')
nuscenes_converter.export_2d_annotation(
root_path, info_test_path, version=version)
update_pkl_infos('nuscenes', out_dir=out_dir, pkl_path=info_test_path) update_pkl_infos('nuscenes', out_dir=out_dir, pkl_path=info_test_path)
return return
info_train_path = osp.join(out_dir, f'{info_prefix}_infos_train.pkl') info_train_path = osp.join(out_dir, f'{info_prefix}_infos_train.pkl')
info_val_path = osp.join(out_dir, f'{info_prefix}_infos_val.pkl') info_val_path = osp.join(out_dir, f'{info_prefix}_infos_val.pkl')
nuscenes_converter.export_2d_annotation(
root_path, info_train_path, version=version)
nuscenes_converter.export_2d_annotation(
root_path, info_val_path, version=version)
update_pkl_infos('nuscenes', out_dir=out_dir, pkl_path=info_train_path) update_pkl_infos('nuscenes', out_dir=out_dir, pkl_path=info_train_path)
update_pkl_infos('nuscenes', out_dir=out_dir, pkl_path=info_val_path) update_pkl_infos('nuscenes', out_dir=out_dir, pkl_path=info_val_path)
create_groundtruth_database(dataset_name, root_path, info_prefix, create_groundtruth_database(dataset_name, root_path, info_prefix,
...@@ -265,6 +256,11 @@ args = parser.parse_args() ...@@ -265,6 +256,11 @@ args = parser.parse_args()
if __name__ == '__main__': if __name__ == '__main__':
from mmdet3d.utils import register_all_modules from mmdet3d.utils import register_all_modules
register_all_modules() register_all_modules()
# Set to spawn mode to avoid stuck when process dataset creating
import multiprocessing
multiprocessing.set_start_method('spawn')
if args.dataset == 'kitti': if args.dataset == 'kitti':
kitti_data_prep( kitti_data_prep(
root_path=args.root_path, root_path=args.root_path,
......
...@@ -6,13 +6,13 @@ import mmcv ...@@ -6,13 +6,13 @@ import mmcv
import mmengine import mmengine
import numpy as np import numpy as np
from mmcv.ops import roi_align from mmcv.ops import roi_align
from mmdet.evaluation import bbox_overlaps
from mmengine import track_iter_progress from mmengine import track_iter_progress
from pycocotools import mask as maskUtils from pycocotools import mask as maskUtils
from pycocotools.coco import COCO from pycocotools.coco import COCO
from mmdet3d.datasets import build_dataset from mmdet3d.datasets import build_dataset
from mmdet3d.structures.ops import box_np_ops as box_np_ops from mmdet3d.structures.ops import box_np_ops as box_np_ops
from mmdet.evaluation import bbox_overlaps
def _poly2mask(mask_ann, img_h, img_w): def _poly2mask(mask_ann, img_h, img_w):
...@@ -243,7 +243,7 @@ def create_groundtruth_database(dataset_class_name, ...@@ -243,7 +243,7 @@ def create_groundtruth_database(dataset_class_name,
image_idx = example['sample_idx'] image_idx = example['sample_idx']
points = example['points'].tensor.numpy() points = example['points'].tensor.numpy()
gt_boxes_3d = annos['gt_bboxes_3d'].tensor.numpy() gt_boxes_3d = annos['gt_bboxes_3d'].tensor.numpy()
names = [dataset.metainfo['CLASSES'][i] for i in annos['gt_labels_3d']] names = [dataset.metainfo['classes'][i] for i in annos['gt_labels_3d']]
group_dict = dict() group_dict = dict()
if 'group_ids' in annos: if 'group_ids' in annos:
group_ids = annos['group_ids'] group_ids = annos['group_ids']
...@@ -409,7 +409,7 @@ class GTDatabaseCreater: ...@@ -409,7 +409,7 @@ class GTDatabaseCreater:
points = example['points'].tensor.numpy() points = example['points'].tensor.numpy()
gt_boxes_3d = annos['gt_bboxes_3d'].tensor.numpy() gt_boxes_3d = annos['gt_bboxes_3d'].tensor.numpy()
names = [ names = [
self.dataset.metainfo['CLASSES'][i] for i in annos['gt_labels_3d'] self.dataset.metainfo['classes'][i] for i in annos['gt_labels_3d']
] ]
group_dict = dict() group_dict = dict()
if 'group_ids' in annos: if 'group_ids' in annos:
......
...@@ -131,6 +131,7 @@ def _fill_trainval_infos(lyft, ...@@ -131,6 +131,7 @@ def _fill_trainval_infos(lyft,
info = { info = {
'lidar_path': lidar_path, 'lidar_path': lidar_path,
'num_features': 5,
'token': sample['token'], 'token': sample['token'],
'sweeps': [], 'sweeps': [],
'cams': dict(), 'cams': dict(),
......
...@@ -129,7 +129,7 @@ class S3DISData(object): ...@@ -129,7 +129,7 @@ class S3DISData(object):
- gt_num (int): Number of boxes. - gt_num (int): Number of boxes.
""" """
bboxes, labels = [], [] bboxes, labels = [], []
for i in range(1, pts_instance_mask.max()): for i in range(1, pts_instance_mask.max() + 1):
ids = pts_instance_mask == i ids = pts_instance_mask == i
# check if all instance points have same semantic label # check if all instance points have same semantic label
assert pts_semantic_mask[ids].min() == pts_semantic_mask[ids].max() assert pts_semantic_mask[ids].min() == pts_semantic_mask[ids].max()
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
Example: Example:
python tools/dataset_converters/update_infos_to_v2.py python tools/dataset_converters/update_infos_to_v2.py
--dataset kitti --dataset kitti
--pkl ./data/kitti/kitti_infos_train.pkl --pkl-path ./data/kitti/kitti_infos_train.pkl
--out-dir ./kitti_v2/ --out-dir ./kitti_v2/
""" """
...@@ -12,6 +12,7 @@ import argparse ...@@ -12,6 +12,7 @@ import argparse
import copy import copy
import time import time
from os import path as osp from os import path as osp
from pathlib import Path
import mmengine import mmengine
import numpy as np import numpy as np
...@@ -80,9 +81,6 @@ def get_empty_lidar_points(): ...@@ -80,9 +81,6 @@ def get_empty_lidar_points():
num_pts_feats=None, num_pts_feats=None,
# (str, optional): Path of LiDAR data file. # (str, optional): Path of LiDAR data file.
lidar_path=None, lidar_path=None,
# (list[list[float]]): Transformation matrix from lidar
# or depth to image with shape [4, 4].
lidar2img=None,
# (list[list[float]], optional): Transformation matrix # (list[list[float]], optional): Transformation matrix
# from lidar to ego-vehicle # from lidar to ego-vehicle
# with shape [4, 4]. # with shape [4, 4].
...@@ -120,6 +118,9 @@ def get_empty_img_info(): ...@@ -120,6 +118,9 @@ def get_empty_img_info():
# matrix from camera to image with # matrix from camera to image with
# shape [3, 3], [3, 4] or [4, 4]. # shape [3, 3], [3, 4] or [4, 4].
cam2img=None, cam2img=None,
# (list[list[float]]): Transformation matrix from lidar
# or depth to image with shape [4, 4].
lidar2img=None,
# (list[list[float]], optional) : Transformation # (list[list[float]], optional) : Transformation
# matrix from camera to ego-vehicle # matrix from camera to ego-vehicle
# with shape [4, 4]. # with shape [4, 4].
...@@ -159,7 +160,7 @@ def get_empty_standard_data_info( ...@@ -159,7 +160,7 @@ def get_empty_standard_data_info(
data_info = dict( data_info = dict(
# (str): Sample id of the frame. # (str): Sample id of the frame.
sample_id=None, sample_idx=None,
# (str, optional): '000010' # (str, optional): '000010'
token=None, token=None,
**get_single_image_sweep(camera_types), **get_single_image_sweep(camera_types),
...@@ -261,13 +262,9 @@ def update_nuscenes_infos(pkl_path, out_dir): ...@@ -261,13 +262,9 @@ def update_nuscenes_infos(pkl_path, out_dir):
print(f'Reading from input file: {pkl_path}.') print(f'Reading from input file: {pkl_path}.')
data_list = mmengine.load(pkl_path) data_list = mmengine.load(pkl_path)
METAINFO = { METAINFO = {
'CLASSES': 'classes':
('car', 'truck', 'trailer', 'bus', 'construction_vehicle', 'bicycle', ('car', 'truck', 'trailer', 'bus', 'construction_vehicle', 'bicycle',
'motorcycle', 'pedestrian', 'traffic_cone', 'barrier'), 'motorcycle', 'pedestrian', 'traffic_cone', 'barrier'),
'DATASET':
'Nuscenes',
'version':
data_list['metadata']['version']
} }
nusc = NuScenes( nusc = NuScenes(
version=data_list['metadata']['version'], version=data_list['metadata']['version'],
...@@ -287,8 +284,8 @@ def update_nuscenes_infos(pkl_path, out_dir): ...@@ -287,8 +284,8 @@ def update_nuscenes_infos(pkl_path, out_dir):
ori_info_dict['ego2global_translation']) ori_info_dict['ego2global_translation'])
temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict.get( temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict.get(
'num_features', 5) 'num_features', 5)
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[ temp_data_info['lidar_points']['lidar_path'] = Path(
'lidar_path'].split('/')[-1] ori_info_dict['lidar_path']).name
temp_data_info['lidar_points'][ temp_data_info['lidar_points'][
'lidar2ego'] = convert_quaternion_to_matrix( 'lidar2ego'] = convert_quaternion_to_matrix(
ori_info_dict['lidar2ego_rotation'], ori_info_dict['lidar2ego_rotation'],
...@@ -318,8 +315,8 @@ def update_nuscenes_infos(pkl_path, out_dir): ...@@ -318,8 +315,8 @@ def update_nuscenes_infos(pkl_path, out_dir):
temp_data_info['images'] = {} temp_data_info['images'] = {}
for cam in ori_info_dict['cams']: for cam in ori_info_dict['cams']:
empty_img_info = get_empty_img_info() empty_img_info = get_empty_img_info()
empty_img_info['img_path'] = ori_info_dict['cams'][cam][ empty_img_info['img_path'] = Path(
'data_path'].split('/')[-1] ori_info_dict['cams'][cam]['data_path']).name
empty_img_info['cam2img'] = ori_info_dict['cams'][cam][ empty_img_info['cam2img'] = ori_info_dict['cams'][cam][
'cam_intrinsic'].tolist() 'cam_intrinsic'].tolist()
empty_img_info['sample_data_token'] = ori_info_dict['cams'][cam][ empty_img_info['sample_data_token'] = ori_info_dict['cams'][cam][
...@@ -344,8 +341,8 @@ def update_nuscenes_infos(pkl_path, out_dir): ...@@ -344,8 +341,8 @@ def update_nuscenes_infos(pkl_path, out_dir):
empty_instance = get_empty_instance() empty_instance = get_empty_instance()
empty_instance['bbox_3d'] = ori_info_dict['gt_boxes'][ empty_instance['bbox_3d'] = ori_info_dict['gt_boxes'][
i, :].tolist() i, :].tolist()
if ori_info_dict['gt_names'][i] in METAINFO['CLASSES']: if ori_info_dict['gt_names'][i] in METAINFO['classes']:
empty_instance['bbox_label'] = METAINFO['CLASSES'].index( empty_instance['bbox_label'] = METAINFO['classes'].index(
ori_info_dict['gt_names'][i]) ori_info_dict['gt_names'][i])
else: else:
ignore_class_name.add(ori_info_dict['gt_names'][i]) ignore_class_name.add(ori_info_dict['gt_names'][i])
...@@ -363,11 +360,20 @@ def update_nuscenes_infos(pkl_path, out_dir): ...@@ -363,11 +360,20 @@ def update_nuscenes_infos(pkl_path, out_dir):
ori_info_dict, nusc) ori_info_dict, nusc)
temp_data_info, _ = clear_data_info_unused_keys(temp_data_info) temp_data_info, _ = clear_data_info_unused_keys(temp_data_info)
converted_list.append(temp_data_info) converted_list.append(temp_data_info)
pkl_name = pkl_path.split('/')[-1] pkl_name = Path(pkl_path).name
out_path = osp.join(out_dir, pkl_name) out_path = osp.join(out_dir, pkl_name)
print(f'Writing to output file: {out_path}.') print(f'Writing to output file: {out_path}.')
print(f'ignore classes: {ignore_class_name}') print(f'ignore classes: {ignore_class_name}')
converted_data_info = dict(metainfo=METAINFO, data_list=converted_list)
metainfo = dict()
metainfo['categories'] = {k: i for i, k in enumerate(METAINFO['classes'])}
if ignore_class_name:
for ignore_class in ignore_class_name:
metainfo['categories'][ignore_class] = -1
metainfo['dataset'] = 'nuscenes'
metainfo['version'] = data_list['metadata']['version']
metainfo['info_version'] = '1.1'
converted_data_info = dict(metainfo=metainfo, data_list=converted_list)
mmengine.dump(converted_data_info, out_path, 'pkl') mmengine.dump(converted_data_info, out_path, 'pkl')
...@@ -381,7 +387,7 @@ def update_kitti_infos(pkl_path, out_dir): ...@@ -381,7 +387,7 @@ def update_kitti_infos(pkl_path, out_dir):
# TODO update to full label # TODO update to full label
# TODO discuss how to process 'Van', 'DontCare' # TODO discuss how to process 'Van', 'DontCare'
METAINFO = { METAINFO = {
'CLASSES': ('Pedestrian', 'Cyclist', 'Car', 'Van', 'Truck', 'classes': ('Pedestrian', 'Cyclist', 'Car', 'Van', 'Truck',
'Person_sitting', 'Tram', 'Misc'), 'Person_sitting', 'Tram', 'Misc'),
} }
print(f'Reading from input file: {pkl_path}.') print(f'Reading from input file: {pkl_path}.')
...@@ -405,15 +411,15 @@ def update_kitti_infos(pkl_path, out_dir): ...@@ -405,15 +411,15 @@ def update_kitti_infos(pkl_path, out_dir):
temp_data_info['images']['CAM3']['cam2img'] = ori_info_dict['calib'][ temp_data_info['images']['CAM3']['cam2img'] = ori_info_dict['calib'][
'P3'].tolist() 'P3'].tolist()
temp_data_info['images']['CAM2']['img_path'] = ori_info_dict['image'][ temp_data_info['images']['CAM2']['img_path'] = Path(
'image_path'].split('/')[-1] ori_info_dict['image']['image_path']).name
h, w = ori_info_dict['image']['image_shape'] h, w = ori_info_dict['image']['image_shape']
temp_data_info['images']['CAM2']['height'] = h temp_data_info['images']['CAM2']['height'] = h
temp_data_info['images']['CAM2']['width'] = w temp_data_info['images']['CAM2']['width'] = w
temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[ temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[
'point_cloud']['num_features'] 'point_cloud']['num_features']
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[ temp_data_info['lidar_points']['lidar_path'] = Path(
'point_cloud']['velodyne_path'].split('/')[-1] ori_info_dict['point_cloud']['velodyne_path']).name
rect = ori_info_dict['calib']['R0_rect'].astype(np.float32) rect = ori_info_dict['calib']['R0_rect'].astype(np.float32)
Trv2c = ori_info_dict['calib']['Tr_velo_to_cam'].astype(np.float32) Trv2c = ori_info_dict['calib']['Tr_velo_to_cam'].astype(np.float32)
...@@ -446,8 +452,8 @@ def update_kitti_infos(pkl_path, out_dir): ...@@ -446,8 +452,8 @@ def update_kitti_infos(pkl_path, out_dir):
empty_instance = get_empty_instance() empty_instance = get_empty_instance()
empty_instance['bbox'] = anns['bbox'][instance_id].tolist() empty_instance['bbox'] = anns['bbox'][instance_id].tolist()
if anns['name'][instance_id] in METAINFO['CLASSES']: if anns['name'][instance_id] in METAINFO['classes']:
empty_instance['bbox_label'] = METAINFO['CLASSES'].index( empty_instance['bbox_label'] = METAINFO['classes'].index(
anns['name'][instance_id]) anns['name'][instance_id])
else: else:
ignore_class_name.add(anns['name'][instance_id]) ignore_class_name.add(anns['name'][instance_id])
...@@ -493,12 +499,20 @@ def update_kitti_infos(pkl_path, out_dir): ...@@ -493,12 +499,20 @@ def update_kitti_infos(pkl_path, out_dir):
temp_data_info['cam_instances'] = cam_instances temp_data_info['cam_instances'] = cam_instances
temp_data_info, _ = clear_data_info_unused_keys(temp_data_info) temp_data_info, _ = clear_data_info_unused_keys(temp_data_info)
converted_list.append(temp_data_info) converted_list.append(temp_data_info)
pkl_name = pkl_path.split('/')[-1] pkl_name = Path(pkl_path).name
out_path = osp.join(out_dir, pkl_name) out_path = osp.join(out_dir, pkl_name)
print(f'Writing to output file: {out_path}.') print(f'Writing to output file: {out_path}.')
print(f'ignore classes: {ignore_class_name}') print(f'ignore classes: {ignore_class_name}')
converted_data_info = dict(
metainfo={'DATASET': 'KITTI'}, data_list=converted_list) # dataset metainfo
metainfo = dict()
metainfo['categories'] = {k: i for i, k in enumerate(METAINFO['classes'])}
if ignore_class_name:
for ignore_class in ignore_class_name:
metainfo['categories'][ignore_class] = -1
metainfo['dataset'] = 'kitti'
metainfo['info_version'] = '1.1'
converted_data_info = dict(metainfo=metainfo, data_list=converted_list)
mmengine.dump(converted_data_info, out_path, 'pkl') mmengine.dump(converted_data_info, out_path, 'pkl')
...@@ -509,7 +523,7 @@ def update_s3dis_infos(pkl_path, out_dir): ...@@ -509,7 +523,7 @@ def update_s3dis_infos(pkl_path, out_dir):
print(f'Warning, you may overwriting ' print(f'Warning, you may overwriting '
f'the original data {pkl_path}.') f'the original data {pkl_path}.')
time.sleep(5) time.sleep(5)
METAINFO = {'CLASSES': ('table', 'chair', 'sofa', 'bookcase', 'board')} METAINFO = {'classes': ('table', 'chair', 'sofa', 'bookcase', 'board')}
print(f'Reading from input file: {pkl_path}.') print(f'Reading from input file: {pkl_path}.')
data_list = mmengine.load(pkl_path) data_list = mmengine.load(pkl_path)
print('Start updating:') print('Start updating:')
...@@ -519,12 +533,12 @@ def update_s3dis_infos(pkl_path, out_dir): ...@@ -519,12 +533,12 @@ def update_s3dis_infos(pkl_path, out_dir):
temp_data_info['sample_idx'] = i temp_data_info['sample_idx'] = i
temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[ temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[
'point_cloud']['num_features'] 'point_cloud']['num_features']
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[ temp_data_info['lidar_points']['lidar_path'] = Path(
'pts_path'].split('/')[-1] ori_info_dict['pts_path']).name
temp_data_info['pts_semantic_mask_path'] = ori_info_dict[ temp_data_info['pts_semantic_mask_path'] = Path(
'pts_semantic_mask_path'].split('/')[-1] ori_info_dict['pts_semantic_mask_path']).name
temp_data_info['pts_instance_mask_path'] = ori_info_dict[ temp_data_info['pts_instance_mask_path'] = Path(
'pts_instance_mask_path'].split('/')[-1] ori_info_dict['pts_instance_mask_path']).name
# TODO support camera # TODO support camera
# np.linalg.inv(info['axis_align_matrix'] @ extrinsic): depth2cam # np.linalg.inv(info['axis_align_matrix'] @ extrinsic): depth2cam
...@@ -541,12 +555,12 @@ def update_s3dis_infos(pkl_path, out_dir): ...@@ -541,12 +555,12 @@ def update_s3dis_infos(pkl_path, out_dir):
empty_instance['bbox_3d'] = anns['gt_boxes_upright_depth'][ empty_instance['bbox_3d'] = anns['gt_boxes_upright_depth'][
instance_id].tolist() instance_id].tolist()
if anns['class'][instance_id] < len(METAINFO['CLASSES']): if anns['class'][instance_id] < len(METAINFO['classes']):
empty_instance['bbox_label_3d'] = anns['class'][ empty_instance['bbox_label_3d'] = anns['class'][
instance_id] instance_id]
else: else:
ignore_class_name.add( ignore_class_name.add(
METAINFO['CLASSES'][anns['class'][instance_id]]) METAINFO['classes'][anns['class'][instance_id]])
empty_instance['bbox_label_3d'] = -1 empty_instance['bbox_label_3d'] = -1
empty_instance = clear_instance_unused_keys(empty_instance) empty_instance = clear_instance_unused_keys(empty_instance)
...@@ -554,12 +568,21 @@ def update_s3dis_infos(pkl_path, out_dir): ...@@ -554,12 +568,21 @@ def update_s3dis_infos(pkl_path, out_dir):
temp_data_info['instances'] = instance_list temp_data_info['instances'] = instance_list
temp_data_info, _ = clear_data_info_unused_keys(temp_data_info) temp_data_info, _ = clear_data_info_unused_keys(temp_data_info)
converted_list.append(temp_data_info) converted_list.append(temp_data_info)
pkl_name = pkl_path.split('/')[-1] pkl_name = Path(pkl_path).name
out_path = osp.join(out_dir, pkl_name) out_path = osp.join(out_dir, pkl_name)
print(f'Writing to output file: {out_path}.') print(f'Writing to output file: {out_path}.')
print(f'ignore classes: {ignore_class_name}') print(f'ignore classes: {ignore_class_name}')
converted_data_info = dict(
metainfo={'DATASET': 'S3DIS'}, data_list=converted_list) # dataset metainfo
metainfo = dict()
metainfo['categories'] = {k: i for i, k in enumerate(METAINFO['classes'])}
if ignore_class_name:
for ignore_class in ignore_class_name:
metainfo['categories'][ignore_class] = -1
metainfo['dataset'] = 's3dis'
metainfo['info_version'] = '1.1'
converted_data_info = dict(metainfo=metainfo, data_list=converted_list)
mmengine.dump(converted_data_info, out_path, 'pkl') mmengine.dump(converted_data_info, out_path, 'pkl')
...@@ -571,7 +594,7 @@ def update_scannet_infos(pkl_path, out_dir): ...@@ -571,7 +594,7 @@ def update_scannet_infos(pkl_path, out_dir):
f'the original data {pkl_path}.') f'the original data {pkl_path}.')
time.sleep(5) time.sleep(5)
METAINFO = { METAINFO = {
'CLASSES': 'classes':
('cabinet', 'bed', 'chair', 'sofa', 'table', 'door', 'window', ('cabinet', 'bed', 'chair', 'sofa', 'table', 'door', 'window',
'bookshelf', 'picture', 'counter', 'desk', 'curtain', 'refrigerator', 'bookshelf', 'picture', 'counter', 'desk', 'curtain', 'refrigerator',
'showercurtrain', 'toilet', 'sink', 'bathtub', 'garbagebin') 'showercurtrain', 'toilet', 'sink', 'bathtub', 'garbagebin')
...@@ -584,12 +607,12 @@ def update_scannet_infos(pkl_path, out_dir): ...@@ -584,12 +607,12 @@ def update_scannet_infos(pkl_path, out_dir):
temp_data_info = get_empty_standard_data_info() temp_data_info = get_empty_standard_data_info()
temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[ temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[
'point_cloud']['num_features'] 'point_cloud']['num_features']
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[ temp_data_info['lidar_points']['lidar_path'] = Path(
'pts_path'].split('/')[-1] ori_info_dict['pts_path']).name
temp_data_info['pts_semantic_mask_path'] = ori_info_dict[ temp_data_info['pts_semantic_mask_path'] = Path(
'pts_semantic_mask_path'].split('/')[-1] ori_info_dict['pts_semantic_mask_path']).name
temp_data_info['pts_instance_mask_path'] = ori_info_dict[ temp_data_info['pts_instance_mask_path'] = Path(
'pts_instance_mask_path'].split('/')[-1] ori_info_dict['pts_instance_mask_path']).name
# TODO support camera # TODO support camera
# np.linalg.inv(info['axis_align_matrix'] @ extrinsic): depth2cam # np.linalg.inv(info['axis_align_matrix'] @ extrinsic): depth2cam
...@@ -607,9 +630,9 @@ def update_scannet_infos(pkl_path, out_dir): ...@@ -607,9 +630,9 @@ def update_scannet_infos(pkl_path, out_dir):
empty_instance['bbox_3d'] = anns['gt_boxes_upright_depth'][ empty_instance['bbox_3d'] = anns['gt_boxes_upright_depth'][
instance_id].tolist() instance_id].tolist()
if anns['name'][instance_id] in METAINFO['CLASSES']: if anns['name'][instance_id] in METAINFO['classes']:
empty_instance['bbox_label_3d'] = METAINFO[ empty_instance['bbox_label_3d'] = METAINFO[
'CLASSES'].index(anns['name'][instance_id]) 'classes'].index(anns['name'][instance_id])
else: else:
ignore_class_name.add(anns['name'][instance_id]) ignore_class_name.add(anns['name'][instance_id])
empty_instance['bbox_label_3d'] = -1 empty_instance['bbox_label_3d'] = -1
...@@ -619,12 +642,21 @@ def update_scannet_infos(pkl_path, out_dir): ...@@ -619,12 +642,21 @@ def update_scannet_infos(pkl_path, out_dir):
temp_data_info['instances'] = instance_list temp_data_info['instances'] = instance_list
temp_data_info, _ = clear_data_info_unused_keys(temp_data_info) temp_data_info, _ = clear_data_info_unused_keys(temp_data_info)
converted_list.append(temp_data_info) converted_list.append(temp_data_info)
pkl_name = pkl_path.split('/')[-1] pkl_name = Path(pkl_path).name
out_path = osp.join(out_dir, pkl_name) out_path = osp.join(out_dir, pkl_name)
print(f'Writing to output file: {out_path}.') print(f'Writing to output file: {out_path}.')
print(f'ignore classes: {ignore_class_name}') print(f'ignore classes: {ignore_class_name}')
converted_data_info = dict(
metainfo={'DATASET': 'SCANNET'}, data_list=converted_list) # dataset metainfo
metainfo = dict()
metainfo['categories'] = {k: i for i, k in enumerate(METAINFO['classes'])}
if ignore_class_name:
for ignore_class in ignore_class_name:
metainfo['categories'][ignore_class] = -1
metainfo['dataset'] = 'scannet'
metainfo['info_version'] = '1.1'
converted_data_info = dict(metainfo=metainfo, data_list=converted_list)
mmengine.dump(converted_data_info, out_path, 'pkl') mmengine.dump(converted_data_info, out_path, 'pkl')
...@@ -636,7 +668,7 @@ def update_sunrgbd_infos(pkl_path, out_dir): ...@@ -636,7 +668,7 @@ def update_sunrgbd_infos(pkl_path, out_dir):
f'the original data {pkl_path}.') f'the original data {pkl_path}.')
time.sleep(5) time.sleep(5)
METAINFO = { METAINFO = {
'CLASSES': ('bed', 'table', 'sofa', 'chair', 'toilet', 'desk', 'classes': ('bed', 'table', 'sofa', 'chair', 'toilet', 'desk',
'dresser', 'night_stand', 'bookshelf', 'bathtub') 'dresser', 'night_stand', 'bookshelf', 'bathtub')
} }
print(f'Reading from input file: {pkl_path}.') print(f'Reading from input file: {pkl_path}.')
...@@ -647,8 +679,8 @@ def update_sunrgbd_infos(pkl_path, out_dir): ...@@ -647,8 +679,8 @@ def update_sunrgbd_infos(pkl_path, out_dir):
temp_data_info = get_empty_standard_data_info() temp_data_info = get_empty_standard_data_info()
temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[ temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[
'point_cloud']['num_features'] 'point_cloud']['num_features']
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[ temp_data_info['lidar_points']['lidar_path'] = Path(
'pts_path'].split('/')[-1] ori_info_dict['pts_path']).name
calib = ori_info_dict['calib'] calib = ori_info_dict['calib']
rt_mat = calib['Rt'] rt_mat = calib['Rt']
# follow Coord3DMode.convert_point # follow Coord3DMode.convert_point
...@@ -656,8 +688,8 @@ def update_sunrgbd_infos(pkl_path, out_dir): ...@@ -656,8 +688,8 @@ def update_sunrgbd_infos(pkl_path, out_dir):
]) @ rt_mat.transpose(1, 0) ]) @ rt_mat.transpose(1, 0)
depth2img = calib['K'] @ rt_mat depth2img = calib['K'] @ rt_mat
temp_data_info['images']['CAM0']['depth2img'] = depth2img.tolist() temp_data_info['images']['CAM0']['depth2img'] = depth2img.tolist()
temp_data_info['images']['CAM0']['img_path'] = ori_info_dict['image'][ temp_data_info['images']['CAM0']['img_path'] = Path(
'image_path'].split('/')[-1] ori_info_dict['image']['image_path']).name
h, w = ori_info_dict['image']['image_shape'] h, w = ori_info_dict['image']['image_shape']
temp_data_info['images']['CAM0']['height'] = h temp_data_info['images']['CAM0']['height'] = h
temp_data_info['images']['CAM0']['width'] = w temp_data_info['images']['CAM0']['width'] = w
...@@ -674,9 +706,9 @@ def update_sunrgbd_infos(pkl_path, out_dir): ...@@ -674,9 +706,9 @@ def update_sunrgbd_infos(pkl_path, out_dir):
empty_instance['bbox_3d'] = anns['gt_boxes_upright_depth'][ empty_instance['bbox_3d'] = anns['gt_boxes_upright_depth'][
instance_id].tolist() instance_id].tolist()
empty_instance['bbox'] = anns['bbox'][instance_id].tolist() empty_instance['bbox'] = anns['bbox'][instance_id].tolist()
if anns['name'][instance_id] in METAINFO['CLASSES']: if anns['name'][instance_id] in METAINFO['classes']:
empty_instance['bbox_label_3d'] = METAINFO[ empty_instance['bbox_label_3d'] = METAINFO[
'CLASSES'].index(anns['name'][instance_id]) 'classes'].index(anns['name'][instance_id])
empty_instance['bbox_label'] = empty_instance[ empty_instance['bbox_label'] = empty_instance[
'bbox_label_3d'] 'bbox_label_3d']
else: else:
...@@ -688,12 +720,21 @@ def update_sunrgbd_infos(pkl_path, out_dir): ...@@ -688,12 +720,21 @@ def update_sunrgbd_infos(pkl_path, out_dir):
temp_data_info['instances'] = instance_list temp_data_info['instances'] = instance_list
temp_data_info, _ = clear_data_info_unused_keys(temp_data_info) temp_data_info, _ = clear_data_info_unused_keys(temp_data_info)
converted_list.append(temp_data_info) converted_list.append(temp_data_info)
pkl_name = pkl_path.split('/')[-1] pkl_name = Path(pkl_path).name
out_path = osp.join(out_dir, pkl_name) out_path = osp.join(out_dir, pkl_name)
print(f'Writing to output file: {out_path}.') print(f'Writing to output file: {out_path}.')
print(f'ignore classes: {ignore_class_name}') print(f'ignore classes: {ignore_class_name}')
converted_data_info = dict(
metainfo={'DATASET': 'SUNRGBD'}, data_list=converted_list) # dataset metainfo
metainfo = dict()
metainfo['categories'] = {k: i for i, k in enumerate(METAINFO['classes'])}
if ignore_class_name:
for ignore_class in ignore_class_name:
metainfo['categories'][ignore_class] = -1
metainfo['dataset'] = 'sunrgbd'
metainfo['info_version'] = '1.1'
converted_data_info = dict(metainfo=metainfo, data_list=converted_list)
mmengine.dump(converted_data_info, out_path, 'pkl') mmengine.dump(converted_data_info, out_path, 'pkl')
...@@ -706,13 +747,9 @@ def update_lyft_infos(pkl_path, out_dir): ...@@ -706,13 +747,9 @@ def update_lyft_infos(pkl_path, out_dir):
print(f'Reading from input file: {pkl_path}.') print(f'Reading from input file: {pkl_path}.')
data_list = mmengine.load(pkl_path) data_list = mmengine.load(pkl_path)
METAINFO = { METAINFO = {
'CLASSES': 'classes':
('car', 'truck', 'bus', 'emergency_vehicle', 'other_vehicle', ('car', 'truck', 'bus', 'emergency_vehicle', 'other_vehicle',
'motorcycle', 'bicycle', 'pedestrian', 'animal'), 'motorcycle', 'bicycle', 'pedestrian', 'animal'),
'DATASET':
'Nuscenes',
'version':
data_list['metadata']['version']
} }
print('Start updating:') print('Start updating:')
converted_list = [] converted_list = []
...@@ -724,8 +761,10 @@ def update_lyft_infos(pkl_path, out_dir): ...@@ -724,8 +761,10 @@ def update_lyft_infos(pkl_path, out_dir):
temp_data_info['ego2global'] = convert_quaternion_to_matrix( temp_data_info['ego2global'] = convert_quaternion_to_matrix(
ori_info_dict['ego2global_rotation'], ori_info_dict['ego2global_rotation'],
ori_info_dict['ego2global_translation']) ori_info_dict['ego2global_translation'])
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[ temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict.get(
'lidar_path'].split('/')[-1] 'num_features', 5)
temp_data_info['lidar_points']['lidar_path'] = Path(
ori_info_dict['lidar_path']).name
temp_data_info['lidar_points'][ temp_data_info['lidar_points'][
'lidar2ego'] = convert_quaternion_to_matrix( 'lidar2ego'] = convert_quaternion_to_matrix(
ori_info_dict['lidar2ego_rotation'], ori_info_dict['lidar2ego_rotation'],
...@@ -756,8 +795,8 @@ def update_lyft_infos(pkl_path, out_dir): ...@@ -756,8 +795,8 @@ def update_lyft_infos(pkl_path, out_dir):
temp_data_info['images'] = {} temp_data_info['images'] = {}
for cam in ori_info_dict['cams']: for cam in ori_info_dict['cams']:
empty_img_info = get_empty_img_info() empty_img_info = get_empty_img_info()
empty_img_info['img_path'] = ori_info_dict['cams'][cam][ empty_img_info['img_path'] = Path(
'data_path'].split('/')[-1] ori_info_dict['cams'][cam]['data_path']).name
empty_img_info['cam2img'] = ori_info_dict['cams'][cam][ empty_img_info['cam2img'] = ori_info_dict['cams'][cam][
'cam_intrinsic'].tolist() 'cam_intrinsic'].tolist()
empty_img_info['sample_data_token'] = ori_info_dict['cams'][cam][ empty_img_info['sample_data_token'] = ori_info_dict['cams'][cam][
...@@ -781,8 +820,8 @@ def update_lyft_infos(pkl_path, out_dir): ...@@ -781,8 +820,8 @@ def update_lyft_infos(pkl_path, out_dir):
empty_instance = get_empty_instance() empty_instance = get_empty_instance()
empty_instance['bbox_3d'] = ori_info_dict['gt_boxes'][ empty_instance['bbox_3d'] = ori_info_dict['gt_boxes'][
i, :].tolist() i, :].tolist()
if ori_info_dict['gt_names'][i] in METAINFO['CLASSES']: if ori_info_dict['gt_names'][i] in METAINFO['classes']:
empty_instance['bbox_label'] = METAINFO['CLASSES'].index( empty_instance['bbox_label'] = METAINFO['classes'].index(
ori_info_dict['gt_names'][i]) ori_info_dict['gt_names'][i])
else: else:
ignore_class_name.add(ori_info_dict['gt_names'][i]) ignore_class_name.add(ori_info_dict['gt_names'][i])
...@@ -793,11 +832,20 @@ def update_lyft_infos(pkl_path, out_dir): ...@@ -793,11 +832,20 @@ def update_lyft_infos(pkl_path, out_dir):
temp_data_info['instances'].append(empty_instance) temp_data_info['instances'].append(empty_instance)
temp_data_info, _ = clear_data_info_unused_keys(temp_data_info) temp_data_info, _ = clear_data_info_unused_keys(temp_data_info)
converted_list.append(temp_data_info) converted_list.append(temp_data_info)
pkl_name = pkl_path.split('/')[-1] pkl_name = Path(pkl_path).name
out_path = osp.join(out_dir, pkl_name) out_path = osp.join(out_dir, pkl_name)
print(f'Writing to output file: {out_path}.') print(f'Writing to output file: {out_path}.')
print(f'ignore classes: {ignore_class_name}') print(f'ignore classes: {ignore_class_name}')
converted_data_info = dict(metainfo=METAINFO, data_list=converted_list)
metainfo = dict()
metainfo['categories'] = {k: i for i, k in enumerate(METAINFO['classes'])}
if ignore_class_name:
for ignore_class in ignore_class_name:
metainfo['categories'][ignore_class] = -1
metainfo['dataset'] = 'lyft'
metainfo['version'] = data_list['metadata']['version']
metainfo['info_version'] = '1.1'
converted_data_info = dict(metainfo=metainfo, data_list=converted_list)
mmengine.dump(converted_data_info, out_path, 'pkl') mmengine.dump(converted_data_info, out_path, 'pkl')
...@@ -820,7 +868,7 @@ def update_waymo_infos(pkl_path, out_dir): ...@@ -820,7 +868,7 @@ def update_waymo_infos(pkl_path, out_dir):
# TODO update to full label # TODO update to full label
# TODO discuss how to process 'Van', 'DontCare' # TODO discuss how to process 'Van', 'DontCare'
METAINFO = { METAINFO = {
'CLASSES': ('Car', 'Pedestrian', 'Cyclist', 'Sign'), 'classes': ('Car', 'Pedestrian', 'Cyclist', 'Sign'),
} }
print(f'Reading from input file: {pkl_path}.') print(f'Reading from input file: {pkl_path}.')
data_list = mmengine.load(pkl_path) data_list = mmengine.load(pkl_path)
...@@ -851,7 +899,7 @@ def update_waymo_infos(pkl_path, out_dir): ...@@ -851,7 +899,7 @@ def update_waymo_infos(pkl_path, out_dir):
ori_info_dict['calib'][f'P{cam_idx}'] @ lidar2cam).tolist() ori_info_dict['calib'][f'P{cam_idx}'] @ lidar2cam).tolist()
# image path # image path
base_img_path = ori_info_dict['image']['image_path'].split('/')[-1] base_img_path = Path(ori_info_dict['image']['image_path']).name
for cam_idx, cam_key in enumerate(camera_types): for cam_idx, cam_key in enumerate(camera_types):
temp_data_info['images'][cam_key]['timestamp'] = ori_info_dict[ temp_data_info['images'][cam_key]['timestamp'] = ori_info_dict[
...@@ -867,8 +915,8 @@ def update_waymo_infos(pkl_path, out_dir): ...@@ -867,8 +915,8 @@ def update_waymo_infos(pkl_path, out_dir):
'point_cloud']['num_features'] 'point_cloud']['num_features']
temp_data_info['lidar_points']['timestamp'] = ori_info_dict[ temp_data_info['lidar_points']['timestamp'] = ori_info_dict[
'timestamp'] 'timestamp']
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[ temp_data_info['lidar_points']['lidar_path'] = Path(
'point_cloud']['velodyne_path'].split('/')[-1] ori_info_dict['point_cloud']['velodyne_path']).name
# TODO discuss the usage of Tr_velo_to_cam in lidar # TODO discuss the usage of Tr_velo_to_cam in lidar
Trv2c = ori_info_dict['calib']['Tr_velo_to_cam'].astype(np.float32) Trv2c = ori_info_dict['calib']['Tr_velo_to_cam'].astype(np.float32)
...@@ -888,13 +936,13 @@ def update_waymo_infos(pkl_path, out_dir): ...@@ -888,13 +936,13 @@ def update_waymo_infos(pkl_path, out_dir):
lidar_sweep = get_single_lidar_sweep() lidar_sweep = get_single_lidar_sweep()
lidar_sweep['ego2global'] = ori_sweep['pose'] lidar_sweep['ego2global'] = ori_sweep['pose']
lidar_sweep['timestamp'] = ori_sweep['timestamp'] lidar_sweep['timestamp'] = ori_sweep['timestamp']
lidar_sweep['lidar_points']['lidar_path'] = ori_sweep[ lidar_sweep['lidar_points']['lidar_path'] = Path(
'velodyne_path'].split('/')[-1] ori_sweep['velodyne_path']).name
# image sweeps # image sweeps
image_sweep = get_single_image_sweep(camera_types) image_sweep = get_single_image_sweep(camera_types)
image_sweep['ego2global'] = ori_sweep['pose'] image_sweep['ego2global'] = ori_sweep['pose']
image_sweep['timestamp'] = ori_sweep['timestamp'] image_sweep['timestamp'] = ori_sweep['timestamp']
img_path = ori_sweep['image_path'].split('/')[-1] img_path = Path(ori_sweep['image_path']).name
for cam_idx, cam_key in enumerate(camera_types): for cam_idx, cam_key in enumerate(camera_types):
image_sweep['images'][cam_key]['img_path'] = img_path image_sweep['images'][cam_key]['img_path'] = img_path
...@@ -910,8 +958,8 @@ def update_waymo_infos(pkl_path, out_dir): ...@@ -910,8 +958,8 @@ def update_waymo_infos(pkl_path, out_dir):
empty_instance = get_empty_instance() empty_instance = get_empty_instance()
empty_instance['bbox'] = anns['bbox'][instance_id].tolist() empty_instance['bbox'] = anns['bbox'][instance_id].tolist()
if anns['name'][instance_id] in METAINFO['CLASSES']: if anns['name'][instance_id] in METAINFO['classes']:
empty_instance['bbox_label'] = METAINFO['CLASSES'].index( empty_instance['bbox_label'] = METAINFO['classes'].index(
anns['name'][instance_id]) anns['name'][instance_id])
else: else:
ignore_class_name.add(anns['name'][instance_id]) ignore_class_name.add(anns['name'][instance_id])
...@@ -954,8 +1002,8 @@ def update_waymo_infos(pkl_path, out_dir): ...@@ -954,8 +1002,8 @@ def update_waymo_infos(pkl_path, out_dir):
empty_instance = get_empty_instance() empty_instance = get_empty_instance()
empty_instance['bbox'] = anns['bbox'][instance_id].tolist() empty_instance['bbox'] = anns['bbox'][instance_id].tolist()
if anns['name'][instance_id] in METAINFO['CLASSES']: if anns['name'][instance_id] in METAINFO['classes']:
empty_instance['bbox_label'] = METAINFO['CLASSES'].index( empty_instance['bbox_label'] = METAINFO['classes'].index(
anns['name'][instance_id]) anns['name'][instance_id])
else: else:
ignore_class_name.add(anns['name'][instance_id]) ignore_class_name.add(anns['name'][instance_id])
...@@ -991,12 +1039,22 @@ def update_waymo_infos(pkl_path, out_dir): ...@@ -991,12 +1039,22 @@ def update_waymo_infos(pkl_path, out_dir):
temp_data_info, _ = clear_data_info_unused_keys(temp_data_info) temp_data_info, _ = clear_data_info_unused_keys(temp_data_info)
converted_list.append(temp_data_info) converted_list.append(temp_data_info)
pkl_name = pkl_path.split('/')[-1] pkl_name = Path(pkl_path).name
out_path = osp.join(out_dir, pkl_name) out_path = osp.join(out_dir, pkl_name)
print(f'Writing to output file: {out_path}.') print(f'Writing to output file: {out_path}.')
print(f'ignore classes: {ignore_class_name}') print(f'ignore classes: {ignore_class_name}')
converted_data_info = dict(
metainfo={'DATASET': 'Waymo'}, data_list=converted_list) # dataset metainfo
metainfo = dict()
metainfo['categories'] = {k: i for i, k in enumerate(METAINFO['classes'])}
if ignore_class_name:
for ignore_class in ignore_class_name:
metainfo['categories'][ignore_class] = -1
metainfo['dataset'] = 'waymo'
metainfo['version'] = '1.2'
metainfo['info_version'] = '1.1'
converted_data_info = dict(metainfo=metainfo, data_list=converted_list)
mmengine.dump(converted_data_info, out_path, 'pkl') mmengine.dump(converted_data_info, out_path, 'pkl')
...@@ -1073,4 +1131,4 @@ if __name__ == '__main__': ...@@ -1073,4 +1131,4 @@ if __name__ == '__main__':
if args.out_dir is None: if args.out_dir is None:
args.out_dir = args.root_dir args.out_dir = args.root_dir
update_pkl_infos( update_pkl_infos(
dataset=args.dataset, out_dir=args.out_dir, pkl_path=args.pkl) dataset=args.dataset, out_dir=args.out_dir, pkl_path=args.pkl_path)
...@@ -12,7 +12,6 @@ except ImportError: ...@@ -12,7 +12,6 @@ except ImportError:
from glob import glob from glob import glob
from os.path import join from os.path import join
import mmcv
import mmengine import mmengine
import numpy as np import numpy as np
import tensorflow as tf import tensorflow as tf
...@@ -70,10 +69,7 @@ class Waymo2KITTI(object): ...@@ -70,10 +69,7 @@ class Waymo2KITTI(object):
'_SIDE_LEFT', '_SIDE_LEFT',
'_SIDE_RIGHT', '_SIDE_RIGHT',
] ]
self.lidar_list = [ self.lidar_list = ['TOP', 'FRONT', 'SIDE_LEFT', 'SIDE_RIGHT', 'REAR']
'_FRONT', '_FRONT_RIGHT', '_FRONT_LEFT', '_SIDE_RIGHT',
'_SIDE_LEFT'
]
self.type_list = [ self.type_list = [
'UNKNOWN', 'VEHICLE', 'PEDESTRIAN', 'SIGN', 'CYCLIST' 'UNKNOWN', 'VEHICLE', 'PEDESTRIAN', 'SIGN', 'CYCLIST'
] ]
...@@ -136,7 +132,9 @@ class Waymo2KITTI(object): ...@@ -136,7 +132,9 @@ class Waymo2KITTI(object):
self.save_image(frame, file_idx, frame_idx) self.save_image(frame, file_idx, frame_idx)
self.save_calib(frame, file_idx, frame_idx) self.save_calib(frame, file_idx, frame_idx)
self.save_lidar(frame, file_idx, frame_idx) if 'testing_3d_camera_only_detection' not in self.load_dir:
# the camera only split doesn't contain lidar points.
self.save_lidar(frame, file_idx, frame_idx)
self.save_pose(frame, file_idx, frame_idx) self.save_pose(frame, file_idx, frame_idx)
self.save_timestamp(frame, file_idx, frame_idx) self.save_timestamp(frame, file_idx, frame_idx)
...@@ -162,8 +160,8 @@ class Waymo2KITTI(object): ...@@ -162,8 +160,8 @@ class Waymo2KITTI(object):
img_path = f'{self.image_save_dir}{str(img.name - 1)}/' + \ img_path = f'{self.image_save_dir}{str(img.name - 1)}/' + \
f'{self.prefix}{str(file_idx).zfill(3)}' + \ f'{self.prefix}{str(file_idx).zfill(3)}' + \
f'{str(frame_idx).zfill(3)}.jpg' f'{str(frame_idx).zfill(3)}.jpg'
img = mmcv.imfrombytes(img.image) with open(img_path, 'wb') as fp:
mmcv.imwrite(img, img_path) fp.write(img.image)
def save_calib(self, frame, file_idx, frame_idx): def save_calib(self, frame, file_idx, frame_idx):
"""Parse and save the calibration data. """Parse and save the calibration data.
...@@ -442,7 +440,6 @@ class Waymo2KITTI(object): ...@@ -442,7 +440,6 @@ class Waymo2KITTI(object):
dir_list1 = [ dir_list1 = [
self.label_all_save_dir, self.label_all_save_dir,
self.calib_save_dir, self.calib_save_dir,
self.point_cloud_save_dir,
self.pose_save_dir, self.pose_save_dir,
self.timestamp_save_dir, self.timestamp_save_dir,
] ]
...@@ -452,10 +449,12 @@ class Waymo2KITTI(object): ...@@ -452,10 +449,12 @@ class Waymo2KITTI(object):
dir_list2.append(self.cam_sync_label_save_dir) dir_list2.append(self.cam_sync_label_save_dir)
else: else:
dir_list1 = [ dir_list1 = [
self.calib_save_dir, self.point_cloud_save_dir, self.calib_save_dir, self.pose_save_dir,
self.pose_save_dir, self.timestamp_save_dir self.timestamp_save_dir
] ]
dir_list2 = [self.image_save_dir] dir_list2 = [self.image_save_dir]
if 'testing_3d_camera_only_detection' not in self.load_dir:
dir_list1.append(self.point_cloud_save_dir)
for d in dir_list1: for d in dir_list1:
mmengine.mkdir_or_exist(d) mmengine.mkdir_or_exist(d)
for d in dir_list2: for d in dir_list2:
......
...@@ -71,7 +71,7 @@ def build_data_cfg(config_path, aug, cfg_options): ...@@ -71,7 +71,7 @@ def build_data_cfg(config_path, aug, cfg_options):
if aug: if aug:
show_pipeline = cfg.train_pipeline show_pipeline = cfg.train_pipeline
else: else:
show_pipeline = cfg.eval_pipeline show_pipeline = cfg.test_pipeline
for i in range(len(cfg.train_pipeline)): for i in range(len(cfg.train_pipeline)):
if cfg.train_pipeline[i]['type'] == 'LoadAnnotations3D': if cfg.train_pipeline[i]['type'] == 'LoadAnnotations3D':
show_pipeline.insert(i, cfg.train_pipeline[i]) show_pipeline.insert(i, cfg.train_pipeline[i])
...@@ -117,13 +117,20 @@ def main(): ...@@ -117,13 +117,20 @@ def main():
progress_bar = ProgressBar(len(dataset)) progress_bar = ProgressBar(len(dataset))
for item in dataset: for i, item in enumerate(dataset):
# the 3D Boxes in input could be in any of three coordinates # the 3D Boxes in input could be in any of three coordinates
data_input = item['inputs'] data_input = item['inputs']
data_sample = item['data_samples'].numpy() data_sample = item['data_samples'].numpy()
out_file = osp.join( out_file = osp.join(
args.output_dir) if args.output_dir is not None else None args.output_dir,
f'{i}.jpg') if args.output_dir is not None else None
# o3d_save_path is valid when args.not_show is False
o3d_save_path = osp.join(args.output_dir, f'pc_{i}.png') if (
args.output_dir is not None
and vis_task in ['lidar_det', 'lidar_seg', 'multi-modality_det']
and not args.not_show) else None
visualizer.add_datasample( visualizer.add_datasample(
'3d visualzier', '3d visualzier',
...@@ -132,6 +139,7 @@ def main(): ...@@ -132,6 +139,7 @@ def main():
show=not args.not_show, show=not args.not_show,
wait_time=args.show_interval, wait_time=args.show_interval,
out_file=out_file, out_file=out_file,
o3d_save_path=o3d_save_path,
vis_task=vis_task) vis_task=vis_task)
progress_bar.update() progress_bar.update()
......
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