Upstage AI Lab/AI 심화학습 : CV

[14] CV 모델 성능 높이기

Visioneer 2024. 2. 6. 14:04

1. 모델 성능 높이는 방법

출처 : Upstage CV 모델 성능 높이기 7page

  • 데이터
    Vision 데이터는 전처리 및 가공 방법이 특히 중요한 분야
    • 복잡한 Semantic 정보와 다양한 object들을 동시에 담고 있음
    • 실세계 데이터는 noise가 많이 포함 되어 있음

  • 모델 

    학습 목표와 데이터, GPU 환경에 따라 적절한 모델 구조와 학습 전략을 선택해야함
    • Ex 01 ) Task 마다 다른 모델 구조
    • Ex 02 ) 데이터 양에 따른 transformer-based, CNN-based model 선택
      • 일반적으로 데이터 적을 때, CNN-based model 유리함
    • Ex 03 ) Overfitting 방지를 위한 학습 scheduling 방법 조절 (Ir, scheduler, steps, epochs, ~ )

  • 학습, 추론, 평가
    특정 task에서 좋은 성능을 내는 모델 구조를 사용하더라도, 학습 후 평가 단계에서 최적의 성능이 나오지 않을 수 있음
    • 데이터 특성 (클래스 불균형, object 크기)이 충분히 고려되지 않은 데이터 전처리
    • 적절하지 않은 모델, 또는 모델에 최적화되지 않은 학습 전략
  • ☆ 학습, 추론, 평가 ☆ 결과를 통해 "1. EDA " or "2. 모델 파라미터 튜닝" 단계로 유동적으로 반복될 수 있음.

2. 데이터

  • EDA (Exploratory Data Analysis) 
    • EDA (탐색적 데이터 분석)은 데이터를 다양한 각도에서 살펴봄
      • 시각화 및 통계 분석을 통해 데이터 구조, 패턴, 이상치 등을 먼저 파악해보는 과정
        -> EDA를 통해 이미지에서 보이는 문제들을 처리하는 방법에 대한 가설을 내리는 것이 매우 중요
            -> class의 imbalance가 심하다. validation 전략에서 imbalance를 다룰 수 있는 validation  전략을 사용해야겠다.
            -> 문제정의 과정에서 imbalance를 다룰 수 있는 평가 지표들을  도입. ex) F1 score. 
    • EDA in CV
      • 이미지 및 object의 분포 파악
      • 이미지의 다양성 확인
        어두운지, 밝은지 등
      • 이상치 및 noise 종류 확인

      • Ex 01 ) Image와 annotation 시각화를 통해 대략적인 데이터 파악
        • 다양한 형태의 object가 등장하는지
        • Occlusion이 많은 데이터 인지
        • 각 이미지의 noise 정도가 대략 어느 정도 인지
          gaussian blurring

      • Ex 02 ) 이미지 또는 object의 width, height 분포 시각화
        • Min, Max, Mean 등 
          Min Max -> 학습에 적절한 크기 

      • Ex 03 ) Class 분포 시각화 

      • Ex 04 ) 이미지당 포함된 object 개수 또는 object 종류의 수 시각화

      •  Ex 05 ) 이미지에 동시에 등장하는 class 간 상관관계

  • Augmentation
    EDA를 기반으로 적절한 augmentation 기법 선정 및 학습 과정에 적용
    • 데이터 증가
      샘플 개수 및 다양성을 추가하여 overfitting을 방지하고 generalization 능력 향상

    • Robustness 향상
      실제 세계에서 데이터의 다양성에 맞춰 모델의 robustness 향상

    • Imbalance 보정
      데이터셋 특성에 따라 다양한 imbalance 문제를 완화하고 모델 성능 향상  

    • Vision 데이터에 쉽게 augmentation을 적용할 수 있는 library 소개 
      • Torchvision
        torchvision.transforms에서 이미지의 기본적인 전처리와 augmentation 함수 제공

        • Cropping
          이미지의 특정 부분 잘라내기 (CenterCrop, RandomCrop, ~ )
        • Color
          밝기, 대비, 채도, 색조 변형 (ColorJitter, Grayscale, ~ )
        • Matrix Transformation
          기하학적 형태 변형 (RandomHorizontal Flip, RandomRotation, ~ )
        • Blur
          흐리게 만들기 (GaussianBlur, ~ )

          import torchvision.transforms as transforms
          
          preprocessing_pipeline = transforms.Compose([
              transforms.RandomCrop(size=(200,200)),
              transforms.ColorJitter(brightness=0.5, contrast= 0.5, saturation=0.5,hue=0.5),
              transforms.RandomRotation(degree=45),
              transforms.GaussianBlur(kernel_size=5),
              transforms.ToTensor(),
              transforms.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])
          ])​​
        • AutoAugment
          미리 정의된 augmentation 레시피
          • AutoAugmentPolicy.IMAGENET 
            ImageNet 데이터에 대한 최적의 augmentation
          • AutoAugmentPolicy.CIFAR10
            cifar-10 데이터에 대한 최적의 augmentation
            transform = transfomrs.AutoAugment(transforms.AutoAugmentPolicy.IMAGENET)
            
            augmented_image = transform(image)​
      • Albumentations
        Object detection, segmentation, keypoint detection 등 다양한 task에 적용 가능한 multi-task augmentation 지원
        • 여러 타입의 annotation에 일관된 augmentation을 적용한 가능한 library
        • Torchvision에 비해 더 다양한 종류의 변환을 제공
        • Numpy 배열을 직접 처리하여 torchvision에 비해 더 빠른 속도
          # https://lcyking.tistory.com/80
          # https://hoya012.github.io/blog/albumentation_tutorial/
          
          import albumentations as A
          
          # p 함수가 적용될 확률
          transform = A.Compose([
              # 좌우 반전
              A.HorizontalFlip(p=0.5), 
              # 상하 반전
              A.VerticalFlip(p=0.5), 
              # 수평,수직 또는 수평 및 수직으로 뒤집는다.
              A.Flip(always_apply=False, p=0.5)
              
              # 행과 열의 입력을 바꿈
              A.Transpose(always_apply=False, p=0.5)
              
              #  -90 ~ 90도 사이로 돌림, 남은 공간은 주변 환경으로 채움 (cv2.BORDER_CONSTAN, cv2.BORDER_REFLECT, cv2.BORDER_REFLECT_101, cv2.BORDER_WRAP)
              A.Rotate(limit=90, p=1, border_mode=cv2.BORDER_REPLICATE), 
              # 원본사이즈를 변경 하면서 90, 180, 270, 360도 돌림
              A.RandomRotate90(p=1), 
              
              # shift, scale, rotate를 한번에 적용
              A.ShiftScaleRotate(shift_limit=0.4, scale_limit=(0.5, 0.9), rotate_limit=90, p=1, border_mode=cv2.BORDER_REPLICATE),
              # scale만 적용한 경우 (이미지 확대)
              A.ShiftScaleRotate(shift_limit=0, scale_limit=(0.5, 0.9), rotate_limit=0, p=1),
              # shift만 적용한 경우 (height, width)
              A.ShiftScaleRotate(shift_limit=(0.4, 0.5), scale_limit=0, rotate_limit=0, p=1,  border_mode=cv2.BORDER_REPLICATE),
              # Crop은 원본 이미지의 특정 영역을 잘라낸 후, 잘라낸 사이즈를 반환
              A.Crop(x_min=500, y_min=300, x_max=1000, y_max=800, p=1),
              # 이미지의 중심을 기준으로 입력된 height, width값 만큼의 영역을 잘라낸 후, 잘라낸 사이즈를 반환(반드시 Resize 해주어야함)
              A.CenterCrop(width=500, height=300, p=1),
              A.Resize(1370, 2000),
              
              # 밝기와 대비 변경 (대비를 올리면 어두운색은 더 어둡게, 밝은색은 더 밝게)
              A.RandomBrightnessContrast(brightness_limit=(-0.3, 0.3), contrast_limit=(-0.3, 0.3), p=1),
              # 밝기만 변경
              A.RandomBrightnessContrast(brightness_limit=(-0.8, 0.8), contrast_limit=0, p=1),
              # 대비만 변경
              A.RandomBrightnessContrast(brightness_limit=0, contrast_limit=(-0.8, 0.8), p=1),
              # 색상 채도 명도 변경, default(hue_shift_limit=(-20, 20), sat_shift_limit=(-30, 30), val_shift_limit=(-20, 20))
              A.HueSaturationValue(p=1),
              
              #RGB 값 각각 범위내 임의로 변경 default(r_shift_limit=(-20, 20), g_shift_limit=(-20, 20), b_shift_limit=(-20, 20))
              A.RGBShift(p=1),
              #RGB Channel을 랜덤하게 섞음
              A.ChannelShuffle(p=1),
              
              #가우시안 노이즈 분포를 가지는 노이즈를 추가
              A.GaussNoise(p=1, var_limit=(100, 200)),
              # 가우시안 필터 적용
              A.GaussianBlur( blur_limit = 7 , always_apply = False , p = 0.5 )
              # 글래스 필터 사용
              A.GlassBlur( sigma = 0.7 , max_delta = 4 , iterations = 2 , always_apply = False , mode = 'fast' , p = 0.5 )
              #정사각형 노이즈 추가
              A.Cutout(p=1, num_holes=8, max_h_size=24, max_w_size=24),
              
              # blur_limit가 클수록 더 흐림
              A.Blur(p=1, blur_limit=(50, 60)),
              
              # Random으로 이미지 resize 후 crop
              A.RandomResizedCrop(height=200, width=200, p=0.5),
              A.Normalize(mean=(0.485,0.456,0.406),std=(0.229,0.224,0.225)),
          ])
          
          transformed_image = transform(image=image)​
        • Object detection의 annotation에 일관된 augmentation이 적용된 경우
      • Augraphy
        Document 이미지에 특화된 다양한 augmentation을 제공하는 library
        출처 : https://github.com/sparkfish/augraphy

        • Input Image를 입력
          • Ink pahse (텍스트)
          • paper phase (배경, 종이)
        • Ink와 papaer 각각에 대해 별도의 augmentation 적용
        • 분리된 phase를 다시 합쳐서 post phase 생성
        • Post phase에 최종 augmentation 적용
          출처 : https://github.com/sparkfish/augraphy
        • Ink phase, paper phase, post phase 각각에 적용할 augmentation 지정하여 pipeline 생성

          from augraphy import *
          
          ink_phase = [DirtyDrum()]
          paper_phase = [ColorPaper()]
          post_phase = [BleedThrough()]
          
          pipeline = AugraphyPipe(ink_phase=ink_phase, paper_phase=paper_phase, post_phase=post_phase)
          
          image_augmented = pipeline(image)​
      • Further Augmentation
        • Cutout
          이미지 일부분을 특정 값으로 마스킹하는 방법
          • 모델이 이미지의 일부분에만 의존하지 않고, 전체 맥락을 학습하도록 도와 generalization 능력 향상
          • Task에 따라 이미지 내의 object 개수, object scale 등을 고려해야함 
        • Mixup
          서로 다른 label을 가지는 두 이미지와 해당하는 label을 선형적으로 결합하여 새로운 데이터를 생성하는 방법
          • 데이터에 다양성을 제공하며, 입력 데이터의 변화 및 noise에 덜 민감하도록 하여 모델의 robustness 향상
          • Label smoothing 효과를 통해 generalization 성능 향상 
        • Cutmix
          두 이미지에서 임의의 부분을 잘라내고 이를 교차하여 결합함. 새로운 데이터를 생성하는 방법.
          • label도 같은 비율로 혼합
          • 데이터에서 다양성을 제공하며, 입력 데이터의 변화 및 noise에 덜 민감하도록 하여 모델의 robustness 향상
          • label smoothing 효과를 통해 generalization 성능 향상
        • Copy&Paste
          한 이미지에서 객체를 잘라내어 다른 이미지에 붙여넣음. 새로운 데이터를 생성.
          • Detection 및 segmentation에서 annotation과 함께 copy&paste
          • 같은 객체에 대한 위치와 형태에 다양성 제공
          • 입력 데이터의 변화 및 noise에 덜 민감하도록 모델의 robustness향상
      •  Pseudo Labeling
        Semi-supervised learning의 한 형태, label이 없는 데이터에 가짜 label(pseudo label)을 부여하여 학습에 활용
        • 부족한 학습 데이터에 양을 늘려 모델 성능 향상
        • 다양한 데이터를 학습에 활용함으로써 모델이 보다 일반화된 특성 학습
        • 1. 주어진 training data로 모델 학습
        • 2. 학습된 모델로 예측하여 pseudo label 생성
        • 모델의 prediction이 높은 confidence score를 가지는 sample만 선택하는 방법
        • 3. 모델 재학습
          • A) 원래 데이터와 새로 생성한 데이터를 모두 사용하여 scratch로부터 재학습
          • B) 새로 생성한 데이터로만 finetuning

3. 모델

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Upstage AI Lab > AI 심화학습 : CV' 카테고리의 다른 글

[3-1] CV 모델 구조 이해  (0) 2024.02.01
[2-2] 고전 컴퓨터 비전 심화  (0) 2024.01.31
[2-1] 고전 컴퓨터 비전  (0) 2024.01.31
[1] Computer Vision 이란?  (0) 2024.01.31