https://github.com/KimGeunUk/Recyclable-Waste-Object-Detection
목표
입력 받은 이미지 데이터에서 재활용 쓰레기를 검출하는 모델을 개발합니다.
나의 역할 및 시도
- MMDetection 라이브러리를 사용하여 각종 모델 실험
- Ensemble 코드 구현
- Multi Scale, RandomBrightnessContrast, Blur Augmentation 실험
- TTA 실험
개인 회고 ★
프로젝트 첫 주는 강의를 위주로 Object Detection에 대해 이해하고 정리하는 시간을 가졌습니다. 사실상 이번 대회의 시작은 2주차 부터였는데, base framework로 잡은 MMDetection을 제대로 이해하는 시간도 필요하여 시간이 많이 남지 않게 되었습니다. 결과적으로, 대회를 시작하기 전 소비한 시간들을 대회에 잘 적용시켜 강의 시간에서 배운 다양한 기법, 최신 SOTA 모델, 라이브러리를 사용하여 성능을 올릴 수 있었고, 특히 2주간의 노력을 통해 MMDetection을 제대로 이해하고 자유롭게 사용할 수 있는 자신감을 얻어 큰 발전이 있었습니다.
본격적으로 대회를 시작하면서 우선적으로 EDA를 통해 클래스의 불균형을 확인하였고, 하나의 이미지에 대한 많은 작은 객체, 많은 Bounding Box, 많은 Bounding Box의 겹침을 확인하였습니다. 이러한 문제점들을 해결하는 것이 이번 대회의 포인트 중 하나일 것이라 생각하였고 이를해결하기 위해, 저번 대회를 통해 실험 전에 가설을 세워 그 가설을 검증하고, 검증한 결과가 “왜 ?” 나온 것인지 생각하는 절차를 하면서 대회 진행했습니다.
우선 클래스 중 “Battery” 클래스가 매우 적어, 제일 검출하기 힘들 것으로 생각하고 기본 Baseline인 Faster RCNN Resnet 50 모델을 학습하여 정말 그러한지 확인하였습니다. 생각과 다르게, “Battery” 클래스가 다른 클래스에 비해 mAP 50 기준, Confusion Matrix 기준 점수가 매우 높게 나왔습니다. 이러한 이유는, 다른 클래스들은 Bounding Box 크기가 적절하고 단일 객체가 많이 없는 이미지인 반면, “Battery” 클래스는 그러한 이미지가 대부분이기 때문이라고 판단하였다.
다음으로 Baseline의 False Negative 이미지와 Train/Valid 학습 그래프를 확인하였을 때, 예상 했던 대로 작은 객체, 겹쳐있는 객체를 잘 검출하지 못함을 확인하여 우선적으로 모델의 파라미터 수가 많고, 복잡해지면 다양한 특징을 가진 객체를 잘 검출하고, 작은 객체 또한 잘 검출할 것으로 판단하여, Model을 Faster RCNN에서 Casecade RCNN으로, Model의 Backbone을 Resnet50에서 ConvNext Small 까지 점차 올리면서 모델의 성능을 비교 실험하였고, 결과 예상했던 데로 모델이 깊어질 수록 좋은 성능을 가져오는 것을 확인할 수 있었습니다. 이것을 기반으로 최신 SOTA 모델을 사용한다면 더 좋은 성능을 가져올 것으로 확신 하였고, 여러 모델을 확인한 결과 DETR모델의 Anchor Box에 객체가 없을 때 Negative로 분류하는 것에 취약하고, 객체가 겹쳐있을 때 이를 인지하는 것이 어려운 단점을 극복한 DINO 모델을 채택하였습니다. 실험 결과 Baseline으로 잡은 Casecade RCNN ConvNext Small 보다 좋은 성능을 가져왔습니다. 하지만 학습 비용이 매우 커 이후 실험부터는 Faster RCNN Swin Tiny 를 실험으로 사용하고 성능이 좋아지는 기법을 그대로 DINO 모델에 적용하는 방법을 사용했습니다.
다음으로 작은 객체, 어두운 객체 또는 그림자에 가려진 객체, 흐릿한 객체를 조금 더 잘 검출하기 위해 Multi Scale, RandomBrightnessContrast, Blur Augmentation을 사용하여 해결하고자 하였고, 실험결과 Multi Scale을 제외한 Augmentation은 성능이 조금 하락한 것을 확인할 수 있었습니다. Multi Scale은 확실히 작은 객체를 조금 더 정확히 검출하여 좋은 성능을 가져왔지만, 다른 Augmentation은 Validation Dataset과 조금 달라져 성능이 조금 하락한 것으로 판단하였습니다. 하지만 그만큼 일반화 성능을 향상시켜 결국, Test Dataset에는 좋은 성능을 낼 수 있다고 판단하여 이후 실험에서도 이 Augmentation을 적용하여 실험을 진행하였습니다.
이후 팀원들과 각자 학습 시킨 모델을 Weight Box Fusion Ensemble을 통해 성능을 향상 시킬 수 있었고, 최종적으로 Public, Private 4등을 기록할 수 있었습니다. 비록 이번 대회에서는 Github를 제대로 사용하지 않아 협업 부분이 아쉬웠지만, 그것을 커버하고자 매일 피어세션 시간에 각자 실험한 내용과 실험한 내용의 이유를 자세히 발표하고 많은 대화를 나누었으며, 그 부분에서 많은 Insight를 얻었고 성능을 향상시킬 수 있었습니다. 하나 더 아쉬운 점으로 팀원이 알려준 Roboflow를 통해 Data를 Generation하여 성능을 향상시킬 수 있었지만, 변인 통제와 함께 Labeling을 잘못하여 제출하지 못하였고, 다른 여러 실험 에도 변인 통제를 제대로 하지 못해 마저 적을 수 없었던 것이 아쉬웠습니다. 다음 대회에는 이렇게 부족했던 점을 보완하기위해 실험 후 자세히 정리하고 무작정 실험만 하는 것이 아닌, 실험의 이유를 한번 더 생각하는 시간을 가지도록 하겠습니다.
'Competition' 카테고리의 다른 글
[2023] / [DACON] 대구 교통사고 피해 예측 AI 경진대회 - Private 34th (0.42688) (0) | 2024.01.11 |
---|---|
[2023] / [Naver Boostcamp AI Tech] Hand Bone Segmentation (0) | 2023.09.07 |
[2023] / [Naver Boostcamp AI Tech] Mask Image Classification (0) | 2023.09.07 |
[2023] / [DACON] 제1회 코스포 x 데이콘 자동차 충돌 분석 AI 경진대회(채용 연계형) - Private 9th (0.68156) (0) | 2023.02.20 |
[2023] / [DACON] 포디블록 구조 추출 AI 경진대회 (0) | 2023.02.03 |