함께하는 데이터 분석

[Python] IMAGE(2D data) AUGMENTATION 본문

학회 세션/비어플

[Python] IMAGE(2D data) AUGMENTATION

JEONGHEON 2022. 3. 24. 17:17

안녕하세요!

 

오늘은 이미지 증강(Image Augmentation)을

 

python을 통해 구현해보겠습니다.

 

Image Augmentation은 몇 개의 이미지를 활용하여

 

이미지에 여러 가지 변화를 주어 데이터의 양을 증가시키는 것입니다.

 

장점은 데이터 다양성 향상과 모델 성능 향상 등이 있습니다.

 

그렇다면 python에서 살펴볼까요?

 

라이브러리 불러오기

import numpy as np
from matplotlib.pyplot import imshow, subplots, title
from PIL import Image
from torchvision import transforms
import albumentations
import random

 

이미지 불러오고 그리기

img = Image.open('경로/image1.jpg')
imgArray = np.array(img) # 이미지 분석을 위해 배열 전환
imgArray.shape
>>> (400, 400, 3)
imshow(Image.fromarray(imgArray))

 

이미지 증강

fig, ax = subplots(2, 2, figsize=(9, 9))

loader_transform1 = transforms.ColorJitter(brightness=2)
loader_transform2 = transforms.ColorJitter(contrast=2)
loader_transform3 = transforms.ColorJitter(saturation=2)
loader_transform4 = transforms.ColorJitter(hue=0.3)

img_aug1 = loader_transform1(img)
img_aug2 = loader_transform2(img)
img_aug3 = loader_transform3(img)
img_aug4 = loader_transform4(img)

ax[0, 0].imshow(img_aug1)
ax[0, 1].imshow(img_aug2)
ax[1, 0].imshow(img_aug3)
ax[1, 1].imshow(img_aug4)

torchvision을 이용하여 밝기, 대비, 채도, 색상을 조절하여

 

4개의 이미지를 생성했습니다.

 

transform1 = albumentations.HorizontalFlip(p=0.5)
imshow(transform1(image=imgArray)['image'])

1/2의 확률로 좌우반전을 해준 이미지입니다.

 

transform2 = albumentations.ShiftScaleRotate(p=0.5)
imshow(transform2(image=imgArray)['image'])

1/2 확률로 돌리거나 이동해준 이미지입니다.

 

fig, ax = subplots(6, 6, figsize=(12, 12))

transform1 = albumentations.HorizontalFlip(p=0.5)
transform2 = albumentations.ShiftScaleRotate(p=0.5)

loader_transform = transforms.ColorJitter(brightness=2, contrast=2, saturation=2, hue=0.2)

for i in range(6):
    for j in range(6):
        newimg = transform1(image=imgArray)['image']
        newimg = transform2(image=newimg)['image']
        newimg = loader_transform(Image.fromarray(newimg))

        ax[i, j].imshow(newimg)

 

Random erase

fig, ax = subplots(3, 3, figsize=(12, 12))

for i in range(3):
    for j in range(3):

        imgArray_aug = np.array(Image.open("경로/image1.jpg"))

        indx1 = random.sample(range(400),2)
        indx2 = random.sample(range(400),2)

        length = (np.max(indx1)-np.min(indx1))*(np.max(indx2)-np.min(indx2))*3

        imgArray_aug[np.min(indx1):np.max(indx1), np.min(indx2):np.max(indx2), range(3)] = np.random.choice(256, length, replace=True).reshape(((np.max(indx1)-np.min(indx1)),(np.max(indx2)-np.min(indx2)),3))
        ax[i, j].imshow(Image.fromarray(imgArray_aug))

 

Mix up

imgArray1 = np.array(Image.open("경로/image1.jpg"))
imgArray2 = np.array(Image.open("경로/image2.jpg"))
imshow(Image.fromarray(imgArray1))
label1 = [1,0]

imshow(Image.fromarray(imgArray2))
label2 = [0,1]

img1을 [1,0], img2를 [0,1]로 설정했습니다.

 

import tensorflow as tf
def sample_beta_distribution(size, concentration_0=0.2, concentration_1=0.2):
    gamma_1_sample = tf.random.gamma(shape=[size], alpha=concentration_1)
    gamma_2_sample = tf.random.gamma(shape=[size], alpha=concentration_0)
    return gamma_1_sample / (gamma_1_sample + gamma_2_sample)
L = sample_beta_distribution(1, 0.5, 0.5)

new_label = (label1*L) + (label2*(1-L))
new_image = (imgArray1*L) + (imgArray2*(1-L))
new_image = np.array(new_image, np.uint8)

imshow(Image.fromarray(new_image))
title(str(new_label))

베타분포를 이용하여 생성해 준 결과

 

img1을 0.43, img2를 0.56 정도로 Mix up 시켜준 것을 알 수 있습니다.


Copyright

 

- 비어플 빅데이터 학회

'학회 세션 > 비어플' 카테고리의 다른 글

[R] 로지스틱 회귀 & LDA  (0) 2022.03.26
[Classification] LDA(선형 판별분석)  (0) 2022.03.26
[R] 데이터 불균형 해소  (0) 2022.03.20
데이터 불균형 해소  (0) 2022.03.20
[R] 선형회귀를 이용한 회귀분석  (0) 2022.03.12