월간 데이콘 Computer Vision 이상치 탐지 알고리즘 경진대회

소소한 대회 후기 Public: 0.74977

2022.05.13 17:53 2,899 조회

우선 저는 업로드하는 기준으로 Public LB 0.74977입니다

tfhub.dev 에서 Pertained efficientnet V2-L or XL 을 기준으로 Classification Task를 진행했습니다


이런 과제를 하다보면 마지막 제출물로 test하기보단 train 데이터를 통해 염두한 이론을 확인하는 Trian-Valid split을 하는게 좋습니다

데이터에 대한 접근은 우선 가장 적은 갯수의 label을 고려하여 4 folds 로 나눠서 진행했습니다


이 대회의 Metric은 F1-Macro인데, 간단히 얘기하자면 F1 Micro는 많이 나오는 데이터를 잘 신경쓸 수록 결과값이 좋지만

Macro같은 경우는 모든 데이터에 대해 동등하게 결과가 잘 나와야합니다


그렇기 때문에 어떻게 모든 데이터를 동등하게 처리하냐가 중요한 관건입니다

Imbalance를 해결하는 방벙은 Undersampling, Oversampling, label weight, SMOTE 몇가지 방법이 있지만 이미지 데이터 셋이고

Undersampling을 하기엔 데이터의 양이 적다고 생각했습니다.

그런데 label weight를 통해 처리를 한다면 마치 batch가 구성되는 것에 다라서 learning rate가 달라지는 현상과 동일할 것 같기도하고

주어진 train 은 몇천개이긴하지만 oversampling을 해서 몇만개 정도가 되더라도 학습하는데 큰 지장이 없기 떄문에 Oversampling을 진행했습니다

(TFRecord 상의 oversampling에 대한 참고자료 https://stackoverflow.com/a/47236466/17382999 )


이미지 clasification을 하다보면 항상 Augmentation을 통해 주어진 데이터보다 좀 더 풍성하게 학습하고 generalization과 regularization이 중요합니다

하지만 주어진 task는 일반 classification과는 다르게 신중하게 적용해야하는 이유가

metal_nut 같은 경우는 image를 flip한다고하면 label이 달라지지만 다른 경우는 그렇지 않고 또 이미지 배경이 밝거나 어둡기도하기 때문에

class에 따라 최적의 augmentation이 다를 수 있습니다


그래서 결국 문제를 2가지 단계로 나누어 해결했습니다

Taks 1 이미지가 어떤 Class인지 구분하는 Classification

Task 2 Class별로 최적의 hyperparameter(augmentation 유형을 찾고,) 이를 통해 Classification하는 방식


Task 1에선 GridMask와 imagenet preprocessing만 했더니 cross validation에서 충분히 좋은 결과가 나왔고

Taks 2에선 hue saturation brightness, contrast값 조정 뿐만 아니라 정도를 몇개 단계로 나눠 rotation, scaling, translation, flip 등을 진행한뒤 GridMask와 imagenet preprocessing만 진행했습니다 ( https://www.kaggle.com/code/saife245/cutmix-vs-mixup-vs-gridmask-vs-cutout#GridMask-data-augmentation )

그랬더니 학습에 사용되지 않은 Validation set에선, Macro F1 Score가 0.91~0.95 정도가 나왔습니다

(* Carpet, Capsule, Transistor 의 경우는 평균을 꽤 깎아먹던데 좋은 접근 소개해주시면 감사합니다)


그래서 급하게 최종 재학습을 하면서 결과를 제출하면서 test 이미지를 처음 봤는데

test 이미지는 train 데이터와는 다르게 shear 등 augmentation이 적용된 이미지들이 많았습니다


배운 것

  1. Swin Transformer 등이 있지만, TPU를 활용한 계산에선 pertained Efficientnet만한게 없다: Swin Transformer의 경우는 좀 더 테스트해봐야하긴 하지만 Notebook TPU가 아닌 Cloud TPU상에선 tensorflow 버전에 의존하는 등 안정적이지 못했습니다. 그런 상황에서 EfficientNet V2 -L, XL은 좋은 결과물을 줬고, 경우에 따라 b7도 많이 선호되었지만 이번 task에서 저는 잠깐 써보니 b7 상대적 퍼포먼스가 떨어져서 사용하지 않았습니다
  2. Pseudo Labeling을 효율적으로 적용하는 연구가 필요할듯합니다. Image Classification에서 Pseudo Labeling의 방법은 어느정도 결과를 부스팅해주는 효과가 있는데 TPU를 통해 해당 작업을 해본적이 없어서 쉽지 않았습니다. Cloud Storage에 데이터를 자유롭게 쓰기도하면서 작동하는 구성을, 모델 돌아갈 동안 종종 해봐야겠다는 생각이 들었습니다
  3. Anomaly Detection의 경우는 여러 접근이 가능하다. Augmentation에 대해서 최적의 접근을 고려하고 다양하게 실험해보는 것도 재밌었고, 주어진 task와는 다르긴하지만 MVTec Dataset을 통해 다른 Task들은 어떻게 접근해서 어떤 결과를 주는지 염탐해보는것도 재밌었습니다. 관심 있으신 분은 링크 참고해주세요 ( https://paperswithcode.com/sota/anomaly-detection-on-mvtec-ad )
  4. TPU는 빠르다 하지만 어렵다. 특별히 가속기가 없는 개인의 입장에서는 빠른 결과를 얻기가 쉽지 않은데 TPU를 활용해서 단기간내에 여러 실험이 가능했습니다. 하지만 요즘 Image Classification과 관련해 PyTorch 진영이 상당히 발전하고 있고, TPU는 구글에선… 열씸히 쓰고있는것 같은 상황에서 리소스 자체는 개인에게 유익하고 좋지만 TPU 에 맞게 코드를 변환하는 것도 어렵다라는걸 다시금 느꼈습니다
  5. SGD보단 Adabound가 좋다. Generalization을 위한 목적으로 SGD를 Optimizer로 많이 쓰고 있꼬, Adam의 경우는 Generalizaiton이 떨어진다는 평이 많은데, 이를 보완하는 Optimizaer 중에 Adabound라는것이 있습니다. Adam처럼 처음에 빠르고 나중엔 SGD만큼 일반화를 잘한다고만 체크하고 사용하고 있는데, SGD와의 퍼포먼스를 비교해보니 좋았습니다 (*혹시라도 추천하실만한 새로운 Optimizer가 있다면 댓글감사합니다)



건의하고 싶은 것

  1. Test 데이터가 실제 데이터와는 다르게 비틀어져있는 식으로 augmentation이 되어있던던데 일반적인 경우와는 조금 다른 것 같습니다. Train 데이터뿐만 아니라 Test 데이터를 EDA를 진행한다음 그에 targeting하는 augmentation을 만들어서 풀어야하는데, Test 데이터가 Train 데이터와 본질적으로 다르지 않는게 좀 더 실제와 맞는 것 같습니다.



급하게 횡설수설하게 작성했는데 궁금한점 댓글 남겨주시면 여유될 떄 답변 드리겠습니다

로그인이 필요합니다
0 / 1000
도비콘
2022.05.13 18:02

멋진 후기네요~