Flow
1.농업 환경 변화에 따른 작물 병해 진단 AI 경진대회
- 개요: "작물 환경 데이터", "작물 병해 이미지"를 이용해 "작물의 종류", "병해의 종류", "병해의 진행 정도"를 진단하는 AI 모델
2) 주최 : LG AI Research, 주관 : 데이콘
- 모델 평가 방식: macro-f1
- 결과: 29등(상위10%이내)
2. Summary
- for model generalization
hard voting ensemble(3)
- efficientnetb4
- agumentation(horizontal_flip=True,rotation_range=40,zoom_range=0.4,brightness_range=[0.5,1.3])
- using pretrained model(keras)
2-1. Ensemble
model Generalization을 위해서는 다양한 모델의 앙상블이 필수라고 생각했습니다. 따라서 저희는
Model
1)
softvoting ensemble
5fold+tta+efficientnetb2+agumentation(horizontal_flip=True,rotation_range=40,zoom_range=0.4,brightness_range[0.5,1.3])
5 fold+inceptionresnetv2+agumentation(horizontal_flip=True,rotation_range=40,zoom_range=0.4,brightness_range[0.5,1.3])
- vit
- eff4+cutmix
2-2. Augmentation
최종적으로 모델 코드는 keras로 짰기 때문에 keras agumentation안에 있는 agumentation들을 최대한 활용해보려고 하였습니다.
식물 데이터셋에 있어 vertical flip이나 shear_range가 오히려 혼동을 줄 수 있다고 판단하였고 실제로 적용하였을 때 성능이 떨어짐을 확인 할 수 있었습니다.
최종 선택한 Augmentation은 다음과 같습니다.horizontal_flip=True,rotation_range=40,zoom_range=0.4,brightness_range=[0.5,1.3]
이중에서 brightness_range는 데이터셋 특성상 작물의 색을 조정할 수 있어 도움이 되지 않을거라고 생각했는데 넣었을 때가 훨씬 좋은 성능을 보였습니다. 데이터에 측정시간이 기록되어 있고, 이는 과제가 다양한 밝기의 조명에 노출되었음을 의미해 밝기 변화가 도움이 된다고 여겨졌습니다.
3. Training Details
Weight : 모든 모델은 ImageNet에서 pretrained된 weight를 초깃값으로 사용Optimizer : AdamScheduler : ReduceLROnPlateau(patience=5), EarlyStopping(patience=6)Epochs : 100
Model
softvoting ensemble
EfficientNetv4(*0.7)+InceptionResNet(*0.3)
4. 실패한 방식
https://www.kaggle.com/c/quickdraw-doodle-recognition/leaderboard
Quick, Draw! Doodle Recognition Challenge | Kaggle www.kaggle.com
f1_ score를 사용한 classification 대회 중 1등 solution 하나에서 차용했습니다.
softmax값에서 6_a12_2(레이블수제일적음) 와 6_00_0(레이블수 top3안에들음) 을 헷갈려하면서 결국 6_00_0으로 값을 선택한 애들이 총 6개 정도됐습니다. 선발기준은 진짜 헷갈려하는애들만(softmax값이 0.4/0.5로 정도)로 했고 이정도면 6_a12_2로 값을 넣어봐서 실험해도 되겠다고 하고 실험했습니다. 이유는 평가방식이 f1_score이기 때문에 클래스 값을 이런식으로 바꿔줄 때 성공하면 점수 향상에 크게 도움이 된다고 생각했습니다. 그치만 결과적으론 도움이 되지 않았지만 좋은 시도라고 생각합니다.
2) CUT MIX
tf 내에서 다른 유저들이 만든 cutmix 라이브러리를 사용해 적용해 보았습니다.
dataset전체에 아무런 hyperparmeter를 건드리지 않은채 적용해 보았는데, 오히려 점수가 큰 폭으로 하락 했습니다. dataset 특징을 고려하지 않고 vision문제라는 이유로 cutmix를 적용하면 안되겠구나 느꼈습니다.
- Cutmix와 같은 방법은 투입되는 이미지의 크기가 축소되고, 이는 모델이 변별하기 어려운 사이즈로 변경되어 성능이 감소했을 수 있음. (안그래도 병변 객체들이 크기가 작기때문에 도움이 안될 수 있다.)
같은 cutmix 실험중 (봉현님 실험내용)
3) VIT
(재우님 실험내용)
5. 새롭게 얻은 insight
1) 데이터 EDA를 열심히 하자.
Dataset을 꼼꼼히 분석해 보면 model의 성능을 높일 수 있는 여러가지 기법이 보입니다. 모델 성능을 향상 시킬 수 있는 새로운 아이디어는 꼼꼼한 EDA에서 나온다고 느꼈습니다.
ex) 병해가 있는 농작물 dataset같은 경우 주로 가운데에 작물들이 위치되어 있는것이 보였습니다. 또한 모델이 구분하기 힘들어했던 "파프리카흰가루병" 은 병이 잎이 희게 변하는 질병이다 보니까 흰색에 영향을 많이 받아 주변 사진촬영한곳이 희거나,비닐하우스가 잘보이게 찍거나(흰색값 다수)면 병해정도를 '심하다'라고 판단했습니다.
2) 모델을 다르게 써도 agumentation을 똑같이 쓰면 앙상블에서 효과가 다소 미비 할 수 있다.
LB에서 성능은 우수하게 나오는 모델이지만, 같은 실험한 다른 종류의 모델을 앙상블하게 되면 MODEL Generalization이 떨어져서 효과가 적은것 같습니다. 전혀 다른 agumentation을 쓰고 새로운 실험을 사용한 모델끼리의 앙상블 효과가 좋은것같다고 느꼈습니다.
3) 코드 최적화, 전처리 최적화가 필요하다.
ㄱ. k-fold나 tta를 사용했지만 학습시간 및 추론시간이 몇배로 길어져 큰 성능향상을 보이지 않으면 inference시간 단축을 위해서라도 사용하지 않는게 도움이 될 수 있다 느꼈습니다.
ㄴ. 주로 제가 사용하던 keras나 tensorflow같은 경우에 직접 원하는대로 agumentation이나 해당 library 를 입맛대로 변경하며 사용하는것이 힘들다는 것을 깨달았습니다. data processing을 조금 더 빨리하고 빠른 code를 만들기 위해서는 pytorch 사용이 훨씬 이득이라는 것을 알았습니다.
4) BIT (+)
5) 다양한 가설을 내는 것이 좋으나 꼭 실험이 필요하다.
6) Focal Loss(https://arxiv.org/pdf/1708.02002.pdf)의%EC%9D%98) 사용
이 loss 값은 기본적으로 예측을 잘하는 대상에 대한 loss 값을 줄임으로써 다른 빈도수가 낮고 아직 모델이 잘 예측하지 못하는 범주에 대한 loss 값을 상대적으로 크게하는 방식. 실제로 각각의 classifier loss에 기여하는 데이터의 비율이 다른 가운데, 잘 예측하는 것의 loss 값에 대한 영향력을 축소시킬 필요가 있음. 극단적인 예로는 Risk 3단계의 경우 전체 데이터의 1% 정도에 불과함. 이를 사용함으로써 얻는 효과는, 모델이 아직 학습이 덜 된 범주의 데이터에 초점을 맞추고, 실제 데이터 비율이 적더라도 이에 더욱 초점을 맞춤으로써 효과적인 학습이 가능해 질 수 있음. 예를 들자면, 결과적으로 crop 예측을 매우 잘할 경우 crop classifier의 성능 개선의 중요도는 떨어지고 다른 classifier의 성능 개선이 필요하게 되는데, 이를 자동으로 조절해주는 역할을 하게 됨.
'머신러닝-딥러닝 > Kaggle' 카테고리의 다른 글
DL - 0218 (0) | 2021.02.18 |
---|---|
ML (0) | 2021.02.09 |
1주차 머신러닝 (0) | 2021.01.22 |
9주차 review (0) | 2021.01.14 |
7주차 review (0) | 2020.12.28 |