_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')]