boostcampaitech3 / level2-semantic-segmentation-level2-cv-14

level2-semantic-segmentation-level2-cv-14 created by GitHub Classroom
0 stars 2 forks source link

[팁] 기존 Segmentation 관련 대회 조사 #21

Closed TaehaKim-Kor closed 2 years ago

TaehaKim-Kor commented 2 years ago

내용

목적

기존 대회의 내용을 조사하여 정리하고 우리가 활용할 수 있는 방안을 수색함.

작성 방법

각 코멘트별로 대회 하나에 대한 내용을 정리함.

TaehaKim-Kor commented 2 years ago

위성 레이더 사진으로부터 구름 영역을 픽셀 단위로 찾는 문제

데이터 타입

Sentinal - 2 Data R/G/B 파장 데이터와 적외선 파장 데이터가 주어짐. R/G/B 파장 데이터를 조합해서 Color Image를 만드는 방법이 DrivenData Blog에 게시됨. 자카드 지수로 평가함.

3등 솔루션

TIMM 라이브러리에서 제공하는 Unet계열의 모델을 활용함. Backbone : resnet34, efficientnetv2_b0, efficientnetv2_s, efficientnet_b0, efficientnet_b3 Sample 수를 기준으로 Kfold를 적용 각 위치 별 자카드 지수의 평균을 loss로 사용(+focal loss) Augmentation : random flips, rotations, scale, cut-outs, elastic Test-Time Augmentation : Horizontal flips

2등 솔루션

데이터에 노이즈가 많아서 데이터 클렌징 적용 UNet++ 모델 사용 학습 후 mIoU가 70% 이하인 이미지들을 전수조사하여 데이터 클렌징 적용 이렇게 정제한 데이터셋을 Kfold를 적용(5개) Validation 성능 기준으로 좋은 모델과 데이터셋을 수집 efficientnetv2_rw_s 인코더를 적용한 UNet++에 TTA를 적용함.(TTA 뭐 했는진 모름)

1등 솔루션

GroupKfold를 적용(5개) Augmentation : random crop, ShiftScaleRotate, GridDistortion. 커스텀 Augmentation 적용 : 구름이 30% 이하인 영역에 다른 구름 이미지 추가 Test-Time Augmentation : Horizontal flip, Vertical flip 사용 모델

  1. UNet with tf_efficientnet_b1 backbone
  2. UNet with tf_efficientnetv2_b2 backbone(실제 제출 모델엔 적용 x)
  3. SegformerForSemanticSegmentation-B1 -> 구름이 있고 없고를 판별하기 위한 Global Attention model로, Swin과 같은 모델은 다른 크기의 이미지에 적용할 수 없지만 Segformer는 적용할 수 있어서 사용했다고 밝힘

Github Repository

TaehaKim-Kor commented 2 years ago

위성 레이더 사진으로부터 홍수 영역을 픽셀 단위로 찾는 문제

데이터 타입

  1. Sentinal - 1 Data 직교하는 파장을 2개를 지구에 쏘아 반사된 값을 dB단위로 측정한 데이터(이미지 참고)

  2. NASADEM 데이터 위성 사진 데이터

자카드 지수로 평가함.

3등 솔루션

전반적으로 일반화된 앙상블 모델을 생성하려고 노력함. (기존에 이런 유형의 대회를 참여할때 cross validation의 hold-out variance에 난항을 겪음.) (hold-out variance : 처음보는거긴 한데 맥락적으로는 dataset에서 임의로 test set을 나누면서 발생하는 variance를 말하는 듯) 5개의 fold를 생성 후 ensemble하였고 많은 augmentation을 먹임.

사용 모델 : UNet++(Pytorch Lightning)

Augmentation(Albumentation)은 아래의 순서로 적용 Randomcrop ShiftScaleRotate RandomSizedCrop 또는 PadifNeeded Transpose MaskDropout VerticalFlip HorizontalFlip RandomRotate90 MotionBlur 또는 MedianBlur 또는 Blur ElasticTransform 또는 GridDistortion 또는 RandomGridShuffle 또는 OpticalDistortion RandomBrightnessContrast Resize

2등 솔루션

  1. 3개의 fold로 나누어 학습시킨 후 Average로 Ensemble
  2. Sentinal-1 과 NASADEM에 각각 Clipping을 적용하여 입력
  3. Random Transformation으로 RandomRotate90, Horizontal flip, Vertical flip을 적용한 다음 이미지를 붙여서 새로운 이미지를 생성하여 데이터셋증강(Albumentation 활용)
  4. Unet구조에 학습시켰는데, 이 때 dice loss에서 분모를 제곱한 것을 사용함. 여길 참조했다고 함.

1등 솔루션

  1. 단일 Unet 모델을 학습
  2. 홍수는 수학적인 모델링으로 표현할 수 있는 것을 바탕으로, 이미지를 Tabular data로 변환하여 추론 시도
  3. 2번의 방법만으론 홍수가 발생한 모든 픽셀을 채우지 못해서, 1번 솔루션과 2번 솔루션을 엮어서 둘의 최대값을 반환하도록 설정
  4. NASADEM Evaluation band(이게 맞는지, 또 도움이 될지 확인 중)를 모델 추론 과정에 포함하였음.

    Reference

    NASADEM이 뭔지 이해할만한 자료?

Github Repository

TaehaKim-Kor commented 2 years ago

신장(콩팥) 구조를 해킹해보자!

데이터 타입

신장의 기능 조직을 디텍팅하는 분류기를 만들어야함. 냉동 신장 이미지와 포르말린으로 박제한 신장 이미지가 주어짐. Dice Efficient로 평가함.

1등 솔루션

사용모델 : Unet SeResNeXt101 + CBAM + Hypecolumns + deepsupervision 손실함수 : bce loss + lovasz-hinge loss(classification head에는 bce loss) Psuedo Labeling 적용 3등과 같이 Edge Effect를 피하기 위한 테크닉을 적용(중앙에 작은 부분만 사용했다는데..) -> 3등 솔루션 참조하면 됨.

3등 솔루션

5개의 fold로 구성 사용모델 : UNet구조에 Backbone을 ResNeXt50 and ResNeXt101(EfficientNet은 그닥이었나봄..) Augmentation은 빡세게 넣음

4등 솔루션

특이점 : Scientific Prize 수상 아마 보고서를 잘 써서 그런 듯 함.

내용이 너무 많아 요약하자면

  1. 사구체(glomerulus, 신장에 있는 구조) 데이터셋을 추가로 활용
  2. 모든 데이터셋(학습용, 테스트용)에 노이즈가 많이 존재하여 Robust한 모델 필요성을 체감(luminosity, contrast and blur issues) -> 이미지 아티팩트에도 강건하도록 mixup등과 같은 augmentation을 많이 넣어서 해결(5번)
  3. 건강한(healthy) 사구체와 아픈(unhealthy) 사구체를 구별하도록 함.(전체적으로 경화되어있는 사구체의 경우 annotation에서 제외되었다고 주최측이 밝혔는데, 이걸 무시하고 classification하는게 문제가 되었음)
  4. 사용모델은 EfficientNet을 encoder에 활용한 UNet구조에 FPN skip connection, bottleneck Transformer(receptive field확장)
  5. Augmentation도 색조 변환, blur, cutmix, mixup 위주로 넣었음.

전체적으로 배울 수 있는 것이 많은 솔루션은 4등 솔루션으로 생각됨.

TaehaKim-Kor commented 2 years ago

기흉 질환이 일어난 폐를 찾아보자!

데이터 타입

폐 X-ray 사진을 주고 병이 있는 부분을 segmentation

1등 솔루션 git repo

Segmentation Network를 학습시키긴 하는데, 조금 방법이 특이해서 참조할만함. 3가지 Threshold를 설정함.

손실 함수는 Binary Cross Entropy, Dice Loss, Focal Loss를 사용함. 단 초기에 Dice loss가 너무 커서(10배 정도) 다른 loss의 가중치를 2~4 정도 곱해줌

폐질환 이미지와 건강한이미지 사이의 sample ratio를 조절해가며 학습시킴. 코드를 정확히 보진 않았는데, 대충 보면 초기에는 폐질환이미지를 80%정도 넣었다가 점점 40%수준까지 줄이는 방법이었나봄.

전체적인 학습 과정은 아래와 같음.

  1. ImageNet이나 제공된 데이터셋을 저해상도(1024x1024->512x512)로 바꾸어 pretrained시켜준 네트워크를 큰 learning rate(1e-3\~1e-4)와 sample ratio(0.8)를 주고, lr scheduler는 ReduceLROnPlateau를 사용하여 10\~12 epoch 정도 학습시킴.
    • 초기 epoch에는 encoder freeze.
  2. 1번에서 잘 나온 모델을 적당한 learning rate(1e-5)와 sample ratio(0.6)를 주고, lr scheduler는 CosineAnnealingLR 나 CosineAnnealingWarmRestarts를 사용하여 학습시킴.
  3. 2에서 잘 나온 모델을 sample ratio만 0.4로 바꿔서 학습시킴
  4. 3에서 잘 나온 모델을 작은 learning rate(1e-5~1e-6)와 적당한 sample ratio(0.5)를 주고, lr scheduler는 그대로 하여 학습

잘 나온 model 3개를 뽑아서 checkpoint averaging을 함. TTA는 horizontal flip만 했음. 모델은 Unet구조를 쓴 듯

2등 솔루션

건강한 폐와 아닌 폐를 구분하는 classification과 어디인지를 조사하는 segmentation으로 나누어서 조사하였음.

Classification This part is used to classify whether an image in related with pneumothorax or not. Our model is a multi-task model based on unet with a branch for classifying. Data: all data Cls loss: BCE + focal loss Seg loss: BCE Augmentation: hflip, scale, rotate, bright, blur Backbone: seresnext 50, seresnext101, efficientnet-b3 Ensemble: stacking

Segmentation: There are two models used to segment, unet and deeplabv3. Data: data with pneumothorax Loss: dice loss Augmentation: same as classification Backbone: seresnext50, seresnext101, efficientnet-b3, efficientnet-b5 Ensemble: average

3등 솔루션

외부 데이터의 사용 : 품질은 좋지 않았는데, 그냥 쓰거나 psuedo labeling해서 씀 positive sample과 negative sample의 비율을 0.5로 일정하게 유지함 다른 팀과 다르게 classification 모델을 분리하지 않음. 앙상블 효과는 많이 못 봤다고 밝힘.(10개 중 3개 fold에서 m2모델이 더 높은 성적을 기록한 것 같음) 모델은 아래처럼 사용 My final models were 3 SE-Resnext50 models: m1:704x704 images with no pseudo m2:576x576 images with CheXpert Pseudo m3:576x576 images with CheXpert and NIH Pseudo Attention: CBAM Loss: Lovasz Loss No threshold search, just used 0.5 Optimizer: Adam with 0.0001 learning rate, no learning rate change during training Epochs: 15 EMA of model parameters after 6 epoch. Batch Size: 3 per GPU when trained on 576x576 images, so the batch size was 9 when using 3 1080Ti, no accumulations of batch-size, no Synch-BN was used. 2 per GPU on 704x704 images.

금메달 솔루션 모음