kavaliha's picture
up
17680f1 verified
raw
history blame
17.2 kB
_base_ = [
'../datasets/custom_nus-3d.py',
'../_base_/default_runtime.py'
]
#
plugin = True
plugin_dir = 'projects/mmdet3d_plugin/'
# If point cloud range is changed, the models should also change their point
# cloud range accordingly
point_cloud_range = [-15.0, -30.0, -2.0, 15.0, 30.0, 2.0]
voxel_size = [0.15, 0.15, 4]
img_norm_cfg = dict(
mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
# For nuScenes we usually do 10-class detection
class_names = [
'car', 'truck', 'construction_vehicle', 'bus', 'trailer', 'barrier',
'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone'
]
num_classes = len(class_names)
# map has classes: divider, ped_crossing, boundary
map_classes = ['divider', 'ped_crossing', 'boundary']
map_num_vec = 100
map_fixed_ptsnum_per_gt_line = 20 # now only support fixed_pts > 0
map_fixed_ptsnum_per_pred_line = 20
map_eval_use_same_gt_sample_num_flag = True
map_num_classes = len(map_classes)
input_modality = dict(
use_lidar=False,
use_camera=True,
use_radar=False,
use_map=False,
use_external=True)
_dim_ = 256
_pos_dim_ = _dim_//2
_ffn_dim_ = _dim_*2
_num_levels_ = 1
bev_h_ = 100
bev_w_ = 100
queue_length = 3 # each sequence contains `queue_length` frames.
total_epochs = 60
model = dict(
type='VAD',
use_grid_mask=True,
video_test_mode=True,
pretrained=dict(img='torchvision://resnet50'),
img_backbone=dict(
type='ResNet',
depth=50,
num_stages=4,
out_indices=(3,),
frozen_stages=1,
norm_cfg=dict(type='BN', requires_grad=False),
norm_eval=True,
style='pytorch'),
img_neck=dict(
type='FPN',
in_channels=[2048],
out_channels=_dim_,
start_level=0,
add_extra_convs='on_output',
num_outs=_num_levels_,
relu_before_extra_convs=True),
pts_bbox_head=dict(
type='VADHead',
map_thresh=0.5,
dis_thresh=0.2,
pe_normalization=True,
tot_epoch=total_epochs,
use_traj_lr_warmup=False,
query_thresh=0.0,
query_use_fix_pad=False,
ego_his_encoder=None,
ego_lcf_feat_idx=None,
valid_fut_ts=6,
agent_dim = 300,
ego_agent_decoder=dict(
type='CustomTransformerDecoder',
num_layers=1,
return_intermediate=False,
transformerlayers=dict(
type='BaseTransformerLayer',
attn_cfgs=[
dict(
type='MultiheadAttention',
embed_dims=_dim_,
num_heads=8,
dropout=0.1),
],
feedforward_channels=_ffn_dim_,
ffn_dropout=0.1,
operation_order=('cross_attn', 'norm', 'ffn', 'norm'))),
ego_map_decoder=dict(
type='CustomTransformerDecoder',
num_layers=1,
return_intermediate=False,
transformerlayers=dict(
type='BaseTransformerLayer',
attn_cfgs=[
dict(
type='MultiheadAttention',
embed_dims=_dim_,
num_heads=8,
dropout=0.1),
],
feedforward_channels=_ffn_dim_,
ffn_dropout=0.1,
operation_order=('cross_attn', 'norm', 'ffn', 'norm'))),
motion_decoder=dict(
type='CustomTransformerDecoder',
num_layers=1,
return_intermediate=False,
transformerlayers=dict(
type='BaseTransformerLayer',
attn_cfgs=[
dict(
type='MultiheadAttention',
embed_dims=_dim_,
num_heads=8,
dropout=0.1),
],
feedforward_channels=_ffn_dim_,
ffn_dropout=0.1,
operation_order=('cross_attn', 'norm', 'ffn', 'norm'))),
motion_map_decoder=dict(
type='CustomTransformerDecoder',
num_layers=1,
return_intermediate=False,
transformerlayers=dict(
type='BaseTransformerLayer',
attn_cfgs=[
dict(
type='MultiheadAttention',
embed_dims=_dim_,
num_heads=8,
dropout=0.1),
],
feedforward_channels=_ffn_dim_,
ffn_dropout=0.1,
operation_order=('cross_attn', 'norm', 'ffn', 'norm'))),
use_pe=True,
bev_h=bev_h_,
bev_w=bev_w_,
num_query=300,
num_classes=num_classes,
in_channels=_dim_,
sync_cls_avg_factor=True,
with_box_refine=True,
as_two_stage=False,
map_num_vec=map_num_vec,
map_num_classes=map_num_classes,
map_num_pts_per_vec=map_fixed_ptsnum_per_pred_line,
map_num_pts_per_gt_vec=map_fixed_ptsnum_per_gt_line,
map_query_embed_type='instance_pts',
map_transform_method='minmax',
map_gt_shift_pts_pattern='v2',
map_dir_interval=1,
map_code_size=2,
map_code_weights=[1.0, 1.0, 1.0, 1.0],
transformer=dict(
type='VADPerceptionTransformer',
map_num_vec=map_num_vec,
map_num_pts_per_vec=map_fixed_ptsnum_per_pred_line,
rotate_prev_bev=True,
use_shift=True,
use_can_bus=True,
embed_dims=_dim_,
encoder=dict(
type='BEVFormerEncoder',
num_layers=3,
pc_range=point_cloud_range,
num_points_in_pillar=4,
return_intermediate=False,
transformerlayers=dict(
type='BEVFormerLayer',
attn_cfgs=[
dict(
type='TemporalSelfAttention',
embed_dims=_dim_,
num_levels=1),
dict(
type='SpatialCrossAttention',
pc_range=point_cloud_range,
deformable_attention=dict(
type='MSDeformableAttention3D',
embed_dims=_dim_,
num_points=8,
num_levels=_num_levels_),
embed_dims=_dim_,
)
],
feedforward_channels=_ffn_dim_,
ffn_dropout=0.1,
operation_order=('self_attn', 'norm', 'cross_attn', 'norm',
'ffn', 'norm'))),
decoder=dict(
type='DetectionTransformerDecoder',
num_layers=3,
return_intermediate=True,
transformerlayers=dict(
type='DetrTransformerDecoderLayer',
attn_cfgs=[
dict(
type='MultiheadAttention',
embed_dims=_dim_,
num_heads=8,
dropout=0.1),
dict(
type='CustomMSDeformableAttention',
embed_dims=_dim_,
num_levels=1),
],
feedforward_channels=_ffn_dim_,
ffn_dropout=0.1,
operation_order=('self_attn', 'norm', 'cross_attn', 'norm',
'ffn', 'norm'))),
map_decoder=dict(
type='MapDetectionTransformerDecoder',
num_layers=3,
return_intermediate=True,
transformerlayers=dict(
type='DetrTransformerDecoderLayer',
attn_cfgs=[
dict(
type='MultiheadAttention',
embed_dims=_dim_,
num_heads=8,
dropout=0.1),
dict(
type='CustomMSDeformableAttention',
embed_dims=_dim_,
num_levels=1),
],
feedforward_channels=_ffn_dim_,
ffn_dropout=0.1,
operation_order=('self_attn', 'norm', 'cross_attn', 'norm',
'ffn', 'norm')))),
bbox_coder=dict(
type='CustomNMSFreeCoder',
post_center_range=[-20, -35, -10.0, 20, 35, 10.0],
pc_range=point_cloud_range,
max_num=100,
voxel_size=voxel_size,
num_classes=num_classes),
map_bbox_coder=dict(
type='MapNMSFreeCoder',
post_center_range=[-20, -35, -20, -35, 20, 35, 20, 35],
pc_range=point_cloud_range,
max_num=50,
voxel_size=voxel_size,
num_classes=map_num_classes),
positional_encoding=dict(
type='LearnedPositionalEncoding',
num_feats=_pos_dim_,
row_num_embed=bev_h_,
col_num_embed=bev_w_,
),
loss_cls=dict(
type='FocalLoss',
use_sigmoid=True,
gamma=2.0,
alpha=0.25,
loss_weight=2.0),
loss_bbox=dict(type='L1Loss', loss_weight=0.25),
loss_traj=dict(type='L1Loss', loss_weight=0.2),
loss_traj_cls=dict(
type='FocalLoss',
use_sigmoid=True,
gamma=2.0,
alpha=0.25,
loss_weight=0.2),
loss_iou=dict(type='GIoULoss', loss_weight=0.0),
loss_map_cls=dict(
type='FocalLoss',
use_sigmoid=True,
gamma=2.0,
alpha=0.25,
loss_weight=2.0),
loss_map_bbox=dict(type='L1Loss', loss_weight=0.0),
loss_map_iou=dict(type='GIoULoss', loss_weight=0.0),
loss_map_pts=dict(type='PtsL1Loss', loss_weight=1.0),
loss_map_dir=dict(type='PtsDirCosLoss', loss_weight=0.005),
loss_plan_reg=dict(type='L1Loss', loss_weight=1.0),
loss_plan_bound=dict(type='PlanMapBoundLoss', loss_weight=1.0, dis_thresh=1.0),
loss_plan_col=dict(type='PlanCollisionLoss', loss_weight=1.0),
loss_plan_dir=dict(type='PlanMapDirectionLoss', loss_weight=0.5),
loss_vae_gen=dict(type='ProbabilisticLoss', loss_weight=1.0),
loss_diff_gen=dict(type='DiffusionLoss', loss_weight=0.5)),
# model training and testing settings
train_cfg=dict(pts=dict(
grid_size=[512, 512, 1],
voxel_size=voxel_size,
point_cloud_range=point_cloud_range,
out_size_factor=4,
assigner=dict(
type='HungarianAssigner3D',
cls_cost=dict(type='FocalLossCost', weight=2.0),
reg_cost=dict(type='BBox3DL1Cost', weight=0.25),
iou_cost=dict(type='IoUCost', weight=0.0), # Fake cost. This is just to make it compatible with DETR head.
pc_range=point_cloud_range),
map_assigner=dict(
type='MapHungarianAssigner3D',
cls_cost=dict(type='FocalLossCost', weight=2.0),
reg_cost=dict(type='BBoxL1Cost', weight=0.0, box_format='xywh'),
iou_cost=dict(type='IoUCost', iou_mode='giou', weight=0.0),
pts_cost=dict(type='OrderedPtsL1Cost', weight=1.0),
pc_range=point_cloud_range))))
dataset_type = 'VADCustomNuScenesDataset'
data_root = 'xxx/nuscenes/'
file_client_args = dict(backend='disk')
train_pipeline = [
dict(type='LoadMultiViewImageFromFiles', to_float32=True),
dict(type='PhotoMetricDistortionMultiViewImage'),
dict(type='LoadAnnotations3D', with_bbox_3d=True, with_label_3d=True, with_attr_label=True),
dict(type='CustomObjectRangeFilter', point_cloud_range=point_cloud_range),
dict(type='CustomObjectNameFilter', classes=class_names),
dict(type='NormalizeMultiviewImage', **img_norm_cfg),
dict(type='RandomScaleImageMultiViewImage', scales=[0.4]),
dict(type='PadMultiViewImage', size_divisor=32),
dict(type='CustomDefaultFormatBundle3D', class_names=class_names, with_ego=True),
dict(type='CustomCollect3D',\
keys=['gt_bboxes_3d', 'gt_labels_3d', 'img', 'ego_his_trajs',
'ego_fut_trajs', 'ego_fut_masks', 'ego_fut_cmd', 'ego_lcf_feat', 'gt_attr_labels'])
]
test_pipeline = [
dict(type='LoadMultiViewImageFromFiles', to_float32=True),
dict(type='LoadPointsFromFile',
coord_type='LIDAR',
load_dim=5,
use_dim=5,
file_client_args=file_client_args),
dict(type='LoadAnnotations3D', with_bbox_3d=True, with_label_3d=True, with_attr_label=True),
dict(type='CustomObjectRangeFilter', point_cloud_range=point_cloud_range),
dict(type='CustomObjectNameFilter', classes=class_names),
dict(type='NormalizeMultiviewImage', **img_norm_cfg),
# dict(type='PadMultiViewImage', size_divisor=32),
dict(
type='MultiScaleFlipAug3D',
img_scale=(1600, 900),
pts_scale_ratio=1,
flip=False,
transforms=[
dict(type='RandomScaleImageMultiViewImage', scales=[0.4]),
dict(type='PadMultiViewImage', size_divisor=32),
dict(type='CustomDefaultFormatBundle3D', class_names=class_names, with_label=False, with_ego=True),
dict(type='CustomCollect3D',\
keys=['points', 'gt_bboxes_3d', 'gt_labels_3d', 'img', 'fut_valid_flag',
'ego_his_trajs', 'ego_fut_trajs', 'ego_fut_masks', 'ego_fut_cmd',
'ego_lcf_feat', 'gt_attr_labels'])])
]
data = dict(
samples_per_gpu=1,
workers_per_gpu=4,
train=dict(
type=dataset_type,
data_root=data_root,
ann_file=data_root + 'genad_nuscenes_infos_train.pkl',
pipeline=train_pipeline,
classes=class_names,
modality=input_modality,
test_mode=False,
use_valid_flag=True,
bev_size=(bev_h_, bev_w_),
pc_range=point_cloud_range,
queue_length=queue_length,
map_classes=map_classes,
map_fixed_ptsnum_per_line=map_fixed_ptsnum_per_gt_line,
map_eval_use_same_gt_sample_num_flag=map_eval_use_same_gt_sample_num_flag,
# 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',
custom_eval_version='vad_nusc_detection_cvpr_2019'),
val=dict(type=dataset_type,
data_root=data_root,
pc_range=point_cloud_range,
ann_file=data_root + 'genad_nuscenes_infos_val.pkl',
pipeline=test_pipeline, bev_size=(bev_h_, bev_w_),
classes=class_names, modality=input_modality, samples_per_gpu=1,
map_classes=map_classes,
map_ann_file=data_root + 'nuscenes_map_anns_val.json',
map_fixed_ptsnum_per_line=map_fixed_ptsnum_per_gt_line,
map_eval_use_same_gt_sample_num_flag=map_eval_use_same_gt_sample_num_flag,
use_pkl_result=True,
custom_eval_version='vad_nusc_detection_cvpr_2019'),
test=dict(type=dataset_type,
data_root=data_root,
pc_range=point_cloud_range,
ann_file=data_root + 'genad_nuscenes_infos_val.pkl',
pipeline=test_pipeline, bev_size=(bev_h_, bev_w_),
classes=class_names, modality=input_modality, samples_per_gpu=1,
map_classes=map_classes,
map_ann_file=data_root + 'nuscenes_map_anns_val.json',
map_fixed_ptsnum_per_line=map_fixed_ptsnum_per_gt_line,
map_eval_use_same_gt_sample_num_flag=map_eval_use_same_gt_sample_num_flag,
use_pkl_result=True,
custom_eval_version='vad_nusc_detection_cvpr_2019'),
shuffler_sampler=dict(type='DistributedGroupSampler'),
nonshuffler_sampler=dict(type='DistributedSampler')
)
optimizer = dict(
type='AdamW',
lr=2e-4,
paramwise_cfg=dict(
custom_keys={
'img_backbone': dict(lr_mult=0.1),
}),
weight_decay=0.01)
optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))
# learning policy
lr_config = dict(
policy='CosineAnnealing',
warmup='linear',
warmup_iters=500,
warmup_ratio=1.0 / 3,
min_lr_ratio=1e-3)
evaluation = dict(interval=total_epochs, pipeline=test_pipeline, metric='bbox', map_metric='chamfer')
runner = dict(type='EpochBasedRunner', max_epochs=total_epochs)
log_config = dict(
interval=100,
hooks=[
dict(type='TextLoggerHook'),
dict(type='TensorboardLoggerHook')
])
# fp16 = dict(loss_scale=512.)
find_unused_parameters = True
checkpoint_config = dict(interval=1, max_keep_ckpts=total_epochs)
custom_hooks = [dict(type='CustomSetEpochInfoHook')]