부스트캠프 AI Tech 2기/2기 CV P-Stage-Semantic Segmentation

Semantic Segmentation 대회에서 사용하는 방법들 1

모플로 2021. 10. 20. 13:41
반응형

1. EfficientUnet baseline

1.1 model불러오기

1) Segmentation Models라는 Library를 사용

- 많은 형태의 Encoder, Decoder Network를 제공

1.2 학습시키기

사용방법

    - encoder name에 따라 encoder weights를 사용하지 못하는 것들도있다.

2. baseline 이후에 실험 해봐야할 사항들

2.1 주의해야할 사항들

1) 디버깅모드

- 샘플링을 통해서 데이터셋의 일부분만 추출하여 실험

- epoch를 1~2정도 설정하여 loss가 감소하는지 확인

 

2) 시드 고정

- torch 외 numpy, os 관련 시드 고정

- validation 검증셋의 시드 고정

 

3) 실험 기록

- Network 종류, Augmentation 방법, Hyperparameter 등 성능에 영향을 주는 조건을 바꿔가며 실험을 진행

- 노션, 구글 스프레드시트 등 사용

 

4) 실험은 한번에 하나씩

- 실험을 할 때에는 하나의 조건만을 변경해가며 실험

- Augmentation과 Network종류를 동시에 변경하면안됨

 

5) 팀원별 역할분배

• 하나의 베이스라인 코드를 기반으로 가장 좋은 솔루션을 만들기?

    • 같은 코드에 실험을 서로 중복되지 않게 진행 !

• 독립적으로 베이스라인 코드를 만들어서 마지막에 앙상블?

• EDA / 코드 만들기 / 솔루션 조사 / 디스커션 조사 등 역할을 분배할 지?

-> 솔루션, 디스커션조사는 한사람이 해서 공유

 

각 모델에 맞는 optimizer가 존재할텐데 어떤 baseline코드에서는 효과적일텐데 다른곳에서는 효과적이 아닐 수 있다.

 

2.2 Validation

- 제출을 하지 않아도 모델의 성능을 평가할 수 있다.

- public 리더보드의 성능에 오버피팅 되지 않도록 도와준다

 

1) Hold Out

- 전체 데이터를 8:2로 분리해서 validation을 사용

- 빠른 속도로 모델 검증이 가능

- 20%의 valid data는 학습에 사용할 수 없음

 

2) k-fold

- train-valid를 동일하게 분리하지만 모든 데이터에 대해서 validation을 만든다

- ex) 5개로 나온 모델을 앙상블하여 결과를 예측한다 

- 이렇게 사용되면 모든 training 데이터에 대해 고려했다고 볼 수 있다.

- 하지만 K배의 속도만큼 오래걸린다

 

3) Stratified K-fold

- 기존 fold는 class의 비율을 고려하지 않았지만 이 방법은 class를 균형있게 split한다

 

4) Group K-fold

 

2.3 Augmentation

- 데이터 수를 증가

- 일반성강화

- 성능향상

- class imbalance 해결

- Albumentation을 자주 사용함

 

- Augmentation은 도메인에 맞게끔 적용해야한다

ex) 아무때나 flip을 하면 안된다

 

1) Cutout

A.CoarseDropout( max_holes=8, min_holes=4, max_height=20, min_height=8, max_width=20, min_width=8, p=1.0)

- 위의 코드로 하더라도 원하는데로 잘 가려주지 않는다.

 

2) Gridmask

- 위의 이미지처럼 object를 제대로 가리지 않기 때문에 이를 해결해주기 위해 나온 기법

A.GridDropout(holes_number_x=4, holes_number_y=4, p=1.0)

3) Mixup

4) Cutmix

5) SnapMix

- CAM(Class Activation Map)을 이용해 이미지 및 라벨을 mixing하는 방법

- 영역 크기만을 고려해 라벨을 생성했던 CutMix와 달리 영역의 의미적 중요도를 고려해 라벨을 생성

6) CropNonEmptyMaskIfExists

- object가 존재하는 부분을 중심으로 crop 할 수 있다면 model의 학습을 효율적으로 할 수 있음

A.augmentations.crops.transforms.CropNonEmptyMaskIfExists(height=256,width=256)

 

2.4 SOTAModel

1) HRNet

- 최근 segmentation에서 좋은 성능을 냄

2.5 Scheduler

constant learningrate는 발산 혹은 local minima에 빠질 수 있음

그래서 scheduler를 사용하여 빠른속도, 높은정확도를 갖는 lr을 사용해야한다

 

1) CosineAnnealingLR

- Learning rate의 최대값과 최소값을 정해, 그 범위의 학습율을 Cosine 함수를 이용해 스케줄링하는 방법

- 최대값과 최소값 사이에서 learning rate를 급격히 증가시켰다가, 감소시키기 때문에 saddle point, 정체 구간을 빠르게 벗어나게 함

2) ReduceLROnPlateau

- metric의 성능이 향상되지 않을 때 learning rate를 조절하는 방법

- Local minima에 빠졌을 때 learning rate를 조절하여 , 효과적으로 빠져나옴

 

3) GradualWarmup

학습을 시작할 때 매우 작은 learning rate로 출발해서 특정 값에 도달할 때까지 learning rate를 서서히 증가시키는 방법 • 이 방식을 사용하면 weight가 불안정한 초반에도 비교적 안정적으로 학습을 수행할 수 있음

• backbone 네트워크 사용시에 weight가 망가지는 것을 방지

 

2.6 HyperparameterTuning

1) GradientAccumulation

모델의 weight를 매 step 마다 업데이트하지 않고, 일정 step 동안 gradient를 누적한 다음 누적된 gradient를 사용해 weight를 업데이트하는 방법

• 배치 사이즈를 키우는 장점이 있음

2.7 Optimizer/Loss

Optimizer

1. Adam

2. AdamW

3. AdamP

4. Radam

5. Lookahead optimizer

- Adam이나 SGD를 통해 k번 업데이트 후, 처음 시작했던 point 방향으로 1 step back 후, 그 지점에서 다시 k번 업데이트를 시작하는 방법

- Adam이나 SGD로는 빠져나오기 힘든 Local minima를 빠져나올 수 있게 한다는 장점Loss

 

Loss

- segmentation에서 cross entropy뿐 아니라 여러 loss가 존재하고 hybrid loss로 여러개의 loss를 합쳐서 사용하기도한다

반응형