AI 개발 공부 공간

AI, 머신러닝, 딥러닝, Python & PyTorch, 실전 프로젝트

딥러닝/딥러닝: 이미지 분류

이미지 증강 1

qordnswnd123 2025. 2. 20. 12:15

1. 라이브러리 로드

import torch
import torchvision.transforms as transforms

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

import albumentations as A
from albumentations.pytorch import ToTensorV2

 

 


2. 이미지를 시각화하는 함수 정의

def show_image(img, title):
    plt.imshow(img)
    plt.title(title)
    plt.axis('off')

 


3. 뒤집기 (Flip)

3.1. torchvision을 활용하여 원본이미지 좌우 뒤집기 적용

HorizontalFlip과 VerticalFlip은 이미지 데이터 증강을 위해 널리 사용되는 두 가지 기본적인 변환 방법입니다. 이들은 각각 이미지를 수평(좌우) 및 수직(상하) 방향으로 뒤집어, 데이터의 다양성을 늘리는 데 도움을 줍니다.

 

※ HorizontalFlip (수평 뒤집기)
작동 방식: 이미지의 좌우를 뒤집습니다. 예를 들어, 이미지의 오른쪽 부분이 왼쪽으로 이동하고 왼쪽 부분이 오른쪽으로 이동합니다.
사용 용도: 이미지에서 방향성이 중요하지 않을 때 유용합니다. 예를 들어, 도로 표지판이나 자연 경관 이미지 에서 좌우 방향이 결과에 큰 영향을 미치지 않을 경우 사용됩니다.


※ VerticalFlip (수직 뒤집기)
작동 방식: 이미지의 상하를 뒤집습니다. 이미지의 상단이 하단으로 이동하고, 하단이 상단으로 이동합니다. 

사용 용도: 상하 방향이 중요하지 않은 경우에 유용합니다. 이는 예를 들어 하늘과 물의 반영을 다룰 때 유용할 수 있습니다.


적용 방법
이러한 변환은 다양한 라이브러리를 통해 적용할 수 있습니다. 예를 들어, Python에서는 다음과 같은 라이브 러리를 통해 쉽게 적용할 수 있습니다

  • Albumentations: 빠르고 효율적인 이미지 변환을 위해 설계된 Python 라이브러리입니다. 이 라이브러리를 사용하면 여러 변환을 쉽게 조합하고 적용할 수 있습니다.
  • PyTorch torchvision: PyTorch의 일부로 제공되는 라이브러리로, 주로 학습 목적의 이미지 전처리와 증강에 사용됩니다.

이 변환들은 모두 파라미터를 통해 적용 확률을 설정할 수 있으며, 이는 변환을 적용할 확률을 의미합니다. (p=1.0은 변환이 항상 적용되고, p=0.5는 50% 확률로 적용됨). 이를 통해 모델 학습 과정에서 더 강건한 특성을 학습하도록 도울 수 있습니다.

image_path = 'dog.png'
image = Image.open(image_path)

horizontal_flip = transforms.RandomHorizontalFlip(p=1.0)  # 100% 확률로 좌우 반전
flipped_horizontal_image = horizontal_flip(image)

plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
show_image(image, 'Original Image')

plt.subplot(1, 2, 2)
show_image(flipped_horizontal_image, 'Horizontally Flipped Image')

plt.show()

 

3.2. albumentations을 활용하여 원본이미지 좌우, 상하 뒤집기 적용

image_path = 'dog.png'
image = Image.open(image_path).convert("RGB")
image_np = np.array(image)
# 100% 확률로 좌우 및 상하 뒤집기 변환 정의
transform_horizontal_flip_100 = A.HorizontalFlip(p=1.0)
transform_vertical_flip_100 = A.VerticalFlip(p=1.0)

# 50% 확률로 좌우 및 상하 뒤집기 변환 정의
transform_horizontal_flip_50 = A.HorizontalFlip(p=0.5)
transform_vertical_flip_50 = A.VerticalFlip(p=0.5)

# 데이터 증강 적용 (100%)
flipped_horizontal_100 = transform_horizontal_flip_100(image=image_np)['image']
flipped_vertical_100 = transform_vertical_flip_100(image=image_np)['image']

# 데이터 증강 적용 (50%)
flipped_horizontal_50 = transform_horizontal_flip_50(image=image_np)['image']
flipped_vertical_50 = transform_vertical_flip_50(image=image_np)['image']
plt.figure(figsize=(13, 6))

plt.subplot(2, 3, 1)
show_image(image_np, 'Original Image')

plt.subplot(2, 3, 2)
show_image(flipped_horizontal_100, '100% Horizontally Flipped Image')

plt.subplot(2, 3, 3)
show_image(flipped_vertical_100, '100% Vertically Flipped Image')

plt.subplot(2, 3, 4)
show_image(image_np, 'Original Image')

plt.subplot(2, 3, 5)
show_image(flipped_horizontal_50, '50% Horizontally Flipped Image')

plt.subplot(2, 3, 6)
show_image(flipped_vertical_50, '50% Vertically Flipped Image')

plt.show()

 


4.잘라내기(Crop)

RandomCrop과 CenterCrop은 각각 이미지를 무작위 위치와 중앙에서 잘라내어 데이터의 다양성을 늘리고, 모델의 일반화 성능을 향상시키는 데 도움을 줍니다.


※ RandomCrop (랜덤 자르기)
작동 방식: 이미지의 무작위 위치에서 지정된 크기로 이미지를 잘라냅니다. 변환을 적용할 때마다 이미지의 다른 부분이 잘리게 됩니다.
사용 용도: 다양한 부분의 이미지를 학습하여 모델의 일반화 성능을 향상시 키고, 과적합을 방지하는 데 유용합니다. 특히, 이미지의 중요한 정보가 특정 위치에 고정되어 있지 않은 경우에 효과적입니다.


※ CenterCrop (중앙 자르기)
작동 방식: 이미지의 중앙에서 지정된 크기로 이미지를 잘라냅니다. 항상 이미지의 중심 부분을 잘라내므로, 중요한 정보가 중앙에 있는 경우 유용합니다.
사용 용도: 이미지의 중심 부분이 중요하고, 중앙에서의 정보가 주로 필요한 경우에 효과적입니다. 예를 들어, 얼굴 인식 또는 특정 객체가 항상 중앙에 위치한 경우에 유용합니다.

 

transform_random_crop = A.RandomCrop(height=200, width=200, p=1.0)  # 랜덤 자르기
transform_center_crop = A.CenterCrop(height=200, width=200, p=1.0)  # 중앙 자르기

random_cropped = transform_random_crop(image=image_np)['image']
center_cropped = transform_center_crop(image=image_np)['image']
plt.figure(figsize=(15, 8))

plt.subplot(1, 3, 1)
show_image(image_np, 'Original Image')

plt.subplot(1, 3, 2)
show_image(random_cropped, 'Random Cropped')

plt.subplot(1, 3, 3)
show_image(center_cropped, 'Center Cropped')

plt.show()

 


5. 이동(shift), 스케일링(scale), 회전(rotate)

ShiftScaleRotate은 이미지에 대해 이동(shift), 스케일링(scale), 그리고 회 전(rotate) 변환을 동시에 적용할 수 있습니다. 이 기술은 모델이 이미지의 위치, 크기, 방향에 덜 민감하게 만들어 일반화 능력을 향상시킬 수 있도록 설계되었습니다.


※ 이동(Shift)
이동 변환은 이미지를 특정 방향으로 옮깁니다. 이는 이미지의 모든 픽셀을 지정된 양만큼 x축 및 y축을 따라 이동시키는 것을 말합니다. shift_limit 매 개변수로 이동 범위를 제어하며, 이는 -1에서 1 사이의 값을 갖습니다. 예를 들어, shift_limit=0.1은 이미지 크기의 최대 10%까지 이동할 수 있음을 의미합니다.


※ 스케일링 (Scale)
스케일링은 이미지의 크기를 변경하는 변환으로, 이미지를 확대하거나 축소 합니다. scale_limit 매개변수를 사용하여 스케일링의 정도를 지정합니다. 예를 들어, scale_limit=0.1은 원본 크기의 90%에서 110% 사이로 크기를 변경할 수 있음을 의미합니다.


※ 회전(Rotate)
회전 변환은 이미지를 중심점을 기준으로 특정 각도만큼 회전시킵니다. rotate_limit 매개변수로 회전 각도의 범위를 설정할 수 있으며, 이 값은 각도 단위로 표현됩니다. 예를 들어, rotate_limit=45는 이미지를 최대 -45도 에서 +45도 사이로 회전할 수 있음을 의미합니다.


이러한 변환들은 각각 독립적으로 적용될 수도 있고, shiftScaleRotate 변환을 통해 하나의 변환으로 조합하여 적용될 수 있습니다. 조합된 변환을 사용함으로써 모델이 이미지의 변위, 크기 변화, 회전에 대해 더 강력하게 대응할 수 있게 됩니다. Albumentations 라이브러리에서는 이 모든 작업을 매우 효율적으로 처리할 수 있도록 구현되어 있으며, 이는 특히 이미지 관련 딥러닝 작업에서 데이터의 다양성을 증가시키는 데 매우 유용합니다.

shift_transform = A.ShiftScaleRotate(shift_limit=0.3, scale_limit=0, rotate_limit=0, p=1.0)
scale_transform = A.ShiftScaleRotate(shift_limit=0, scale_limit=0.3, rotate_limit=0, p=1.0)
rotate_transform = A.ShiftScaleRotate(shift_limit=0, scale_limit=0, rotate_limit=45, p=1.0)
combined_transform = A.ShiftScaleRotate(shift_limit=0.4, scale_limit=0.4, rotate_limit=45, p=1.0)

shifted_image = shift_transform(image=image_np)['image']
scaled_image = scale_transform(image=image_np)['image']
rotated_image = rotate_transform(image=image_np)['image']
combined_image = combined_transform(image=image_np)['image']
plt.figure(figsize=(20, 5))  

plt.subplot(1, 5, 1) 
show_image(image_np, 'Original Image')

plt.subplot(1, 5, 2)  
show_image(shifted_image, 'Shifted Image')

plt.subplot(1, 5, 3) 
show_image(scaled_image, 'Scaled Image')

plt.subplot(1, 5, 4)  
show_image(rotated_image, 'Rotated Image')

plt.subplot(1, 5, 5)  
show_image(combined_image, 'Combined Image')

plt.show()

 

 


6. 색상 조정 (ColorJitter)

ColorJitter는 이미지의 색상, 채도, 밝기, 그리고 대비를 무작위로 변경하여 이미지의 시각적 다양성을 증가시키는 데이터 증강 기법입니다. 이 변환은 주로 컴퓨터 비전에서 사용되며, 모델이 다양한 조명 및 색상 조건에서 이미지를 더 잘 인식하고 처리할 수 있도록 합니다.


※ ColorJitter의 주요 파라미터
1) brightness: 밝기를 조정합니다. 0에서 1 사이로 설정할 수 있으며, 0은 원본 이미지의 밝기를 유지하고, 1은 완전히 밝거나 어두운 값으로 변경할 수 있습니다. 일반적으로 소수값이 주어져, 예를 들어 0.2라면 밝기를 최대 20% 증가시키거나 감소시킬 수 있습니다.
2) contrast: 대비를 조정합니다. 이 파라미터 역시 0에서 1 사이의 값을 사용 하며, 0은 원본 이미지의 대비를 유지하고, 1은 매우 높거나 낮은 대비로 변환할 수 있습니다.
3) saturation: 채도를 조정합니다. 0은 흑백 이미지로 만들고, 1은 색상의 강도를 최대화할 수 있습니다. 중간 값은 더 미묘한 채도 변화를 제공합니다.
4) hue: 색조를 조정합니다. 이 값은 일반적으로 -0.5에서 +0.5 사이로 설정됩니다. 이 범위 내에서 값은 색상을 빨강에서 녹색으로, 또는 파랑 등으로 완전히 변경할 수 있습니다.


이 기법은 이미지에 인위적인 조명 변화나 색상 변화를 추가하여 훈련 데이 터 세트에 포함된 이미지의 다양성을 증가시킵니다. 예를 들어, 밝은 환경과 어두운 환경에서 촬영된 이미지들을 모두 학습하는 데 유용할 수 있습니다. 또한, 다양한 색상의 옷을 입은 사람들을 인식하는 패션 관련 모델 훈련에도 도움을 줄 수 있습니다.
ColorJitter는 이미지 데이터에 다양한 시각적 경험을 제공함으로써, 모델 이 실세계의 다양한 시각적 조건에 더 강건하게 대응할 수 있도록 돕습니다. 이는 특히 색상이나 조명 변화에 민감할 수 있는 응용 분야에서 중요합니다.

color_brightness_transform = A.ColorJitter(brightness=0.5, contrast=0, saturation=0, hue=0, p=1.0)
color_contrast_transform = A.ColorJitter(brightness=0, contrast=0.5, saturation=0, hue=0, p=1.0)
color_saturation_transform = A.ColorJitter(brightness=0, contrast=0, saturation=0.5, hue=0, p=1.0)
color_hue_transform = A.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0.5, p=1.0)
color_all_transform = A.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.2, p=1.0)

color_brightness_image = color_brightness_transform(image=image_np)['image']
color_contrast_image = color_contrast_transform(image=image_np)['image']
color_saturation_image = color_saturation_transform(image=image_np)['image']
color_hue_image = color_hue_transform(image=image_np)['image']
color_all_image = color_all_transform(image=image_np)['image']
plt.figure(figsize=(10, 5)) 

plt.subplot(2, 3, 1) 
show_image(image_np, 'Original Image')

plt.subplot(2, 3, 2)  
show_image(color_brightness_image, 'Color brightness Image')

plt.subplot(2, 3, 3) 
show_image(color_contrast_image, 'Color Contrast Image')

plt.subplot(2, 3, 4)  
show_image(color_saturation_image, 'Color Saturation Image')

plt.subplot(2, 3, 5)  
show_image(color_hue_image, 'Color Hue Image')

plt.subplot(2, 3, 6)  
show_image(color_all_image, 'Color all Image')

plt.show()

 


7.노이즈(Gauss Noise)

가우시안 노이즈(GaussNoise)는 각 픽셀 값에 가우시안 분포를 따르는 무작위 값을 추가하여 이미지를 변형합니다. 이는 모델이 다양한 노이즈 조건에 대해 강건한 성능을 발휘하도록 돕습니다.

가우시안 노이즈는 평균이 0인 가우시안 분포를 따르는 무작위 값을 이미지의 각 픽셀에 추가하여 생성됩니다. 이는 자연스럽고 일반적인 노이즈 유형으로, 센서 노이즈나 조명 변화 등 다양한 실제 상황을 시뮬레이션할 수 있습니다.

※ 파라미터

  • var_limit : 노이즈의 분산 범위를 정의합니다. 예를 들어, var_limit=(10.0. 50.0)는 노이즈의 분산이 10에서 50 사이의 값을 가질 수 있음을 의미합니다.
  • p : 노이즈 적용 확률을 의미합니다. p=1.0이면 항상 노이즈를 적용합니다.
gauss_noise_transform1 = A.GaussNoise(var_limit=(300.00, 400.0), p=1.0)
gauss_noise_transform2 = A.GaussNoise(var_limit=(1000.00, 1100.0), p=1.0)

gauss_noised_image1 = gauss_noise_transform1(image=image_np)['image']
gauss_noised_image2 = gauss_noise_transform2(image=image_np)['image']
plt.figure(figsize=(10, 5)) 

plt.subplot(1, 3, 1) 
show_image(image_np, 'Original Image')

plt.subplot(1, 3, 2)  
show_image(gauss_noised_image1, 'First Noise Image')

plt.subplot(1, 3, 3)  
show_image(gauss_noised_image2, 'Second Noise Image')

plt.show()