ML/AI/SW Developer

모델 경량화 - 이미지 분류(분리수거)

1. 대회 개요

1.1 대회 의의

최근들어 분야를 막론하고 인공지능 기술은 사람을 뛰어넘은 엄청난 성능을 보여주고 있고, 때문에 여러 산업에서 인공지능을 이용해 그동안 해결하지 못 했던 문제들을 풀려는 노력을 하고 있습니다.

대표적인 예로는 수퍼빈의 수퍼큐브가 있습니다. 수퍼큐브는 수퍼빈에서 만든 인공지능 분리수거 기계로 사람이 기계에 캔과 페트병을 넣으면 내부에서 인공지능을 통해 재활용이 가능한 쓰레기인지를 판단해 보관해주는 방식입니다. 간단한 인공지능을 이용해 그동안 힘들었던 분리수거 문제를 해결한 것입니다. 그렇다면 수퍼큐브를 만들기 위해 필요한 인공지능은 무엇일까요? 당연히 들어온 쓰레기를 분류하는 작업일 것입니다. 하지만 분류만 잘 한다고 해서 사용할 수 있는 것은 아닙니다. 로봇 내부 시스템에 탑재되어 즉각적으로 쓰레기를 분류할 수 있어야만 실제로 사용이 될 수 있습니다.

이번 프로젝트를 통해서는 분리수거 로봇에 가장 기초 기술인 쓰레기 분류기를 만들면서 실제로 로봇에 탑재될 만큼 작고 계산량이 적은 모델을 만들어볼 예정입니다.

1.2 Input and Output

  • Input: 이미지 (쓰래기 사진)
  • Ouput: 6개 카테고리 (Metal, Paper, Paperpack, Plastic, Plasticbag, Styrofoam)
  • Metrics:
    • Score (f1-score) : 분류 성능 지표로, 기준이 되는 모델의 f1 score에서 제출한 모델의 f1 score의 차이를 구한 뒤, 상수를 곱하고 sigmoid 함수를 적용한 값 (낮을수록 좋음)
    • Score (submit time) : 기준이 되는 모델의 추론하는 시간으로 제출한 모델의 추론하는 시간을 나눈 값 (낮을수록 좋음)
    • 최종 Score : Score (submit time) * 0.5 + Score (f1-score)

1.3 Task 정리

  • 쓰래기를 6가지로 분류할 수 있는 모델을 만들어 최대한 성능을 높이면서 경량화 작업을 통해 inference time을 줄이자.

1.4 역할

  • 팀리딩
  • timm 라이브러리 추천, pretrained 모델 사용 방법 및 코드 제공

2. 대회 결과 요약

2.1 최종 Score 및 랭킹

  • Public: Score: 0.9875 / f1: 0.7478 / time: 61.2576 / rank: 4
  • Private: Score: 0.9710 / f1: 0.7520 / time: 61.2576 / rank: 5

3. 데이터

3.1 데이터 통계

  • Train: 20,851장 이미지
  • Test:
    • Public: 2,611 장
    • Private: 2,606 장

3.2 EDA

  • class별 데이터 수 차이가 상당히 크기 때문에 class imbalance 문제 해결 필요
  • 이미지의 width와 height가 모두 제각각 -> 통일 필요

4. 시도 및 결과 정리

  • Augmentation 사용
    • class imbalance 문제를 약간이라도 해소하기 위해, 다양한 transformation 기법을 random으로 적용
      • “Identity”, “AutoContrast”, “Equalize”, “Rotate”, “Solarize”, “Color”, “Posterize”, “Contrast”, “Brightness”, “Sharpness”, “ShearX”, “ShearY”, “TranslateX”, “TranslateY”
    • Augmentation을 적용하지 않았을 경우 일정 스코어에서 학습의 한계를 보임
  • Pretrained 모델 사용
    • 이미지의 수가 많지 않고, class imbalance 문제까지 있기 때문에 pretrained 모델 활용
    • back-bone 구조 탐색: 경량화 대회이기 때문에 가벼운 모델 중점으로 탐색
      • Mobilenet : F1 - 64점대
      • resnet18, resnet50 : F1 - 73점대
      • distilation model : F1 - 63점대
    • resnet18이 성능 및 속도에서 가장 뛰어난 성능을 보여줌
  • Mixed precision
    • 32bit float 연산을 16bit 연산으로 바꾸어 적용(training 및 inference 속도 30%이상 향상)

5. 최종 제출

  • resnet18d 계열 모델

6. 새롭게 해볼수 있는 시도

  • resnet18d에 structured pruning 적용
    • unstructured pruning은 레이어에 마스킹을 적용하는 기법으로 속도에 대한 비용 감소는 없다. (메모리에 대한 비용 감소)
    • 따라서 unstructured pruning을 통해 필요없는 노드를 제거해 더 추론 속도를 높일 수 있을 것 같다.
  • Knowledge distilation 적용
    • pretrained 모델을 학습 시켜 teacher로 사용하고, 더욱 가벼운 구조로 student를 구성해 knowlege disitilation 방법을 적용한다면 성능의 저하는 약간 있겠지만, 모델을 훨씬 경량화 해서 사용할 수 있을 것 같다.

7. 대회 회고

2주간 진행하던 대회가 끝이났다. 사실 앞에 일주일은 다른 대회(대화요약)에 막판 스퍼트(?)를 내느라 거의 신경쓰지 못했다. 실제로 경량화 대회에 참여한 시간은 화, 수, 목 3일밖에 되지 않는다. 따라서 아이디어는 많아도, 시도해볼 시간이 별로 없었다. 특히나 Knowledge distilation을 적용해 보고 싶었지만 구현과정들이 상당히 복잡한 방법들이기에 실질적으로 시도할 시간이 없었다. 모델을 학습하는데에도 시간이 많이 소요됬고, 많은 후보모델 중 어떤 모델을 back-bone으로 적용할지 탐색할 시간도 사실 부족했다. 옛날에 이미지 대회를 진행하면서 mobilenet, resnet이 괜찮은 성능을 보였다는 경험에 의존해 시작했던 것이 큰 도움이 되었던 것 같다. 많은 시도를 해보지는 못했지만, 기초에 집중해 당장 적용할 수 있는 기법들을 조합해 최종 5등이라는 성과를 얻을 수 있었다는 것이 참 놀라운 대회 였다. 시간만 더 있었으면, 1등도 노릴 수 있지 않았을까 싶다. 어찌됬든 경량화를 위해 다양한 기법들을 공부해볼 시간이 되어서 의미있는 기간이 된것 같다.