또르르's 개발 Story

[Stage 1 - 08] No Augmentation 본문

[P Stage 1] Image Classification/프로젝트

[Stage 1 - 08] No Augmentation

또르르21 2021. 4. 8. 22:46

 1️⃣ Goal

 

  • [BaseLine 작성] (추가 : 3/29, 기간 : 3/29 ~ 3/29)

  • [Data Processing]

    - Face Recognition (추가 : 3/29, 기간 : 3/30 ~ 3/31)


    - Cross-validation 사용 (추가 : 3/29)

    -데이터 불균형 해소 / imbalanced Sampler, Focal Loss, OverSampling, Weighted loss (추가 : 3/30, 기간 : 4/1 ~ )

    - Data Augumentation (Affine, Gaussian 등) (추가 : 3/30, 추가 : 4/5 ~ 4/8)

    -
    Generator의 초당 Batch 처리량 측정 및 향상 (추가 : 3/30, 기간 : 3/31 ~ 3/31)

    - Cutmix 시도 (추가 : 4/1)

    - Repeated Agumentation (추가 : 4/1)

    - 
    validation data 사용 (추가 : 4/1, 기간 : 4/1 ~ 4/1)

  • [Model]

    - ResNet 152층 시도 (추가 : 3/29)

    - Efficient Net 시도 (추가 : 3/29, 기간 : 4/1 ~ 4/2)

    - YOLO 시도 (추가 : 3/31)

    - Pre-trained 모델에 Fine-tuning 하기 (추가 : 3/29, 기간 : 4/1 ~ 4/1)

    - Model의 초당 Batch 처리량 측정 및 향상 (추가 : 3/30)

    - dm_nfnet 시도 (추가 : 4/1, 기간 : 4/7 ~ 4/7 )

  • [Training]

    - 앙상블 시도 (추가 : 3/29, 기간 : 4/7 ~  )

    - Hyperparameter 변경 (추가 : 3/29, 기간 : 3/29 ~)

    - Learning Schedular 사용 (추가 : 3/29, 기간 : 4/1 ~ 4/7 )

    - Model의 초당 Batch 처리량 측정 (추가 : 3/30)

    - 좋은 위치에서 Checkpoint 만들기 (Adam으로 모든 minimum 찾고, SGD로 극소점 찾기) (추가 : 4/1, 새로운 baseline code)

    - Sex 분류 (1번 모델)  -> Age 분류 (2번 모델) -> Mask 분류 (3번 모델) // 모델 나누기 (추가 : 4/1, 기간 : 4/5 ~ 4/8 )

    - Crop image (mask 분류)와 일반 image(age, sex 등 분류) 둘 다 사용 (추가 : 4/1, 기간 : 4/5 ~4/5 )

    - batch size 작게 쓰면서, SGD 사용 (추가 : 4/2, 기간 : 4/8 ~ )

    - NNI (Auto ML) 사용 (추가 : 4/2, 기간 : 4/2 ~ 4/4)

  • [Deploy]

    - Python 모듈화 (추가 : 3/30, 새로운 baseline code)

 

 

 

2️⃣ Learning

없음.

 

3️⃣ Main Task

1) No Augmentation

Stage 1을 하면서 Augmentation을 사용하면 오히려 성능이 하락한다는 말이 많아서..

Data Processing 단계의 Center Crop, MTCNN Crop 모두 사용하지 않고 온전한 image를 input으로 넣었습니다.

 

 

1-1) 첫 번째 시도

 

  • batch_size:8
  • model:"ecaresnet50t"
  • criterion:"cross_entropy"
  • classification:"multi"
  • epoch : 14

 

 

효과가 있었고, test Accuracy 4% 정도, F1-score 0.05% 정도의 성능 향상이 있었습니다.

 

처음에는 image 뒤의 noise 때문에 걱정했지만, background의 noise들이 Robust 한 모델을 만들어주는 역할을 하는 것 같습니다.

 

 

1-2) 두 번째 시도

 

  • batch_size: 16
  • model:"Efficientnet_b4"
  • criterion:"cross_entropy"
  • classification:"multi"
  • epoch : 12

더 많은 epoch을 돌렸어야 하는데 제출 시간문제로 epoch을 12까지밖에 돌리지 못했습니다.

그래도 기존 test Accuracy 1% 정도, F1-score 0.01% 정도의 성능 향상이 있었습니다.

 

 

2) Soft voting Ensemble 

ecaresnet50t 모델과 Efficientnet_b4 모델의 soft label들을 모두 csv로 저장했습니다.

 

아래 사진은 ecaresnet50t의 inference soft label입니다.

 

아래 사진은 Efficient-net b4의 inference soft label입니다.

 

이 두 개의 csv를 soft voting 방식으로 앙상블 해서 사용합니다.

MULTI_LABEL_CLASSES = 18

_multi_list = [								# 앙상블하고 싶은 파일 path

       '/content/submission12_0.8927_0.2882_soft.csv',
       
       '/content/submission14_0.9006_0.2756_soft.csv'
       
]


multi = []

for idx, path in enumerate(_multi_list):

    multi.append(pd.read_csv(path))
    


label_names = {}

for idx in range(MULTI_LABEL_CLASSES):

    label_names[str(idx)] = 0
    

for idx in range(len(_multi_list)):					# index들의 값들을 label별로 더함

    for label_idx in range(len(label_names)):
    
        label_names[str(label_idx)] += multi[idx][str(label_idx)]
        

label_names = {key : value/len(_multi_list) for key, value in label_names.items()}		# list의 개수로 나눠줌 (평균을 구하는 과정)


ensemble_multi = pd.DataFrame.from_dict(label_names)		# dict을 dataframe으로 변경


ensemble_multi['ans'] = ensemble_multi[[str(idx) for idx in range(MULTI_LABEL_CLASSES)]].idxmax(axis=1)		# idxmax (argmax 함수)를 통해 가장 max값의 indx를 구함


ensemble_multi.insert(0, 'ImageID', multi[0]['ImageID'])		# ImageID를 dataframe 맨 앞에 추가

 

출력해보면 다음과 같이 출력됩니다.

>>> ensemble_multi

 

Soft voting을 사용하니 (첫 번째 시도 기준) test Accuracy 0.5% 정도, F1-score 0.01% 정도의 성능이 올랐습니다.

 

4️⃣ Sub Task

1) Dictionary to dataframe

Dictionary를 pandas dataframe으로 변경하는 방법은 아주 간단합니다.

 

label_names는 Key : label 번호, Values : Series 형태의 값들로 구성되어있습니다.

ensemble_multi = pd.DataFrame.from_dict(label_names)		# dict을 dataframe으로 변경

 

 

5️⃣ Evaluation

 

Data processing Model Training Time Accuracy F1
3/29   -
ResNet-50
-
-
Hyperparmeter
설정
-
7h 32m 61.87% 0.52%
3/31 -
Face Recognition
-
    36m 65.05% 0.56%
4/1   -
(pre-trained)
Efficient-Net-b6
-
-
epoch : 20,
batch size : 128
-
1h 35m 73.67% 0.66%
4/1   -
(pre-trained)
Efficient-Net-b7
-
-
epoch : 20,
batch size : 100
-
1h 31m 73.25% 0.66%
4/1     -
learning scheduler : 
CosineAnnealingLR
-
epoch : 21
-
1h 41m 68.49% 0.60%
4/2 -
 imbalanced-dataset-sampler
-
  -
learning scheduler X
-
epoch : 26
-
1h 39m 72.38% 0.64%
4/2     -
loss :
Focal loss 
(γ = 2)
-
epoch : 16
-
1h 29m 74.43% 0.68%
4/8    -
(pre-trained)
Efficient-net b6
Efficient-net b4
ecaresnet50t
seresnet152d
-
-
Ensemble
(Soft voting)
-
17h 24m 74.46% 0.68%
4/8 -
No Augmentation
-
-
(pre-trained)
ecaresnet50t
-
-
batch size : 8
epoch : 15
-
1h 47m 78.9841% 0.7389%
4/8   -
(pre-trained)
Efficient-net b4
-
-
batch size : 16
epoch : 12
-
1h 36m 75.6190% 0.6919%
4/8   -
(pre-trained)
ecaresnet50t

Efficient-net b4
-
-
Ensemble
(Soft voting)
-
  79.4921% 0.7404%

 

* F1 Score



1) NoAugmentation

  • 이미지 MTCNN을 사용해서 face만 crop 해서 사용한 경우, 성능에 한계가 있었습니다. ( Test accuracy가 74%를 넘지 못합니다.)

  • 따라서 CenterCrop이나 MTCNN crop을 사용하지 않은 원본 사진을 그대로 사용했습니다.

  • 다른 캠퍼님들의 토론 게시판을 보니 다른 agumentation들은 성능 향상이 거의 없었다고 해서 Augmentation을 사용하지 않은 이유도 있습니다.

  • 결론적으론 성능 향상으로 이어졌습니다.

 

 

2) Ensemble

  • 이번 앙상블은 18개의 label을 뽑아내는 Multi Label 2개를 섞어서 사용했습니다.

    - model : ecaresnet50t / batch size : 8 / loss : cross_entropy / lr : 0.01 (10 epoch 당 1/10)

    - model : Efficientnet_b4 / batch size : 16 / loss : cross_entropy / lr : 0.01 (10 epoch 당 1/10)
Comments