Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
mmdeploy
Commits
e4fb2aa4
Commit
e4fb2aa4
authored
Jun 25, 2025
by
limm
Browse files
add test_mmdet3d
parent
481f872d
Pipeline
#2822
canceled with stages
Changes
26
Pipelines
2
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
1147 additions
and
0 deletions
+1147
-0
tests/test_codebase/test_mmdet3d/conftest.py
tests/test_codebase/test_mmdet3d/conftest.py
+10
-0
tests/test_codebase/test_mmdet3d/data/centerpoint_pillar02_second_secfpn_8xb4-cyclic-20e_nus-3d.py
...terpoint_pillar02_second_secfpn_8xb4-cyclic-20e_nus-3d.py
+141
-0
tests/test_codebase/test_mmdet3d/data/centerpoint_pillar02_second_secfpn_head-circlenms_8xb4-cyclic-20e_nus-3d.py
...02_second_secfpn_head-circlenms_8xb4-cyclic-20e_nus-3d.py
+4
-0
tests/test_codebase/test_mmdet3d/data/centerpoint_pillar02_second_secfpn_nus.py
...st_mmdet3d/data/centerpoint_pillar02_second_secfpn_nus.py
+90
-0
tests/test_codebase/test_mmdet3d/data/cyclic-20e.py
tests/test_codebase/test_mmdet3d/data/cyclic-20e.py
+66
-0
tests/test_codebase/test_mmdet3d/data/cyclic-40e.py
tests/test_codebase/test_mmdet3d/data/cyclic-40e.py
+68
-0
tests/test_codebase/test_mmdet3d/data/default_runtime.py
tests/test_codebase/test_mmdet3d/data/default_runtime.py
+24
-0
tests/test_codebase/test_mmdet3d/data/kitti-3d-3class.py
tests/test_codebase/test_mmdet3d/data/kitti-3d-3class.py
+133
-0
tests/test_codebase/test_mmdet3d/data/kitti-mono3d.py
tests/test_codebase/test_mmdet3d/data/kitti-mono3d.py
+88
-0
tests/test_codebase/test_mmdet3d/data/kitti/kitti_000008.bin
tests/test_codebase/test_mmdet3d/data/kitti/kitti_000008.bin
+0
-0
tests/test_codebase/test_mmdet3d/data/kitti/kitti_infos_val.pkl
...test_codebase/test_mmdet3d/data/kitti/kitti_infos_val.pkl
+0
-0
tests/test_codebase/test_mmdet3d/data/kitti/training/velodyne_reduced/000008.bin
...t_mmdet3d/data/kitti/training/velodyne_reduced/000008.bin
+1
-0
tests/test_codebase/test_mmdet3d/data/model_cfg.py
tests/test_codebase/test_mmdet3d/data/model_cfg.py
+114
-0
tests/test_codebase/test_mmdet3d/data/nus-3d.py
tests/test_codebase/test_mmdet3d/data/nus-3d.py
+133
-0
tests/test_codebase/test_mmdet3d/data/nuscenes/n008-2018-09-18-12-07-26-0400__LIDAR_TOP__1537287083900561.pcd.bin
...-09-18-12-07-26-0400__LIDAR_TOP__1537287083900561.pcd.bin
+0
-0
tests/test_codebase/test_mmdet3d/data/nuscenes/n015-2018-07-24-11-22-45+0800.pkl
...t_mmdet3d/data/nuscenes/n015-2018-07-24-11-22-45+0800.pkl
+0
-0
tests/test_codebase/test_mmdet3d/data/nuscenes/n015-2018-07-24-11-22-45+0800__CAM_FRONT__1532402927612460.jpg
...2018-07-24-11-22-45+0800__CAM_FRONT__1532402927612460.jpg
+0
-0
tests/test_codebase/test_mmdet3d/data/pointpillars.py
tests/test_codebase/test_mmdet3d/data/pointpillars.py
+114
-0
tests/test_codebase/test_mmdet3d/data/pointpillars_hv_secfpn_kitti.py
...odebase/test_mmdet3d/data/pointpillars_hv_secfpn_kitti.py
+99
-0
tests/test_codebase/test_mmdet3d/data/smoke.py
tests/test_codebase/test_mmdet3d/data/smoke.py
+62
-0
No files found.
tests/test_codebase/test_mmdet3d/conftest.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
import
pytest
@
pytest
.
fixture
(
autouse
=
True
)
def
init_test
():
# init default scope
from
mmdet3d.utils
import
register_all_modules
register_all_modules
(
True
)
tests/test_codebase/test_mmdet3d/data/centerpoint_pillar02_second_secfpn_8xb4-cyclic-20e_nus-3d.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
_base_
=
[
'nus-3d.py'
,
'centerpoint_pillar02_second_secfpn_nus.py'
,
'cyclic-20e.py'
,
'default_runtime.py'
]
# If point cloud range is changed, the models should also change their point
# cloud range accordingly
point_cloud_range
=
[
-
51.2
,
-
51.2
,
-
5.0
,
51.2
,
51.2
,
3.0
]
# For nuScenes we usually do 10-class detection
class_names
=
[
'car'
,
'truck'
,
'construction_vehicle'
,
'bus'
,
'trailer'
,
'barrier'
,
'motorcycle'
,
'bicycle'
,
'pedestrian'
,
'traffic_cone'
]
data_prefix
=
dict
(
pts
=
'samples/LIDAR_TOP'
,
img
=
''
,
sweeps
=
'sweeps/LIDAR_TOP'
)
model
=
dict
(
data_preprocessor
=
dict
(
voxel_layer
=
dict
(
point_cloud_range
=
point_cloud_range
)),
pts_voxel_encoder
=
dict
(
point_cloud_range
=
point_cloud_range
),
pts_bbox_head
=
dict
(
bbox_coder
=
dict
(
pc_range
=
point_cloud_range
[:
2
])),
# model training and testing settings
train_cfg
=
dict
(
pts
=
dict
(
point_cloud_range
=
point_cloud_range
)),
test_cfg
=
dict
(
pts
=
dict
(
pc_range
=
point_cloud_range
[:
2
])))
dataset_type
=
'NuScenesDataset'
data_root
=
'data/nuscenes/'
file_client_args
=
dict
(
backend
=
'disk'
)
db_sampler
=
dict
(
data_root
=
data_root
,
info_path
=
data_root
+
'nuscenes_dbinfos_train.pkl'
,
rate
=
1.0
,
prepare
=
dict
(
filter_by_difficulty
=
[
-
1
],
filter_by_min_points
=
dict
(
car
=
5
,
truck
=
5
,
bus
=
5
,
trailer
=
5
,
construction_vehicle
=
5
,
traffic_cone
=
5
,
barrier
=
5
,
motorcycle
=
5
,
bicycle
=
5
,
pedestrian
=
5
)),
classes
=
class_names
,
sample_groups
=
dict
(
car
=
2
,
truck
=
3
,
construction_vehicle
=
7
,
bus
=
4
,
trailer
=
6
,
barrier
=
2
,
motorcycle
=
6
,
bicycle
=
6
,
pedestrian
=
2
,
traffic_cone
=
2
),
points_loader
=
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
5
,
use_dim
=
[
0
,
1
,
2
,
3
,
4
]))
train_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
5
,
use_dim
=
5
),
dict
(
type
=
'LoadPointsFromMultiSweeps'
,
sweeps_num
=
9
,
use_dim
=
[
0
,
1
,
2
,
3
,
4
],
pad_empty_sweeps
=
True
,
remove_close
=
True
),
dict
(
type
=
'LoadAnnotations3D'
,
with_bbox_3d
=
True
,
with_label_3d
=
True
),
dict
(
type
=
'ObjectSample'
,
db_sampler
=
db_sampler
),
dict
(
type
=
'GlobalRotScaleTrans'
,
rot_range
=
[
-
0.3925
,
0.3925
],
scale_ratio_range
=
[
0.95
,
1.05
],
translation_std
=
[
0
,
0
,
0
]),
dict
(
type
=
'RandomFlip3D'
,
sync_2d
=
False
,
flip_ratio_bev_horizontal
=
0.5
,
flip_ratio_bev_vertical
=
0.5
),
dict
(
type
=
'PointsRangeFilter'
,
point_cloud_range
=
point_cloud_range
),
dict
(
type
=
'ObjectRangeFilter'
,
point_cloud_range
=
point_cloud_range
),
dict
(
type
=
'ObjectNameFilter'
,
classes
=
class_names
),
dict
(
type
=
'PointShuffle'
),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
,
'gt_bboxes_3d'
,
'gt_labels_3d'
])
]
test_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
5
,
use_dim
=
5
),
dict
(
type
=
'LoadPointsFromMultiSweeps'
,
sweeps_num
=
9
,
use_dim
=
[
0
,
1
,
2
,
3
,
4
],
pad_empty_sweeps
=
True
,
remove_close
=
True
),
dict
(
type
=
'MultiScaleFlipAug3D'
,
img_scale
=
(
1333
,
800
),
pts_scale_ratio
=
1
,
flip
=
False
,
transforms
=
[
dict
(
type
=
'GlobalRotScaleTrans'
,
rot_range
=
[
0
,
0
],
scale_ratio_range
=
[
1.
,
1.
],
translation_std
=
[
0
,
0
,
0
]),
dict
(
type
=
'RandomFlip3D'
)
]),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
])
]
train_dataloader
=
dict
(
_delete_
=
True
,
batch_size
=
4
,
num_workers
=
4
,
persistent_workers
=
True
,
sampler
=
dict
(
type
=
'DefaultSampler'
,
shuffle
=
True
),
dataset
=
dict
(
type
=
'CBGSDataset'
,
dataset
=
dict
(
type
=
dataset_type
,
data_root
=
data_root
,
ann_file
=
'nuscenes_infos_train.pkl'
,
pipeline
=
train_pipeline
,
metainfo
=
dict
(
CLASSES
=
class_names
),
test_mode
=
False
,
data_prefix
=
data_prefix
,
use_valid_flag
=
True
,
# we use box_type_3d='LiDAR' in kitti and nuscenes dataset
# and box_type_3d='Depth' in sunrgbd and scannet dataset.
box_type_3d
=
'LiDAR'
)))
test_dataloader
=
dict
(
dataset
=
dict
(
pipeline
=
test_pipeline
,
metainfo
=
dict
(
CLASSES
=
class_names
)))
val_dataloader
=
dict
(
dataset
=
dict
(
pipeline
=
test_pipeline
,
metainfo
=
dict
(
CLASSES
=
class_names
)))
train_cfg
=
dict
(
val_interval
=
20
)
tests/test_codebase/test_mmdet3d/data/centerpoint_pillar02_second_secfpn_head-circlenms_8xb4-cyclic-20e_nus-3d.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
_base_
=
[
'./centerpoint_pillar02_second_secfpn_8xb4-cyclic-20e_nus-3d.py'
]
model
=
dict
(
test_cfg
=
dict
(
pts
=
dict
(
nms_type
=
'circle'
)))
tests/test_codebase/test_mmdet3d/data/centerpoint_pillar02_second_secfpn_nus.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
voxel_size
=
[
0.2
,
0.2
,
8
]
model
=
dict
(
type
=
'CenterPoint'
,
data_preprocessor
=
dict
(
type
=
'Det3DDataPreprocessor'
,
voxel
=
True
,
voxel_layer
=
dict
(
max_num_points
=
20
,
voxel_size
=
voxel_size
,
max_voxels
=
(
30000
,
40000
))),
pts_voxel_encoder
=
dict
(
type
=
'PillarFeatureNet'
,
in_channels
=
5
,
feat_channels
=
[
64
],
with_distance
=
False
,
voxel_size
=
(
0.2
,
0.2
,
8
),
norm_cfg
=
dict
(
type
=
'BN1d'
,
eps
=
1e-3
,
momentum
=
0.01
),
legacy
=
False
),
pts_middle_encoder
=
dict
(
type
=
'PointPillarsScatter'
,
in_channels
=
64
,
output_shape
=
(
512
,
512
)),
pts_backbone
=
dict
(
type
=
'SECOND'
,
in_channels
=
64
,
out_channels
=
[
64
,
128
,
256
],
layer_nums
=
[
3
,
5
,
5
],
layer_strides
=
[
2
,
2
,
2
],
norm_cfg
=
dict
(
type
=
'BN'
,
eps
=
1e-3
,
momentum
=
0.01
),
conv_cfg
=
dict
(
type
=
'Conv2d'
,
bias
=
False
)),
pts_neck
=
dict
(
type
=
'SECONDFPN'
,
in_channels
=
[
64
,
128
,
256
],
out_channels
=
[
128
,
128
,
128
],
upsample_strides
=
[
0.5
,
1
,
2
],
norm_cfg
=
dict
(
type
=
'BN'
,
eps
=
1e-3
,
momentum
=
0.01
),
upsample_cfg
=
dict
(
type
=
'deconv'
,
bias
=
False
),
use_conv_for_no_stride
=
True
),
pts_bbox_head
=
dict
(
type
=
'CenterHead'
,
in_channels
=
sum
([
128
,
128
,
128
]),
tasks
=
[
dict
(
num_class
=
1
,
class_names
=
[
'car'
]),
dict
(
num_class
=
2
,
class_names
=
[
'truck'
,
'construction_vehicle'
]),
dict
(
num_class
=
2
,
class_names
=
[
'bus'
,
'trailer'
]),
dict
(
num_class
=
1
,
class_names
=
[
'barrier'
]),
dict
(
num_class
=
2
,
class_names
=
[
'motorcycle'
,
'bicycle'
]),
dict
(
num_class
=
2
,
class_names
=
[
'pedestrian'
,
'traffic_cone'
]),
],
common_heads
=
dict
(
reg
=
(
2
,
2
),
height
=
(
1
,
2
),
dim
=
(
3
,
2
),
rot
=
(
2
,
2
),
vel
=
(
2
,
2
)),
share_conv_channel
=
64
,
bbox_coder
=
dict
(
type
=
'CenterPointBBoxCoder'
,
post_center_range
=
[
-
61.2
,
-
61.2
,
-
10.0
,
61.2
,
61.2
,
10.0
],
max_num
=
500
,
score_threshold
=
0.1
,
out_size_factor
=
4
,
voxel_size
=
voxel_size
[:
2
],
code_size
=
9
),
separate_head
=
dict
(
type
=
'SeparateHead'
,
init_bias
=-
2.19
,
final_kernel
=
3
),
loss_cls
=
dict
(
type
=
'mmdet.GaussianFocalLoss'
,
reduction
=
'mean'
),
loss_bbox
=
dict
(
type
=
'mmdet.L1Loss'
,
reduction
=
'mean'
,
loss_weight
=
0.25
),
norm_bbox
=
True
),
# model training and testing settings
train_cfg
=
dict
(
pts
=
dict
(
grid_size
=
[
512
,
512
,
1
],
voxel_size
=
voxel_size
,
out_size_factor
=
4
,
dense_reg
=
1
,
gaussian_overlap
=
0.1
,
max_objs
=
500
,
min_radius
=
2
,
code_weights
=
[
1.0
,
1.0
,
1.0
,
1.0
,
1.0
,
1.0
,
1.0
,
1.0
,
0.2
,
0.2
])),
test_cfg
=
dict
(
pts
=
dict
(
post_center_limit_range
=
[
-
61.2
,
-
61.2
,
-
10.0
,
61.2
,
61.2
,
10.0
],
max_per_img
=
500
,
max_pool_nms
=
False
,
min_radius
=
[
4
,
12
,
10
,
1
,
0.85
,
0.175
],
score_threshold
=
0.1
,
pc_range
=
[
-
51.2
,
-
51.2
],
out_size_factor
=
4
,
voxel_size
=
voxel_size
[:
2
],
nms_type
=
'rotate'
,
pre_max_size
=
1000
,
post_max_size
=
83
,
nms_thr
=
0.2
)))
tests/test_codebase/test_mmdet3d/data/cyclic-20e.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
# For nuScenes dataset, we usually evaluate the model at the end of training.
# Since the models are trained by 24 epochs by default, we set evaluation
# interval to be 20. Please change the interval accordingly if you do not
# use a default schedule.
# optimizer
lr
=
1e-4
# This schedule is mainly used by models on nuScenes dataset
# max_norm=10 is better for SECOND
optim_wrapper
=
dict
(
type
=
'OptimWrapper'
,
optimizer
=
dict
(
type
=
'AdamW'
,
lr
=
lr
,
weight_decay
=
0.01
),
clip_grad
=
dict
(
max_norm
=
35
,
norm_type
=
2
))
# learning rate
param_scheduler
=
[
# learning rate scheduler
# During the first 8 epochs, learning rate increases from 0 to lr * 10
# during the next 12 epochs, learning rate decreases from lr * 10 to
# lr * 1e-4
dict
(
type
=
'CosineAnnealingLR'
,
T_max
=
8
,
eta_min
=
lr
*
10
,
begin
=
0
,
end
=
8
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
dict
(
type
=
'CosineAnnealingLR'
,
T_max
=
12
,
eta_min
=
lr
*
1e-4
,
begin
=
8
,
end
=
20
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
# momentum scheduler
# During the first 8 epochs, momentum increases from 0 to 0.85 / 0.95
# during the next 12 epochs, momentum increases from 0.85 / 0.95 to 1
dict
(
type
=
'CosineAnnealingMomentum'
,
T_max
=
8
,
eta_min
=
0.85
/
0.95
,
begin
=
0
,
end
=
8
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
dict
(
type
=
'CosineAnnealingMomentum'
,
T_max
=
12
,
eta_min
=
1
,
begin
=
8
,
end
=
20
,
by_epoch
=
True
,
convert_to_iter_based
=
True
)
]
# runtime settings
train_cfg
=
dict
(
by_epoch
=
True
,
max_epochs
=
20
,
val_interval
=
20
)
val_cfg
=
dict
()
test_cfg
=
dict
()
# Default setting for scaling LR automatically
# - `enable` means enable scaling LR automatically
# or not by default.
# - `base_batch_size` = (8 GPUs) x (4 samples per GPU).
auto_scale_lr
=
dict
(
enable
=
False
,
base_batch_size
=
32
)
tests/test_codebase/test_mmdet3d/data/cyclic-40e.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
# The schedule is usually used by models trained on KITTI dataset
# The learning rate set in the cyclic schedule is the initial learning rate
# rather than the max learning rate. Since the target_ratio is (10, 1e-4),
# the learning rate will change from 0.0018 to 0.018, than go to 0.0018*1e-4
lr
=
0.0018
# The optimizer follows the setting in SECOND.Pytorch, but here we use
# the official AdamW optimizer implemented by PyTorch.
optim_wrapper
=
dict
(
type
=
'OptimWrapper'
,
optimizer
=
dict
(
type
=
'AdamW'
,
lr
=
lr
,
betas
=
(
0.95
,
0.99
),
weight_decay
=
0.01
),
clip_grad
=
dict
(
max_norm
=
10
,
norm_type
=
2
))
# learning rate
param_scheduler
=
[
# learning rate scheduler
# During the first 16 epochs, learning rate increases from 0 to lr * 10
# during the next 24 epochs, learning rate decreases from lr * 10 to
# lr * 1e-4
dict
(
type
=
'CosineAnnealingLR'
,
T_max
=
16
,
eta_min
=
lr
*
10
,
begin
=
0
,
end
=
16
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
dict
(
type
=
'CosineAnnealingLR'
,
T_max
=
24
,
eta_min
=
lr
*
1e-4
,
begin
=
16
,
end
=
40
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
# momentum scheduler
# During the first 16 epochs, momentum increases from 0 to 0.85 / 0.95
# during the next 24 epochs, momentum increases from 0.85 / 0.95 to 1
dict
(
type
=
'CosineAnnealingMomentum'
,
T_max
=
16
,
eta_min
=
0.85
/
0.95
,
begin
=
0
,
end
=
16
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
dict
(
type
=
'CosineAnnealingMomentum'
,
T_max
=
24
,
eta_min
=
1
,
begin
=
16
,
end
=
40
,
by_epoch
=
True
,
convert_to_iter_based
=
True
)
]
# Runtime settings,training schedule for 40e
# Although the max_epochs is 40, this schedule is usually used we
# RepeatDataset with repeat ratio N, thus the actual max epoch
# number could be Nx40
train_cfg
=
dict
(
by_epoch
=
True
,
max_epochs
=
40
,
val_interval
=
1
)
val_cfg
=
dict
()
test_cfg
=
dict
()
# Default setting for scaling LR automatically
# - `enable` means enable scaling LR automatically
# or not by default.
# - `base_batch_size` = (8 GPUs) x (6 samples per GPU).
auto_scale_lr
=
dict
(
enable
=
False
,
base_batch_size
=
48
)
tests/test_codebase/test_mmdet3d/data/default_runtime.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
default_scope
=
'mmdet3d'
default_hooks
=
dict
(
timer
=
dict
(
type
=
'IterTimerHook'
),
logger
=
dict
(
type
=
'LoggerHook'
,
interval
=
50
),
param_scheduler
=
dict
(
type
=
'ParamSchedulerHook'
),
checkpoint
=
dict
(
type
=
'CheckpointHook'
,
interval
=-
1
),
sampler_seed
=
dict
(
type
=
'DistSamplerSeedHook'
),
visualization
=
dict
(
type
=
'Det3DVisualizationHook'
))
env_cfg
=
dict
(
cudnn_benchmark
=
False
,
mp_cfg
=
dict
(
mp_start_method
=
'fork'
,
opencv_num_threads
=
0
),
dist_cfg
=
dict
(
backend
=
'nccl'
),
)
log_processor
=
dict
(
type
=
'LogProcessor'
,
window_size
=
50
,
by_epoch
=
True
)
log_level
=
'INFO'
load_from
=
None
resume
=
False
# TODO: support auto scaling lr
tests/test_codebase/test_mmdet3d/data/kitti-3d-3class.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
# dataset settings
dataset_type
=
'KittiDataset'
data_root
=
'tests/test_codebase/test_mmdet3d/data/kitti'
class_names
=
[
'Pedestrian'
,
'Cyclist'
,
'Car'
]
point_cloud_range
=
[
0
,
-
40
,
-
3
,
70.4
,
40
,
1
]
input_modality
=
dict
(
use_lidar
=
True
,
use_camera
=
False
)
metainfo
=
dict
(
CLASSES
=
class_names
)
db_sampler
=
dict
(
data_root
=
data_root
,
info_path
=
data_root
+
'kitti_dbinfos_train.pkl'
,
rate
=
1.0
,
prepare
=
dict
(
filter_by_difficulty
=
[
-
1
],
filter_by_min_points
=
dict
(
Car
=
5
,
Pedestrian
=
10
,
Cyclist
=
10
)),
classes
=
class_names
,
sample_groups
=
dict
(
Car
=
12
,
Pedestrian
=
6
,
Cyclist
=
6
),
points_loader
=
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
4
,
use_dim
=
4
))
train_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
4
,
# x, y, z, intensity
use_dim
=
4
),
dict
(
type
=
'LoadAnnotations3D'
,
with_bbox_3d
=
True
,
with_label_3d
=
True
),
dict
(
type
=
'ObjectSample'
,
db_sampler
=
db_sampler
),
dict
(
type
=
'ObjectNoise'
,
num_try
=
100
,
translation_std
=
[
1.0
,
1.0
,
0.5
],
global_rot_range
=
[
0.0
,
0.0
],
rot_range
=
[
-
0.78539816
,
0.78539816
]),
dict
(
type
=
'RandomFlip3D'
,
flip_ratio_bev_horizontal
=
0.5
),
dict
(
type
=
'GlobalRotScaleTrans'
,
rot_range
=
[
-
0.78539816
,
0.78539816
],
scale_ratio_range
=
[
0.95
,
1.05
]),
dict
(
type
=
'PointsRangeFilter'
,
point_cloud_range
=
point_cloud_range
),
dict
(
type
=
'ObjectRangeFilter'
,
point_cloud_range
=
point_cloud_range
),
dict
(
type
=
'PointShuffle'
),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
,
'gt_bboxes_3d'
,
'gt_labels_3d'
])
]
test_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
4
,
use_dim
=
4
),
dict
(
type
=
'MultiScaleFlipAug3D'
,
img_scale
=
(
1333
,
800
),
pts_scale_ratio
=
1
,
flip
=
False
,
transforms
=
[
dict
(
type
=
'GlobalRotScaleTrans'
,
rot_range
=
[
0
,
0
],
scale_ratio_range
=
[
1.
,
1.
],
translation_std
=
[
0
,
0
,
0
]),
dict
(
type
=
'RandomFlip3D'
),
dict
(
type
=
'PointsRangeFilter'
,
point_cloud_range
=
point_cloud_range
)
]),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
])
]
# construct a pipeline for data and gt loading in show function
# please keep its loading function consistent with test_pipeline (e.g. client)
eval_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
4
,
use_dim
=
4
),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
])
]
train_dataloader
=
dict
(
batch_size
=
6
,
num_workers
=
4
,
persistent_workers
=
True
,
sampler
=
dict
(
type
=
'DefaultSampler'
,
shuffle
=
True
),
dataset
=
dict
(
type
=
'RepeatDataset'
,
times
=
2
,
dataset
=
dict
(
type
=
dataset_type
,
data_root
=
data_root
,
ann_file
=
'kitti_infos_train.pkl'
,
data_prefix
=
dict
(
pts
=
'training/velodyne_reduced'
),
pipeline
=
train_pipeline
,
modality
=
input_modality
,
test_mode
=
False
,
metainfo
=
metainfo
,
# we use box_type_3d='LiDAR' in kitti and nuscenes dataset
# and box_type_3d='Depth' in sunrgbd and scannet dataset.
box_type_3d
=
'LiDAR'
)))
val_dataloader
=
dict
(
batch_size
=
1
,
num_workers
=
1
,
persistent_workers
=
True
,
drop_last
=
False
,
sampler
=
dict
(
type
=
'DefaultSampler'
,
shuffle
=
False
),
dataset
=
dict
(
type
=
dataset_type
,
data_root
=
data_root
,
data_prefix
=
dict
(
pts
=
'training/velodyne_reduced'
),
ann_file
=
'kitti_infos_val.pkl'
,
pipeline
=
test_pipeline
,
modality
=
input_modality
,
test_mode
=
True
,
metainfo
=
metainfo
,
box_type_3d
=
'LiDAR'
))
test_dataloader
=
dict
(
batch_size
=
1
,
num_workers
=
1
,
persistent_workers
=
True
,
drop_last
=
False
,
sampler
=
dict
(
type
=
'DefaultSampler'
,
shuffle
=
False
),
dataset
=
dict
(
type
=
dataset_type
,
data_root
=
data_root
,
data_prefix
=
dict
(
pts
=
'training/velodyne_reduced'
),
ann_file
=
'kitti_infos_val.pkl'
,
pipeline
=
test_pipeline
,
modality
=
input_modality
,
test_mode
=
True
,
metainfo
=
metainfo
,
box_type_3d
=
'LiDAR'
))
val_evaluator
=
dict
(
type
=
'KittiMetric'
,
ann_file
=
data_root
+
'kitti_infos_val.pkl'
,
metric
=
'bbox'
)
test_evaluator
=
val_evaluator
vis_backends
=
[
dict
(
type
=
'LocalVisBackend'
)]
visualizer
=
dict
(
type
=
'Det3DLocalVisualizer'
,
vis_backends
=
vis_backends
,
name
=
'visualizer'
)
tests/test_codebase/test_mmdet3d/data/kitti-mono3d.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
dataset_type
=
'KittiDataset'
data_root
=
'tests/test_codebase/test_mmdet3d/data/kitti/'
class_names
=
[
'Pedestrian'
,
'Cyclist'
,
'Car'
]
input_modality
=
dict
(
use_lidar
=
False
,
use_camera
=
True
)
metainfo
=
dict
(
classes
=
class_names
)
backend_args
=
None
train_pipeline
=
[
dict
(
type
=
'LoadImageFromFileMono3D'
,
backend_args
=
backend_args
),
dict
(
type
=
'LoadAnnotations3D'
,
with_bbox
=
True
,
with_label
=
True
,
with_attr_label
=
False
,
with_bbox_3d
=
True
,
with_label_3d
=
True
,
with_bbox_depth
=
True
),
dict
(
type
=
'Resize'
,
scale
=
(
1242
,
375
),
keep_ratio
=
True
),
dict
(
type
=
'RandomFlip3D'
,
flip_ratio_bev_horizontal
=
0.5
),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'img'
,
'gt_bboxes'
,
'gt_bboxes_labels'
,
'gt_bboxes_3d'
,
'gt_labels_3d'
,
'centers_2d'
,
'depths'
]),
]
test_pipeline
=
[
dict
(
type
=
'LoadImageFromFileMono3D'
,
backend_args
=
backend_args
),
dict
(
type
=
'Resize'
,
scale
=
(
1242
,
375
),
keep_ratio
=
True
),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'img'
])
]
eval_pipeline
=
[
dict
(
type
=
'LoadImageFromFileMono3D'
,
backend_args
=
backend_args
),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'img'
])
]
train_dataloader
=
dict
(
batch_size
=
2
,
num_workers
=
2
,
persistent_workers
=
True
,
sampler
=
dict
(
type
=
'DefaultSampler'
,
shuffle
=
True
),
dataset
=
dict
(
type
=
dataset_type
,
data_root
=
data_root
,
ann_file
=
'kitti_infos_train.pkl'
,
data_prefix
=
dict
(
img
=
'training/image_2'
),
pipeline
=
train_pipeline
,
modality
=
input_modality
,
load_type
=
'fov_image_based'
,
test_mode
=
False
,
metainfo
=
metainfo
,
# we use box_type_3d='Camera' in monocular 3d
# detection task
box_type_3d
=
'Camera'
,
backend_args
=
backend_args
))
val_dataloader
=
dict
(
batch_size
=
1
,
num_workers
=
2
,
persistent_workers
=
True
,
drop_last
=
False
,
sampler
=
dict
(
type
=
'DefaultSampler'
,
shuffle
=
False
),
dataset
=
dict
(
type
=
dataset_type
,
data_root
=
data_root
,
data_prefix
=
dict
(
img
=
'training/image_2'
),
ann_file
=
'kitti_infos_val.pkl'
,
pipeline
=
test_pipeline
,
modality
=
input_modality
,
load_type
=
'fov_image_based'
,
metainfo
=
metainfo
,
test_mode
=
True
,
box_type_3d
=
'Camera'
,
backend_args
=
backend_args
))
test_dataloader
=
val_dataloader
val_evaluator
=
dict
(
type
=
'KittiMetric'
,
ann_file
=
data_root
+
'kitti_infos_val.pkl'
,
metric
=
'bbox'
,
backend_args
=
backend_args
)
test_evaluator
=
val_evaluator
vis_backends
=
[
dict
(
type
=
'LocalVisBackend'
)]
visualizer
=
dict
(
type
=
'Det3DLocalVisualizer'
,
vis_backends
=
vis_backends
,
name
=
'visualizer'
)
tests/test_codebase/test_mmdet3d/data/kitti/kitti_000008.bin
0 → 100644
View file @
e4fb2aa4
File added
tests/test_codebase/test_mmdet3d/data/kitti/kitti_infos_val.pkl
0 → 100644
View file @
e4fb2aa4
File added
tests/test_codebase/test_mmdet3d/data/kitti/training/velodyne_reduced/000008.bin
0 → 120000
View file @
e4fb2aa4
../../kitti_000008.bin
\ No newline at end of file
tests/test_codebase/test_mmdet3d/data/model_cfg.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
_base_
=
[
'pointpillars_hv_secfpn_kitti.py'
,
'kitti-3d-3class.py'
,
'cyclic-40e.py'
,
'default_runtime.py'
]
point_cloud_range
=
[
0
,
-
39.68
,
-
3
,
69.12
,
39.68
,
1
]
# dataset settings
data_root
=
'data/kitti/'
class_names
=
[
'Pedestrian'
,
'Cyclist'
,
'Car'
]
metainfo
=
dict
(
CLASSES
=
class_names
)
# PointPillars adopted a different sampling strategies among classes
db_sampler
=
dict
(
data_root
=
data_root
,
info_path
=
data_root
+
'kitti_dbinfos_train.pkl'
,
rate
=
1.0
,
prepare
=
dict
(
filter_by_difficulty
=
[
-
1
],
filter_by_min_points
=
dict
(
Car
=
5
,
Pedestrian
=
5
,
Cyclist
=
5
)),
classes
=
class_names
,
sample_groups
=
dict
(
Car
=
15
,
Pedestrian
=
15
,
Cyclist
=
15
),
points_loader
=
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
4
,
use_dim
=
4
))
# PointPillars uses different augmentation hyper parameters
train_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
4
,
use_dim
=
4
),
dict
(
type
=
'LoadAnnotations3D'
,
with_bbox_3d
=
True
,
with_label_3d
=
True
),
dict
(
type
=
'ObjectSample'
,
db_sampler
=
db_sampler
,
use_ground_plane
=
True
),
dict
(
type
=
'RandomFlip3D'
,
flip_ratio_bev_horizontal
=
0.5
),
dict
(
type
=
'GlobalRotScaleTrans'
,
rot_range
=
[
-
0.78539816
,
0.78539816
],
scale_ratio_range
=
[
0.95
,
1.05
]),
dict
(
type
=
'PointsRangeFilter'
,
point_cloud_range
=
point_cloud_range
),
dict
(
type
=
'ObjectRangeFilter'
,
point_cloud_range
=
point_cloud_range
),
dict
(
type
=
'PointShuffle'
),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
,
'gt_labels_3d'
,
'gt_bboxes_3d'
])
]
test_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
4
,
use_dim
=
4
),
dict
(
type
=
'MultiScaleFlipAug3D'
,
img_scale
=
(
1333
,
800
),
pts_scale_ratio
=
1
,
flip
=
False
,
transforms
=
[
dict
(
type
=
'GlobalRotScaleTrans'
,
rot_range
=
[
0
,
0
],
scale_ratio_range
=
[
1.
,
1.
],
translation_std
=
[
0
,
0
,
0
]),
dict
(
type
=
'RandomFlip3D'
),
dict
(
type
=
'PointsRangeFilter'
,
point_cloud_range
=
point_cloud_range
)
]),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
])
]
train_dataloader
=
dict
(
dataset
=
dict
(
dataset
=
dict
(
pipeline
=
train_pipeline
,
metainfo
=
metainfo
)))
test_dataloader
=
dict
(
dataset
=
dict
(
pipeline
=
test_pipeline
,
metainfo
=
metainfo
))
val_dataloader
=
dict
(
dataset
=
dict
(
pipeline
=
test_pipeline
,
metainfo
=
metainfo
))
# In practice PointPillars also uses a different schedule
# optimizer
lr
=
0.001
epoch_num
=
80
optim_wrapper
=
dict
(
optimizer
=
dict
(
lr
=
lr
),
clip_grad
=
dict
(
max_norm
=
35
,
norm_type
=
2
))
param_scheduler
=
[
dict
(
type
=
'CosineAnnealingLR'
,
T_max
=
epoch_num
*
0.4
,
eta_min
=
lr
*
10
,
begin
=
0
,
end
=
epoch_num
*
0.4
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
dict
(
type
=
'CosineAnnealingLR'
,
T_max
=
epoch_num
*
0.6
,
eta_min
=
lr
*
1e-4
,
begin
=
epoch_num
*
0.4
,
end
=
epoch_num
*
1
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
dict
(
type
=
'CosineAnnealingMomentum'
,
T_max
=
epoch_num
*
0.4
,
eta_min
=
0.85
/
0.95
,
begin
=
0
,
end
=
epoch_num
*
0.4
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
dict
(
type
=
'CosineAnnealingMomentum'
,
T_max
=
epoch_num
*
0.6
,
eta_min
=
1
,
begin
=
epoch_num
*
0.4
,
end
=
epoch_num
*
1
,
convert_to_iter_based
=
True
)
]
# max_norm=35 is slightly better than 10 for PointPillars in the earlier
# development of the codebase thus we keep the setting. But we does not
# specifically tune this parameter.
# PointPillars usually need longer schedule than second, we simply double
# the training schedule. Do remind that since we use RepeatDataset and
# repeat factor is 2, so we actually train 160 epochs.
train_cfg
=
dict
(
by_epoch
=
True
,
max_epochs
=
epoch_num
,
val_interval
=
2
)
val_cfg
=
dict
()
test_cfg
=
dict
()
tests/test_codebase/test_mmdet3d/data/nus-3d.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
# If point cloud range is changed, the models should also change their point
# cloud range accordingly
point_cloud_range
=
[
-
50
,
-
50
,
-
5
,
50
,
50
,
3
]
# For nuScenes we usually do 10-class detection
class_names
=
[
'car'
,
'truck'
,
'trailer'
,
'bus'
,
'construction_vehicle'
,
'bicycle'
,
'motorcycle'
,
'pedestrian'
,
'traffic_cone'
,
'barrier'
]
metainfo
=
dict
(
CLASSES
=
class_names
)
dataset_type
=
'NuScenesDataset'
data_root
=
'data/nuscenes/'
# Input modality for nuScenes dataset, this is consistent with the submission
# format which requires the information in input_modality.
input_modality
=
dict
(
use_lidar
=
True
,
use_camera
=
False
)
data_prefix
=
dict
(
pts
=
'samples/LIDAR_TOP'
,
img
=
''
,
sweeps
=
'sweeps/LIDAR_TOP'
)
file_client_args
=
dict
(
backend
=
'disk'
)
# Uncomment the following if use ceph or other file clients.
# See https://mmcv.readthedocs.io/en/latest/api.html#mmcv.fileio.FileClient
# for more details.
# file_client_args = dict(
# backend='petrel',
# path_mapping=dict({
# './data/nuscenes/': 's3://nuscenes/nuscenes/',
# 'data/nuscenes/': 's3://nuscenes/nuscenes/'
# }))
train_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
5
,
use_dim
=
5
),
dict
(
type
=
'LoadPointsFromMultiSweeps'
,
sweeps_num
=
10
),
dict
(
type
=
'LoadAnnotations3D'
,
with_bbox_3d
=
True
,
with_label_3d
=
True
),
dict
(
type
=
'GlobalRotScaleTrans'
,
rot_range
=
[
-
0.3925
,
0.3925
],
scale_ratio_range
=
[
0.95
,
1.05
],
translation_std
=
[
0
,
0
,
0
]),
dict
(
type
=
'RandomFlip3D'
,
flip_ratio_bev_horizontal
=
0.5
),
dict
(
type
=
'PointsRangeFilter'
,
point_cloud_range
=
point_cloud_range
),
dict
(
type
=
'ObjectRangeFilter'
,
point_cloud_range
=
point_cloud_range
),
dict
(
type
=
'ObjectNameFilter'
,
classes
=
class_names
),
dict
(
type
=
'PointShuffle'
),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
,
'gt_bboxes_3d'
,
'gt_labels_3d'
])
]
test_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
5
,
use_dim
=
5
),
dict
(
type
=
'LoadPointsFromMultiSweeps'
,
sweeps_num
=
10
,
test_mode
=
True
),
dict
(
type
=
'MultiScaleFlipAug3D'
,
img_scale
=
(
1333
,
800
),
pts_scale_ratio
=
1
,
flip
=
False
,
transforms
=
[
dict
(
type
=
'GlobalRotScaleTrans'
,
rot_range
=
[
0
,
0
],
scale_ratio_range
=
[
1.
,
1.
],
translation_std
=
[
0
,
0
,
0
]),
dict
(
type
=
'RandomFlip3D'
),
dict
(
type
=
'PointsRangeFilter'
,
point_cloud_range
=
point_cloud_range
)
]),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
])
]
# construct a pipeline for data and gt loading in show function
# please keep its loading function consistent with test_pipeline (e.g. client)
eval_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
5
,
use_dim
=
5
),
dict
(
type
=
'LoadPointsFromMultiSweeps'
,
sweeps_num
=
10
,
test_mode
=
True
),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
])
]
train_dataloader
=
dict
(
batch_size
=
4
,
num_workers
=
4
,
persistent_workers
=
True
,
sampler
=
dict
(
type
=
'DefaultSampler'
,
shuffle
=
True
),
dataset
=
dict
(
type
=
dataset_type
,
data_root
=
data_root
,
ann_file
=
'nuscenes_infos_train.pkl'
,
pipeline
=
train_pipeline
,
metainfo
=
metainfo
,
modality
=
input_modality
,
test_mode
=
False
,
data_prefix
=
data_prefix
,
# we use box_type_3d='LiDAR' in kitti and nuscenes dataset
# and box_type_3d='Depth' in sunrgbd and scannet dataset.
box_type_3d
=
'LiDAR'
))
test_dataloader
=
dict
(
batch_size
=
1
,
num_workers
=
1
,
persistent_workers
=
True
,
drop_last
=
False
,
sampler
=
dict
(
type
=
'DefaultSampler'
,
shuffle
=
False
),
dataset
=
dict
(
type
=
dataset_type
,
data_root
=
data_root
,
ann_file
=
'nuscenes_infos_val.pkl'
,
pipeline
=
test_pipeline
,
metainfo
=
metainfo
,
modality
=
input_modality
,
data_prefix
=
data_prefix
,
test_mode
=
True
,
box_type_3d
=
'LiDAR'
))
val_dataloader
=
dict
(
batch_size
=
1
,
num_workers
=
1
,
persistent_workers
=
True
,
drop_last
=
False
,
sampler
=
dict
(
type
=
'DefaultSampler'
,
shuffle
=
False
),
dataset
=
dict
(
type
=
dataset_type
,
data_root
=
data_root
,
ann_file
=
'nuscenes_infos_val.pkl'
,
pipeline
=
test_pipeline
,
metainfo
=
metainfo
,
modality
=
input_modality
,
test_mode
=
True
,
data_prefix
=
data_prefix
,
box_type_3d
=
'LiDAR'
))
val_evaluator
=
dict
(
type
=
'NuScenesMetric'
,
data_root
=
data_root
,
ann_file
=
data_root
+
'nuscenes_infos_val.pkl'
,
metric
=
'bbox'
)
test_evaluator
=
val_evaluator
vis_backends
=
[
dict
(
type
=
'LocalVisBackend'
)]
visualizer
=
dict
(
type
=
'Det3DLocalVisualizer'
,
vis_backends
=
vis_backends
,
name
=
'visualizer'
)
tests/test_codebase/test_mmdet3d/data/nuscenes/n008-2018-09-18-12-07-26-0400__LIDAR_TOP__1537287083900561.pcd.bin
0 → 100644
View file @
e4fb2aa4
File added
tests/test_codebase/test_mmdet3d/data/nuscenes/n015-2018-07-24-11-22-45+0800.pkl
0 → 100755
View file @
e4fb2aa4
File added
tests/test_codebase/test_mmdet3d/data/nuscenes/n015-2018-07-24-11-22-45+0800__CAM_FRONT__1532402927612460.jpg
0 → 100644
View file @
e4fb2aa4
128 KB
tests/test_codebase/test_mmdet3d/data/pointpillars.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
_base_
=
[
'pointpillars_hv_secfpn_kitti.py'
,
'kitti-3d-3class.py'
,
'cyclic-40e.py'
,
'default_runtime.py'
]
point_cloud_range
=
[
0
,
-
39.68
,
-
3
,
69.12
,
39.68
,
1
]
# dataset settings
data_root
=
'data/kitti/'
class_names
=
[
'Pedestrian'
,
'Cyclist'
,
'Car'
]
metainfo
=
dict
(
CLASSES
=
class_names
)
# PointPillars adopted a different sampling strategies among classes
db_sampler
=
dict
(
data_root
=
data_root
,
info_path
=
data_root
+
'kitti_dbinfos_train.pkl'
,
rate
=
1.0
,
prepare
=
dict
(
filter_by_difficulty
=
[
-
1
],
filter_by_min_points
=
dict
(
Car
=
5
,
Pedestrian
=
5
,
Cyclist
=
5
)),
classes
=
class_names
,
sample_groups
=
dict
(
Car
=
15
,
Pedestrian
=
15
,
Cyclist
=
15
),
points_loader
=
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
4
,
use_dim
=
4
))
# PointPillars uses different augmentation hyper parameters
train_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
4
,
use_dim
=
4
),
dict
(
type
=
'LoadAnnotations3D'
,
with_bbox_3d
=
True
,
with_label_3d
=
True
),
dict
(
type
=
'ObjectSample'
,
db_sampler
=
db_sampler
,
use_ground_plane
=
True
),
dict
(
type
=
'RandomFlip3D'
,
flip_ratio_bev_horizontal
=
0.5
),
dict
(
type
=
'GlobalRotScaleTrans'
,
rot_range
=
[
-
0.78539816
,
0.78539816
],
scale_ratio_range
=
[
0.95
,
1.05
]),
dict
(
type
=
'PointsRangeFilter'
,
point_cloud_range
=
point_cloud_range
),
dict
(
type
=
'ObjectRangeFilter'
,
point_cloud_range
=
point_cloud_range
),
dict
(
type
=
'PointShuffle'
),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
,
'gt_labels_3d'
,
'gt_bboxes_3d'
])
]
test_pipeline
=
[
dict
(
type
=
'LoadPointsFromFile'
,
coord_type
=
'LIDAR'
,
load_dim
=
4
,
use_dim
=
4
),
dict
(
type
=
'MultiScaleFlipAug3D'
,
img_scale
=
(
1333
,
800
),
pts_scale_ratio
=
1
,
flip
=
False
,
transforms
=
[
dict
(
type
=
'GlobalRotScaleTrans'
,
rot_range
=
[
0
,
0
],
scale_ratio_range
=
[
1.
,
1.
],
translation_std
=
[
0
,
0
,
0
]),
dict
(
type
=
'RandomFlip3D'
),
dict
(
type
=
'PointsRangeFilter'
,
point_cloud_range
=
point_cloud_range
)
]),
dict
(
type
=
'Pack3DDetInputs'
,
keys
=
[
'points'
])
]
train_dataloader
=
dict
(
dataset
=
dict
(
dataset
=
dict
(
pipeline
=
train_pipeline
,
metainfo
=
metainfo
)))
test_dataloader
=
dict
(
dataset
=
dict
(
pipeline
=
test_pipeline
,
metainfo
=
metainfo
))
val_dataloader
=
dict
(
dataset
=
dict
(
pipeline
=
test_pipeline
,
metainfo
=
metainfo
))
# In practice PointPillars also uses a different schedule
# optimizer
lr
=
0.001
epoch_num
=
80
optim_wrapper
=
dict
(
optimizer
=
dict
(
lr
=
lr
),
clip_grad
=
dict
(
max_norm
=
35
,
norm_type
=
2
))
param_scheduler
=
[
dict
(
type
=
'CosineAnnealingLR'
,
T_max
=
epoch_num
*
0.4
,
eta_min
=
lr
*
10
,
begin
=
0
,
end
=
epoch_num
*
0.4
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
dict
(
type
=
'CosineAnnealingLR'
,
T_max
=
epoch_num
*
0.6
,
eta_min
=
lr
*
1e-4
,
begin
=
epoch_num
*
0.4
,
end
=
epoch_num
*
1
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
dict
(
type
=
'CosineAnnealingMomentum'
,
T_max
=
epoch_num
*
0.4
,
eta_min
=
0.85
/
0.95
,
begin
=
0
,
end
=
epoch_num
*
0.4
,
by_epoch
=
True
,
convert_to_iter_based
=
True
),
dict
(
type
=
'CosineAnnealingMomentum'
,
T_max
=
epoch_num
*
0.6
,
eta_min
=
1
,
begin
=
epoch_num
*
0.4
,
end
=
epoch_num
*
1
,
convert_to_iter_based
=
True
)
]
# max_norm=35 is slightly better than 10 for PointPillars in the earlier
# development of the codebase thus we keep the setting. But we does not
# specifically tune this parameter.
# PointPillars usually need longer schedule than second, we simply double
# the training schedule. Do remind that since we use RepeatDataset and
# repeat factor is 2, so we actually train 160 epochs.
train_cfg
=
dict
(
by_epoch
=
True
,
max_epochs
=
epoch_num
,
val_interval
=
2
)
val_cfg
=
dict
()
test_cfg
=
dict
()
tests/test_codebase/test_mmdet3d/data/pointpillars_hv_secfpn_kitti.py
0 → 100644
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
voxel_size
=
[
0.16
,
0.16
,
4
]
model
=
dict
(
type
=
'VoxelNet'
,
data_preprocessor
=
dict
(
type
=
'Det3DDataPreprocessor'
,
voxel
=
True
,
voxel_layer
=
dict
(
max_num_points
=
32
,
# max_points_per_voxel
point_cloud_range
=
[
0
,
-
39.68
,
-
3
,
69.12
,
39.68
,
1
],
voxel_size
=
voxel_size
,
max_voxels
=
(
16000
,
40000
))),
voxel_encoder
=
dict
(
type
=
'PillarFeatureNet'
,
in_channels
=
4
,
feat_channels
=
[
64
],
with_distance
=
False
,
voxel_size
=
voxel_size
,
point_cloud_range
=
[
0
,
-
39.68
,
-
3
,
69.12
,
39.68
,
1
]),
middle_encoder
=
dict
(
type
=
'PointPillarsScatter'
,
in_channels
=
64
,
output_shape
=
[
496
,
432
]),
backbone
=
dict
(
type
=
'SECOND'
,
in_channels
=
64
,
layer_nums
=
[
3
,
5
,
5
],
layer_strides
=
[
2
,
2
,
2
],
out_channels
=
[
64
,
128
,
256
]),
neck
=
dict
(
type
=
'SECONDFPN'
,
in_channels
=
[
64
,
128
,
256
],
upsample_strides
=
[
1
,
2
,
4
],
out_channels
=
[
128
,
128
,
128
]),
bbox_head
=
dict
(
type
=
'Anchor3DHead'
,
num_classes
=
3
,
in_channels
=
384
,
feat_channels
=
384
,
use_direction_classifier
=
True
,
assign_per_class
=
True
,
anchor_generator
=
dict
(
type
=
'AlignedAnchor3DRangeGenerator'
,
ranges
=
[
[
0
,
-
39.68
,
-
0.6
,
69.12
,
39.68
,
-
0.6
],
[
0
,
-
39.68
,
-
0.6
,
69.12
,
39.68
,
-
0.6
],
[
0
,
-
39.68
,
-
1.78
,
69.12
,
39.68
,
-
1.78
],
],
sizes
=
[[
0.8
,
0.6
,
1.73
],
[
1.76
,
0.6
,
1.73
],
[
3.9
,
1.6
,
1.56
]],
rotations
=
[
0
,
1.57
],
reshape_out
=
False
),
diff_rad_by_sin
=
True
,
bbox_coder
=
dict
(
type
=
'DeltaXYZWLHRBBoxCoder'
),
loss_cls
=
dict
(
type
=
'mmdet.FocalLoss'
,
use_sigmoid
=
True
,
gamma
=
2.0
,
alpha
=
0.25
,
loss_weight
=
1.0
),
loss_bbox
=
dict
(
type
=
'mmdet.SmoothL1Loss'
,
beta
=
1.0
/
9.0
,
loss_weight
=
2.0
),
loss_dir
=
dict
(
type
=
'mmdet.CrossEntropyLoss'
,
use_sigmoid
=
False
,
loss_weight
=
0.2
)),
# model training and testing settings
train_cfg
=
dict
(
assigner
=
[
dict
(
# for Pedestrian
type
=
'Max3DIoUAssigner'
,
iou_calculator
=
dict
(
type
=
'mmdet3d.BboxOverlapsNearest3D'
),
pos_iou_thr
=
0.5
,
neg_iou_thr
=
0.35
,
min_pos_iou
=
0.35
,
ignore_iof_thr
=-
1
),
dict
(
# for Cyclist
type
=
'Max3DIoUAssigner'
,
iou_calculator
=
dict
(
type
=
'mmdet3d.BboxOverlapsNearest3D'
),
pos_iou_thr
=
0.5
,
neg_iou_thr
=
0.35
,
min_pos_iou
=
0.35
,
ignore_iof_thr
=-
1
),
dict
(
# for Car
type
=
'Max3DIoUAssigner'
,
iou_calculator
=
dict
(
type
=
'mmdet3d.BboxOverlapsNearest3D'
),
pos_iou_thr
=
0.6
,
neg_iou_thr
=
0.45
,
min_pos_iou
=
0.45
,
ignore_iof_thr
=-
1
),
],
allowed_border
=
0
,
pos_weight
=-
1
,
debug
=
False
),
test_cfg
=
dict
(
use_rotate_nms
=
True
,
nms_across_levels
=
False
,
nms_thr
=
0.01
,
score_thr
=
0.1
,
min_bbox_size
=
0
,
nms_pre
=
100
,
max_num
=
50
))
tests/test_codebase/test_mmdet3d/data/smoke.py
0 → 100755
View file @
e4fb2aa4
# Copyright (c) OpenMMLab. All rights reserved.
# model settings
model
=
dict
(
type
=
'SMOKEMono3D'
,
data_preprocessor
=
dict
(
type
=
'Det3DDataPreprocessor'
,
mean
=
[
123.675
,
116.28
,
103.53
],
std
=
[
58.395
,
57.12
,
57.375
],
bgr_to_rgb
=
True
,
pad_size_divisor
=
32
),
backbone
=
dict
(
type
=
'DLANet'
,
depth
=
34
,
in_channels
=
3
,
norm_cfg
=
dict
(
type
=
'GN'
,
num_groups
=
32
),
init_cfg
=
dict
(
type
=
'Pretrained'
,
checkpoint
=
'http://dl.yf.io/dla/models/imagenet/dla34-ba72cf86.pth'
)),
neck
=
dict
(
type
=
'DLANeck'
,
in_channels
=
[
16
,
32
,
64
,
128
,
256
,
512
],
start_level
=
2
,
end_level
=
5
,
norm_cfg
=
dict
(
type
=
'GN'
,
num_groups
=
32
)),
bbox_head
=
dict
(
type
=
'SMOKEMono3DHead'
,
num_classes
=
3
,
in_channels
=
64
,
dim_channel
=
[
3
,
4
,
5
],
ori_channel
=
[
6
,
7
],
stacked_convs
=
0
,
feat_channels
=
64
,
use_direction_classifier
=
False
,
diff_rad_by_sin
=
False
,
pred_attrs
=
False
,
pred_velo
=
False
,
dir_offset
=
0
,
strides
=
None
,
group_reg_dims
=
(
8
,
),
cls_branch
=
(
256
,
),
reg_branch
=
((
256
,
),
),
num_attrs
=
0
,
bbox_code_size
=
7
,
dir_branch
=
(),
attr_branch
=
(),
bbox_coder
=
dict
(
type
=
'SMOKECoder'
,
base_depth
=
(
28.01
,
16.32
),
base_dims
=
((
0.88
,
1.73
,
0.67
),
(
1.78
,
1.70
,
0.58
),
(
3.88
,
1.63
,
1.53
)),
code_size
=
7
),
loss_cls
=
dict
(
type
=
'mmdet.GaussianFocalLoss'
,
loss_weight
=
1.0
),
loss_bbox
=
dict
(
type
=
'mmdet.L1Loss'
,
reduction
=
'sum'
,
loss_weight
=
1
/
300
),
loss_dir
=
dict
(
type
=
'mmdet.CrossEntropyLoss'
,
use_sigmoid
=
False
,
loss_weight
=
1.0
),
loss_attr
=
None
,
conv_bias
=
True
,
dcn_on_last_conv
=
False
),
train_cfg
=
None
,
test_cfg
=
dict
(
topK
=
100
,
local_maximum_kernel
=
3
,
max_per_img
=
100
))
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment