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
from mmengine import DefaultScope
from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs,
_get_detector_cfg, _setup_seed)
from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
setup_seed)
class TestImvoteNet(unittest.TestCase):
......@@ -15,12 +15,12 @@ class TestImvoteNet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'ImVoteNet')
DefaultScope.get_instance('test_imvotenet_img', scope_name='mmdet3d')
_setup_seed(0)
votenet_net_cfg = _get_detector_cfg(
setup_seed(0)
votenet_net_cfg = get_detector_cfg(
'imvotenet/imvotenet_faster-rcnn-r50_fpn_4xb2_sunrgbd-3d.py')
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)
if torch.cuda.is_available():
......@@ -49,12 +49,12 @@ class TestImvoteNet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'ImVoteNet')
DefaultScope.get_instance('test_imvotenet', scope_name='mmdet3d')
_setup_seed(0)
votenet_net_cfg = _get_detector_cfg(
setup_seed(0)
votenet_net_cfg = get_detector_cfg(
'imvotenet/imvotenet_stage2_8xb16_sunrgbd-3d.py')
model = MODELS.build(votenet_net_cfg)
packed_inputs = _create_detector_inputs(
packed_inputs = create_detector_inputs(
with_points=True,
with_img=True,
img_size=128,
......
......@@ -4,8 +4,8 @@ import torch
from mmengine import DefaultScope
from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs,
_get_detector_cfg, _setup_seed)
from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
setup_seed)
class TestImVoxelNet(unittest.TestCase):
......@@ -15,12 +15,12 @@ class TestImVoxelNet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'ImVoxelNet')
DefaultScope.get_instance('test_ImVoxelNet', scope_name='mmdet3d')
_setup_seed(0)
imvoxel_net_cfg = _get_detector_cfg(
setup_seed(0)
imvoxel_net_cfg = get_detector_cfg(
'imvoxelnet/imvoxelnet_8xb4_kitti-3d-car.py')
model = MODELS.build(imvoxel_net_cfg)
num_gt_instance = 1
packed_inputs = _create_detector_inputs(
packed_inputs = create_detector_inputs(
with_points=False,
with_img=True,
img_size=(128, 128),
......
......@@ -4,8 +4,8 @@ import torch
from mmengine import DefaultScope
from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs,
_get_detector_cfg, _setup_seed)
from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
setup_seed)
class TestMVXNet(unittest.TestCase):
......@@ -15,14 +15,14 @@ class TestMVXNet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'DynamicMVXFasterRCNN')
_setup_seed(0)
setup_seed(0)
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
)
model = MODELS.build(mvx_net_cfg)
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)
if torch.cuda.is_available():
......
......@@ -4,8 +4,8 @@ import torch
from mmengine import DefaultScope
from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs,
_get_detector_cfg, _setup_seed)
from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
setup_seed)
class TestPartA2(unittest.TestCase):
......@@ -15,18 +15,17 @@ class TestPartA2(unittest.TestCase):
assert hasattr(mmdet3d.models, 'PartA2')
DefaultScope.get_instance('test_parta2', scope_name='mmdet3d')
_setup_seed(0)
parta2_cfg = _get_detector_cfg(
'parta2/PartA2_hv_secfpn_8xb2-cyclic-80e_kitti-3d-3class.py')
setup_seed(0)
parta2_cfg = get_detector_cfg(
'parta2/parta2_hv_secfpn_8xb2-cyclic-80e_kitti-3d-3class.py')
model = MODELS.build(parta2_cfg)
num_gt_instance = 2
packed_inputs = _create_detector_inputs(
num_gt_instance=num_gt_instance)
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)
# create_detector_inputs(num_gt_instance=num_gt_instance),
# create_detector_inputs(num_gt_instance=num_gt_instance + 1)
# ]
# test_aug_test
# metainfo = {
......
......@@ -4,8 +4,8 @@ import torch
from mmengine import DefaultScope
from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs,
_get_detector_cfg, _setup_seed)
from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
setup_seed)
class TestPointRCNN(unittest.TestCase):
......@@ -15,12 +15,12 @@ class TestPointRCNN(unittest.TestCase):
assert hasattr(mmdet3d.models, 'PointRCNN')
DefaultScope.get_instance('test_pointrcnn', scope_name='mmdet3d')
_setup_seed(0)
pointrcnn_cfg = _get_detector_cfg(
setup_seed(0)
pointrcnn_cfg = get_detector_cfg(
'point_rcnn/point-rcnn_8xb2_kitti-3d-3class.py')
model = MODELS.build(pointrcnn_cfg)
num_gt_instance = 2
packed_inputs = _create_detector_inputs(
packed_inputs = create_detector_inputs(
num_points=10101, num_gt_instance=num_gt_instance)
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
from mmengine import DefaultScope
from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs,
_get_detector_cfg, _setup_seed)
from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
setup_seed)
class TestVotenet(unittest.TestCase):
......@@ -15,18 +15,16 @@ class TestVotenet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'VoteNet')
DefaultScope.get_instance('test_vote_net', scope_name='mmdet3d')
_setup_seed(0)
voxel_net_cfg = _get_detector_cfg(
'votenet/votenet_8xb16_sunrgbd-3d.py')
setup_seed(0)
voxel_net_cfg = get_detector_cfg('votenet/votenet_8xb16_sunrgbd-3d.py')
model = MODELS.build(voxel_net_cfg)
num_gt_instance = 50
packed_inputs = _create_detector_inputs(
num_gt_instance=num_gt_instance)
packed_inputs = create_detector_inputs(num_gt_instance=num_gt_instance)
# TODO: Support aug test
# aug_data = [
# _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),
# create_detector_inputs(num_gt_instance=num_gt_instance + 1)
# ]
# # test_aug_test
# metainfo = {
......
......@@ -5,8 +5,8 @@ import torch
from mmengine import DefaultScope
from mmdet3d.registry import MODELS
from tests.utils.model_utils import (_create_detector_inputs,
_get_detector_cfg, _setup_seed)
from mmdet3d.testing import (create_detector_inputs, get_detector_cfg,
setup_seed)
class TestVoxelNet(unittest.TestCase):
......@@ -16,18 +16,17 @@ class TestVoxelNet(unittest.TestCase):
assert hasattr(mmdet3d.models, 'VoxelNet')
DefaultScope.get_instance('test_voxelnet', scope_name='mmdet3d')
_setup_seed(0)
pointpillars_cfg = _get_detector_cfg(
setup_seed(0)
pointpillars_cfg = get_detector_cfg(
'pointpillars/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class.py')
model = MODELS.build(pointpillars_cfg)
num_gt_instance = 2
packed_inputs = _create_detector_inputs(
num_gt_instance=num_gt_instance)
packed_inputs = create_detector_inputs(num_gt_instance=num_gt_instance)
# TODO: Support aug_test
# aug_data = [
# _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),
# create_detector_inputs(num_gt_instance=num_gt_instance + 1)
# ]
# # test_aug_test
# 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():
second_cfg = dict(
type='SECOND',
in_channels=64,
out_channels=[64, 128, 256],
in_channels=2,
out_channels=[2, 2, 2],
layer_nums=[3, 5, 5],
layer_strides=[2, 2, 2],
norm_cfg=dict(type='BN', eps=1e-3, momentum=0.01),
......@@ -57,8 +57,8 @@ def test_centerpoint_fpn():
# centerpoint usage of fpn
centerpoint_fpn_cfg = dict(
type='SECONDFPN',
in_channels=[64, 128, 256],
out_channels=[128, 128, 128],
in_channels=[2, 2, 2],
out_channels=[2, 2, 2],
upsample_strides=[0.5, 1, 2],
norm_cfg=dict(type='BN', eps=1e-3, momentum=0.01),
upsample_cfg=dict(type='deconv', bias=False),
......@@ -67,17 +67,17 @@ def test_centerpoint_fpn():
# original usage of fpn
fpn_cfg = dict(
type='SECONDFPN',
in_channels=[64, 128, 256],
in_channels=[2, 2, 2],
upsample_strides=[1, 2, 4],
out_channels=[128, 128, 128])
out_channels=[2, 2, 2])
second_fpn = build_neck(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)
centerpoint_output = centerpoint_second_fpn(sec_output)
second_output = second_fpn(sec_output)
assert centerpoint_output[0].shape == torch.Size([4, 384, 128, 128])
assert second_output[0].shape == torch.Size([4, 384, 256, 256])
assert centerpoint_output[0].shape == torch.Size([2, 6, 8, 8])
assert second_output[0].shape == torch.Size([2, 6, 16, 16])
......@@ -45,10 +45,10 @@ def test_anchor_3d_range_generator():
'\nrotations=[0, 1.57],\nreshape_out=False,' \
'\nsize_per_range=True)'
assert repr_str == expected_repr_str
featmap_size = (256, 256)
featmap_size = (8, 8)
mr_anchors = anchor_generator.single_level_grid_anchors(
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():
......@@ -80,108 +80,108 @@ def test_aligned_anchor_generator():
size_per_range=False,
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)
assert anchor_generator.num_base_anchors == 8
# check base anchors
expected_grid_anchors = [
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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
]],
device=device),
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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
]],
device=device),
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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
],
[
-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
]],
device=device)
......@@ -189,9 +189,9 @@ def test_aligned_anchor_generator():
multi_level_anchors = anchor_generator.grid_anchors(
featmap_sizes, device=device)
expected_multi_level_shapes = [
torch.Size([524288, 9]),
torch.Size([131072, 9]),
torch.Size([32768, 9])
torch.Size([2048, 9]),
torch.Size([512, 9]),
torch.Size([128, 9])
]
for i, single_level_anchor in enumerate(multi_level_anchors):
assert single_level_anchor.shape == expected_multi_level_shapes[i]
......
......@@ -6,17 +6,15 @@ from mmdet3d.models.task_modules.voxel import VoxelGenerator
def test_voxel_generator():
np.random.seed(0)
voxel_size = [0.5, 0.5, 0.5]
point_cloud_range = [0, -40, -3, 70.4, 40, 1]
max_num_points = 1000
voxel_size = [5, 5, 1]
point_cloud_range = [0, 0, 0, 20, 40, 4]
max_num_points = 5
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, coors, num_points_per_voxel = voxels
expected_coors = np.array([[7, 81, 1], [6, 81, 0], [7, 80, 1], [6, 81, 1],
[7, 81, 0], [6, 80, 1], [7, 80, 0], [6, 80, 0]])
expected_num_points_per_voxel = np.array(
[120, 121, 127, 134, 115, 127, 125, 131])
assert voxels.shape == (8, 1000, 4)
expected_coors = np.array([[2, 0, 0], [3, 0, 0], [0, 0, 0], [1, 0, 0]])
expected_num_points_per_voxel = np.array([5, 5, 5, 3])
assert voxels.shape == (4, 5, 3)
assert np.all(coors == expected_coors)
assert np.all(num_points_per_voxel == expected_num_points_per_voxel)
......@@ -35,9 +35,6 @@ def kitti_data_prep(root_path,
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_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_val_path)
update_pkl_infos('kitti', out_dir=out_dir, pkl_path=info_trainval_path)
......@@ -76,17 +73,11 @@ def nuscenes_data_prep(root_path,
if version == 'v1.0-test':
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)
return
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')
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_val_path)
create_groundtruth_database(dataset_name, root_path, info_prefix,
......@@ -265,6 +256,11 @@ args = parser.parse_args()
if __name__ == '__main__':
from mmdet3d.utils import 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':
kitti_data_prep(
root_path=args.root_path,
......
......@@ -6,13 +6,13 @@ import mmcv
import mmengine
import numpy as np
from mmcv.ops import roi_align
from mmdet.evaluation import bbox_overlaps
from mmengine import track_iter_progress
from pycocotools import mask as maskUtils
from pycocotools.coco import COCO
from mmdet3d.datasets import build_dataset
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):
......@@ -243,7 +243,7 @@ def create_groundtruth_database(dataset_class_name,
image_idx = example['sample_idx']
points = example['points'].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()
if 'group_ids' in annos:
group_ids = annos['group_ids']
......@@ -409,7 +409,7 @@ class GTDatabaseCreater:
points = example['points'].tensor.numpy()
gt_boxes_3d = annos['gt_bboxes_3d'].tensor.numpy()
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()
if 'group_ids' in annos:
......
......@@ -131,6 +131,7 @@ def _fill_trainval_infos(lyft,
info = {
'lidar_path': lidar_path,
'num_features': 5,
'token': sample['token'],
'sweeps': [],
'cams': dict(),
......
......@@ -129,7 +129,7 @@ class S3DISData(object):
- gt_num (int): Number of boxes.
"""
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
# check if all instance points have same semantic label
assert pts_semantic_mask[ids].min() == pts_semantic_mask[ids].max()
......
......@@ -4,7 +4,7 @@
Example:
python tools/dataset_converters/update_infos_to_v2.py
--dataset kitti
--pkl ./data/kitti/kitti_infos_train.pkl
--pkl-path ./data/kitti/kitti_infos_train.pkl
--out-dir ./kitti_v2/
"""
......@@ -12,6 +12,7 @@ import argparse
import copy
import time
from os import path as osp
from pathlib import Path
import mmengine
import numpy as np
......@@ -80,9 +81,6 @@ def get_empty_lidar_points():
num_pts_feats=None,
# (str, optional): Path of LiDAR data file.
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
# from lidar to ego-vehicle
# with shape [4, 4].
......@@ -120,6 +118,9 @@ def get_empty_img_info():
# matrix from camera to image with
# shape [3, 3], [3, 4] or [4, 4].
cam2img=None,
# (list[list[float]]): Transformation matrix from lidar
# or depth to image with shape [4, 4].
lidar2img=None,
# (list[list[float]], optional) : Transformation
# matrix from camera to ego-vehicle
# with shape [4, 4].
......@@ -159,7 +160,7 @@ def get_empty_standard_data_info(
data_info = dict(
# (str): Sample id of the frame.
sample_id=None,
sample_idx=None,
# (str, optional): '000010'
token=None,
**get_single_image_sweep(camera_types),
......@@ -261,13 +262,9 @@ def update_nuscenes_infos(pkl_path, out_dir):
print(f'Reading from input file: {pkl_path}.')
data_list = mmengine.load(pkl_path)
METAINFO = {
'CLASSES':
'classes':
('car', 'truck', 'trailer', 'bus', 'construction_vehicle', 'bicycle',
'motorcycle', 'pedestrian', 'traffic_cone', 'barrier'),
'DATASET':
'Nuscenes',
'version':
data_list['metadata']['version']
}
nusc = NuScenes(
version=data_list['metadata']['version'],
......@@ -287,8 +284,8 @@ def update_nuscenes_infos(pkl_path, out_dir):
ori_info_dict['ego2global_translation'])
temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict.get(
'num_features', 5)
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[
'lidar_path'].split('/')[-1]
temp_data_info['lidar_points']['lidar_path'] = Path(
ori_info_dict['lidar_path']).name
temp_data_info['lidar_points'][
'lidar2ego'] = convert_quaternion_to_matrix(
ori_info_dict['lidar2ego_rotation'],
......@@ -318,8 +315,8 @@ def update_nuscenes_infos(pkl_path, out_dir):
temp_data_info['images'] = {}
for cam in ori_info_dict['cams']:
empty_img_info = get_empty_img_info()
empty_img_info['img_path'] = ori_info_dict['cams'][cam][
'data_path'].split('/')[-1]
empty_img_info['img_path'] = Path(
ori_info_dict['cams'][cam]['data_path']).name
empty_img_info['cam2img'] = ori_info_dict['cams'][cam][
'cam_intrinsic'].tolist()
empty_img_info['sample_data_token'] = ori_info_dict['cams'][cam][
......@@ -344,8 +341,8 @@ def update_nuscenes_infos(pkl_path, out_dir):
empty_instance = get_empty_instance()
empty_instance['bbox_3d'] = ori_info_dict['gt_boxes'][
i, :].tolist()
if ori_info_dict['gt_names'][i] in METAINFO['CLASSES']:
empty_instance['bbox_label'] = METAINFO['CLASSES'].index(
if ori_info_dict['gt_names'][i] in METAINFO['classes']:
empty_instance['bbox_label'] = METAINFO['classes'].index(
ori_info_dict['gt_names'][i])
else:
ignore_class_name.add(ori_info_dict['gt_names'][i])
......@@ -363,11 +360,20 @@ def update_nuscenes_infos(pkl_path, out_dir):
ori_info_dict, nusc)
temp_data_info, _ = clear_data_info_unused_keys(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)
print(f'Writing to output file: {out_path}.')
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')
......@@ -381,7 +387,7 @@ def update_kitti_infos(pkl_path, out_dir):
# TODO update to full label
# TODO discuss how to process 'Van', 'DontCare'
METAINFO = {
'CLASSES': ('Pedestrian', 'Cyclist', 'Car', 'Van', 'Truck',
'classes': ('Pedestrian', 'Cyclist', 'Car', 'Van', 'Truck',
'Person_sitting', 'Tram', 'Misc'),
}
print(f'Reading from input file: {pkl_path}.')
......@@ -405,15 +411,15 @@ def update_kitti_infos(pkl_path, out_dir):
temp_data_info['images']['CAM3']['cam2img'] = ori_info_dict['calib'][
'P3'].tolist()
temp_data_info['images']['CAM2']['img_path'] = ori_info_dict['image'][
'image_path'].split('/')[-1]
temp_data_info['images']['CAM2']['img_path'] = Path(
ori_info_dict['image']['image_path']).name
h, w = ori_info_dict['image']['image_shape']
temp_data_info['images']['CAM2']['height'] = h
temp_data_info['images']['CAM2']['width'] = w
temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[
'point_cloud']['num_features']
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[
'point_cloud']['velodyne_path'].split('/')[-1]
temp_data_info['lidar_points']['lidar_path'] = Path(
ori_info_dict['point_cloud']['velodyne_path']).name
rect = ori_info_dict['calib']['R0_rect'].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):
empty_instance = get_empty_instance()
empty_instance['bbox'] = anns['bbox'][instance_id].tolist()
if anns['name'][instance_id] in METAINFO['CLASSES']:
empty_instance['bbox_label'] = METAINFO['CLASSES'].index(
if anns['name'][instance_id] in METAINFO['classes']:
empty_instance['bbox_label'] = METAINFO['classes'].index(
anns['name'][instance_id])
else:
ignore_class_name.add(anns['name'][instance_id])
......@@ -493,12 +499,20 @@ def update_kitti_infos(pkl_path, out_dir):
temp_data_info['cam_instances'] = cam_instances
temp_data_info, _ = clear_data_info_unused_keys(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)
print(f'Writing to output file: {out_path}.')
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')
......@@ -509,7 +523,7 @@ def update_s3dis_infos(pkl_path, out_dir):
print(f'Warning, you may overwriting '
f'the original data {pkl_path}.')
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}.')
data_list = mmengine.load(pkl_path)
print('Start updating:')
......@@ -519,12 +533,12 @@ def update_s3dis_infos(pkl_path, out_dir):
temp_data_info['sample_idx'] = i
temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[
'point_cloud']['num_features']
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[
'pts_path'].split('/')[-1]
temp_data_info['pts_semantic_mask_path'] = ori_info_dict[
'pts_semantic_mask_path'].split('/')[-1]
temp_data_info['pts_instance_mask_path'] = ori_info_dict[
'pts_instance_mask_path'].split('/')[-1]
temp_data_info['lidar_points']['lidar_path'] = Path(
ori_info_dict['pts_path']).name
temp_data_info['pts_semantic_mask_path'] = Path(
ori_info_dict['pts_semantic_mask_path']).name
temp_data_info['pts_instance_mask_path'] = Path(
ori_info_dict['pts_instance_mask_path']).name
# TODO support camera
# np.linalg.inv(info['axis_align_matrix'] @ extrinsic): depth2cam
......@@ -541,12 +555,12 @@ def update_s3dis_infos(pkl_path, out_dir):
empty_instance['bbox_3d'] = anns['gt_boxes_upright_depth'][
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'][
instance_id]
else:
ignore_class_name.add(
METAINFO['CLASSES'][anns['class'][instance_id]])
METAINFO['classes'][anns['class'][instance_id]])
empty_instance['bbox_label_3d'] = -1
empty_instance = clear_instance_unused_keys(empty_instance)
......@@ -554,12 +568,21 @@ def update_s3dis_infos(pkl_path, out_dir):
temp_data_info['instances'] = instance_list
temp_data_info, _ = clear_data_info_unused_keys(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)
print(f'Writing to output file: {out_path}.')
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')
......@@ -571,7 +594,7 @@ def update_scannet_infos(pkl_path, out_dir):
f'the original data {pkl_path}.')
time.sleep(5)
METAINFO = {
'CLASSES':
'classes':
('cabinet', 'bed', 'chair', 'sofa', 'table', 'door', 'window',
'bookshelf', 'picture', 'counter', 'desk', 'curtain', 'refrigerator',
'showercurtrain', 'toilet', 'sink', 'bathtub', 'garbagebin')
......@@ -584,12 +607,12 @@ def update_scannet_infos(pkl_path, out_dir):
temp_data_info = get_empty_standard_data_info()
temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[
'point_cloud']['num_features']
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[
'pts_path'].split('/')[-1]
temp_data_info['pts_semantic_mask_path'] = ori_info_dict[
'pts_semantic_mask_path'].split('/')[-1]
temp_data_info['pts_instance_mask_path'] = ori_info_dict[
'pts_instance_mask_path'].split('/')[-1]
temp_data_info['lidar_points']['lidar_path'] = Path(
ori_info_dict['pts_path']).name
temp_data_info['pts_semantic_mask_path'] = Path(
ori_info_dict['pts_semantic_mask_path']).name
temp_data_info['pts_instance_mask_path'] = Path(
ori_info_dict['pts_instance_mask_path']).name
# TODO support camera
# np.linalg.inv(info['axis_align_matrix'] @ extrinsic): depth2cam
......@@ -607,9 +630,9 @@ def update_scannet_infos(pkl_path, out_dir):
empty_instance['bbox_3d'] = anns['gt_boxes_upright_depth'][
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[
'CLASSES'].index(anns['name'][instance_id])
'classes'].index(anns['name'][instance_id])
else:
ignore_class_name.add(anns['name'][instance_id])
empty_instance['bbox_label_3d'] = -1
......@@ -619,12 +642,21 @@ def update_scannet_infos(pkl_path, out_dir):
temp_data_info['instances'] = instance_list
temp_data_info, _ = clear_data_info_unused_keys(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)
print(f'Writing to output file: {out_path}.')
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')
......@@ -636,7 +668,7 @@ def update_sunrgbd_infos(pkl_path, out_dir):
f'the original data {pkl_path}.')
time.sleep(5)
METAINFO = {
'CLASSES': ('bed', 'table', 'sofa', 'chair', 'toilet', 'desk',
'classes': ('bed', 'table', 'sofa', 'chair', 'toilet', 'desk',
'dresser', 'night_stand', 'bookshelf', 'bathtub')
}
print(f'Reading from input file: {pkl_path}.')
......@@ -647,8 +679,8 @@ def update_sunrgbd_infos(pkl_path, out_dir):
temp_data_info = get_empty_standard_data_info()
temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict[
'point_cloud']['num_features']
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[
'pts_path'].split('/')[-1]
temp_data_info['lidar_points']['lidar_path'] = Path(
ori_info_dict['pts_path']).name
calib = ori_info_dict['calib']
rt_mat = calib['Rt']
# follow Coord3DMode.convert_point
......@@ -656,8 +688,8 @@ def update_sunrgbd_infos(pkl_path, out_dir):
]) @ rt_mat.transpose(1, 0)
depth2img = calib['K'] @ rt_mat
temp_data_info['images']['CAM0']['depth2img'] = depth2img.tolist()
temp_data_info['images']['CAM0']['img_path'] = ori_info_dict['image'][
'image_path'].split('/')[-1]
temp_data_info['images']['CAM0']['img_path'] = Path(
ori_info_dict['image']['image_path']).name
h, w = ori_info_dict['image']['image_shape']
temp_data_info['images']['CAM0']['height'] = h
temp_data_info['images']['CAM0']['width'] = w
......@@ -674,9 +706,9 @@ def update_sunrgbd_infos(pkl_path, out_dir):
empty_instance['bbox_3d'] = anns['gt_boxes_upright_depth'][
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[
'CLASSES'].index(anns['name'][instance_id])
'classes'].index(anns['name'][instance_id])
empty_instance['bbox_label'] = empty_instance[
'bbox_label_3d']
else:
......@@ -688,12 +720,21 @@ def update_sunrgbd_infos(pkl_path, out_dir):
temp_data_info['instances'] = instance_list
temp_data_info, _ = clear_data_info_unused_keys(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)
print(f'Writing to output file: {out_path}.')
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')
......@@ -706,13 +747,9 @@ def update_lyft_infos(pkl_path, out_dir):
print(f'Reading from input file: {pkl_path}.')
data_list = mmengine.load(pkl_path)
METAINFO = {
'CLASSES':
'classes':
('car', 'truck', 'bus', 'emergency_vehicle', 'other_vehicle',
'motorcycle', 'bicycle', 'pedestrian', 'animal'),
'DATASET':
'Nuscenes',
'version':
data_list['metadata']['version']
}
print('Start updating:')
converted_list = []
......@@ -724,8 +761,10 @@ def update_lyft_infos(pkl_path, out_dir):
temp_data_info['ego2global'] = convert_quaternion_to_matrix(
ori_info_dict['ego2global_rotation'],
ori_info_dict['ego2global_translation'])
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[
'lidar_path'].split('/')[-1]
temp_data_info['lidar_points']['num_pts_feats'] = ori_info_dict.get(
'num_features', 5)
temp_data_info['lidar_points']['lidar_path'] = Path(
ori_info_dict['lidar_path']).name
temp_data_info['lidar_points'][
'lidar2ego'] = convert_quaternion_to_matrix(
ori_info_dict['lidar2ego_rotation'],
......@@ -756,8 +795,8 @@ def update_lyft_infos(pkl_path, out_dir):
temp_data_info['images'] = {}
for cam in ori_info_dict['cams']:
empty_img_info = get_empty_img_info()
empty_img_info['img_path'] = ori_info_dict['cams'][cam][
'data_path'].split('/')[-1]
empty_img_info['img_path'] = Path(
ori_info_dict['cams'][cam]['data_path']).name
empty_img_info['cam2img'] = ori_info_dict['cams'][cam][
'cam_intrinsic'].tolist()
empty_img_info['sample_data_token'] = ori_info_dict['cams'][cam][
......@@ -781,8 +820,8 @@ def update_lyft_infos(pkl_path, out_dir):
empty_instance = get_empty_instance()
empty_instance['bbox_3d'] = ori_info_dict['gt_boxes'][
i, :].tolist()
if ori_info_dict['gt_names'][i] in METAINFO['CLASSES']:
empty_instance['bbox_label'] = METAINFO['CLASSES'].index(
if ori_info_dict['gt_names'][i] in METAINFO['classes']:
empty_instance['bbox_label'] = METAINFO['classes'].index(
ori_info_dict['gt_names'][i])
else:
ignore_class_name.add(ori_info_dict['gt_names'][i])
......@@ -793,11 +832,20 @@ def update_lyft_infos(pkl_path, out_dir):
temp_data_info['instances'].append(empty_instance)
temp_data_info, _ = clear_data_info_unused_keys(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)
print(f'Writing to output file: {out_path}.')
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')
......@@ -820,7 +868,7 @@ def update_waymo_infos(pkl_path, out_dir):
# TODO update to full label
# TODO discuss how to process 'Van', 'DontCare'
METAINFO = {
'CLASSES': ('Car', 'Pedestrian', 'Cyclist', 'Sign'),
'classes': ('Car', 'Pedestrian', 'Cyclist', 'Sign'),
}
print(f'Reading from input file: {pkl_path}.')
data_list = mmengine.load(pkl_path)
......@@ -851,7 +899,7 @@ def update_waymo_infos(pkl_path, out_dir):
ori_info_dict['calib'][f'P{cam_idx}'] @ lidar2cam).tolist()
# 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):
temp_data_info['images'][cam_key]['timestamp'] = ori_info_dict[
......@@ -867,8 +915,8 @@ def update_waymo_infos(pkl_path, out_dir):
'point_cloud']['num_features']
temp_data_info['lidar_points']['timestamp'] = ori_info_dict[
'timestamp']
temp_data_info['lidar_points']['lidar_path'] = ori_info_dict[
'point_cloud']['velodyne_path'].split('/')[-1]
temp_data_info['lidar_points']['lidar_path'] = Path(
ori_info_dict['point_cloud']['velodyne_path']).name
# TODO discuss the usage of Tr_velo_to_cam in lidar
Trv2c = ori_info_dict['calib']['Tr_velo_to_cam'].astype(np.float32)
......@@ -888,13 +936,13 @@ def update_waymo_infos(pkl_path, out_dir):
lidar_sweep = get_single_lidar_sweep()
lidar_sweep['ego2global'] = ori_sweep['pose']
lidar_sweep['timestamp'] = ori_sweep['timestamp']
lidar_sweep['lidar_points']['lidar_path'] = ori_sweep[
'velodyne_path'].split('/')[-1]
lidar_sweep['lidar_points']['lidar_path'] = Path(
ori_sweep['velodyne_path']).name
# image sweeps
image_sweep = get_single_image_sweep(camera_types)
image_sweep['ego2global'] = ori_sweep['pose']
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):
image_sweep['images'][cam_key]['img_path'] = img_path
......@@ -910,8 +958,8 @@ def update_waymo_infos(pkl_path, out_dir):
empty_instance = get_empty_instance()
empty_instance['bbox'] = anns['bbox'][instance_id].tolist()
if anns['name'][instance_id] in METAINFO['CLASSES']:
empty_instance['bbox_label'] = METAINFO['CLASSES'].index(
if anns['name'][instance_id] in METAINFO['classes']:
empty_instance['bbox_label'] = METAINFO['classes'].index(
anns['name'][instance_id])
else:
ignore_class_name.add(anns['name'][instance_id])
......@@ -954,8 +1002,8 @@ def update_waymo_infos(pkl_path, out_dir):
empty_instance = get_empty_instance()
empty_instance['bbox'] = anns['bbox'][instance_id].tolist()
if anns['name'][instance_id] in METAINFO['CLASSES']:
empty_instance['bbox_label'] = METAINFO['CLASSES'].index(
if anns['name'][instance_id] in METAINFO['classes']:
empty_instance['bbox_label'] = METAINFO['classes'].index(
anns['name'][instance_id])
else:
ignore_class_name.add(anns['name'][instance_id])
......@@ -991,12 +1039,22 @@ def update_waymo_infos(pkl_path, out_dir):
temp_data_info, _ = clear_data_info_unused_keys(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)
print(f'Writing to output file: {out_path}.')
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')
......@@ -1073,4 +1131,4 @@ if __name__ == '__main__':
if args.out_dir is None:
args.out_dir = args.root_dir
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:
from glob import glob
from os.path import join
import mmcv
import mmengine
import numpy as np
import tensorflow as tf
......@@ -70,10 +69,7 @@ class Waymo2KITTI(object):
'_SIDE_LEFT',
'_SIDE_RIGHT',
]
self.lidar_list = [
'_FRONT', '_FRONT_RIGHT', '_FRONT_LEFT', '_SIDE_RIGHT',
'_SIDE_LEFT'
]
self.lidar_list = ['TOP', 'FRONT', 'SIDE_LEFT', 'SIDE_RIGHT', 'REAR']
self.type_list = [
'UNKNOWN', 'VEHICLE', 'PEDESTRIAN', 'SIGN', 'CYCLIST'
]
......@@ -136,7 +132,9 @@ class Waymo2KITTI(object):
self.save_image(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_timestamp(frame, file_idx, frame_idx)
......@@ -162,8 +160,8 @@ class Waymo2KITTI(object):
img_path = f'{self.image_save_dir}{str(img.name - 1)}/' + \
f'{self.prefix}{str(file_idx).zfill(3)}' + \
f'{str(frame_idx).zfill(3)}.jpg'
img = mmcv.imfrombytes(img.image)
mmcv.imwrite(img, img_path)
with open(img_path, 'wb') as fp:
fp.write(img.image)
def save_calib(self, frame, file_idx, frame_idx):
"""Parse and save the calibration data.
......@@ -442,7 +440,6 @@ class Waymo2KITTI(object):
dir_list1 = [
self.label_all_save_dir,
self.calib_save_dir,
self.point_cloud_save_dir,
self.pose_save_dir,
self.timestamp_save_dir,
]
......@@ -452,10 +449,12 @@ class Waymo2KITTI(object):
dir_list2.append(self.cam_sync_label_save_dir)
else:
dir_list1 = [
self.calib_save_dir, self.point_cloud_save_dir,
self.pose_save_dir, self.timestamp_save_dir
self.calib_save_dir, self.pose_save_dir,
self.timestamp_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:
mmengine.mkdir_or_exist(d)
for d in dir_list2:
......
......@@ -71,7 +71,7 @@ def build_data_cfg(config_path, aug, cfg_options):
if aug:
show_pipeline = cfg.train_pipeline
else:
show_pipeline = cfg.eval_pipeline
show_pipeline = cfg.test_pipeline
for i in range(len(cfg.train_pipeline)):
if cfg.train_pipeline[i]['type'] == 'LoadAnnotations3D':
show_pipeline.insert(i, cfg.train_pipeline[i])
......@@ -117,13 +117,20 @@ def main():
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
data_input = item['inputs']
data_sample = item['data_samples'].numpy()
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(
'3d visualzier',
......@@ -132,6 +139,7 @@ def main():
show=not args.not_show,
wait_time=args.show_interval,
out_file=out_file,
o3d_save_path=o3d_save_path,
vis_task=vis_task)
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