COCO - Common Objects in Context
cocodataset.org
COCO 데이터셋은 다양한 컴퓨터비전 타스크의 연구에서 널리 사용되는 벤치마크로, 특정 알고리즘의 성능을 측정할 때 표준으로 활용된다. 최근 이 데이터셋을 이용해 YOLO 알고리즘을 학습시켜 평가해본 결과, 오탐지가 상당히 많다는 사실을 확인하였다.
이런 오탐지 문제가 데이터셋 라벨링 모호함에 기인하는 것이 아닌지 생각하였고 데이터셋의 라벨링 상태를 확인했다.
(물론 데이터 augmentation이나, 모델에 따른 오탐지 가능성도 있지만..)
예를 들어, '사람(person)'이라는 객체에 대해 생각해보자.
- 사람의 기준은 무엇인가?
- 단순히 손 또는 다리가 보이면 사람으로 판단하는 것인가?
- 거울에 비친 모습도 사람으로 인식하는가?
- 사람인 것 같은데 육안으로 사람으로 식별되지 않아도 사람인가?
라벨링에 대한 엄밀한 기준이 있는가? 그 기준이 일관되게 라벨링 했는가? 에 대해서도 의심을 해볼 수 있다.
다음은 yolo11s 모델의 coco2017 validation 데이터셋에 대한 Evalulation 코드의 결과이다.
Class Images Instances P R mAP50 mAP50-95
(metric thread): 100% 1/1 [00:00<00:00, 0.00it/s]
all 5000 36781 0.615 0.814 0.615 0.452
person (0) 2693 11004 0.785 0.911 0.785 0.565
bicycle (1) 149 316 0.583 0.813 0.583 0.347
car (2) 535 1932 0.651 0.851 0.651 0.440
motorcycle (3) 159 371 0.726 0.871 0.726 0.490
airplane (4) 97 143 0.918 0.993 0.918 0.755
bus (5) 189 285 0.823 0.888 0.823 0.698
train (6) 157 190 0.913 0.974 0.913 0.744
truck (7) 250 415 0.498 0.711 0.498 0.351
boat (8) 121 430 0.508 0.788 0.508 0.291
traffic light (9) 191 637 0.497 0.777 0.497 0.268
fire hydrant (10) 86 101 0.842 0.871 0.842 0.702
stop sign (11) 69 75 0.715 0.840 0.715 0.648
parking meter (12) 37 60 0.678 0.767 0.678 0.530
bench (13) 235 413 0.398 0.692 0.398 0.273
bird (14) 125 440 0.500 0.664 0.500 0.341
cat (15) 184 202 0.886 0.936 0.886 0.726
dog (16) 177 218 0.792 0.858 0.792 0.687
horse (17) 128 273 0.809 0.894 0.809 0.626
sheep (18) 65 361 0.757 0.895 0.757 0.545
cow (19) 87 380 0.743 0.842 0.743 0.553
elephant (20) 89 255 0.876 0.976 0.876 0.693
bear (21) 49 71 0.921 0.958 0.921 0.763
zebra (22) 85 268 0.907 0.974 0.907 0.706
giraffe (23) 101 232 0.915 0.970 0.915 0.741
backpack (24) 228 371 0.271 0.596 0.271 0.150
umbrella (25) 174 413 0.646 0.818 0.646 0.451
handbag (26) 292 540 0.278 0.672 0.278 0.158
tie (27) 145 254 0.524 0.720 0.524 0.350
suitcase (28) 105 303 0.664 0.868 0.664 0.464
frisbee (29) 84 115 0.870 0.939 0.870 0.682
skis (30) 120 241 0.478 0.784 0.478 0.284
snowboard (31) 49 69 0.531 0.652 0.531 0.391
sports ball (32) 169 263 0.626 0.719 0.626 0.435
kite (33) 91 336 0.607 0.812 0.607 0.433
baseball bat (34) 97 146 0.566 0.733 0.566 0.379
baseball glove (35) 100 148 0.628 0.791 0.628 0.381
skateboard (36) 127 179 0.773 0.866 0.773 0.589
surfboard (37) 149 269 0.610 0.747 0.610 0.394
tennis racket (38) 167 225 0.781 0.893 0.781 0.520
bottle (39) 379 1025 0.554 0.822 0.554 0.378
wine glass (40) 110 343 0.531 0.703 0.531 0.358
cup (41) 390 899 0.572 0.802 0.572 0.428
fork (42) 155 215 0.538 0.781 0.538 0.393
knife (43) 181 326 0.313 0.623 0.313 0.201
spoon (44) 153 253 0.289 0.656 0.289 0.195
bowl (45) 314 626 0.578 0.829 0.578 0.439
banana (46) 103 379 0.417 0.818 0.417 0.278
apple (47) 76 239 0.295 0.669 0.295 0.208
sandwich (48) 98 177 0.519 0.734 0.519 0.394
orange (49) 85 287 0.396 0.739 0.396 0.305
broccoli (50) 71 316 0.416 0.899 0.416 0.238
carrot (51) 81 371 0.364 0.790 0.364 0.235
hot dog (52) 51 127 0.510 0.669 0.510 0.375
pizza (53) 153 285 0.736 0.891 0.736 0.568
donut (54) 62 338 0.587 0.855 0.587 0.465
cake (55) 124 316 0.587 0.804 0.587 0.405
chair (56) 580 1791 0.511 0.830 0.511 0.338
couch (57) 195 261 0.627 0.847 0.627 0.485
potted plant (58) 172 343 0.501 0.843 0.501 0.304
bed (59) 149 163 0.683 0.859 0.683 0.500
dining table (60) 501 697 0.500 0.834 0.500 0.354
toilet (61) 149 179 0.843 0.950 0.843 0.693
tv (62) 207 288 0.810 0.920 0.810 0.620
laptop (63) 183 231 0.772 0.861 0.772 0.652
mouse (64) 88 106 0.788 0.896 0.788 0.613
remote (65) 145 283 0.500 0.820 0.500 0.319
keyboard (66) 106 153 0.717 0.908 0.717 0.546
cell phone (67) 214 262 0.559 0.779 0.559 0.365
microwave (68) 54 55 0.735 0.891 0.735 0.590
oven (69) 115 143 0.622 0.888 0.622 0.448
toaster (70) 8 9 0.689 0.778 0.689 0.466
sink (71) 187 225 0.627 0.884 0.627 0.424
refrigerator (72) 101 126 0.807 0.921 0.807 0.671
book (73) 230 1161 0.233 0.707 0.233 0.126
clock (74) 204 267 0.721 0.846 0.721 0.524
vase (75) 137 277 0.553 0.798 0.553 0.406
scissors (76) 28 36 0.489 0.583 0.489 0.420
teddy bear (77) 94 191 0.680 0.843 0.680 0.521
hair drier (78) 9 11 0.156 0.545 0.156 0.068
toothbrush (79) 34 57 0.377 0.667 0.377 0.271
위 결과를 보며 여러 가지 생각이 들었다.
COCO 데이터셋에서 사람 객체를 탐지하는 것이 왜 고양이나 비행기와 같은 객체보다는 상대적으로 어려운지에 대해 고민해봤다.
그 이유를 몇 가지로 정리해보았다.
- 라벨링의 모호성
- 부분 가려짐 및 복잡한 배경
- 다양한 포즈와 변형
그래서 위의 경우를 cvat이라는 툴로 coco 2017 val 데이터셋에서 찾아보았다.
일단 coco 데이터셋의 class가 80개 이므로 person이라는 클래스만 추려서 툴에다가 넣었다.
첫 프레임부터 놀라운 것은 창에 비친 것도 사람으로 취급하는 것이었다. 예를 들어서 CCTV Task에 적용했을 때 반사된 모습을 사람으로 처리하면 이건... 말이 안되는 경우이다.
우측의 이미지 역시도 사람의 형체가 분명하게 인지되지 않음에도 person이라는 라벨이 쳐졌음을 확인할 수 있다. 너무 모호하다....
그리고 또한 Box의 Localization을 어떻게 처리할 것인가도 이슈이다.
왼쪽의 경우는 사람들이 겹쳐있는 경우이다. 앉아 있으니 앉아있는 영역까지 box를 친다. 문제는 가려짐에 의해 맨 앞의 사람은 머리부분만 bound box가 쳐졌지만 그 우측에 있는 아이는 localization의 기준이 매우 모호하다. 어떤 건 더 넓고 어떤 것은 더 길다..
그러면 만약에 다리만 있으면? 손만 보여지면 사람인가?
위의 결과로 사람임을 인지할 수 있다면 사람으로 라벨링 한다. 손만 보여도, 머리만 보여도, 다리만 보여도 사람이다. localization은 보여지는 부분만 쳐진다.
하지만 사람임을 인지할 수 없음에도 뭔가 사람으로 표기된 경우도 있고 사람으로 인지되는 경우에도 라벨링이 되지 않은 경우도 있다.
왼쪽 이미지에서 점을 어떻게 사람으로 신뢰할 수 있는가? 혹은 우측 이미지에선 crowded data 샘플인데 왜 박스를 치다 말았나?
이러한 사례로 비추어 봤을 때 coco dataset이 computer vision task 데이터셋으로 믿을만한지 의문이다. 아니면 의도적으로 Noise를 넣은 것인가?
실무 적용에서의 문제점과 고민
모호한 라벨링 기준과 부실한 라벨링은 오탐지를 유발할 수 있으며, 오히려 높은 mAP를 취득하는 데 방해요소가 될 수 있다고 생각했다.
실제로, YOLO 모델 평가 결과를 통해 사람 객체에 대한 mAP가 예상보단 낮게 나오는 것을 확인할 수 있었으며, 이는 단순히 알고리즘의 한계가 아니라 데이터셋 자체의 라벨링 문제와도 깊은 관련이 있다.
COCO 데이터셋은 방대한 양의 데이터를 통해 일반화(generalization)를 확보할 수 있는 장점이 있지만, 모두가 납득할 만한 라벨링 정책을 가지고 있지는 않을 수 있다. 라벨링 기준은 팀이나 프로젝트마다 달라질 수 있으므로, 실무에 적용하기 위해서는 별도의 데이터셋을 구축하거나 기존 데이터셋을 재검토하여 명확한 기준 하에 재어노테이션을 진행할 필요가 있다.
따라서, 단순히 성능 벤치마크용으로 쓰이는 COCO 데이터셋을 맹신하기보다는, 자체적으로 명확한 라벨링 기준 하에 구축된 데이터셋과 함께 보완적으로 활용하는 것이 바람직하다고 생각된다.