-
Annotation data efficient learningCS 공부/AI 2023. 3. 28. 20:41
Data augmentation
카메라로 찍은 사진들(편향됨) ≠ 실제 데이터
- 편향된 데이터가 문제인 이유?
- 만약에 밝은 데이터로만 훈련을 시킨다면 테스트 이미지로 어두운 사진이 주어졌을 때 모델은 헷갈림,,~
- 데이터셋이 실제 데이터 분포를 대표하지는 않는다
∴
따라서
train 데이터와 실제 데이터 분포와의 gap을 줄이기 위해 사용
하는 것이 data augmentation
Data augmentation 종류
- Brightness (밝기) 조절
def brightness_augmentation(img): img[:,:,0]=img[:,:,0] + 100 # R값에 +100 img[:,:,1]=img[:,:,1] + 100 # G값에 +100 img[:,:,2]=img[:,:,2] + 100 # B값에 +100 img[:,:,0][img[:,:,0]>255] = 255 # R값 255 이상으로 자름 img[:,:,1][img[:,:,1]>255] = 255 # G값 255 이상으로 자름 img[:,:,2][img[:,:,2]>255] = 255 # B값 255 이상으로 자름
- Rotate, flip (회전, 반전)
img_rotated = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) img_flipped = cv2.rotate(img, cv.ROTAT_180)
- Crop (이미지 자르기)
x_start=300 # 자르기 시작할 x pixel 좌표 y_start=500 # 자르기 시작할 y pixel 좌표 crop_x_size=800 # 잘린 이미지의 너비 crop_y_size=400 # 잘린 이미지의 높이 img_cropped=image[y_start: y_start+crop_y_size, x_start : x_start+crop_x_size,:]
- Affine transform (선, 길이 비율, 평행도는 유지하면서 바꾸는 것) ex. 직사각형 -> 평행사변형
rows, cols, ch =image.shape pt1=np.float32([[50,50],[200,50],[50,200]]) # pt1 점 세개가 pt2=np.float32([[100,100],[200,50],[100,250]]) # pt2 점 세개로 이동했으면 좋겠다 M=cv2.getAffineTransform(pt1,pt2) # pt1을 pt2로 transform shear_img=cv2.warpAffine(image,M,(cols,rows))
- CutMix (사진 여러개 잘라 붙이기)
- ex) x1,y1=[1,0] / x2,y2=[0,1]
- xnew, ynew=[0.7,0.3]
- RandAugment
- 다양한 조합으로 augmentation을 진행한 뒤 최적의 augmentation 시퀀스를 자동으로 찾아줌
- 파라미터 2개 (어떤 augmentation 적용할지, 어느 정도 적용할지)
- Policy=적용할 N개의 augmentation, 결국은 best policy 찾기!
pre-trained 정보 활용하기
Transfer learning
- 직접 data를 annotating하는 것은 많은 노력이 필요하고 비싸다,,,
- 적은 데이터셋으로도 좋은 성능을 낼 수 있는 획기적인 방법
- 방법1: pre-trained 모델을 새로운 task에 붙이기
- pre-trained 모델의 마지막 계층을 잘라내고, 새 FC 계층을 추가한 후 다시 train
- Convolution layers는 freeze 되어있기 때문에 모든 지식이 보존됨
- 방법2: 모델 전체 fine-tuning (추천!)
- pretrained 모델의 마지막 계층을 잘라내고, 새 FC 계층을 추가 (동일)
- convolution layers도 learning rate를 낮게 잡아서 같이 학습시킴 (FC는 lr 높게)
Knowledge distillation
- 큰 모델에서 작은 모델로 지식을 전달
teacher: pretrained 모델, student: not trained 모델 - 같은 input 정보를 teacher, student 모델에 똑같이 학습시킨 뒤 둘의 출력을 KL-divergence를 측정
- Soft label: 주로 모델의 출력 값에서 얻음. 모델이 입력에 대해서 어떻게 추측하는지 나타냄
- value 값들 간의 차이를 smooth하게 만들어줌
- teacher 모델과 student 모델과 같게 만들어줌
- Distillation loss
- Teacher network 와 Student network 의 분류결과의 차이를 Loss 에 포함
- KL-div 사용 (soft label, soft prediction)
- teacher 네트워크 모방
- Student loss
- Student network와 실제 label의 분류결과 차이를 Loss에 포함
- Cross Entropy 사용 (hard label, soft prediction)
- 정답을 학습
- Distillation loss와 student loss의 weighted sum 구함
- Hard label (one-hot 벡터): 주로 데이터셋에서 얻음, class가 맞는지 아닌지 나타냄 (0 또는 1)
unlabeled datset 활용하기
Semi-supervised learning
- 데이터 중 일부만 라벨링 되어있음
- Unsupervised (no label) + Fully supervised (fully labeled)
- labeled 데이터를 학습시킴
- pre-trained 모델을 사용하여 unlabeled 데이터를 예측함 (psudo-labeled data가 됨)
- 두개의 데이터셋을 합쳐서 다시 train 시킴
Self-training
- Augmentation + Teacher-Student networks + semi-supervised learning
- teacher모델(labeled 데이터)을 학습시킴
- pre-trained 모델을 사용하여 unlabeled 데이터를 예측함
- 두개의 데이터셋을 합쳐서 RandAugment 추가해서 다시 train시킴 (Student model)
- 학습이 끝나면 teacher 모델을 제거하고 Student 모델을 teacher 모델로 바꿈. 새로운 student 모델 사용
- 1~4 두세번 반복 (student 모델이 점점 커짐)
'CS 공부 > AI' 카테고리의 다른 글
Semantic segmantation 모델: FCN, U-Net, DeepLab (0) 2023.03.30 GoogleNet, ResNet (0) 2023.03.28 AlexNet과 VGGNet (feat. CNN) (0) 2023.03.28 Latent variable model (GAN, Diffusion model) (0) 2023.03.24 Auto-regressive model (0) 2023.03.23 - 편향된 데이터가 문제인 이유?