호기심 많은 분석가

[BoostCamp] Week5_Day20. 6일만의 상승 본문

Coding/BoostCamp

[BoostCamp] Week5_Day20. 6일만의 상승

DA Hun 2021. 9. 1. 22:11
 

부스트캠프

개발자의 지속 가능한 성장을 위한 학습 커뮤니티

boostcamp.connect.or.kr

이번주는 강의가 따로 주어지지 않고, 대회로만 진행된다. 한동안 점수 상승이 없어서 리더보드가 계속 밀리는 슬픔을 겪었는데 오랜만에 순위를 올려서 뿌듯함을 느낀 날이다. 다른 팀원들도 그렇고 나도 그렇고 참 여러가지를 시도해보더라도 결과가 좋지 않으면 힘이 많이 빠진다. 특히 이론적으로 좋아질거라 생각했던 방향이 그렇지 않을 때는 더더욱 심하다. 하지만 그게 대회 아닐까. 꾸준히 많은 것들을 시도하는 게 대회에선 굉장히 중요하다.


🕵🏻‍♂️마스크착용_분류_대회

  • 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주일 됐는데 굉장히 다른 사람이 된 기분이다. 이론으로 배웠던 것들을 구현해보면서 이해가 됐고, 대회가 종료되고 다시 강의를 들어보면 이해되는 깊이가 다르지 않을까. 팀 코드를 병합하기 위해 팀원분이 노력해주셨는데 원래 현업에 계시던 개발자라 그런지 코드들이 깔끔했다. 이해하기 조금 어려웠지만, 내 코드에서 발견한 좋은 방법들을 시도해볼 것이다.🌱

 

 

[AI Tech]Daily Report

Naver AI Tech BoostCamp 2기 캠퍼 허정훈 2021.08.03 - 2021.12.27 https://bit.ly/3zvJnSh

data-hun.notion.site