https://github.com/open-mmlab/OpenPCDet/tree/master/tools/cfgs/kitti_models
위 설정 파일이 모여있는 곳에서 앞으로 사용할 모델인 Voxel-RCNN을 조사해봄
Voxel-RCNN의 설정 파일 (.yaml)
https://github.com/open-mmlab/OpenPCDet/blob/master/tools/cfgs/kitti_models/voxel_rcnn_car.yaml
# CLASS_NAMES
객체를 감지할 클래스
여기에서는 Car만 감지한다는 의미
CLASS_NAMES: 네트워크가 학습할/예측할 클래스 종류 지정. 여러 클래스도 가능함
_BASE_CONFIG: KITTI 데이터셋의 기본 설정을 상속한다는 의미
DATA_CONFIG: 데이터셋 관련 모든 설정을 담는 블록
> 어떤 데이터를 어떻게 읽고, 전처리하고, 증강할지 정하는 부분
# DATA_CONFIG
DISABLE_AUG_LIST: 증강 중 비활성화할 리스트, 여기서 주는 placeholder는 그냥 기본값이라고 함
DATA_AUGMENTOR: 데이터 증강에 관한 설정을 모아둔 블록
증강 기법 중 하나인 gt_sampling 설정임
OpenPCDet에서 Point Cloud 객체 감지 정확도를 높이기 위해 객체를 복붙해서 넣는 증강임
SECOND 논문에서 이 개념이 나옴 (10 of 17, 3.2.2 Data Augmentation)
gt_sampling?
> 이미 라벨링된 GT(ground truth) 객체들의 포인트 클라우드 조각들을 미리 저장해두고,
학습할 때마다 배경 point cloud에 일부분을 복사해서 붙여 넣음.
> 객체 수가 적은 프레임을 보강할 수 있고 다양한 위치/자세에 객체가 나오는 상황을 만들 수 있음 (데이터 다양성 높아짐)
NAME: gt_sampling
> 사용할 증강 기법 이름, Ground Truth Sampling
USE_ROAD_PLANE: True > 복사한 객체들을 도로 평면 위에 위치시키도록 조정한다는 의미
DB_INFO_PATH:
- kitti_dbinfos_train.pkl > Ground Truth Database의 메타정보 경로
> 이 파일에 각 객체마다 bbox, point, class name 같은 정보 있음
> 이걸 바탕으로 객체를 샘플링해서 붙인다고 함...
PREPARE: {
filter_by_min_points: ['Car:5'], > 포인트 수가 너무 적은 객체 버림
filter_by_difficulty: [-1], > KITTI 난이도 필터링 (-1은 필터링 안함)
}
SAMPLE_GROUPS: ['Car:15'] > 한 프레임에 삽입할 객체 수 (최대 15개까지 샘플링해서 붙여넣겠다)
NUM_POINT_FEATURES: 4 > 각 포인트 특징의 차원 수 (4차원)
DATABASE_WITH_FAKELIDAR: False
REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] > 붙여 넣은 box 주변에 마진 줄 지 여부 (안늘림)
LIMIT_WHOLE_SCENE: False > 복붙할 객체를 포인트 클라우드 범위 안에 제한할지 여부 (False면 범위 바깥도 허용)
좌우(x축) 뒤집기 증강
회전 각도 (-45도 ~ 45도)
확대/축소 범위 (95% ~ 105%)
# MODEL 설정
MODEL: 모델 설정
VoxelRCNN > model name
> Voxel Feature Encoder
> 논문에서 Voxel-RCNN은 Sparse Conv를 사용하기 때문에 무조건 쓰일 수 밖에 없음
> 3D conv로 공간 특징 추출 ( downsampling 8x ) > stride가 8
논문의 이 부분에 해당 (3D Sparse Conv)
> 3D feature를 2D BEV로 압축
x축 방향을 압축해서 2D CNN으로 넘김
256은 압축된 BEV의 채널 수
이 부분에 해당
> 2D CNN으로 BEV feature map 처리
LAYER_NUMS: 각 블록에 들어갈 conv 레이어 수
LAYER_STRIDES: stride 값 (2면 downsampling)
NUM_FILTERS: 블록별 conv output 채널 수
UPSAMPLE_STRIDES: upsample하는 배수
NUM_UPSAMPLE_FILTERS: upsample 후 feature 채널 수
RPN에 해당하는 부분
NAME: AnchorHeadSingle > 하나의 클래스만 다룰 때 사용
그 아래는 방향 분류에 관련된 것
객체가 어느 방향으로 바라보는지 분류하는 것임
0°와 180°는 바운딩 박스는 같지만 학습 할 때 손실값에서 차이가 나기 때문에 이를 보정하는 설정 같음...
앵커 설정하는 부분
anchor_sizes: 클래스별 anchor box 크기 (l, w, h) > Car의 평균 크기
anchor_rotations: 앵커 박스 방향: 0°와 90°
feature_map_stride: 앵커의 해상도
matched_threshold: IoU ≥ 0.6 > positive anchor로 간주
unmatched_threshold: IoU ≤ 0.45 > negative로 간주 (나머진 ignore)
타겟 할당 부분
앵커 관련된 부분에 대해서 조정하는 부분같다... (어떤 앵커를 학습에 쓸지?)
여기에 관련한 손실 함수 설정값들이 정의되어 있음
cls_weight: 분류 손실 가중치
loc_weight: 회귀 손실 가중치
dir_weight: 방향 분류 손실 가중치
code_weights: 회귀 값 (x, y, z, l, w, h, ry)의 개별 가중치
# ROI_HEAD
> RPN에서 예측된 RoI 박스 내부를 3D grid로 나누고, 각 위치에서 feature를 pooling하는 설정
SHARED_FC: classification과 regression에 공통으로 쓰이는 FC layer
CLS_FC: classification 전용 FC layers
REG_FC: bounding box 회귀 전용 FC layers
DP_RATIO: dropout 비율 (Dropout으로 과적합 방지)
NMS 설정
> RPN에서 생성한 RoI들 중 겹치는 거 제거
NMS_THRESH: IoU threshold 기준
NMS_PRE_MAXSIZE: NMS 전에 고려할 후보 수
NMS_POST_MAXSIZE: NMS 후 최종 후보 수
> RPN에서 나온 RoI 박스 내부를 6×6×6 grid로 나눔
주변 포인트들에 대해 feature를 3D 영역 기반 pooling
MLPS: grid pooling 이후 feature embedding용 MLP 구조
QUERY_RANGES: pool 영역 범위 (3D query box 크기)
POOL_RADIUS: point pooling 반경
NSAMPLE: 몇 개의 포인트를 샘플링할지
POOL_METHOD: max_pool 또는 avg_pool 선택
RoI 타겟 설정
ROI_PER_IMAGE: 이미지 당 샘플링할 RoI 수
CLS_SCORE_TYPE: RoI의 분류 기준은 GT와의 IoU
HARD_BG_RATIO: 배경 중 hard sample 비율
REG_FG_THRESH: 회귀 학습에 사용할 최소 IoU
손실 함수 설정 부분
CLS_LOSS: RoI classification 손실
REG_LOSS: bounding box 회귀 손실
아래 숫자들은 가중치 설정해놓은 부분임
최종 결과를 필터링 하는 부분 < 추론에 해당함 (inference)
RECALL_THRESH_LIST: 평가 시 recall 계산용 IoU threshold
SCORE_THRESH: score가 이보다 낮은 box는 버림
최종 추론 결과에서 겹치는 박스를 제거하는 NMS
# OPTIMIZATION
학습 기본 설정
BATCH_SIZE_PER_GPU: 한 GPU당 mini-batch 크기
NUM_EPOCHS: 에폭 수
옵티마이저 설정
OPTIMIZER: adam_onecycle 사용했다는 뜻
LR: 초기 학습률
OneCycle 방식에서 사용하는 파라미터들을 설정해놓은 것
> 학습 초기에 lr을 올렸다가 천천히 줄이는 방식이라고 함
OpenPCDet에서 제공하는 데이터 증강기법을 모두 찾아보시오.
https://github.com/open-mmlab/OpenPCDet/tree/master/pcdet/datasets/augmentor
pkl 파일은 dict 형태여서 바로 augmentor_utils.py로 적용할 수 없기 때문에 위 파일에서 적용함.
처리할 수 있음, 근데 처리 속도가 느려서 권장하지 않는다고 함... pkl 파일을 만들어서 처리하는 것이 좋음
첫댓글 openpcdet에서 제공하는 데이터 증강기법을 모두 찾아보시오
custom dataset의 설정파일을 만드는 방법을 조사하시오.
데이터와 레이블정보를 pkl파일로 통합하여 사용하는데 별도로 처리할수는 없는지? 없다면 pkl파일을 만드는 코드를 찾아서 설명하시오.
넵