[Object Detection] 4-4. YOLO v3 : evaluation
0. evaluation
- 모델이 잘 학습되었는지 성능을 측정하고 평가하는 것
- training 중간에 수행하거나 training 후에 수행
1. eval일 때 model의 output 변경
- yolo layer의 output shape을 변경
- sigmoid와 exponential을 적용하여 실제 bounging box의 좌표를 뽑아낼 수 있도록 설정한다
- 결과 shape [batch, box수, 13]
- box수 : 3가지의 grid 수(ex. 19x19 + 38x38 + 76x76) x anchor 수(3)
2. NMS (Non Maximum Suppression)
- utils/tools.py의 non_max_suppression() 함수
- 겹쳐있는 box의 수를 줄여주는 것
- GT box과 가장 많이 겹쳐진 box를 선택한다
- IOU와 예측한 objectness를 기반으로 fitering한다
- 기본적으로 한 gird에 3개의 anchor box로 예측하고 layer가 3개이기 때문에 하나의 object에 9개의 box가 생긴다
- 이를 하나로 줄여주기 위해 NMS를 사용한다
- 결과
- batch 수 만큼의 list
- list는 [box 수, 6]으로 구성
- 6 : xmin, ymin, xmax, ymax, max_class_conf, max_class_idx
3. best bbox와 GT box 비교
- train/trainer.py의 run_eval() 함수
- TP, FP 구하기 -> mAP, recall의 값을 구하기 위해서 계산한다
3-1. targets의 box 정보 변환
- targets의 box 값은 0~1 사이로 normalize되어 있다
- cxcy 형식의 좌표를 minmax 형식으로 변환
- normalized된 좌표를 image width, height에 맞게 unnormalization 수행
3-2. true_positive 추출
- utils/tools.py의 get_batch_statistics() 함수
- 예측한 box와 target box의 iou가 threshold 이상이면 TP
- return
- [batch, true_positive, pred_scores, pred_labels]
- true_positive, pred_scores, pred_labels 수는 예측한 box 수
3-3. AP 계산
- utils/tools.py의 ap_per_class() 함수
- precision, recall, AP, f1, ap_class 값을 return
- objectness의 confidence 값으로 정렬한 후 계산
- precision=number_of_GTTP
- recall=TP+FPTP
3-4. 표로 AP 값 출력