ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Annotation data efficient learning
    CS 공부/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)
    1. labeled 데이터를 학습시킴
    2. pre-trained 모델을 사용하여 unlabeled 데이터를 예측함 (psudo-labeled data가 됨)
    3. 두개의 데이터셋을 합쳐서 다시 train 시킴

     

    Self-training

    • Augmentation + Teacher-Student networks + semi-supervised learning
    1. teacher모델(labeled 데이터)을 학습시킴
    2. pre-trained 모델을 사용하여 unlabeled 데이터를 예측함
    3. 두개의 데이터셋을 합쳐서 RandAugment 추가해서 다시 train시킴 (Student model)
    4. 학습이 끝나면 teacher 모델을 제거하고 Student 모델을 teacher 모델로 바꿈. 새로운 student 모델 사용
    5. 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
Designed by Tistory.