클래스 명이 같은 두 데이터셋으로 모델을 훈련시켰는데 하나의 모델만으로 훈련시킬 때가 성능이 더 괜찮다.
해당 데이터셋들을 자세히 뜯어보니 원인으로 추정되는 것을 발견했다.
위 사진을 보면 car 클래스의 인덱스는 0, large bus 클래스의 인덱스는 1, small truck 클래스의 인덱스는 4이다.
위 사진으로는 어느 인덱스가 car인지 small truck인지 구분이 가지 않지만 다른 이미지들의 라벨을 살펴보고 나온 인덱스의 결과는 다음과 같다.
클래스명\데이터셋 이름 | 데이터셋 P1 | 데이터셋 P2 |
car | 0 | 0 |
large_bus | 1 | 1 |
large_truck | 2 | 2 |
medium_truck | 3 | 3 |
small_bus | 4 | 자료 없음 |
small_truck | 5 | 4 |
small_bus, small_truck의 인덱스가 서로 다르게 매겨졌고 이것이 성능 저하의 원인으로 추정된다.
P2에선 small_bus를 어노테이션한 자료가 없다.
해당 인덱스를 수정할 방법을 찾는 중에 Roboflow에서 이런 기능을 발견했다.
데이터셋 P2의 Generate 과정에서 preprocessing 단계에서 수행하는 class modify인데 여기서 small_bus와 small_truck을 서로 오버라이드 하면 인덱스가 바뀌어서 출력되지 않을까 생각했다.
클래스의 인덱스가 전혀 바뀌지 않았다.
문제점이 무엇인지 생각해보았다.
원인 1. 클래스에 할당된 인덱스는 바뀌지 않고 클래스에 소속된 이미지만 바뀐다.
원인 2. 현재 P2에는 small_bus 클래스를 어노테이션한 자료가 부재해서 매핑이 제대로 시행되지 않았다.
일단 1번부터 한번 검정해본다.
large_bus 클래스와 car 클래스를 서로 오버라이드 하였다.
원인 1은 틀렸다.
car와 large_bus를 서로 오버라이드 하였더니 서로의 인덱스가 바뀌어서 나온다.
car 클래스는 0번 인덱스를 가지고 있었으니 2회만 나와야하고, large_bus 클래스는 1번 인덱스를 가지고 있으니 12회만 나와야하는데 라벨에는 0번 인덱스가 12회, 1번 인덱스가 2회 나온다.
class modify는 제대로 내가 생각한 기능을 수행한다.
원인은 small_bus의 부재였다.
그럼 이제 small_bus를 데이터셋에 추가로 어노테이션 수행하고 아래의 과정을 거쳐서 문제의 해결을 확인한다.
1. 데이터셋 P2에 small_bus를 어노테이션한 후 class modify를 거치지 않고 데이터셋 생성하여 인덱스가 P1과 동일한지 관찰. 동일하다면 추가적인 class modify가 불필요하고 이 데이터셋 그대로 P1 데이터셋으로 훈련된 모델의 추가 훈련에 사용하여 성능을 관찰한다.
2. 1번 과정에서 생성된 데이터셋이 인덱스가 P1과 다르다면 class modify를 통해 인덱스를 바꾸고 이를 P1 데이터셋으로 훈련된 모델의 추가 훈련에 사용하여 성능을 관찰한다.
small bus 개체가 있는 이미지를 프로젝트에 추가해서 데이터셋에 small bus를 추가했다.
라벨 텍스트 파일에서 인덱스 4번은 하나만 나오고, 인덱스 5번은 4개 나왔다.
small_bus가 4번 인덱스, small_truck이 5번 인덱스가 되었다.
이는 P1의 인덱스와 동일하다.
여기서 이제 왜 클래스 명이 같은 데이터셋이 클래스 숫자가 다르다고 인덱스가 달라지고 훈련 결과가 이상해졌는지 어느정도 추측이 가능하다.
Roboflow에서 데이터셋의 클래스는 알파벳 순으로 인덱스를 매기는 것 같다.
그래서 3번 인덱스인 medium_truck 다음으로 앞글자가 s인 small_bus와 small_truck이 인덱스 4번과 5번을 차지했고
알파벳 순이라서 bus가 truck보다 앞 순번의 인덱스를 차지했는데 P2에선 bus가 존재하지 않아서 truck이 4번을 차지했다.
이제 데이터셋의 인덱스 문제를 해결했다.
앞으로 'P1 데이터셋으로 훈련된 모델 A'와 '모델 A를 P2 데이터셋으로 추가 훈련시킨 P2' 간 객체탐지 결과물을 비교하면 정상적으로 훈련이 진행되었는지 알 수 있고, 나는 현재 맥북에서 Yolov8의 detect를 사용하면 메모리 부족으로 프로세스가 죽고, colab은 런타임 사용량이 많아서 GPU 사용량이 불가능하여 어노테이션으로 모델의 성능을 확인했다.
Roboflow의 프로젝트에 모델을 업로드 후 라벨링 어시스트를 수행한 결과 모델이 괜찮게 라벨링을 하는 것을 확인할 수 있었다. 훈련은 정상적으로 마쳐졌다.
추가로 해당 모델을 사용하여 객체추적을 진행하였을 때도 다른 모델과 비슷한 성능을 보이며 문제가 생기지 않았다.
'프로그래밍 > 데이터 사이언스 공부' 카테고리의 다른 글
YOLOv8 클래스 불균형(class imbalance) 문제 (0) | 2023.11.21 |
---|---|
NotImplementedError: A UTF-8 locale is required. Got ANSI_X3.4-1968 (0) | 2023.11.01 |
Training yolo model with multiple datasets (0) | 2023.10.29 |
Yolov8 'closing dataloader mosaic' issue (0) | 2023.10.24 |
Yolov8은 두개 이상의 데이터셋으로 학습시킬 때 오류가 발생한다 (0) | 2023.10.24 |