|
|
사용한 모델: Voxel_RCNN
Voxel_RCNN의 원본 코드를 그대로 돌린 결과 30epoch
#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]
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: []
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:20', 'Cyclist:15']
NUM_POINT_FEATURES: 4 # 4
DATABASE_WITH_FAKELIDAR: False
REMOVE_EXTRA_WIDTH: [0.2, 0.2, 0.2]
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_translation # 추가한 증강기법
NOISE_TRANSLATE_STD: [0.2, 0.2, 0.2]
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.1, 0.1, 0.15] #0.1
MAX_POINTS_PER_VOXEL: 5
MAX_NUMBER_OF_VOXELS: {
'train': 150000,
'test': 150000
}
-----------------------------------------------------------------------------------------------------------------
#Voxel_RCNN_custom.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.1, 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.1
MIN_RADIUS: 1 # 2 보행자와 자전거의 recall값을 올리기 위해서
LOSS_CONFIG:
LOSS_WEIGHTS: {
'cls_weight': 1.0,
'loc_weight': 2.0, #2.0
'code_weights': [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ]
}
POST_PROCESSING:
SCORE_THRESH: 0.15 # 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.65 #0.7
NMS_PRE_MAXSIZE: 4096
NMS_POST_MAXSIZE: 500
ROI_HEAD:
NAME: VoxelRCNNHead
CLASS_AGNOSTIC: 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.7 # 0.8
TEST:
NMS_TYPE: nms_gpu
MULTI_CLASSES_NMS: False
NMS_PRE_MAXSIZE: 1024
NMS_POST_MAXSIZE: 100
NMS_THRESH: 0.7 #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: 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: 128
FG_RATIO: 0.5
SAMPLE_ROI_BY_EACH_CLASS: True
CLS_SCORE_TYPE: roi_iou
CLS_FG_THRESH: 0.75
CLS_BG_THRESH: 0.25
CLS_BG_THRESH_LO: 0.1
HARD_BG_RATIO: 0.8
REG_FG_THRESH: 0.55
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.2 #0.1
OUTPUT_RAW_SCORE: False
EVAL_METRIC: waymo
NMS_CONFIG:
MULTI_CLASSES_NMS: False
NMS_TYPE: nms_gpu
NMS_THRESH: 0.7
NMS_PRE_MAXSIZE: 4096
NMS_POST_MAXSIZE: 500
OPTIMIZATION:
BATCH_SIZE_PER_GPU: 4
NUM_EPOCHS: 30 #30
OPTIMIZER: adam_onecycle
LR: 0.01
WEIGHT_DECAY: 0.001
MOMENTUM: 0.9
MOMS: [0.95, 0.85]
PCT_START: 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
-----------------------------------------------------------------------------------------------------------------
# 변경사항 2 voxel_rcnn_custom.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: 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.2 #0.1 해상도를 올렸기 때문에 너무작으면 가우시안 overlap를 조정함
MIN_RADIUS: 1 # 2 보행자와 자전거의 recall값을 올리기 위해서
LOSS_CONFIG:
LOSS_WEIGHTS: {
'cls_weight': 1.3, #1.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 ]
}
POST_PROCESSING:
SCORE_THRESH: 0.1 # 0.1
POST_CENTER_LIMIT_RANGE: [ -75.2, -75.2, -2, 75.2, 75.2, 4 ]
MAX_OBJ_PER_SAMPLE: 800 #500
NMS_CONFIG:
NMS_TYPE: nms_gpu
NMS_THRESH: 0.6 #0.7
NMS_PRE_MAXSIZE: 4096
NMS_POST_MAXSIZE: 500
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.7 # 0.8
TEST:
NMS_TYPE: nms_gpu
MULTI_CLASSES_NMS: False
NMS_PRE_MAXSIZE: 4096 #1024
NMS_POST_MAXSIZE: 512 #100
NMS_THRESH: 0.7 #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: 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.70 #0.75 양성 확대
CLS_BG_THRESH: 0.25
CLS_BG_THRESH_LO: 0.1
HARD_BG_RATIO: 0.8
REG_FG_THRESH: 0.50 #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.1 #0.1 #0.2
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: 4
NUM_EPOCHS: 30 #30
OPTIMIZER: adam_onecycle
LR: 0.01
WEIGHT_DECAY: 0.001
MOMENTUM: 0.9
MOMS: [0.95, 0.85]
PCT_START: 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
-----------------------------------------------------------------------------------------------------------------
개선방법1 변경사항
voxel_Size[0.1,0.1,0.15] 조정
GT_SAMPLING사용 및 기본증강+ TRANSLATE 추가
DENSE_HEAD 부분의 MIN_RADIUS를 0.1로 조정(가우시안 불러의 최소 반경)
DENSE_HEAD의 POST_PROCESSING_SCORE_THRESH 부분 0.15, NMS 0.65로 조정 ROI_HEAD의 NMS_CONFIG_TRAIN의 NMS 0.7조정 POST_PROCESSING_SCORE_THRESH 0.2로 조정
개선방법2 변경사항
voxel_Size[0.08,0.08,0.15] 조정
GT_SAMPLING사용 및 기본증강+ TRANSLATE 추가
DENSE_HEAD 부분의 MIN_RADIUS를 0.1로 조정(가우시안 불러의 최소 반경)
DENSE_HEAD 부분의 GAUSSIAN_OVERLAP 를 0.2로 조정 0.2->0.1로 조정
DENSE_HEAD 부분의 LOSS_WEIGHTS 설정의 cls_weight=1.0->1.3 loc_weight=2.0->2.3조정
DENSE_HEAD의 POST_PROCESSING_SCORE_THRESH 부분 0.15, NMS 0.65로 조정
ROI_HEAD의 NMS_CONFIG_TRAIN의 NMS 0.7조정
POST_PROCESSING_SCORE_THRESH 0.1로 조정
성능을 더 올리기 위해서는 고 해상도가 필요할 것으로 생각해 voxel_size()를 0.1에서 0.08정도 까지 낮춰서 진행하였다.(성능개선1) waymo는 넓은 범위 150m 때문에 연산과 성능의 균형점인 0.1의 size를 선택한 것으로 성능을 올리기위해 0.08까지 축소시켰다.
데이터 불균형의 해결 방법으로 GT_SAMPLING 기법을 채택하여 보행자와 자전거 클래스에 대해서 데이터 증강을 추가했다.(성능개선1,성능개선2)
위 논문에서는표준 증강기법(flip,Rotation,scaling)에 더해서 tranlation까지 증강 기법을 사용했을 때 성능변화에 대해서 설명해주고 있다. 논문에 의하면 전역 Rotation이 가장 큰 영향을 주고 전역 평행이동, 스케일링, 랜덤 플립이 각각 7%의 성능향상을 보였다고 말하고 있다. 여기서 translate 증강 기법을 채택한 이유는 translate는 논문의 결과에 따르면 위에서 언급한 전역 증강 기법과 합께 사용하면 단독 사용 대비 성능이 더 안정적으로 개선된다고 하여 translate 증강 기법을 채택하였다.(성능개선1,2) 로컬 증강 기법은 논문에서 "individual object translation can be counterproductive" 라고 하여 배제 하였다.
heatmap: 객체 중심을 밝게 표시한 2D map (픽셀별 확률)
각 GT 중심에 2D 가우시안(봉우리로 표현)을 넣는방법 크고 가까운 물체일 수록 넓은 봉우리로 표현되고 작은 물체일수록 더 뾰족한 봉우리로 표현된다. 봉우리 모양 타킷을 주면 주변 픽셀도 일부 점수를 받아 학습이 안정되고 중심 추정이 쉬워져서 사용한다.
min_overlap: 최소iou 조건 (가우시안 반경 계산에 쓰이는 목표 겸칩 비율)
MIN_RADIUS: 계산된 반경이 너무 작지 않도록 설정하는 최소 반경이다. 작은 박스(보행자) 반경이 작을 확률이 높다 그러면 타킷이 매우뽀죡한 봉우리가 되어 학습이 불안정해질 수 있어 최소한의 너비를 보장하는 역할이다.
원본 모델을 이용해 검증 하였을 때 보행자, 자전거 클래스의 정확도가 낮게 나와서 상대적으로 작은 객체인 보행자와 자전거의 AP값을 높여주기 위해 MIN_RADIUS를 2->1로 조정하여 정확도를 개선하였다.
적용 결과 보행자는 13점 자전거는 17점 정도가 상승했다. 점수가 상승한 이유는 MIN_RADIUS를 0.1로 조정함으로써 heatmap의 공간적 집중도를 높여 소형 객체의 분리와 중심 좌표 추청 정밀도가 개선되어 점수가 오른것으로 볼 수 있다.
또한 NMS와 SCORE_THRESH를 적정히 조절하여 중복박스를 제거하였다.
| 성능지표 | 베이스라인 | 모델 원본 | 개선방법1 | 개선방법2 |
| OBJECT_TYPE_TYPE_VEHICLE_LEVEL_1/AP: | 0.863 | 0.8167 | 0.8275 | 0.8328 |
| OBJECT_TYPE_TYPE_VEHICLE_LEVEL_2/AP: | 0.8478 | 0.8007 | 0.8113 | 0.8165 |
| OBJECT_TYPE_TYPE_PEDESTRIAN_LEVEL_1/AP: | 0.8415 | 0.4505 | 0.5837 | 0.6371 |
| OBJECT_TYPE_TYPE_PEDESTRIAN_LEVEL_2/AP: | 0.82 | 0.4334 | 0.5611 | 0.6139 |
| OBJECT_TYPE_TYPE_CYCLIST_LEVEL_1/AP: | 0.8772 | 0.6241 | 0.7946 | 0.8014 |
| OBJECT_TYPE_TYPE_CYCLIST_LEVEL_2/AP: | 0.8586 | 0.6079 | 0.7740 | 0.7809 |
| OBJECT_TYPE_TYPE_ALL_LEVEL_1/mAP: | 0.8606 | 0.6304 | 0.7353 | 0.7571 |
| OBJECT_TYPE_TYPE_ALL_LEVEL_2/mAP: | 0.8421 | 0.6194 | 0.7026 | 0.7292 |

첫댓글 내컴퓨터는 경진대회까지만 쓰고 반납하세요