https://cafe.daum.net/SmartRobot/RoVa/2398
dense head를 Vehicle과 Pedestrain, Cyclist 이 두가지로 나누어서 학습을 진행하였을때 오류가 생김
TARGET_ASSIGNER_CONFIG: { FEATURE_MAP_STRIDE: 1, ... } 이 원래 딕셔너리 형태로 되어있는데, 헤드를 두개로 나누면서 리스트(list) 안에 여러 개의 딕셔너리를 넣은 구조로 되어 오류 발생함.
따라서 pcdet/model/dense_head/center_head.py를 고쳐줘야함.
1.
CenterHead init()에서
<수정전>
self.feature_map_stride = self.model_cfg.TARGET_ASSIGNER_CONFIG.get('FEATURE_MAP_STRIDE', None)
<수정 후>
# TARGET_ASSIGNER_CONFIG가 리스트인지 확인
if isinstance(self.model_cfg.TARGET_ASSIGNER_CONFIG, list):
# 다중 헤드 구성일 경우 첫 번째 head의 stride를 대표로 사용 --> 즉 vehicle
self.feature_map_stride = self.model_cfg.TARGET_ASSIGNER_CONFIG[0]['FEATURE_MAP_STRIDE']
else:
self.feature_map_stride = self.model_cfg.TARGET_ASSIGNER_CONFIG.get('FEATURE_MAP_STRIDE', None)
2. Center_head assign_targets()
assign_tagets도 지금 내부안에서 대표 값 즉 Vehicle 값으로 돌아가려고 하고 있음.
그래서 헤드 idx로 서로 다른 가중치 설정
for idx, cur_class_names in enumerate(self.class_names_each_head):
if isinstance(self.model_cfg.TARGET_ASSIGNER_CONFIG, list):
target_assigner_cfg = self.model_cfg.TARGET_ASSIGNER_CONFIG[idx]
else:
target_assigner_cfg = self.model_cfg.TARGET_ASSIGNER_CONFIG
3. Center_head get_loss()
<수정사항>
loss_cfg = self.model_cfg.LOSS_CONFIG
if isinstance(loss_cfg, list):
loss_cfg = loss_cfg[0]
내부에서 딕셔너리를 받게 되어있는데 리스트로 받아, 오류가 생겨 리스트를 받게 하였다.
근데 헤드마다 따로 가중치가 적용되는게 아니라 처음 가중치 Vehicle 가중치가 Pedestrain, Cyclist 가중치에 vehicle 가중치가 적용되고 있었다..
그래서 헤드별로 가중치 다시 잘 들어가게 설정
for idx, pred_dict in enumerate(pred_dicts): # head별 반복
# ① 각 head의 LOSS_CONFIG 가져오기
loss_cfg = (
self.model_cfg.LOSS_CONFIG[idx]
if isinstance(self.model_cfg.LOSS_CONFIG, list)
else self.model_cfg.LOSS_CONFIG
)
# ② heatmap loss 계산 후 가중치 곱하기
hm_loss = hm_loss * loss_cfg.LOSS_WEIGHTS['cls_weight']
# ③ regression loss 계산 후 가중치 곱하기
loc_loss = loc_loss * loss_cfg.LOSS_WEIGHTS['loc_weight']
수정사항 반영하여 CenterPoint-Pillars 다시 훈련 진행
추후 일정은 sw 활용동아리 10월 활동 보고서 작성, 페스티벌 발표 자료를 만들기, 발표 준비를 진행할 예정입니다.