Home Custom augmentation class 정의해보기
Post
Cancel

Custom augmentation class 정의해보기

Data Augmentation

data augmentation 방법은 크게 “기하학 변환”과 “태스크 기반” 확장으로 나뉜다.


기하적 변환은 크기조절, 반전, 자르기, 회전, 이동, 윈도우 분할 등이 있다.

태스크 기반 확장은 데이터를 합성 시 분류에 대한 척도를 고려하여 학습을 수행한다. 물체 인식에 대해 자르기(crop)와 반전(filp), 자르기와 색 조절은 학습 데이터 확장에, 크기 변환과 다각도관점 변환 등이 있다.


이것들의 함수를 직접 정의해보고자 한다.

기본 image와 label 지정하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import wget
import torch
from PIL import Image
import numpy as np
import matplotlib.image as img
import matplotlib.pyplot as plt
import torchvision.transforms.functional as TF

!wget https://i.stack.imgur.com/LW5Fv.png -O dog.jpg
image = Image.open("dog.jpg")
image = np.array(image)

xmin, xmax = (1,2)

red_color = (255,0,0)

label = (1000,450)

drow = cv2.rectangle(image, (label[0]-550,label[1]-400),(label[0],label[1]),red_color,3)

image = Image.from_array(image)

plt.imshow(drow)
plt.show()


1. Resize

이미지를 resize 해줌과 동시에 label도 갱신해줘야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
def resize_img_label(image, label=(0.,0.), target_size = (256,256)):
  w_orig, h_orig = image.size
  w_target, h_target = target_size
  cx, cy = label
  image_new = TF.resize(image, target_size)
  label_new = cx/w_orig*w_target, cy/h_orig*h_target
  return image_new, label_new

image_new, label_new = resize_img_label(image,label)

plt.imshow(image_new)
plt.show()


2. horizontally Flip

1
2
3
4
5
6
7
8
9
10
11
12
def random_hflip(image, label):
  w, h = image.size
  x, y = label

  image = TF.hflip(image)
  label = w-x, y
  return image, label

image_new, label_new = random_hflip(image,label)

plt.imshow(image_new)
plt.show()


3. Vertically Flip

1
2
3
4
5
6
7
8
9
10
11
12
def random_vflip(image, label):
  w, h = image.size
  x, y = label

  image = TF.vflip(image)
  label = x, w-y
  return image, label

image_new, label_new = random_vflip(image,label)

plt.imshow(image_new)
plt.show()


4. Shift or translate image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def random_shift(image, label, max_translate=(0.2,0.2)):
  w,h = image.size
  max_t_w, max_t_h = max_translate
  cx, cy = label
  trans_coef = np.random.rand() * 2 - 1
  w_t = int(trans_coef * max_t_w * w)
  h_t = int(trans_coef * max_t_h * h)
  image = TF.affine(image, translate=(w_t, h_t), shear=0, angle=0, scale=1)
  label = cx + w_t, cy + h_t
  return image, label

image_new, label_new = random_shift(image,label)

plt.imshow(image_new)
plt.show() 

Reference

This post is licensed under CC BY 4.0 by the author.