호기심 많은 분석가

[BoostCamp] Week5_Day23&24. 대회를 마무리하며 본문

Coding/BoostCamp

[BoostCamp] Week5_Day23&24. 대회를 마무리하며

DA Hun 2021. 9. 5. 19:15
 

부스트캠프

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

boostcamp.connect.or.kr

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

드디어 첫 번째 대회 마지막 날이다. 전체적인 대회 회고 및 정리는 다음 포스팅에서 다루겠다.

  • ResNet34 모델도 사용해봄 → 특별히 좋은 성능을 보이진 않음
  • 성능을 최대로 끌어올리기 위해 여러 ensemble을 시도함
    • 결과가 잘 나왔던 모델 2개를 ensemble 해서 Acc 79%, F1_score 0.76까지 달성했다.
  • 우리는 Pretrained된 model에 우리 데이터를 학습시키기 때문에 그 모델의 원래 input size에 맞춰서 데이터를 입력해주는 것도 좋을 수 있다
    • ResNet18의 경우 224x224의 input size를 가지고 있어서, 우리 데이터를 그렇게 변경해서 실험해봄
    • 결과는 좋지 않았다.

👨🏾‍💻모델 파라미터

  • Learning rate=0.0001, Batch_size=128, Epoch=10, seed=12
  • Augmentation : Albumentation 사용
    • Resize(512, 384, cv2.INTER_LINEAR) → Crop 한 이미지를 원본 이미지와 동일하게
    • GaussianBlur(3, sigma_limit=(0.1, 2))
    • Normalize(mean=(0.5601, 0.5241, 0.5014), std=(0.2331, 0.2430, 0.2456)) → 전체 이미지의 평균과 표준편차에 맞춰서
    • HorizontalFlip(0.5) → 50%의 확률로 이미지를 Flip해줌으로써 학습효과 증대
  • Model : ResNet18, xavier_uniform시행, bias도 weight의 표준편차로 uniform 하게 변경시켜줌
  • Loss : Foalloss, Optimizer : Adam
  • Data
    • Train
      • Model1. cvlib으로 얼굴만 Crop한 데이터 19800장
        • Normal 사진으로 좌표 도출 후 일괄적용
      • Model2. Original data와 cvlib으로 얼굴만 crop 한 데이터 총 39800장 사용
      • 각 StatifiedKfold로 5개의 폴더로 나눠서 Ensemble 하고 두 개의 모델도 마지막으로 Ensemble 해줌
    • Test
      • cvlib으로 얼굴만 Crop 한 뒤 Crop 불가능한 데이터는 원본 그대로 사용

👍유용하게 사용하고 배운 것

 정말 다양한 실험 기법들을 시도하였고, 대회에 들이는 시간과 노력, 끈기 등을 가장 많이 배웠다. 점수가 높아질 때는 누구나 신이 나서 열심히 한다. 하지만 하다 보면 점수가 계속 제자리에 머무르거나 떨어지는 경우도 꽤 있다. 그럴 때 마음이 사그라들고 포기하고 싶을 때가 있는데 계속 데이터를 보고 새로운 것을 시도해보자. 언제나 시간을 들이면 새로운 인사이트는 떠오르더라. 데이터를 오래 보고 항상 생각하자.

팀원들

  • 전체적인 모델 흐름 및 프로젝트 템플릿 사용법
    • Class 사용법, Github으로 협업하기
    • pip freeze > requirements.txt로 Dependency 문제 해결
  • 기록 습관, 구글 Sheet에 결과 기록
    • 이전 대회에서부터 하던 건데 습관을 기르는 데 도움이 많이 됐다.
    • 이후의 재연성을 위해 모델에도 헷갈리지 않게 이름을 부여해서 저장
 

Google Sheets - 스프레드시트를 작성하고 수정할 수 있으며 무료입니다.

하나의 계정으로 모든 Google 서비스를 스프레드시트로 이동하려면 로그인하세요.

accounts.google.com

멘토님

  • argparse
  • black & isort

실험 및 수업

  • transform VS albumentation
    • Gaussianblur, HorizontalFlip
  • focal_loss : imbalanced data에 적용
  • Ensemble의 중요성
  • wandb
  • timezone으로 UTC 시각을 우리나라 시각으로

코드공유

  • lr scheduler
  • 학습 완료 시 Slack으로 알람 보내기

Requirements.txt 작성법

  • conda의 경우 기본 깔려있는 라이브러리들이 너무 많아 pip freeze > requirements.txt를 하면 필요하지 않은 라이브러리도 기록된다.
  • 그래서 가상환경을 만들어줘서 확인해줌
cd ~/ # 최상위 root로 이동
python3 -m venv vision # vision이라는 가상환경 생성
pip install -r 'requrirements-path'
# 이 명령어로 requirements.txt에 기록된 파일들을 우선 설치하고 작업 진행하며
# 빠진 library들을 추가로 기록해줌​
  • tree -L depth

👨‍👨‍👦‍👦피어세션

😏굿모닝세션

  • 지금 최고의 결과는 stratified 하게 fold 된 결과가 아닌 fold 만 되어서 된 결과임
    • 편향되어 있을까 걱정됨
    • 앙상블이 해결해줬을 것 🙇‍♂️
  • 정훈님
    • efficientNet 사용
  • 주영님
    • kaggle pretrained 된 efficientNet + cutmix 시도 중
  • 원상님, 준혁님
    • 코드 기록 및 작업 정리
  • 현동님
    • CutOut 시도 중
  • 성민님
    • batch_size, fold_size 조정해서 마지막 실험

😄굿에프터눈세션

  • f1 score 가 가장 높은 걸 제출로 삼기로 했다.
  • 앙상블을 적극적으로 활용하는 것이 점수에 아주 좋다.
  • 코드를 통합해서 제출해야 하는데 현재 작업 상황은 좀 나뉘어 있다.
    • 정훈님 코드를 제출하는 것으로 함
    • 다른 사람들 코드는 각자 git으로 가져가서 개인 포트폴리오로 사용하면 될 듯
  • readme.md
  • Wrap up report
    • 각자 작업한 방법론들을 정리해서 내일 아침에 모아서 작성 예정
    • https://www.notion.so/Wrap-up-9f47d7e7b0964ce5beba2dd0fd5adae1
    • 개인이 작업한 내용도 팀 회고에 적어야 하는가?
      • 그게 좋을 것 같다.
    • 마지막 결과에 feature map을 넣어서 좀 시각화해주면 좋을 듯
    • from PIL import Image
      import matplotlib.pyplot as plt
      
      model = resnet18()
      #weight load
      
      activation = {}
      def get_activation(name):
          def hook(model, input, output):
              activation[name] = output.detach()
          return hook
      
      model.layer4[-1].conv2.register_forward_hook(get_activation('last'))
      
      sample = transforms.ToTensor()(Image.open(r"P:\Downloads\boon\images_\images_\000020_1_000020_FEMALE_28.jpg")).unsqueeze(0)
      output = model(sample)
      act = activation['last']
      
      #visuallize 512 image of size 120 * 90
      # %%
      fig, axes = plt.subplots(ncols = 16, nrows=32, figsize=(100,100), constrained_layout=True)
      for _ in range(act.shape[1]):
          axes.flat[_].xaxis.set_visible(False)
          axes.flat[_].yaxis.set_visible(False)
          axes.flat[_].imshow(act[0, _, :, :])
      
      fig.show()
      # %%
      plt.imshow(Image.open(r"P:\Downloads\boon\images_\images_\000020_1_000020_FEMALE_28.jpg"))
      # %%​
       
       
    • 결과물
  • epoch 당 속도를 줄이는 방법
    • albumentations 사용하면 torchvision.transform 보다 빠르다.

👨🏻‍🏫멘토링

마지막 멘토링도 역시나 이번 주 모두 어땠는 지로 시작해서 멘토님의 본인 이야기도 들려주셨다. 석사, 박사 때 이야기와 그 중간에 스캐터랩이라는 회사에서 인턴을 하며 느꼈던 사이언티스트와 엔지니어의 차이 등을 알려주셨고, 짧다면 짧고 길다면 긴 5주 간의 감상을 서로 나눴다. 이제 조금 친해졌는데 헤어지는 게 아쉬워 전화번호 교환을 하였고, 그렇게 공식적인 멘토링을 마무리하였다.

멘토님께서는 조금 더 남아계신다고 하셔서 개인적인 고민을 이야기하고자 남아있었는데, 성민님도 함께 남아계셔서 같이 서로의 고민을 조금 나눴다. 완전히 해결되진 않았지만 이야기를 하며 조금씩 해소가 되었고, 멘토님께서도 우리 둘이 질문을 많이 해줘서 고마웠다며 말씀해주셨다. 정말 좋은 분이신데 NLP 전공이셔서 남은 캠프 기간 동안은 만나기 힘들 것 같지만 그래도 종종 연락드려야겠다.

 

 

[AI Tech]Daily Report

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

data-hun.notion.site