Skip to content

bcaitech1/p3-ims-obd-connectnet

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

97 Commits
 
 
 
 
 
 
 
 

Repository files navigation

부스트캠프 AI Tech - Team Project

Title Task Date Team
재활용 쓰레기 이미지 객체 영역 구분 & 객체 탐지 Semantic Segmentation & Object Detection 2021.04.26 ~ 2021.05.21 5조 ConnectNet

P stage 3 대회 진행 과정과 결과를 기록한 Team Git repo 입니다. 대회 특성상 수정 혹은 삭제된 부분이 존재 합니다


✔️ Segmentation Task

  • Rank: 17
  • LB: 0.6205

✔️ Object Detection Task

  • Rank : 5
  • LB: 0.4789

📋 Table of content

Team 소개
Gound Rule

1.1 대회 전략
1.2 Model
1.3 Loss
1.4 Augmentation
1.5 실패한 부분
1.6 회고 & 과제

2.1 대회 전략
2.2 Model
2.3 Augmentation
2.4 사용한 기술
2.5 Ensemble
2.6 실패한 부분


🌏Team - ConnectNet

  • 김종호_T1034 Github Badge Blog Badge
  • 김현우_T1045 Github Badge
  • 김현우_T1046 Github Badge
  • 배철환_T1086 Github Badge
  • 서준배_T1097 Github Badge Blog Badge
  • 윤준호_T1138 Github Badge Blog Badge

Ground rule

  1. 공유 코드 작성 시

    • 작성자 표시
    • 함수 단위 작성
    • merge 시 .py 형식 사용
  2. 모델 로그 기록

    • Wandb 사용
  3. 회의 기록 작성

  4. 자료 공유 및 연락 - Slack

  5. Code review

    • Git에 code review 요청,
    • Peer session 활용
  6. 결과 제출 시

    • 실험 내용 결과 공유 및 기록

🔍Segmentation

전체 실험 내용

1. 대회 전략

  • Daily Mission 수행
  • Augmentation & Loss 조합 실험
  • Model 선정
  • Skill
    • TTA

    • SWA

    • Pseudo Labeling

    • Image 생성 - 김현우T1045 진행


2. Model

  1. efficientb3-noisy-student , FPN
  • LB 점수 : 0.6248
  • 모델 : decoder : FPN, backbone : efficientb3-noisy-student
  • loss : Jaccard + SoftCE
  • optimizer : AdamP (learning_rate = 0.0001), LookAhead
  • hyperparameters : Batch size 4, Epochs : 40
  • augmentation
    • HorizontalFlip
    • ShiftScaleRotate
    • RandomBrightnessContrast
    • VerticalFlip
    • OneOf
      • A.RandomResizedCrop(512,512,scale = (0.5,0.8),p=0.8)
      • A.CropNonEmptyMaskIfExists(height=300, width=300, p=0.2),], p=0.5)
      • A.Resize(256, 256)
  • SWA

  1. se_resnext101_32x4d, FPN
  • LB 점수: 0.6228 (public)
  • 모델 : decoder : FPN, backbone : se_resnext101_32x4d
  • loss : Jacarrd
  • optimizer : Adam (learning_rate = 0.00001)
  • hyperparameters : Batch size 16, Epochs : 15
  • augmentation
    • HorizontalFlip
    • VerticalFlip
    • ShiftScaleRotate
    • RandomBrightnessContrast(brightness_limit=0.15, contrast_limit=0.2, p=0.5)
    • RandomResizedCrop(512,512,scale = (0.5,0.8))

  1. efficient-b3 , FPN
  • LB 점수: 0.5897 (public)
  • 모델 : decoder : FPN, backbone : efficient-b3
  • loss : Cross Entropy
  • optimizer : AdamW (learning_rate = 0.00001)
  • augmentation
    • HorizontalFlip
    • ShiftScaleRotate
    • RandomBrightnessContrast
    • RandomResizedCrop
    • OpticalDistortion
    • VerticalFlip
  • pseudo hyperparameters : batch 8, epochs 20
  • pseudo 학습: Fold로 나뉜 모델, 각각 psudo labeling 학습 진행

3. Loss

동일한 모델을 사용하여, Loss 값에 따른 Score 실험

  • Decoder : deeplabV3+
  • Backbone : efficientb3-noisy-student
  • Optimizer : AdamW

seg_chart


4. Augmentation

arg0


crop0

Scale58 = RandomResizedCrop(512,512,scale = (0.5,0.8))
Scale68 =RandomResizedCrop(512,512,scale = (0.6,0.8))
Scale46 = RandomResizedCrop(512,512,scale = (0.4,0.6))
Scale24 = RandomResizedCrop(512,512,scale = (0.2,0.4))

5. 실패한 부분

  • Unet, Unet ++, Unet3+을 적용하려고 했으나 성능이 나오지 않았다.

  • pseudo labeling

    • 학습 방법
      • label이 없는 데이터셋(test셋)에 대해 매 배치마다 생성 및 학습
      • 50batch마다 기존 train셋을 1epoch학습 진행
    for each_test_image in test_loader:
    	model.eval()
    	output = output of model with each_test_image
    	oms = output label
    	model.train()
    	unlabled_loss = alpha_wight * CE(output,oms)
    	if batch % 50 == 0:
    		for each_train_image in train_loader:
    			train_output = output of model with each_train_image
          

    → CE(output, mos)는 사실상 같은 값이기 때문에 값이 0에 수렴하여 의미가 없다. 따라서, 위 pseudo code는 원래의 pseudo-labeling의 의도와는 다른 방식으로 작동한다. 그럼에도 불구하고 적용하지 않았을 때 보다 0.06이 상승하는 효과가 있었는데, 이는 단순히 내부 for문에 의해 train이 추가적으로 이루어진 결과에 기인한다고 생각한다.


6. 회고 & 과제

  • Library 버전 통일하기
  • EDA를 통해서 이미지 특성에 따라 실험하기
  • 시각화 코드도 한번 짜보기
  • 학습 진행 시 ,다른 작업을 못할 때는 SOTA 모델 TTA나 CRF 같이 테크닉 탐색
  • loss를 조합 시, 특정 모델에서만 좋았던 것일 수도 있으니 참고하기
  • 최대한 작은 모델로 실험 하기 -> 기본적 조합 (loss, optim, augmentation, batch_size, lr, epoch)
  • 기준 점수 (ex. 현재 single SOTA 점수의 +- 15%)를 충족하지 못하면 과감하게 드랍하기
  • csv 파일로 soft voting, hard voting 앙상블 기능을 미리 구현
  • 개인별 앙상블 미리 실험
  • 낮에는 작은 모델로 기능 테스트를 진행하고, 밤에는 성능이 좋은 모델로 실험을 진행함 -> 성능이 좋은 모델은 모두 다른 조합으로 진행함
  • pseudo labeling 다른팀과 비교해서 검증 및 재사용
  • 목표를 세분화해서 각각 데드라인을 지정
  • 시간이 부족하면 validation score 측정 빼고 실험
  • GPU 20 시간 돌리기!!!
  • 항상 모델 pt 저장해서 필요할 때 사용하기
  • 시각화 코드도 한번 짜보기




🔍Object Detection

전체 실험 내용

1. 대회 전략

  • Global wheat detection 분석을 통해 사전 실험의 방향성을 수립

  • 모델 설정

  • augmentation & loss 조합 실험

  • Multi Scale Train

  • TTA

  • WBF

  • Pseudo Labeling

  • hyper parameter 튜닝


2. Model

  1. Cascade R-CNN 계열

    • ResNext101 / FPN / Cascade R-CNN

      • LB: 0.4781
      • optimizer : SGD (learning_rate = 0.02)
      • loss: CrossEntropyLoss (Class loss), SmoothL1Loss (Bbox loss)
      • hyperparameters : batch : 16, epochs : 50
    • ResNet50 / RFN + SAC / Cascade R-CNN (DetectoRS)

      • LB : 0.5121
      • optimizer : SGD (learning_rate = 0.01)
      • loss: SoftCrossEntropyLoss (Class loss), SmoothL1Loss (Bbox loss)
      • hyperparameters : batch : 4, epochs : 48 or 60
      • 5 fold cross-validation
      • TTA
    • ResNext101 / RFN + SAC / Cascade R-CNN (DetectoRS)

      • LB: 0.5247
      • optimizer : SGD (learning_rate = 0.01)
      • loss: SoftCrossEntropyLoss (Class loss), SmoothL1Loss (Bbox loss)
      • hyperparameters : batch : 4, epochs : 48 or 60
      • TTA : vertical, horizontal flip, 512, 768 resize

  1. YOLO 계열

    • DarkNet / SPP / YOLO v5
      • LB : 0.4916
      • loss : CrossEntropy (150 epoch models), Focal Loss (240 epoch models)
      • optimizer : SGD (learning_rate = 0.01)
      • hyperparameters : batch : 32, epochs : 150 or 240
      • TTA
      • 원본 사이즈의 절반으로 Multi-scale train 진행

  1. Swin 계열

    • SwinTransformer / FPN / Mask R-CNN
      • LB: 0.5486
      • cls_loss: LabelSmooth + CE + Focal (각 box_head 별)
      • bbox_loss: SmoothL1Loss
      • optimizer: AdamW (learning_rate = 0.0001)
      • 재학습
        • loss 변경
        • augmentation 추가
      • TTA

3. Augmentation

  • Mosaic

    • 이미지 4장을 각각 무작위로 잘라서 하나의 사진으로 만드는 augmentation

    • cutmix와 차이점 : cutmix는 자른 사진이 다른 사진을 가리는 구조, Mosaic은 4장의 랜덤하게 자른 사진을 하나로 합치는 구조

      mosaic

    • Mixup

    • RandomRotate90

    • HueSaturationValue

    • CLAHE

    • RandomBrightnessContrast

    • RGBShift

    • Blur

    • MotionBlur

    • GaussNoise

    • ShiftScaleRotate

    • Multi-scale


4. 사용한 기술

  1. Add Data
    • 외부 데이터 이용은 대회 규칙 상 금지
    • 마스크와 BBOX를 이용해서 원하는 오브젝트를 분리해서 다른 이미지에 붙일수 있을것이라고 생각.
    • 데이터상에서 Battery, Clothes, Metal, PaperPack, Glass 오브젝트가 부족한것으로 바악해서 해당 오브젝트를 기존 이미지에 추가하는 방식으로 데이터를 증강.
    • 부족하다고 판단된 오브젝트를 각 500개씩 증가
    • 데이터 추가 후 기본 베이스 라인 코드로 테스트 결과 0.05정도 점수 상승해서 폴드별로 데이터 추가
    • SWIN_T에서는 마스크 부분이 새로 생성된 이미지에 존재하지 않아 적용하지 못함.

  1. WBF
    • 여러개의 bounding box를 각각의 확률을 가중평균으로 하여 하나의 bounding box로 나타내는 방식

  1. Pseudo-Labeling

    • 기본모델 : Fold = 2 / size = 640 / EfficientDetD6
    1. 기본모델을 10 epoch 학습

      • 학습 데이터는 기본 train data + Pseudo-Labeling test data mixup
    2. 1에서 학습한 모델을 다시 6에폭동안 학습

      • 학습 데이터는 기본 train data + 1단계 모델 Pseudo-Labeling test data mixup

  1. WBF hyperparameter

    • IOU threshold 와 Skip box threshold 조정
    • IOU threshold는 특정 임계값 이하로 내리면 오히려 성능이 하락
    • Skip box threshold는 낮은 값인 경우, test data visualization 시 지나치게 많은 박스가 존재하여 직관적으로는 납득하기 어려움
    • 최종값
    • IOU threshold : 0.4, Skip box threshold : 0.01

5. Ensemble

  • 총 26개 모델을 WBF와 threshold 최적화를 이용하여 앙상블
  • stratified kfold방식으로 데이터셋을 5개(fold0,fold1,fold2,fold3,fold4)로 나뉘어 학습하여 앙상블
  • 기준(0.5이상)을 넘긴 모델 앙상블 목록
    • YOLO v5
      • fold0, fold1, fold2, fold3, fold4
      • augment적용 fold0 ,fold1, fold2, fold3
      • fold4(img size 256)
    • Swin T
      • fold0, fold1, fold2, fold3
      • fold4(img size 768)
    • Cascade R-CNN
      • ResNet50
        • fold0, fold1, fold2, fold3
        • trainall data
      • ResNet101
        • fold0, fold1, fold2, fold3, fold4
        • train all data

6. 실패한 부분

  • pseudo labeling
    • 가장 높은 LB CSV 파일로 pseudo labeling 을 생성
    • BBox 성능이 0.75 이상의 값만 사용하여, pseudo.json 파일을 생성
    • pseudo.json 파일로 모델을 재학습 진행

Reference

Paper

GIt

Site & Kaggle

편의 기능

About

p3-ims-obd-connectnet created by GitHub Classroom

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published