hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py 3.92 KB
Newer Older
zhangwenwei's avatar
zhangwenwei committed
1
_base_ = [
2
    '../_base_/models/hv_pointpillars_secfpn_kitti.py',
zhangwenwei's avatar
zhangwenwei committed
3
4
5
    '../_base_/datasets/kitti-3d-3class.py',
    '../_base_/schedules/cyclic_40e.py', '../_base_/default_runtime.py'
]
6

zhangwenwei's avatar
zhangwenwei committed
7
point_cloud_range = [0, -39.68, -3, 69.12, 39.68, 1]
8
9
10
# dataset settings
data_root = 'data/kitti/'
class_names = ['Pedestrian', 'Cyclist', 'Car']
VVsssssk's avatar
VVsssssk committed
11
metainfo = dict(CLASSES=class_names)
zhangwenwei's avatar
zhangwenwei committed
12
# PointPillars adopted a different sampling strategies among classes
13
14
15
16
17
18
db_sampler = dict(
    data_root=data_root,
    info_path=data_root + 'kitti_dbinfos_train.pkl',
    rate=1.0,
    prepare=dict(
        filter_by_difficulty=[-1],
19
        filter_by_min_points=dict(Car=5, Pedestrian=5, Cyclist=5)),
20
    classes=class_names,
21
    sample_groups=dict(Car=15, Pedestrian=15, Cyclist=15))
22

zhangwenwei's avatar
zhangwenwei committed
23
# PointPillars uses different augmentation hyper parameters
24
train_pipeline = [
25
    dict(type='LoadPointsFromFile', coord_type='LIDAR', load_dim=4, use_dim=4),
26
    dict(type='LoadAnnotations3D', with_bbox_3d=True, with_label_3d=True),
Xiangxu-0103's avatar
Xiangxu-0103 committed
27
    dict(type='ObjectSample', db_sampler=db_sampler, use_ground_plane=True),
wuyuefeng's avatar
wuyuefeng committed
28
    dict(type='RandomFlip3D', flip_ratio_bev_horizontal=0.5),
29
    dict(
zhangwenwei's avatar
zhangwenwei committed
30
31
32
        type='GlobalRotScaleTrans',
        rot_range=[-0.78539816, 0.78539816],
        scale_ratio_range=[0.95, 1.05]),
33
34
35
    dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range),
    dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range),
    dict(type='PointShuffle'),
VVsssssk's avatar
VVsssssk committed
36
37
38
    dict(
        type='Pack3DDetInputs',
        keys=['points', 'gt_labels_3d', 'gt_bboxes_3d'])
39
40
]
test_pipeline = [
41
    dict(type='LoadPointsFromFile', coord_type='LIDAR', load_dim=4, use_dim=4),
42
    dict(
zhangwenwei's avatar
zhangwenwei committed
43
44
45
46
47
48
49
50
51
52
53
54
55
        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),
VVsssssk's avatar
VVsssssk committed
56
            dict(type='Pack3DDetInputs', keys=['points'])
zhangwenwei's avatar
zhangwenwei committed
57
        ])
58
59
]

VVsssssk's avatar
VVsssssk committed
60
61
62
63
train_dataloader = dict(
    dataset=dict(dataset=dict(pipeline=train_pipeline, metainfo=metainfo)))
test_dataloader = dict(dataset=dict(metainfo=metainfo))
val_dataloader = dict(dataset=dict(metainfo=metainfo))
zhangwenwei's avatar
zhangwenwei committed
64
# In practice PointPillars also uses a different schedule
65
# optimizer
zhangwenwei's avatar
zhangwenwei committed
66
lr = 0.001
VVsssssk's avatar
VVsssssk committed
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
epoch_num = 80
iter_num_in_epoch = 3712
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 * iter_num_in_epoch,
        eta_min=lr * 10,
        by_epoch=False,
        begin=0,
        end=epoch_num * 0.4 * iter_num_in_epoch),
    dict(
        type='CosineAnnealingLR',
        T_max=epoch_num * 0.6 * iter_num_in_epoch,
        eta_min=lr * 1e-4,
        by_epoch=False,
        begin=epoch_num * 0.4 * iter_num_in_epoch,
        end=epoch_num * 1 * iter_num_in_epoch),
    dict(
        type='CosineAnnealingBetas',
        T_max=epoch_num * 0.4 * iter_num_in_epoch,
        eta_min=0.85 / 0.95,
        by_epoch=False,
        begin=0,
        end=epoch_num * 0.4 * iter_num_in_epoch),
    dict(
        type='CosineAnnealingBetas',
        T_max=epoch_num * 0.6 * iter_num_in_epoch,
        eta_min=1,
        by_epoch=False,
        begin=epoch_num * 0.4 * iter_num_in_epoch,
        end=epoch_num * 1 * iter_num_in_epoch)
]
zhangwenwei's avatar
zhangwenwei committed
101
102
103
104
105
106
# 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.
VVsssssk's avatar
VVsssssk committed
107
108
109
train_cfg = dict(by_epoch=True, max_epochs=epoch_num)
val_cfg = dict(interval=2)
test_cfg = dict()