Project Outline
Task
재활용 품목 분류를 위한 Semantic Segmentation (https://stages.ai/competitions/78/overview/description)
쓰레기가 찍힌 사진에서 쓰레기를 Segmentation 하는 모델을 통한 분리수거 인공지능 만들기
Metric
mIoU (Mean Intersection over Union) : 각 클래스 별 IoU를 계산하고, 이 값들의 평균을 구한다.
Result
Public : 0.779(mIoU), 19팀 중 6등
Private : 0.760(mIoU), 19팀 중 3등
Trial and Errors
Augment
모델이 학습한 결과를 시각화하면서, 다양한 문제점을 발견했다. 그림자나 객체의 프린팅 된 그림에 의한 오류, 이미지의 밝기 등 다양한 원인으로 잘못 예측하는 경우가 있었다. 이를 해결하기 위해서, Augment를 활용했다.
Flip과 Blur를 통해서 전반적인 성능을 향상시키고, CLAHE와 Hue Saturation을 통해서 밝기나 색상에 의한 오류를 줄일 수 있었다. 이를 통해서 전반적인 성능을 향상시킬 수 있었다.
전반적인 성능을 향상시켰는데, Augment를 적용하는 과정에서 특정 Class는 성능이 감소하는 것을 확인했다. 이를 활용해서 다양한 Augment를 적용시키고, 각 모델이 잘 예측하는 Class에 가중치를 주어 Ensemble을 시도했다. 하지만, 유의미한 성능 향상을 얻을 수는 없었다.
Model
지난 대회에서 높은 성능의 모델을 찾는 것이 굉장히 중요하고, 특히 Ensemble에서 다양한 모델을 사용하는 것이 효과적이라는 것을 확인했다. 이번 대회에서도 Ensemble을 위해서 다양한 모델을 준비하고자, 최대한 다양한 모델을 사용하기로 계획했다.
그래서 이번 대회에서 Pytorch 기반의 Baseline Code를 사용하기보다는 다양한 모델을 빠르게 실험할 수 있는 MMSegmentation을 사용했다. 지난 대회에서 사용한 MMDetection과 유사한 구조이지만, Dataset의 format이나 Inference 등 다양한 부분에서 수정이 필요했다. (AI-Stage 게시글 참고)
MMSegmentation을 통해서 다양한 모델을 실험했지만, 결국 Swin-L을 Backbone으로 사용하는 UperNet의 성능과 유사한 모델을 찾지는 못했다. 그래서 앙상블에서는 큰 효과를 볼 수 없었다. 하지만, 다른 팀의 솔루션 발표에서 성능이 낮다고 판단한 모델 중에서도 상당히 좋은 성능의 모델이 있음을 확인했는데, 다음에는 실험에 있어서 좀 더 확실하게 파악할 필요성을 느꼈다.
CRF
최종 결과물에 DenseCRF를 적용해봤다. CRF는 마스크의 좌표를 근접한 좌표의 위치를 고려하는 것과, 주변의 이미지 색상을 고려하는 것을 통해서 마스크를 수정한다. 덕분에 조금 더 명확하고 high resolution의 결과를 얻을 수 있다고 한다. 특히, 객체 안에 다른 객체를 예측하는 경우는 올바르게 예측하지 않은 경우가 많다. CRF를 통해서 그런 예측을 고치고 좀 더 명확한 경계를 얻을 수 있다.
실제로 CRF를 적용했을 경우 일부 객체에서는 긍정적인 효과를 얻었지만 대부분의 경우 Resolution이 낮아지고, 객체의 존재하는 프린팅 된 그림을 또 다른 객체로 예측하는 등 오히려 역효과를 얻는 경우도 있었다. 이번 대회의 특성상 CRF로 큰 효과를 얻기는 어려워 보인다.
Ensemble
대회 후반, 우리 팀은 성능을 더 향상시키기 위해서 시간을 투자하기보다는 일반화 성능을 최대한 높이기 위해서 노력했다. 대표적으로 일반화 성능을 높여주는 K-fold Ensemble을 사용하기에는 시간이 부족하다고 판단해, 단일 모델을 다양한 Seed와 Epoch을 통해서 Ensemble을 시도했다. 결과적으로는 비교적 짧은 시간으로 상당히 좋은 일반화 성능을 얻을 수 있었다.
추가적으로 성능을 높이기 위해서, 다양한 모델의 Ensemble도 시도했지만 다른 모델의 성능이 가장 높은 성능의 모델에 비해서 부족해서 큰 효과를 얻지는 못했다.
Collaboration Tool
이번에는 Github을 통해서 팀원들과 최대한 공유를 시도했다. Baseline Code 자체를 각 모듈로 나눠서 작업하는 것은 아직은 부족했지만, 그래도 이전보다는 잘 활용했다고 생각한다.
이외에도 실험 결과를 공유하기 위해서 Wandb와 Notion을 사용했다. 이번에는 추가적으로 실험 결과뿐 아니라 실험을 위해서 어떤 작업을 진행하고 있는지 공유하기 위해서 Notion에 Kanban Board를 제작해 사용했다. 결과는 성공적이었다. 각자의 진행사항을 파악하기 쉬웠고, 다른 사람의 작업을 다시 중복해서 진행하거나 이후에 지난 작업을 까먹지 않는 장점이 있었다. 또한, 앞으로 필요한 작업을 모두 작성해서 공유하고 분담해서 진행하다 보니 이전보다 피어세션을 통한 회의 내용을 효과적으로 활용할 수 있었다.
Retrospective
High level API의 장점과 단점
이번 대회에서 나는 MMSegmentation을 활용해서 대회를 진행했다. 기존의 강의에서 열심히 배운 Pytorch기반의 Baseline Code를 사용한 이유는 아무리 수정이 쉽고 구조를 잘 알아도 결국 다양한 모델을 사용하기 위해서는 다양한 코드를 구현할 필요가 있다. 반면, MMSegmentation의 경우 환경만 구축하면 빠르게 다양한 모델을 실험할 수 있다.
나는 지난번 MMDetection에 적응하는데 많은 시간을 소비하다 보니 시간이 부족해서 사용하지 못했던 많은 모델들이 아쉬웠다. 이번에는 지난 경험을 바탕으로 빠르게 MMSegmentation을 준비하고 활용해 다양한 실험을 빠르게 진행할 수 있었고, 대회에서 좋은 성적을 거둘 수 있었다.
일반화 성능에 관해서
일반화 성능을 높이기 위해서는 대표적으로 K-fold Ensemble을 사용한다. 하지만, 내가 사용하는 모델은 5번 학습하기 위해서는 상당한 시간이 필요했다. 이를 개선하기 위해서 Seed와 Epoch을 다양하게 바꾼 모델을 Ensemble 시켰다. 그 결과 절반도 안 되는 짧은 시간을 통해서 높은 일반화 성능을 얻을 수 있었다.
추가적으로 단일 모델보다는 다양한 모델을 사용해서 성능을 개선하려고 했으나, 다른 모델의 성능이 상대적으로 부족해서 큰 효과는 얻을 수 없었다. 이러한 상황에서도 가중치를 조절하는 등 조금 더 큰 효과를 얻을 수 있는 방법이 있을 것 같은데, 아쉬움이 남는다.
CRF
강의에서 항상 사용해보고 싶었던 CRF. 이론적으로는 상당히 효과적인 방법이지만, 이번 대회에서의 Dataset은 배경과 객체의 구분이 확실하지 않은 편이다. 눈밭에 있는 종이 쓰레기나, 동일한 색상의 종이와 비닐 등 CRF를 사용하기에는 좋지 않은 환경이었다. 실제로 적용해 본 결과 일부 사진에서는 효과적이었지만, 대부분의 경우 오히려 역효과였다.
추가적으로 내가 사용한 모델은 상당히 높은 High Resolution의 결과를 보여줬는데, CRF를 통과한 결과 오히려 Resolution이 저하되었다. 내가 사용했던 모델이 아닌, 다른 모델에서 CRF를 사용했다면 좋은 효과를 얻을 수도 있었을 것 같다.
끝으로
이번 대회에서는 지난 대회에서 아쉬웠던 부분을 많이 개선했고 나와 팀원들이 지난 대회보다 많이 성장한 모습을 보여줬다고 생각한다. 그리고 개인적으로 내가 공유한 코드를 다른 사람들이 잘 사용했다는 말을 듣고 뿌듯했다. 남은 기간 동안도 내가 배운 것들을 열심히 정리하고 공유하고 싶다.
이번 대회에서 Github을 열심히 사용하긴 했지만, 여전히 협업으로써 잘 사용했다고 하기에는 부족했다. 다음에는 모듈을 분담해서 작업하는 등 제대로 협업을 진행해보고 싶다.
'Project' 카테고리의 다른 글
올바른 손 씻기 교육을 위한 손 씻기 단계 인식 모델 (0) | 2022.01.18 |
---|---|
눈바디 AI Challenge Wrap-up (0) | 2021.12.05 |
재활용 품목 분류를 위한 Semantic Segmentation 대회 [3/3] (0) | 2021.11.04 |
재활용 품목 분류를 위한 Semantic Segmentation 대회 [2/3] (0) | 2021.10.29 |
재활용 품목 분류를 위한 Semantic Segmentation 대회 [1/3] (0) | 2021.10.22 |