Title | Task | Date | Team |
---|---|---|---|
재활용 쓰레기 이미지 객체 영역 구분 & 객체 탐지 | Semantic Segmentation & Object Detection | 2021.04.26 ~ 2021.05.21 | 5조 ConnectNet |
P stage 3 대회 진행 과정과 결과를 기록한 Team Git repo 입니다. 대회 특성상 수정 혹은 삭제된 부분이 존재 합니다
- Rank: 17
- LB: 0.6205
- Rank : 5
- LB: 0.4789
1. Segmentation
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 실패한 부분
-
공유 코드 작성 시
작성자 표시
함수
단위 작성merge
시 .py 형식 사용
-
모델 로그 기록
Wandb
사용
-
회의 기록 작성
-
자료 공유 및 연락 - Slack
-
Code review
- Git에 code review 요청,
- Peer session 활용
-
결과 제출 시
- 실험 내용 결과 공유 및 기록
- Daily Mission 수행
- Augmentation & Loss 조합 실험
- Model 선정
- Skill
-
TTA
-
SWA
-
Pseudo Labeling
-
Image 생성 - 김현우T1045 진행
-
- 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
- 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))
- 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 학습 진행
동일한 모델을 사용하여, Loss 값에 따른 Score 실험
- Decoder : deeplabV3+
- Backbone : efficientb3-noisy-student
- Optimizer : AdamW
- 데이터에 적용 가능한 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))
-
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이 추가적으로 이루어진 결과에 기인한다고 생각한다.
- 학습 방법
- 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 저장해서 필요할 때 사용하기
- 시각화 코드도 한번 짜보기
-
Global wheat detection 분석을 통해 사전 실험의 방향성을 수립
-
모델 설정
-
augmentation & loss 조합 실험
-
Multi Scale Train
-
TTA
-
WBF
-
Pseudo Labeling
-
hyper parameter 튜닝
-
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
-
-
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 진행
- DarkNet / SPP / YOLO v5
-
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
- SwinTransformer / FPN / Mask R-CNN
-
Mosaic
- Add Data
- 외부 데이터 이용은 대회 규칙 상 금지
- 마스크와 BBOX를 이용해서 원하는 오브젝트를 분리해서 다른 이미지에 붙일수 있을것이라고 생각.
- 데이터상에서 Battery, Clothes, Metal, PaperPack, Glass 오브젝트가 부족한것으로 바악해서 해당 오브젝트를 기존 이미지에 추가하는 방식으로 데이터를 증강.
- 부족하다고 판단된 오브젝트를 각 500개씩 증가
- 데이터 추가 후 기본 베이스 라인 코드로 테스트 결과 0.05정도 점수 상승해서 폴드별로 데이터 추가
- SWIN_T에서는 마스크 부분이 새로 생성된 이미지에 존재하지 않아 적용하지 못함.
- WBF
- 여러개의 bounding box를 각각의 확률을 가중평균으로 하여 하나의 bounding box로 나타내는 방식
-
Pseudo-Labeling
- 기본모델 : Fold = 2 / size = 640 / EfficientDetD6
-
기본모델을 10 epoch 학습
- 학습 데이터는 기본 train data + Pseudo-Labeling test data mixup
-
1에서 학습한 모델을 다시 6에폭동안 학습
- 학습 데이터는 기본 train data + 1단계 모델 Pseudo-Labeling test data mixup
-
WBF hyperparameter
- IOU threshold 와 Skip box threshold 조정
- IOU threshold는 특정 임계값 이하로 내리면 오히려 성능이 하락
- Skip box threshold는 낮은 값인 경우, test data visualization 시 지나치게 많은 박스가 존재하여 직관적으로는 납득하기 어려움
- 최종값
- IOU threshold : 0.4, Skip box threshold : 0.01
- 총 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
- ResNet50
- YOLO v5
- pseudo labeling
- 가장 높은 LB CSV 파일로 pseudo labeling 을 생성
- BBox 성능이 0.75 이상의 값만 사용하여, pseudo.json 파일을 생성
- pseudo.json 파일로 모델을 재학습 진행
- Segmentation loss
- Segmentation Models
- Lookahead optimizer
- Weighted Boxes Fusion
- Swin Transformer Object Detection