1. 모델 성능 높이는 방법

- 데이터
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 -> 학습에 적절한 크기
- Min, Max, Mean 등
- Ex 03 ) Class 분포 시각화
- Ex 04 ) 이미지당 포함된 object 개수 또는 object 종류의 수 시각화
- Ex 05 ) 이미지에 동시에 등장하는 class 간 상관관계
- EDA (탐색적 데이터 분석)은 데이터를 다양한 각도에서 살펴봄
- 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)
- AutoAugmentPolicy.IMAGENET
- Cropping
- 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)
- Input 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향상

- Cutout
- Pseudo Labeling
Semi-supervised learning의 한 형태, label이 없는 데이터에 가짜 label(pseudo label)을 부여하여 학습에 활용- 부족한 학습 데이터에 양을 늘려 모델 성능 향상
- 다양한 데이터를 학습에 활용함으로써 모델이 보다 일반화된 특성 학습

- 1. 주어진 training data로 모델 학습

- 2. 학습된 모델로 예측하여 pseudo label 생성
- 모델의 prediction이 높은 confidence score를 가지는 sample만 선택하는 방법

- 3. 모델 재학습
- A) 원래 데이터와 새로 생성한 데이터를 모두 사용하여 scratch로부터 재학습
- B) 새로 생성한 데이터로만 finetuning

- Torchvision
- 데이터 증가
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 |