YOLO v4 custom data 학습하기
자신의 데이터를 훈련시키고 응용하는 것을 알아보려 한다.
[yolo와 성능지표]
과거 Pascal VOC 기준 YoLo가 최고의 detector
물체 검출(object detection) 알고리즘의 성능은 precision-recall 곡선과 AP(Average Precision)로 평가한다.
* precision은 정밀도라는 뜻으로 검출 결과 중 옳게 검출한 비율 (TP / (TP+FP) )
-> TP(True Positive)
-> FP(False Positive)
* Recall은 재현율이라는 뜻으로 검출해내야 하는 물체 중 제대로 검출된 것의 비율 ( TP / (TP + FN) )
물체가 10개인데 알고리즘이 검출한 물체는 5개이고 그 중 4개가 맞은 경우
Precision = 4/5
Recall = 4/10
-> Precision으로 보면 성능이 좋아보이나 Recall로 보면 그닥 좋아 보이지 않는다.
따라서 어느 한 값만으로 알고리즘 성능을 평가하는 것은 거의 불가하고 두 값을 종합해서 알고리즘의 성능을 평가해야 한다. 그래서 필요한 것이 precision-recall curve와 AP이다.
* 물체를 검출할 때 옳다 옳지 않다를 구분하는 기준 즉, TP(옳은 검출)와 FP(틀린 검출)를 결정해주는 기준은 바로 intersection over union(iou)
[Precision-Recall Curve]
PR곡선은 confidence 레벨에 대한 임계값의 변화에 의한 검출 알고리즘 성능을 평가하는 방법이다. 따라서 이 confidence 임계값의 변화에 따라 precision과 recall 값들이 달라질 것이다.
[AP]
Precision-Recall 그래프 선 아래쪽 면적으로 계산된다.
물체 클래스가 여러 개인 경우 각 클래스당 AP를 구한 다음 그것을 모두 합한 다음 물체 클래스의 개수로 나눠 알고리즘 성능을 평가한다. 이를 mAP(mean average precision)이라 한다.
기존 object detection 관련 연구에서는 classifier를 사용한 반면, YoLo는 Bounding boxes, class probabilities에 대한 regression problem으로 접근했다.
한번의 evaluation만으로 전체 이미지에서 Bounding Boxes와 Class Probabilities를 예측한다. 전체 Pipeline이 Single Neural Network이기 때문에, End-To-End로써 최적화된다.
[cfg 파일 수정 - net]
coco 데이터셋 기반으로 되어 있기 때문에 사용하고자 하는 데이터셋에 맞춰줄 필요가 있다.
* width, height 값으 416, 416으로 수정해준다. 기존 608, 608로 진행하면 gpu 메모리를 굉장히 많이 차지하게 된다.
* cuda memory 에러 시 batch size를 수정한다.
* subdivisions = 16으로 수정
* max_batches는 데이터 클래스 수 * 2000
* steps는 max_batches의 80~90% 수치로 작성
[cfg 파일 수정 - yolo]
classes는 훈련시키고자 하는 데이터셋의 class 갯수
filter(convolutional)의 갯수는 (classes+5)*3
* anchor size의 경우 kmeans를 이용하여 본인의 데이터셋에 맞게끔 수정해줄 수 있다. 하지만 훈련을 충분히 시킬 수 있다면, 그냥 default로 설정되어 있는 coco데이터셋의 anchor size를 이용해도 된다.
[names, data, train.txt 파일 수정]
1. train.txt 파일안에 절대경로로 수정
그 외 SSD, RetinaNet ...