Wrap-up Report

Naver Boostcamp AI Tech

P stage 3

윤준호 (T1138)

IndexTitleTaskDate
1재활용 쓰레기 이미지 객체 탐지Object Detection
2재활용 쓰레기 이미지 객체 영역 구분Semantic Segmentation
bcaitech1/p3-ims-obd-connectnet
Title Task Date Team 재활용 쓰레기 이미지 객체 영역 구분 & 객체 탐지 Semantic Segmentation & Object Detection 2021.04.26 ~ 2021.05.21 5조 ConnectNet P stage 3 대회 진행 과정과 결과를 기록한 Team Git repo 입니다.
https://github.com/bcaitech1/p3-ims-obd-connectnet

TEAM

Object detection

최종 결과

1 . 문제 탐색과 해결 전략

2. 최종 사용 모델 및 하이퍼파라미터

Models (backbone / neck / detector)

  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 적용시 : 0.05 상승
    • 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 → 적용시 0.01 상승
        • 원본 사이즈의 절반으로 Multi-scale train 진행 → 대비 모델보다는 점수 하락했으나, 앙상블 시 추가하는 것이 좋은 결과로 이끔
        • WBF → TTA와 함께 적용시 0.16 상승

  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)
      • 추가로 시도한 것
        • 첫 40 epoch은 defalut augmentation, loss를 적용하였으나, 이후 12 epoch를 재학습 시 loss 변경 + augmentation을 진행 → val mAP 0.02상승, public LB 0.06 상승

2.2 Augmentations

3. 앙상블 전략

4. 아쉬움이 남는 시도들

  1. Pseudo labeling
    • 테스트 데이터셋을 inference 하면 csv 파일이 생성된다. LB 성능이 가장 좋은 결과 파일을 csv 파일을 기준으로 pseudo labeling 을 생성한다.
    • BBox 성능이 0.75 이상의 값만 읽어 COCO dataset 의 파일인 pseudo.json 파일을 생성한다.
    • pseudo.json 파일로 모델을 재학습시킨 모델의 성능을 올린다.
    • CODE
      #결과 파일 읽기
      df = pd.read_csv('final.csv')
      pred= df['PredictionString'][i]
          bbox = pred.split()
          bbox = map(float, bbox)
          bbox = list(bbox)
          bbox = numpy.array(bbox).reshape(-1,6)
         
          for d in bbox:
              if d[1] > 0.75: # 성능: 0.75 이상
                  x_min, y_min, x_max, y_max = tuple(d[2:6])
                  w = x_max-x_min
                  h  = y_max - y_min
                  pseudo_annotations.append(
                      {
                          "id": cnt,
                          "segmentation": 0,
                          "area": w * h,
                          "image_id": i,
                          "category_id": id,
                          "bbox": [x_min, y_min, w, h],
                          "iscrowd": 0
                      }
                  )
      
                  cnt +=1
          
      data["images"] = pseudo_images
      data["annotations"] = pseudo_annotations
      ...
      #CoCo dataset 파일로 저장
      with open('pseudo.json', 'w', encoding="utf-8") as make_file:
          json.dump(data, make_file, ensure_ascii=False, indent="\t")

    → 하루 전날 구현을 하고 성능이 좋은 무거운 모델로 테스트를 진행하여, 제 시간내에 검증을 진행하지 못하였습니다.

  1. EfficientDet (model)
    • MMDetection 용으로 구현된 EfficientDet의 소스 코드가 있는 git repo도 있었지만, 부스트캠프에서 제공하는 서버를 사용해 학습을 진행 중이었는데 GPU의 CUDA 버전이 맞지 않아 일부 모듈과 나아가 전체 라이브러리가 동작하지 않았다. CUDA 버전 업데이트 권한을 가질 수 있었거나, 아니면 (나중에 알게 되었듯) 다른 조처럼 구글 코랩 프로를 가입해 그쪽에서 진행했다면 가능했을 텐데 아쉽다. 아니면 대회 시간이라도 좀 더 길었다면 구현해보면서 커스텀으로 맞춰볼 수도 있었을 텐데 역시 아쉽다.

Semantic Segmentation

1. 대회 전략

2. 최종 사용 모델 및 하이퍼파라미터

  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)
  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 실험

4. Augmentation 실험

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. 아쉬움이 남는 시도들

6. 보완할 점

→ 이 보완할 점들이 두 번째 프로젝트인 object detection 대회에서는 상당 부분 반영되어, 성과를 올리는 데 큰 도움이 됨

전체 프로젝트 회고 및 느낀점

잘한점

아쉬운 점

개선할 점

느낀 점