|
|
Voxel_RCNN 제출결과
1. voxel_size[0.075,0.075,0.15] 파인튜닝 결과
# custom_av_dataset.yaml
DATASET: 'CustomAvDataset'
DATA_PATH: '../data/custom_av'
#POINT_CLOUD_RANGE: [-70.4, -70.4, -4.0, 70.4, 70.4, 4.0]
POINT_CLOUD_RANGE: [-75.0, -75.0, -2.0, 75.0, 75.0, 4.0] #
MAP_CLASS_TO_KITTI: {
'Vehicle': 'Car',
'Pedestrian': 'Pedestrian',
'Cyclist': 'Cyclist',
}
DATA_SPLIT: {
'train': train,
'test': val
}
INFO_PATH: {
'train': [custom_av_infos_train.pkl],
'test': [custom_av_infos_val.pkl],
}
POINT_FEATURE_ENCODING: {
encoding_type: absolute_coordinates_encoding,
used_feature_list: ['x', 'y', 'z'],
src_feature_list: ['x', 'y', 'z', 'intensity'],
}
DATA_AUGMENTOR:
DISABLE_AUG_LIST: ['placeholder','line_downsample','random_world_translation','random_points_dropout'] #,gt_sampling','random_world_scaling','random_world_flip','random_world_rotation',placeholder','random_points_dropout',,
AUG_CONFIG_LIST:
- NAME: gt_sampling
USE_ROAD_PLANE: False
DB_INFO_PATH:
- custom_av_dbinfos_train.pkl
PREPARE: {
filter_by_min_points: ['Vehicle:5', 'Pedestrian:5', 'Cyclist:5'],
}
SAMPLE_GROUPS: ['Vehicle:10', 'Pedestrian:16', 'Cyclist:14']
NUM_POINT_FEATURES: 4
DATABASE_WITH_FAKELIDAR: False
REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0]
LIMIT_WHOLE_SCENE: True
- 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]
# 약한 증강용
- NAME: random_world_rotation
WORLD_ROT_ANGLE: [-0.39269908, 0.39269908] # ±22.5°로 축소
- NAME: random_world_scaling
WORLD_SCALE_RANGE: [0.98, 1.02]
- NAME: random_world_translation # 추가한 증강기법
NOISE_TRANSLATE_STD: [0.2, 0.2, 0.2]
- NAME: random_points_dropout # 추가한 증강기법
DROP_RATE: 0.15 # ← 25% 제거
ENSURE_MIN_KEEP: 90000 # ← 너무 과하게 줄어드는 것 방지
PROB: 0.4 # ← 50% 확률로 적용
- NAME: line_downsample
TARGET_LINES: 64
LINE_BINS: 128
TOLERANCE: 6 # 60~68 라인이면 스킵
MIN_BIN_OCCUPANCY: 120
ELEVATION_FROM: 'auto'
PROB: 0.5 # 프레임마다 시도하되, 함수 내부가 알아서 스킵/적용
DATA_PROCESSOR:
- NAME: mask_points_and_boxes_outside_range
REMOVE_OUTSIDE_BOXES: True
- NAME: shuffle_points
SHUFFLE_ENABLED: {
'train': True,
'test': True
}
- NAME: transform_points_to_voxels
VOXEL_SIZE: [0.075, 0.075, 0.15] # 0.1,0.1,0.2 0.08 0.06
MAX_POINTS_PER_VOXEL: 5
MAX_NUMBER_OF_VOXELS: {
'train': 250000, #150000
'test': 300000 #150000
}
# custom_voxel_rcnn.yaml
CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist']
DATA_CONFIG:
_BASE_CONFIG_: cfgs/dataset_configs/custom_av_dataset.yaml
# DATA_PROCESSOR:
# - NAME: mask_points_and_boxes_outside_range
# REMOVE_OUTSIDE_BOXES: True
# STRICT_MASK: True
# - NAME: shuffle_points
# SHUFFLE_ENABLED: {
# 'train': True,
# 'test': True
# }
# - NAME: transform_points_to_voxels_placeholder
# VOXEL_SIZE: [ 0.08, 0.08, 0.15 ] #0.1 0.15
MODEL:
NAME: VoxelRCNN
VFE:
NAME: DynMeanVFE
BACKBONE_3D:
NAME: VoxelBackBone8x
MAP_TO_BEV:
NAME: HeightCompression
NUM_BEV_FEATURES: 256
BACKBONE_2D:
NAME: BaseBEVBackbone
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: 3 #2
SEPARATE_HEAD_CFG:
HEAD_ORDER: [ 'center', 'center_z', 'dim', 'rot' ]
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 },
}
TARGET_ASSIGNER_CONFIG:
FEATURE_MAP_STRIDE: 8
NUM_MAX_OBJS: 500
GAUSSIAN_OVERLAP: 0.11 #0.15 해상도를 올렸기 때문에 너무작으면 가우시안 overlap를 조정함
MIN_RADIUS: 1 # 1 보행자와 자전거의 recall값을 올리기 위해서
LOSS_CONFIG:
LOSS_WEIGHTS: {
'cls_weight': 2.3, #1.0 2.0
'loc_weight': 2.3, #2.0
'code_weights': [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ]
}
CLASS_WEIGHTS: # heatmap 분류 손실용
Vehicle: 1.0
Pedestrian: 2.7
Cyclist: 3.0 #2.7
LOC_CLASS_WEIGHTS:
Vehicle: 1.0
Pedestrian: 1.2
Cyclist: 1.5
POST_PROCESSING:
SCORE_THRESH: 0.1 # 0.1
POST_CENTER_LIMIT_RANGE: [ -75.0, -75.0, -2.0, 75.0, 75.0, 4.0 ] #-74.80, -65.92, -3.0, 74.80,65.92, 4.0 #-75.2, -75.2, -2, 75.2, 75.2, 4 $#65.92
MAX_OBJ_PER_SAMPLE: 500 #500
NMS_CONFIG:
NMS_TYPE: nms_gpu
NMS_THRESH: 0.7 #0.7
NMS_PRE_MAXSIZE: 4096
NMS_POST_MAXSIZE: 400
DEBUG_LABEL_HIST: True
ROI_HEAD:
NAME: VoxelRCNNHead
CLASS_AGNOSTIC: True #True
SHARED_FC: [256, 256]
CLS_FC: [256, 256]
REG_FC: [256, 256]
DP_RATIO: 0.3
NMS_CONFIG:
TRAIN:
NMS_TYPE: nms_gpu
MULTI_CLASSES_NMS: False
NMS_PRE_MAXSIZE: 9000
NMS_POST_MAXSIZE: 512
NMS_THRESH: 0.65 # 0.8
TEST:
NMS_TYPE: nms_gpu
MULTI_CLASSES_NMS: False
NMS_PRE_MAXSIZE: 4096 #1024
NMS_POST_MAXSIZE: 512 #100
NMS_THRESH: 0.6 #0.7
# NMS_PRE_MAXSIZE: 4096
# NMS_POST_MAXSIZE: 300
# NMS_THRESH: 0.85
ROI_GRID_POOL:
FEATURES_SOURCE: ['x_conv2', 'x_conv3', 'x_conv4']
PRE_MLP: True
GRID_SIZE: 8 #8
POOL_LAYERS:
x_conv2:
MLPS: [ [ 64, 64 ] ]
QUERY_RANGES: [ [ 3, 3, 2 ] ]
POOL_RADIUS: [ 0.4 ]
NSAMPLE: [ 16 ]
POOL_METHOD: max_pool
x_conv3:
MLPS: [ [ 64, 64 ] ]
QUERY_RANGES: [ [ 3, 3, 2 ] ]
POOL_RADIUS: [ 0.8 ]
NSAMPLE: [ 16 ]
POOL_METHOD: max_pool
x_conv4:
MLPS: [ [ 64, 64 ] ]
QUERY_RANGES: [ [ 3, 3, 2 ] ]
POOL_RADIUS: [ 1.6 ]
NSAMPLE: [ 16 ]
POOL_METHOD: max_pool
TARGET_CONFIG:
BOX_CODER: ResidualCoder
ROI_PER_IMAGE: 192 #128 양성 풀 확대
FG_RATIO: 0.5
#SAMPLE_ROI_BY_EACH_CLASS: True
CLS_SCORE_TYPE: roi_iou
CLS_FG_THRESH: 0.70 #0.75 양성 확대
CLS_BG_THRESH: 0.25
CLS_BG_THRESH_LO: 0.1
HARD_BG_RATIO: 0.8
REG_FG_THRESH: 0.55 #0.55 작은 박스 IOU도 허용
LOSS_CONFIG:
CLS_LOSS: BinaryCrossEntropy
REG_LOSS: smooth-l1
CORNER_LOSS_REGULARIZATION: True
LOSS_WEIGHTS: {
'rcnn_cls_weight': 1.0,
'rcnn_reg_weight': 1.0,
'rcnn_corner_weight': 1.0,
'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
}
POST_PROCESSING:
RECALL_THRESH_LIST: [0.3, 0.5, 0.7]
SCORE_THRESH: 0.12 #0.1 #0.2 #0.12
OUTPUT_RAW_SCORE: False
EVAL_METRIC: waymo
NMS_CONFIG:
MULTI_CLASSES_NMS: False #False
NMS_TYPE: nms_gpu
NMS_THRESH: 0.6 #0.7
NMS_PRE_MAXSIZE: 4096
NMS_POST_MAXSIZE: 500
OPTIMIZATION:
BATCH_SIZE_PER_GPU: 2
NUM_EPOCHS: 20 #30
OPTIMIZER: adam_onecycle
LR: 0.0010 #0.003 #0.006
WEIGHT_DECAY: 0.001
MOMENTUM: 0.9
MOMS: [0.95, 0.85]
PCT_START: 0.1 #0.35 #0.35 #0.4
DIV_FACTOR: 10
DECAY_STEP_LIST: [35, 45]
LR_DECAY: 0.1
LR_CLIP: 0.0000001
LR_WARMUP: False #True
WARMUP_EPOCH: 1
GRAD_NORM_CLIP: 10
0.075 해상도에서 ROI_GRID와 HM_CONV 을 6->8 2->3으로 늘리는 방법을 채택하여 소형 객체의 AP값을 올리는걸 기대하였는데 강한 증강 이후에 약한 증강으로 일반화를 노렸지만 ROI_GRID와 HM_CONV가 이미 충분히 학습이 된 상태에서 약한증강으로 튜닝을 하여 특징을 잃어버리는 결과를 가져온거 같다.
2. voxel_size[0.08,0.08,0.15] 파인튜닝 결과
# custom_av_dataset_finetuning.yaml
DATASET: 'CustomAvDataset'
DATA_PATH: '../data/custom_av'
#POINT_CLOUD_RANGE: [-70.4, -70.4, -4.0, 70.4, 70.4, 4.0]
POINT_CLOUD_RANGE: [-75.52, -75.52, -2.0, 75.52, 75.52, 4.0] #-74.88, -74.88, -2.0, 74.88, 74.88, 4.0
MAP_CLASS_TO_KITTI: {
'Vehicle': 'Car',
'Pedestrian': 'Pedestrian',
'Cyclist': 'Cyclist',
}
DATA_SPLIT: {
'train': train,
'test': val
}
INFO_PATH: {
'train': [custom_av_infos_train.pkl],
'test': [custom_av_infos_val.pkl],
}
POINT_FEATURE_ENCODING: {
encoding_type: absolute_coordinates_encoding,
used_feature_list: ['x', 'y', 'z'],
src_feature_list: ['x', 'y', 'z', 'intensity'],
}
DATA_AUGMENTOR:
DISABLE_AUG_LIST: ['placeholder','random_points_dropout','line_downsample','random_world_translation'] #
AUG_CONFIG_LIST:
- NAME: gt_sampling
USE_ROAD_PLANE: False
DB_INFO_PATH:
- custom_av_dbinfos_train.pkl
PREPARE: {
filter_by_min_points: ['Vehicle:5', 'Pedestrian:5', 'Cyclist:5'],
}
SAMPLE_GROUPS: ['Vehicle:8', 'Pedestrian:16', 'Cyclist:14']
NUM_POINT_FEATURES: 4
DATABASE_WITH_FAKELIDAR: False
REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0]
LIMIT_WHOLE_SCENE: True
- 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]
# 약한 증강용
- NAME: random_world_rotation
WORLD_ROT_ANGLE: [-0.39269908, 0.39269908] # ±22.5°로 축소
- NAME: random_world_scaling
WORLD_SCALE_RANGE: [0.98, 1.02]
- NAME: random_world_translation # 추가한 증강기법
NOISE_TRANSLATE_STD: [0.2, 0.2, 0.2]
- NAME: random_points_dropout # 추가한 증강기법
DROP_RATE: 0.15 # ← 25% 제거
ENSURE_MIN_KEEP: 90000 # ← 너무 과하게 줄어드는 것 방지
PROB: 0.4 # ← 50% 확률로 적용
- NAME: line_downsample
TARGET_LINES: 64
LINE_BINS: 128
TOLERANCE: 6 # 60~68 라인이면 스킵
MIN_BIN_OCCUPANCY: 120
ELEVATION_FROM: 'auto'
PROB: 0.5 # 프레임마다 시도하되, 함수 내부가 알아서 스킵/적용
DATA_PROCESSOR:
- NAME: mask_points_and_boxes_outside_range
REMOVE_OUTSIDE_BOXES: True
- NAME: shuffle_points
SHUFFLE_ENABLED: {
'train': True,
'test': True
}
- NAME: transform_points_to_voxels
VOXEL_SIZE: [0.08, 0.08, 0.15] # 0.1,0.1,0.2
MAX_POINTS_PER_VOXEL: 5
MAX_NUMBER_OF_VOXELS: {
'train': 200000, #150000
'test': 200000 #150000
}
# custom_voxel_rcnn_0.08.yaml
CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist']
DATA_CONFIG:
_BASE_CONFIG_: cfgs/dataset_configs/custom_av_dataset_0.08.yaml
# DATA_PROCESSOR:
# - NAME: mask_points_and_boxes_outside_range
# REMOVE_OUTSIDE_BOXES: True
# STRICT_MASK: True
# - NAME: shuffle_points
# SHUFFLE_ENABLED: {
# 'train': True,
# 'test': True
# }
# - NAME: transform_points_to_voxels_placeholder
# VOXEL_SIZE: [ 0.08, 0.08, 0.15 ] #0.1 0.15
MODEL:
NAME: VoxelRCNN
VFE:
NAME: DynMeanVFE
BACKBONE_3D:
NAME: VoxelBackBone8x
MAP_TO_BEV:
NAME: HeightCompression
NUM_BEV_FEATURES: 256
BACKBONE_2D:
NAME: BaseBEVBackbone
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' ]
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 },
}
TARGET_ASSIGNER_CONFIG:
FEATURE_MAP_STRIDE: 8
NUM_MAX_OBJS: 500
GAUSSIAN_OVERLAP: 0.11 #0.1 해상도를 올렸기 때문에 너무작으면 가우시안 overlap를 조정함
MIN_RADIUS: 1 # 2 보행자와 자전거의 recall값을 올리기 위해서
LOSS_CONFIG:
LOSS_WEIGHTS: {
'cls_weight': 2.3, #1.0 2.0
'loc_weight': 2.3, #2.0
'code_weights': [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ]
}
CLASS_WEIGHTS: # heatmap 분류 손실용
Vehicle: 1.0
Pedestrian: 2.3
Cyclist: 2.7
LOC_CLASS_WEIGHTS:
Vehicle: 1.0
Pedestrian: 1.2
Cyclist: 1.5
POST_PROCESSING:
SCORE_THRESH: 0.1 # 0.1
POST_CENTER_LIMIT_RANGE: [ -75.52, -75.52, -2.0, 75.52, 75.52, 4.0 ] #-74.88, -74.88, -2.0, 74.88, 74.88, 4.0
MAX_OBJ_PER_SAMPLE: 500 #500
NMS_CONFIG:
NMS_TYPE: nms_gpu
NMS_THRESH: 0.7 #0.7
NMS_PRE_MAXSIZE: 4096
NMS_POST_MAXSIZE: 400
DEBUG_LABEL_HIST: True
ROI_HEAD:
NAME: VoxelRCNNHead
CLASS_AGNOSTIC: True #True
SHARED_FC: [256, 256]
CLS_FC: [256, 256]
REG_FC: [256, 256]
DP_RATIO: 0.3
NMS_CONFIG:
TRAIN:
NMS_TYPE: nms_gpu
MULTI_CLASSES_NMS: False
NMS_PRE_MAXSIZE: 9000
NMS_POST_MAXSIZE: 512
NMS_THRESH: 0.65 # 0.8
TEST:
NMS_TYPE: nms_gpu
MULTI_CLASSES_NMS: False
NMS_PRE_MAXSIZE: 4096 #1024
NMS_POST_MAXSIZE: 512 #100
NMS_THRESH: 0.6 #0.7
# NMS_PRE_MAXSIZE: 4096
# NMS_POST_MAXSIZE: 300
# NMS_THRESH: 0.85
ROI_GRID_POOL:
FEATURES_SOURCE: ['x_conv2', 'x_conv3', 'x_conv4']
PRE_MLP: True
GRID_SIZE: 8 #6
POOL_LAYERS:
x_conv2:
MLPS: [ [ 64, 64 ] ]
QUERY_RANGES: [ [ 3, 3, 2 ] ]
POOL_RADIUS: [ 0.4 ]
NSAMPLE: [ 16 ]
POOL_METHOD: max_pool
x_conv3:
MLPS: [ [ 64, 64 ] ]
QUERY_RANGES: [ [ 3, 3, 2 ] ]
POOL_RADIUS: [ 0.8 ]
NSAMPLE: [ 16 ]
POOL_METHOD: max_pool
x_conv4:
MLPS: [ [ 64, 64 ] ]
QUERY_RANGES: [ [ 3, 3, 2 ] ]
POOL_RADIUS: [ 1.6 ]
NSAMPLE: [ 16 ]
POOL_METHOD: max_pool
TARGET_CONFIG:
BOX_CODER: ResidualCoder
ROI_PER_IMAGE: 192 #128 양성 풀 확대
FG_RATIO: 0.5
#SAMPLE_ROI_BY_EACH_CLASS: True
CLS_SCORE_TYPE: roi_iou
CLS_FG_THRESH: 0.68 #0.75 , 0.70 양성 확대
CLS_BG_THRESH: 0.25
CLS_BG_THRESH_LO: 0.1
HARD_BG_RATIO: 0.8
REG_FG_THRESH: 0.55 #0.55 작은 박스 IOU도 허용
LOSS_CONFIG:
CLS_LOSS: BinaryCrossEntropy
REG_LOSS: smooth-l1
CORNER_LOSS_REGULARIZATION: True
LOSS_WEIGHTS: {
'rcnn_cls_weight': 1.0,
'rcnn_reg_weight': 1.0,
'rcnn_corner_weight': 1.0,
'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
}
POST_PROCESSING:
RECALL_THRESH_LIST: [0.3, 0.5, 0.7]
SCORE_THRESH: 0.12 #0.1 #0.2 #0.12
OUTPUT_RAW_SCORE: False
EVAL_METRIC: waymo
NMS_CONFIG:
MULTI_CLASSES_NMS: False #False
NMS_TYPE: nms_gpu
NMS_THRESH: 0.6 #0.7
NMS_PRE_MAXSIZE: 4096
NMS_POST_MAXSIZE: 500
OPTIMIZATION:
BATCH_SIZE_PER_GPU: 2
NUM_EPOCHS: 30 #30
OPTIMIZER: adam_onecycle
LR: 0.0012 #0.006
WEIGHT_DECAY: 0.001
MOMENTUM: 0.9
MOMS: [0.95, 0.85]
PCT_START: 0.15 #0.35 #0.4
DIV_FACTOR: 10
DECAY_STEP_LIST: [35, 45]
LR_DECAY: 0.1
LR_CLIP: 0.0000001
LR_WARMUP: False
WARMUP_EPOCH: 1
GRAD_NORM_CLIP: 10
0.075 해상도에서는 연산량 + 추론시간 대비 이득이 크지가 않아서 이전에 49.3점수를 받은 ckpt를 받아서 30epoch을 finetuning하는 방식으로 돌아왔다. 하지만 기존의 점수와 크게 다르지 않고 오히려 점수가 떨어진것을 확인 할 수 있다. 때문에 0.08해상도에서 학습을 돌리고 ROI_GRID=8을 유지하면서 HM_CONV를 늘려 소형객체 AP값을 올려보는 방식으로 50점의 도전을 진행할거같다.
VoxelNext 제출결과
# custom_voxelnext_0.075.yaml
CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist']
DATA_CONFIG:
_BASE_CONFIG_: cfgs/dataset_configs/custom_av_dataset.yaml
MODEL:
NAME: VoxelNeXt
VFE:
NAME: MeanVFE
BACKBONE_3D:
NAME: VoxelResBackBone8xVoxelNeXt
SPCONV_KERNEL_SIZES: [5, 5, 3, 3]
OUT_CHANNEL: 256 #256
CHANNELS: [32, 64, 128, 256, 256] # 마지막 256
DENSE_HEAD:
NAME: VoxelNeXtHead
IOU_BRANCH: True #True
CLASS_AGNOSTIC: False
INPUT_FEATURES: 256
CLASS_NAMES_EACH_HEAD: [
['Vehicle', 'Pedestrian', 'Cyclist']
]
SHARED_CONV_CHANNEL: 256 #256
USE_BIAS_BEFORE_NORM: True
NUM_HM_CONV: 2 # 2 VoxelNext-K3에서 3x3으로 변형했는데 2퍼 상승됨
SEPARATE_HEAD_CFG:
HEAD_ORDER: ['center', 'center_z', 'dim', 'rot']
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},
'iou': {'out_channels': 1, 'num_conv': 2},
}
RECTIFIER: [0.68, 0.71, 0.65]
TARGET_ASSIGNER_CONFIG:
FEATURE_MAP_STRIDE: 8
NUM_MAX_OBJS: 500
GAUSSIAN_OVERLAP: 0.1 # 0.1 -> 0.2 -> 0.1
MIN_RADIUS: 1 # 2 -> 3 -> 2
LOSS_CONFIG:
CLASS_LOSS_WEIGHTS: [1.5, 3.0, 2.5] # 2.0 1.7
# - Pedestrian/Cyclist의 long-tail 보정: 분류 히트맵 손실에 더 큰 가중
# - Vehicle은 충분히 자주 등장하므로 1.0 유지
# FOCAL_ALPHA: 0.25 # 클래스 불균형 완화(포컬 논문 기본값)
# FOCAL_GAMMA: 2.0 # hard-example에 더 집중
LOSS_WEIGHTS: {
'cls_weight': 1.3,
'loc_weight': 2.0,
iou_weight: 1.5,
'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
}
# LOSS_CONFIG:
# LOSS_WEIGHTS: {
# 'cls_weight': 1.5, # 1.0 → 1.5 : coarse grid에서 분류 신호 강화
# 'loc_weight': 1.5, # 2.0 → 1.5 : 과도한 회귀 가중 완화(불안정성 감소)
# # [cx, cy, cz, w, l, h, rot_sin, rot_cos] 가정
# 'code_weights': [0.75, 0.75, 1.0, 1.2, 1.2, 1.2, 1.1, 1.1]
# # - center xy: 0.75로 약간 낮춤(양자화 한계 고려)
# # - dim / rot: ↑ (IoU 개선에 직결, AP/APH 방어)
# }
POST_PROCESSING:
SCORE_THRESH: 0.1 # 0.1 -> 0.2~0.3
POST_CENTER_LIMIT_RANGE: [-75.0, -75.0, -2.0, 75.0, 75.0, 4.0]
MAX_OBJ_PER_SAMPLE: 500
NMS_CONFIG:
NMS_TYPE: nms_gpu
MULTI_CLASSES_NMS: False
NMS_THRESH: [0.65, 0.7, 0.7] #0.7
NMS_PRE_MAXSIZE: [2048, 1024, 1024] #4096 #[4096]
NMS_POST_MAXSIZE: [200, 150, 150] #500
POST_PROCESSING:
RECALL_THRESH_LIST: [0.3, 0.5, 0.7]
EVAL_METRIC: waymo
OPTIMIZATION:
BATCH_SIZE_PER_GPU: 1
NUM_EPOCHS: 40
OPTIMIZER: adam_onecycle
LR: 0.003 #0.003 #0.0015
WEIGHT_DECAY: 0.01
MOMENTUM: 0.9
MOMS: [0.95, 0.85]
PCT_START: 0.35 #0.35
DIV_FACTOR: 10
DECAY_STEP_LIST: [15, 25]
LR_DECAY: 0.1
LR_CLIP: 0.0000001
LR_WARMUP: True
WARMUP_EPOCH: 1
GRAD_NORM_CLIP: 10
# custom_av_dataset_voxelnext_0.075.yaml
DATASET: 'CustomAvDataset'
DATA_PATH: '../data/custom_av'
#POINT_CLOUD_RANGE: [-70.4, -70.4, -4.0, 70.4, 70.4, 4.0]
POINT_CLOUD_RANGE: [-75.0, -75.0, -2.0, 75.0, 75.0, 4.0] #
MAP_CLASS_TO_KITTI: {
'Vehicle': 'Car',
'Pedestrian': 'Pedestrian',
'Cyclist': 'Cyclist',
}
DATA_SPLIT: {
'train': train,
'test': val
}
INFO_PATH: {
'train': [custom_av_infos_train.pkl],
'test': [custom_av_infos_val.pkl],
}
POINT_FEATURE_ENCODING: {
encoding_type: absolute_coordinates_encoding,
used_feature_list: ['x', 'y', 'z'],
src_feature_list: ['x', 'y', 'z', 'intensity'],
}
DATA_AUGMENTOR:
DISABLE_AUG_LIST: ['placeholder','line_downsample','random_world_translation','random_points_dropout'] #gt_sampling','random_world_scaling','random_world_flip','random_world_rotation',placeholder','random_points_dropout','line_downsample' 'random_points_dropout',
AUG_CONFIG_LIST:
- NAME: gt_sampling
USE_ROAD_PLANE: False
DB_INFO_PATH:
- custom_av_dbinfos_train.pkl
PREPARE: {
filter_by_min_points: ['Vehicle:5', 'Pedestrian:5', 'Cyclist:5'],
}
SAMPLE_GROUPS: ['Vehicle:10', 'Pedestrian:18', 'Cyclist:14']
NUM_POINT_FEATURES: 4
DATABASE_WITH_FAKELIDAR: False
REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0]
LIMIT_WHOLE_SCENE: True
- 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]
# 약한 증강용
# - NAME: random_world_rotation
# WORLD_ROT_ANGLE: [-0.39269908, 0.39269908] # ±22.5°로 축소
# - NAME: random_world_scaling
# WORLD_SCALE_RANGE: [0.98, 1.02]
- NAME: random_world_translation # 추가한 증강기법
NOISE_TRANSLATE_STD: [0.2, 0.2, 0.2]
- NAME: random_points_dropout # 추가한 증강기법
DROP_RATE: 0.15 # ← 25% 제거
ENSURE_MIN_KEEP: 90000 # ← 너무 과하게 줄어드는 것 방지
PROB: 0.5 # ← 50% 확률로 적용
- NAME: line_downsample
TARGET_LINES: 64
LINE_BINS: 128
TOLERANCE: 6 # 60~68 라인이면 스킵
MIN_BIN_OCCUPANCY: 120
ELEVATION_FROM: 'auto'
PROB: 0.5 # 프레임마다 시도하되, 함수 내부가 알아서 스킵/적용
DATA_PROCESSOR:
- NAME: mask_points_and_boxes_outside_range
REMOVE_OUTSIDE_BOXES: True
- NAME: shuffle_points
SHUFFLE_ENABLED: {
'train': True,
'test': True
}
- NAME: transform_points_to_voxels
VOXEL_SIZE: [0.075, 0.075, 0.15] # 0.1,0.1,0.2 0.08 0.06
MAX_POINTS_PER_VOXEL: 5
MAX_NUMBER_OF_VOXELS: {
'train': 200000, #150000
'test': 300000 #150000
}
1등 takeout팀의 모델이 voxelnext로 추정되어 선택하였다. 먼저 소형객체의 AP값 확보를 위해 0.075의 해상도를 채택하였고 IOU_BREANCH 옵션이 있는데 이 옵션은 0.075해상도 + 4070SUPER Ti 성능(VRAM 16G)에서는 감당이 안되어서 옵션을 끄고 진행하였다. HM 파라미터들은 해상도에 맞게 조정하여 40epoch 학습을 돌렸지만 자전거 클래스는 잘 찾지만 보행자를 잘 못찾는 현상을 발견해 현재 해상도를 0.1로 조정하고 IOU_BREANCH 옵션을 키고 학습을 진행중에 있다.
