호기심 많은 분석가
[BoostCamp] Week5_Day20. 6일만의 상승 본문
이번주는 강의가 따로 주어지지 않고, 대회로만 진행된다. 한동안 점수 상승이 없어서 리더보드가 계속 밀리는 슬픔을 겪었는데 오랜만에 순위를 올려서 뿌듯함을 느낀 날이다. 다른 팀원들도 그렇고 나도 그렇고 참 여러가지를 시도해보더라도 결과가 좋지 않으면 힘이 많이 빠진다. 특히 이론적으로 좋아질거라 생각했던 방향이 그렇지 않을 때는 더더욱 심하다. 하지만 그게 대회 아닐까. 꾸준히 많은 것들을 시도하는 게 대회에선 굉장히 중요하다.
🕵🏻♂️마스크착용_분류_대회
- Pretrained된 모델을 내 데이터로 Classifer와 같이 학습시키는 것이 Freeze를 안한 것
- 그러려면 파라미터가 많아질테니까 데이터가 많아야함
- 우리는 데이터가 많은 편이 아니니(Class당 1만 장 정도) Freeze를 하고 Classifier만 학습시키는 게 좋음
- 데이터가 되게 균일하고 배경이 넓은 경우가 많아서 cvlib으로 얼굴만 잘라냈다.
- 우리 데이터는 mask낀 사진 5개, 코스크나 턱스크를 쓴 사진 1개, 마스크를 쓰지 않은 사진 1개, 총 7개로 이루어져 있는데, mask를 쓴 경우 얼굴 인식이 잘 안되는 경우가 있었다.
- 그래서 마스크를 쓰지 않은 사진으로 얼굴을 잡아내고 그 좌표를 같은 사람끼리 공유하면서 모든 train set을 crop할 수 있었다. → RGB값들의 분포를 확인해본 결과 모든 이미지가 얼굴을 적절히 짜른 것으로 판단
- test set의 경우는 그렇게 할 수 없었으므로, 가능한 것은 crop하고 그렇지 않은 것은 원본 그대로 두었다.
- 학습을 위해 모두 (512, 384)로 Resize시켜주었음
- 그 결과 내 이전 코드 중 1등 코드와 조금 다른 분포를 보여주면서 점수가 그것보단 조금 낮게 나왔는데, 그 두개를 ensemble 해줌으로써 새로운 최고 기록을 갱신할 수 있었다.
👨👨👦👦피어세션
토의내용
- 주영: 모델 가중치를 코드의 어떤 부분에서 저장하는가?
- trainer의 base_trainer._save_checkpoint에서 저장하게 됩니다
- eval.py에 대한 전반적인 설명(원상님)
- 쓰레드에 클래스가 독립이 아닌 경우도 생각해야 할 듯
- 백본이 하나이기 때문에 의존이 아예 없는 건 힘들 듯 하다.
- 허정훈: 나이로 프리트레인된 모델을 이용하면 좋을 것 같은데 아직 찾지 못함
- Mask dataset을 이용하면 남녀구분, mask 프레딕션에 좋을듯
- 원상: Classifier만 날리고 백본만 쓴다면 외부 데이터셋이 좀 속성이 달라도 괜찮을 듯 하다
- 외부 데이터셋을 활용해 프리트레인 후 파인튜닝
- 이준혁: 베스트 모델을 저장하는 기준은?
- 원상: 로스 기준으로 저장합니다
각자 해볼 일
- 주영: Gender & mask, age모델 따로 만들어보겠다
- 정훈: 원래 모델 계속 시도(cv crop, 안되면 중앙)
- 준혁: 외부데이터 사용(effinet b5)
- 현동: test데이터도 크롭해서 진행
- 원상: testpy쪽에 혼동행렬 결과 등 시각화하고 라벨 스무딩(loss 고민)
- 성민: focal loss and bagging
👨🏻🏫오피스아워
Image Classification 경진대회 solution 공유
- 이호민(iShango Ai Engineer)
1. Office-hour concept
- I`m a 고용주
2. Solution 공유
2.1 Define Probelm
- 롯데정보통신 Vision AI 경진대회
- 롯데 제품 이미지 분류, Input으로 이미지가 들어오면 어떤 제품인지 맞추는 간단한 Image Classfication 문제
- Dataset
- Train Data 48000장 (1000 class * 48)
- Test Data 72000장 (1000 class * 72)
2.2 Storyline
EDA
- 간단해보이지만 생각보다 어려워하는 validation score → Class별 데이터가 적음
- 서로 다른 class이지만 모양은 유사
- 캔 종류이지만, 환타야 / 라는 방향성을 원함
- Label smoothing
- 비슷한 모양을 갖고 있는 제품들의 label을 통해 feature 학습이 가능
- 이것을 통해 Validation score가 0.99를 기록 → 하지만 LB가 조금밖에 차이가 없었음
- 이것은 내가 정의한 Validation set이 잘못되었거나 Test데이터가 너무 다를 것이다.
- Pair 기반 접근
- 이미지가 들어오면 비슷한지 다른지 판단
- Image retrieval이랑도 비슷하다. arcface loss, Pooling은 GeM Pooling을 사용
- CNN structure
- NFNet, EfficientNet b2,3
2-3. Method
- Stratified k-fold, Warm-up, Cosin anneling, TTA
- GaussianBlur
Q&A
- Validation이 test와 연결되지 않는다면 Validation 셋을 test와 비슷하게 만들자
✍🏻학습회고
한창 궤도를 달리다가 벽에 가로막힌 뒤 6일만에 점수를 올렸다. 그동안 정말 여러가지를 시도해봤는데, 새로운 시도를 할 때마다 청년층과 중노년층은 잘 구분하는 데 노년층을 너무 분리 못하는 경향이 있었다.
그래서 오늘은 얼굴을 cvlib을 이용해서 crop한 뒤 eval 데이터도 crop하는 방법을 써봤는데, 이번에는 정확도는 꽤 높지만 역시나 중년층을 많이 예측하는 것이었다. 그래서 고민하던 중 두 모델을 ensemble시키면 되지 않나라는 생각이 들어 시도해봤고, 좋은 결과를 얻을 수 있었다. 되게 간단한 아이디어를 놓치고 있어서 먼 길을 돌아오지 않았나.
지금은 focal_loss를 사용하여 모델을 학습 중이다. Imbalanced한 data에 적합한 loss다보니 f1_score가 굉장히 높은데, 너무 과적합되지는 않을까 걱정이 든다.
또한, crop한 image과 original image를 함께 쓰기 위해 작업하면서 정말 머리가 아팠는데, argparse를 써야하는 이유를 뼛속 깊이 깨닫았다. 안일하게 직접 쓴 모듈들을 여러 개 만드는 바람에 그걸 수정한다고 많은 시간을 할애했다.
label이 잘못된 데이터들이 있는데, 이번에는 그 데이터들을 제거하고 여러가지를 실험해보고자 한다. learning scheduler도 써보고, 또 어떤 model과 ensemble할 수 있을지 고민해보고, model 자체도 바꿔보겠다.
대회를 진행한 지 이제 1주일 됐는데 굉장히 다른 사람이 된 기분이다. 이론으로 배웠던 것들을 구현해보면서 이해가 됐고, 대회가 종료되고 다시 강의를 들어보면 이해되는 깊이가 다르지 않을까. 팀 코드를 병합하기 위해 팀원분이 노력해주셨는데 원래 현업에 계시던 개발자라 그런지 코드들이 깔끔했다. 이해하기 조금 어려웠지만, 내 코드에서 발견한 좋은 방법들을 시도해볼 것이다.🌱
'Coding > BoostCamp' 카테고리의 다른 글
[BoostCamp] Week5_Day22. 끝을 향해 달려가는 (0) | 2021.09.03 |
---|---|
[BoostCamp] Week5_Day21. 실수를 통한 발전 (0) | 2021.09.02 |
[BoostCamp] Week4_Day19. 팀 병합의 날 (0) | 2021.09.01 |
[BoostCamp] Week4_Day18. 여러가지 실험들 (0) | 2021.08.31 |
[BoostCamp] Week4_Day17. 여러번의 실패와 깊은 이해 (0) | 2021.08.30 |