Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improving experiment configuration #1294

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions pcdet/config.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from pathlib import Path
from typing import List

import yaml
from easydict import EasyDict
from runcon import Config


def log_config_to_file(cfg, pre='cfg', logger=None):
Expand Down Expand Up @@ -80,6 +82,74 @@ def cfg_from_yaml_file(cfg_file, config):
return config


def dict_representer(dumper, ed: EasyDict):
return dumper.represent_mapping('tag:yaml.org,2002:map', ed)


yaml.add_representer(EasyDict, dict_representer)


def cfg_to_yaml_file(config, cfg_file):
with open(cfg_file, 'w') as f:
yaml.dump(config, f, default_flow_style=False)


def check_recursive_dict_type(cfg, type):
if isinstance(cfg, dict):
if not isinstance(cfg, type):
raise ValueError(
"The config is of type %s but was expected to be of type %s!\n%s"
% (type(cfg), type, cfg)
)
for k in cfg:
check_recursive_dict_type(cfg[k], type)


def ed_to_rc(ed_cfg: EasyDict) -> Config:
check_recursive_dict_type(ed_cfg, EasyDict)
rc_cfg = Config(ed_cfg)
check_recursive_dict_type(rc_cfg, Config)
return rc_cfg


def rc_to_ed(rc_cfg: Config) -> EasyDict:
check_recursive_dict_type(rc_cfg, Config)
ed_cfg = EasyDict()
for k in rc_cfg:
if isinstance(rc_cfg[k], Config):
ed_cfg[k] = rc_to_ed(rc_cfg[k])
else:
ed_cfg[k] = rc_cfg[k]
check_recursive_dict_type(ed_cfg, EasyDict)
return ed_cfg


def modify_rc_cfg(cfg: Config, modify_cfgs: List[Path]) -> Config:
from copy import deepcopy
cfg = deepcopy(cfg)
for m in modify_cfgs:
m = cfg_from_yaml_file(m, EasyDict())
cfg.rupdate(ed_to_rc(m))
cfg = cfg.resolve_transforms()
return cfg


def create_cfg_from_sets(
cfg_file: Path,
modify_cfgs: List[Path],
set_cfgs: List[str],
cfg: EasyDict = None,
) -> EasyDict:
if cfg is None:
cfg = EasyDict()
cfg_from_yaml_file(cfg_file, cfg)
cfg = ed_to_rc(cfg)
cfg = modify_rc_cfg(cfg, modify_cfgs)
cfg = rc_to_ed(cfg)
cfg_from_list(set_cfgs, cfg)
return cfg


cfg = EasyDict()
cfg.ROOT_DIR = (Path(__file__).resolve().parent / '../').resolve()
cfg.LOCAL_RANK = 0
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ tqdm
torchvision
SharedArray
opencv-python
pyquaternion
pyquaternion
runcon
64 changes: 64 additions & 0 deletions tools/cfgs/dataset_configs/modifiers/waymo/multiframe.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
SEQUENCE_CONFIG:
ENABLED: True
SAMPLE_OFFSET: [-3, 0]

TRAIN_WITH_SPEED: True


DATA_AUGMENTOR:
AUG_CONFIG_LIST:
- NAME: gt_sampling
USE_ROAD_PLANE: False
DB_INFO_PATH:
- waymo_processed_data_v0_5_0_waymo_dbinfos_train_sampled_1_multiframe_-4_to_0.pkl

USE_SHARED_MEMORY: False # set it to True to speed up (it costs about 50GB? shared memory)
DB_DATA_PATH:
- waymo_processed_data_v0_5_0_gt_database_train_sampled_1_multiframe_-4_to_0_global.npy

PREPARE: {
filter_by_min_points: ['Vehicle:5', 'Pedestrian:5', 'Cyclist:5'],
filter_by_difficulty: [-1],
}

SAMPLE_GROUPS: ['Vehicle:15', 'Pedestrian:10', 'Cyclist:10']
NUM_POINT_FEATURES: 6
REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0]
LIMIT_WHOLE_SCENE: True

FILTER_OBJ_POINTS_BY_TIMESTAMP: True
TIME_RANGE: [0.3, 0.0] # 0.3s-0.0s indicates 4 frames

- NAME: random_world_flip
ALONG_AXIS_LIST: ['x', 'y']

- NAME: random_world_rotation
WORLD_ROT_ANGLE: [-0.78539816, 0.78539816]

- NAME: random_world_scaling
WORLD_SCALE_RANGE: [0.95, 1.05]


POINT_FEATURE_ENCODING:
used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'timestamp']
src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'timestamp']


DATA_PROCESSOR:
- NAME: mask_points_and_boxes_outside_range
REMOVE_OUTSIDE_BOXES: True
USE_CENTER_TO_FILTER: True

- NAME: shuffle_points
SHUFFLE_ENABLED: {
'train': True,
'test': True
}

- NAME: transform_points_to_voxels
VOXEL_SIZE: [0.1, 0.1, 0.15]
MAX_POINTS_PER_VOXEL: 5
MAX_NUMBER_OF_VOXELS: {
'train': 180000,
'test': 400000
}
16 changes: 16 additions & 0 deletions tools/cfgs/waymo_models/modifiers/mppnet/16frames.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
DATA_CONFIG:
SEQUENCE_CONFIG:
SAMPLE_OFFSET: [-15,0]

MODEL:
ROI_HEAD:
TRANS_INPUT: 64

ROI_GRID_POOL:
MLPS: [[64,64]]
POOL_RADIUS: [0.8]
NSAMPLE: [16]

Transformer:
num_frames: 16
sequence_stride: 4
15 changes: 15 additions & 0 deletions tools/cfgs/waymo_models/modifiers/mppnet/4frames.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
DATA_CONFIG:
SEQUENCE_CONFIG:
SAMPLE_OFFSET: [-3,0]

MODEL:
ROI_HEAD:
TRANS_INPUT: 256

ROI_GRID_POOL:
MLPS: [[128,128], [128,128]]
POOL_RADIUS: [0.8, 1.6]
NSAMPLE: [16, 16]

Transformer:
num_frames: 4
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
DATA_CONFIG:
_BASE_CONFIG_: cfgs/dataset_configs/modifiers/waymo/multiframe.yaml
_TRANSFORM:
- name: remove_element
target: ROI_BOXES_PATH
- name: remove_element
target: USE_PREDBOX

SAMPLED_INTERVAL: {
'train': 5,
'test': 1
}

POINT_FEATURE_ENCODING:
encoding_type: absolute_coordinates_encoding
used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time']
src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time']

MODEL:
NAME: MPPNetE2E

VFE:
NAME: DynMeanVFE

BACKBONE_3D:
NAME: VoxelResBackBone8x

MAP_TO_BEV:
NAME: HeightCompression
NUM_BEV_FEATURES: 256

BACKBONE_2D:
NAME: BaseBEVBackbone
NUM_FRAME: 2
LAYER_NUMS: [5, 5]
LAYER_STRIDES: [1, 2]
NUM_FILTERS: [128, 256]
UPSAMPLE_STRIDES: [1, 2]
NUM_UPSAMPLE_FILTERS: [256, 256]

DENSE_HEAD:
NAME: CenterHead
CLASS_AGNOSTIC: False

CLASS_NAMES_EACH_HEAD: [
['Vehicle', 'Pedestrian', 'Cyclist']
]

SHARED_CONV_CHANNEL: 64
USE_BIAS_BEFORE_NORM: True
NUM_HM_CONV: 2
SEPARATE_HEAD_CFG:
HEAD_ORDER: ['center', 'center_z', 'dim', 'rot','vel']
HEAD_DICT: {
'center': {'out_channels': 2, 'num_conv': 2},
'center_z': {'out_channels': 1, 'num_conv': 2},
'dim': {'out_channels': 3, 'num_conv': 2},
'rot': {'out_channels': 2, 'num_conv': 2},
'vel': {'out_channels': 2, 'num_conv': 2},

}

TARGET_ASSIGNER_CONFIG:
FEATURE_MAP_STRIDE: 8
NUM_MAX_OBJS: 500
GAUSSIAN_OVERLAP: 0.1
MIN_RADIUS: 2

LOSS_CONFIG:
LOSS_WEIGHTS: {
'cls_weight': 1.0,
'loc_weight': 2.0,
'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2]
}

POST_PROCESSING:
SCORE_THRESH: 0.1
POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4]
MAX_OBJ_PER_SAMPLE: 500
NMS_CONFIG:
NMS_TYPE: nms_gpu
NMS_THRESH: 0.7
NMS_PRE_MAXSIZE: 4096
NMS_POST_MAXSIZE: 500

ROI_HEAD:
NAME: MPPNetHeadE2E
USE_BOX_ENCODING:
NORM_T0: True
ALL_YAW_T0: True

Transformer:
sequence_stride: 1 #16frame using 4
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ DATA_CONFIG:
}

POINT_FEATURE_ENCODING: {
encoding_type: absolute_coordinates_encoding,
used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation','time'],
src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation','time'],
encoding_type: absolute_coordinates_encoding,
used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time'],
src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time'],
}


Expand Down Expand Up @@ -75,13 +75,16 @@ MODEL:
POOL_METHOD: max_pool


_TRANSFORM:
name: copy
src: TRANS_INPUT
dest: Transformer.hidden_dim
Transformer:
num_lidar_points: 128
num_proxy_points: 64 # GRID_SIZE*GRID_SIZE*GRID_SIZE
pos_hidden_dim: 64
enc_layers: 3
dim_feedforward: 512
hidden_dim: 256 #equal to ROI_HEAD.TRANS_INPUT
dropout: 0.1
nheads: 4
pre_norm: False
Expand Down
Loading