모델을 학습 시킬 때마다 40에폭을 넘어갈 때면 Closing dataloader mosaic 라는 오류문구가 출력되었다.
훈련 지표야 매번 들쑥날쑥하니 지금까지 신경을 쓰진 않았는데 항상 해당 오류가 출력되고나서 mAP 값이 낮아지는 것이 마음에 걸려서 한번 찾아보았다.
https://github.com/ultralytics/ultralytics/issues/372
ultralytics의 issue에도 올라온 질문이었다.
위의 질의응답을 참고하여 원인을 파악해보자면, 학습을 한 에폭씩 수행하면서 데이터셋에 대한 모자이크를 점점 늘리는데 그러다가 40에폭 쯤에 와서 모자이크 증가 관련 기능이 오류가 난 것으로 보인다. 이에 대해 챗GPT에게도 질문했는데 100% 신뢰는 못하지만 대충 어떤 느낌의 오류인지는 감이 잡힌다.
실제로 저번에 해당 오류가 낯타났던 모델의 훈련 중 40에폭 부근에서 노이즈가 나타난다.
40에폭을 기점으로 box_loss, cls_loss, dfl_loss 그래프가 확 뛴다.
지금 블로그 글을 적을 동안 모델 학습이 50에폭 완료되었고 결과 그래프가 나왔는데 역시 40에폭을 기점으로 box_loss, cls_loss, dfl_loss에 노이즈가 낀다.
cls_loss는 classification loss(분류 손실)을 의미하고 이는 모델이 예측한 클래스가 실제 클래스와 일치하는 정도를 측정한다고 한다. 이 손실 값이 작을수록 모델이 클래스를 정확히 예측한다고 하는데 이 그래프가 40에폭을 기점으로 확 뛰어버린다.
box_loss는 예측된 바운딩 박스와 실제 바운딩 박스 간의 차이를 나타낸다는데 이것도 40 에폭을 기점으로 갑자기 뛴다
dfl_loss는 yolov8에서 사용되는 용어라고 하는데 아래 issue 글을 참고하면 dfl이 감소하면 모델이 바운딩 박스를 더욱 잘 예측하고 있다고 한다.
https://github.com/ultralytics/ultralytics/issues/4219
dfl_loss에 대해서는 정확히는 모르겠다.
https://stackoverflow.com/questions/75950283/yolov8-dfl-loss-metric
위 스택오버플로의 질문에서 yolov8에서 dfl_loss가 무엇을 의미하는지 묻는데 사람마다 말하는 게 다르다.
비교적 최신 논문이라 이해가 덜 됐나보다.
어쨌든 그래프가 40에폭 시기에만 확 뛰고 다시 진정되는 모습을 보이나 이런 오류 자체가 있어서 좋은 게 없다.
위의 ultralytics의 issue 글에서는 이를 방지하기 위해 close_mosaic 옵션을 알려준다.
마지막 10 에폭 동안 모자이크의 확대를 비활성화하는 옵션이던데 이 옵션을 활성화하고 모델 학습을 진행해본다.
model.train(data=DATA_YAML, epochs = 50, patience = 30, batch = 24, imgsz=640, close_mosaic = 10)
여전히 Closing dataloader mosaic 오류가 나온다.
40에폭 구간에서 그래프가 또 튀어버린다.
마지막 10에폭부터 모자이크 확대를 중지하는 것이니 41에폭부터 중지하고, 40에폭까지는 계속 증가시켜서 오류가 나타나는 것일까?
model.train(data=DATA_YAML, epochs = 50, patience = 30, batch = 24, imgsz=640, close_mosaic = 11)
이번에는 close_mosaic 값을 11로 지정하고 학습을 진행해봐야겠다.
close mosaic를 11로 해도 여전하다. 원인을 잘 모르겠다.
이 오류는 큰 영향은 안주니까 일단 둬야겠다.
'프로그래밍 > 데이터 사이언스 공부' 카테고리의 다른 글
클래스 명은 같고 클래스 개수는 다른 두 데이터셋으로 모델 훈련 시 성능 저하 해결 과정 (0) | 2023.10.30 |
---|---|
Training yolo model with multiple datasets (0) | 2023.10.29 |
Yolov8은 두개 이상의 데이터셋으로 학습시킬 때 오류가 발생한다 (0) | 2023.10.24 |
라벨링 툴 CVAT 사용기 (0) | 2023.10.23 |
ImportError: cannot import name 'bbox_overlaps' from 'cython_bbox' (0) | 2023.10.20 |