1. 데이터 증강(Data Augmentation) 이란?
데이터 증강(Data Augmentation)은 학습 이미지 데이터의 다양성을 인 위적으로 증가시켜 모델의 성능을 향상시키고, 과적합(오버피팅) 문제를 완화하는 데 큰 도움이 됩니다. 특히, 컨볼루션 신경망(CNN)과 같은 모델에서는 다양하고 충분한 양의 훈련 데이터가 성능을 결정짓는 중요한 요소입니다.
하지만, 고품질의 이미지 데이터를 충분히 확보하는 것은 많은 경우에 어려운 일입니다. 이를 해결하기 위해 데이터 증강은 원본 이미지 데이터에 다양한 변형을 적용함으로써 마치 더 많은 데이터를 가진 것과 같은 효과를 내며 학습을 진행합니다. 이 과정에서 각 이미지에는 회전, 크기 조정, 색상 조정, 노이즈 추가 등의 변형이 무작위로 적용됩니다. 이는 모델이 실제 세계의 다양한 상황을 잘 일반화하고 적응하도록 돕습니다.
중요한 점은 데이터 증강이 실제로 이미지의 개수를 물리적으로 늘리는 것이 아니라, 훈련 과정에서 원본 이미지를 다양하게 변형하여 사용한다는 것입니다. 이 방식은 특히 리소스가 제한적인 상황에서 매우 유용하며, 효과적으로 모델의 견고성을 높이는 데 기여합니다.
2. 이미지 변환과 증강의 이유
이미지 증강은 모델의 성능을 향상시키기 위해 매우 중요한 과정입니다. 이 과정은 다양한 이유로 필요합니다.
1) 일반화 능력 향상 변환과 증강을 통해 다양한 형태의 이미지를 생성함 으로써 모델이 더 많은 시나리오에 적응할 수 있도록 합니다. 이는 모델이 실제 환경에서도 잘 동작하게 만듭니다.
2) 데이터 부족 문제 해결: 많은 경우, 충분한 양의 데이터가 없을 때가 있습니다. 이때 변환과 증강 기법을 활용하면 데이터를 인위적으로 늘릴 수 있어, 모델 학습에 더 많은 데이터를 사용할 수 있습니다.
3) 과적합 방지: 원본 데이터만으로 학습한 모델은 특정 패턴에 과도하게 적응하여 과적합될 수 있습니다. 다양한 형태의 데이터를 제공함으로써 이러한 과적합을 방지할 수 있습니다.
데이터 증강은 입력 데이터를 변형하여 새로운 데이터를 생성합니다. 예를 들어, 이미지를 회전하거나, 크기를 조정하거나, 좌우 반전시키는 등의 변환을 적용할 수 있습니다. 이를 통해 모델은 다양한 변형된 이미지를 학습하게 되어, 실제 환경에서의 성능이 향상됩니다. 또한, 이는 모델이 특정 패턴에 과적합되지 않도록 도와줍니다.
3.데이터 증강 라이브러리
1) torchvision와 albumentations 비교
이 두 라이브러리는 각각의 장단점과 특징이 있습니다.
torchvision: PyTorch의 기본 이미지 처리 라이브러리로, 사용하기 쉽고 PyTorch와의 호환성이 뛰어납니다. 기본적인 이미지 변환과 증강 기능을 제공하며, PyTorch 데이터 파이프라인과 자연스럽게 통합됩니다.(변환을 transform 인자로 바로 적용할 수 있어 사용이 편리합니다.)
장점: 사용법이 간단하고, PyTorch와의 호환성이 좋습니다.
단점: 변환 및 증강 기법이 상대적으로 제한적입니다.
albumentations: 강력하고 다양한 이미지 변환 및 증강 기능을 제공하는 고성능 이미지 증강 라이브러리로, 특히 컴퓨터 비전 작업에 최적화되어 있습니다. 높은 성능과 유연성을 자랑합니다.
장점: 다양한 변환 및 증강 기법을 제공하며, 성능이 뛰어납니다.
단점: 사용법이 비교적 복잡할 수 있으며, PyTorch와의 통합 작업이 필요할 수 있습니다. 이를 위해 커스텀 Dataset을 구현해야 할 때가 있습니다.
4. 예시코드
4.1 강아지 이미지 시각화
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
image_path = 'dog.png'
image_color_open = Image.open(image_path)
image_color = np.array(image_color_open)
plt.imshow(image_color)
plt.axis('off')
plt.show()
※ 코드 설명
Python에서 이미지를 불러와서 NumPy 배열로 변환한 후, Matplotlib를 사용하여 이미지를 시각화하는 과정을 보여줍니다.
1) 필요한 라이브러리 임포트
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
numpy: 수치 계산을 위한 라이브러리로, 이미지 데이터를 배열 형태로 변환하고 처리하는 데 사용됩니다.PIL: Python Imaging Library의 약자로, 이미지를 열고 조작하는 기능을 제공합니다. Image 모듈을 사용하여 이미지를 불러옵니다. matplotlib.pyplot: 데이터 시각화를 위한 라이브러리로, 이미지를 화면에 출력하는 데 사용됩니다.
2) 이미지 불러오기
image_path = 'dog.png'
image_color_open = Image.open(image_path)
image_path = 'dog_png': 'dog.png'라는 이미지 파일의 경로를 지정합니다. 이 파일은 코드가 실행되는 디렉토리에 있어야 합니다.
image_color_open = Image.open(image_path): PIL.Image.open 함수를 사용하여 이미지를 엽니다. 이 함수는 이미지를 열고 PIL. Image. Image 객체를 반환합니다.
3) 이미지를 NumPy 배열로 변환
image_color = np.array(image_color_open)
image_color = np.array(image_color_open): 이미지를 NumPy 배열로 변환합니다. np.array 함수는 PIL 이미지 객체를 NumPy 배열로 변환하여, 각 픽셀 값을 포함하는 배열을 생성합니다. 이 배열은 이미지 데이터를 수치적으로 조작할 수 있게 합니다.
PIL 객체는 시각화할 수 있습니다. PIL 자체에도 이미지를 시각화하는 방법이 있으며, Matplotlib를 사용하여 PIL 객체를 시각화할 수도 있습니다. 따라서 image_color_open을 NumPy 배열로 변환하는 이유는 시각화 때문이 아니라, 이미지 데이터를 수치적으로 조작하고 분석하기 위해서입니다.
PLI 이미지 객체인 "image_color_open" 을 왜 numpy array 형태로 변경한 이유는 이미지 데이터를 수치적으로 조작하고 분석하기 위해서입니다.
PIL 이미지 객체는 이미지 파일을 열고 저장하는 데 적합하지만, 픽셀 단위의 복잡한 계산이나 대규모 데이터 처리를 효율적으로 수행하기 위해서는 NumPy 배열이 더 유용합니다. NumPy 배열은 고 성능의 수치 계산 라이브러리로, 이미지 데이터를 빠르고 효율적으로 처리할 수 있는 다양한 함수와 메서드를 제공합니다.
4.2 torchvision.transforms를 사용한 이미지 처리 및 텐서 변환
import torch
import torchvision.transforms as transforms
# 이미지 파일 경로
image_path = 'dog.png'
image_color_open = Image.open(image_path)
# 이미지 변환 파이프라인 정의
transform = transforms.Compose([
transforms.Resize((224, 224)), # 이미지를 224x224로 크기 조정
transforms.ToTensor() # 이미지를 텐서로 변환
])
# 이미지를 변환
image_tensor = transform(image_color_open)
# 텐서를 다시 이미지로 변환하여 출력
def imshow(img_tensor):
img = img_tensor.numpy().transpose((1, 2, 0)) # HWC로 변환
plt.imshow(img)
plt.axis('off')
plt.show()
# 변환된 이미지 출력
imshow(image_tensor)
※ 코드 설명
PyTorch의 torchvision.transforms를 사용하여 이미지를 224x224로 크기 조정한 후, 텐서로 변환합니다. 변환된 텐서를 다시 이미지로 변환하여 시각화합니다.
1) 라이브러리 임포트 및 이미지 불러오기
import torch
import torchvision.transforms as transforms
# 이미지 파일 경로
image_path = 'dog.png'
image_color_open = Image.open(image_path)
라이브러리 임포트: PyTorch, torchvision를 임포트합니다.
torch: PyTorch 메인 라이브러리.
torchvision.transforms: 이미지 변환을 위한 torchvision 모듈.
이미지 파일 경로 및 열기: 'dog.png' 파일 경로에서 이미지를 열어 image_color_open 객체에 저장합니다.
2) 이미지 변환 파이프라인 정의 및 변환 적용
# 이미지 변환 파이프라인 정의
transform = transforms.Compose(I
transforms.Resize((224, 224)), # 이미지를 224x224로 크기 조정
transforms.ToTensor() # 이미지를 텐서로 변환
])
# 이미지를 변환
image_tensor = transform(image_color_open)
이미지 변환 파이프라인 정의: transforms. Compose를 사용하여 변환을 순서대로 적용할 수 있는 파이프라인을 정의합니다.
transforms.Resize((224.224)): 이미지의 크기를 지정된 크기로 변경합니다. 여기서는 (224, 224)로 지정하여 이미지를 224x224 픽셀 크기로 조정합니다.
transforms.ToTensor(): 이미지를 텐서로 변환합니다. 이 변환은 이미지를 [0, 255] 범위의 픽셀 값에서 [0.0, 1.0] 범위의 값으로 변환합니다.
이미지 변환 적용: 정의된 변환 파이프라인을 사용하여 이미지를 텐서로 변환합니다.
3) 텐서를 다시 이미지로 변환하여 출력
#텐서를 다시 이미지로 변환하여 출력
def imshow(img_tensor):
img=img_tensor.numpy().transpose((1, 2, 3)) #HxWxC로 변환
plt.imshow(img)
plt.axis('off') plt.show()
# 변환된 이미지 출력
imshow(image_tensor)
imshow 함수 정의: 텐서 형태의 이미지를 다시 시각화할 수 있도록 변환하는 함수입니다.
img = img_tensor.numpy().transpose((1, 2, 0)): 텐서를 NumPy 배열로 변환하고, 차원 순서를 변경합니다. (PyTorch 텐서는 [C, H, W] 형식이며, Matplotlib는 [H, W, C] 형식을 사용합니다.)
4.3 Albumentations를 사용한 이미지 처리 및 텐서 변환
import albumentations as A
from albumentations.pytorch import ToTensorV2
# 이미지 파일 경로
image_path = 'dog.png'
image_color_open = Image.open(image_path)
image_color_open = image_color_open.convert("RGB") # 이미지를 RGB 형식으로 변환
image_color = np.array(image_color_open) # PIL.Image 객체를 numpy 배열로 변환
# 이미지 변환 파이프라인 정의
transform = A.Compose([
A.Resize(224, 224), # 이미지를 224x224로 크기 조정
ToTensorV2() # 이미지를 텐서로 변환
])
# 이미지를 변환
transformed = transform(image=image_color)
image_tensor = transformed['image']
# 텐서를 다시 이미지로 변환하여 출력
def imshow(img_tensor):
img = img_tensor.permute(1, 2, 0).cpu().numpy() # HWC로 변환
plt.imshow(img)
plt.axis('off')
plt.show()
# 변환된 이미지 출력
imshow(image_tensor)
※ 코드 설명
Albumentations 라이브러리를 사용하여 이미지를 224x224로 크기 조정한 후, 텐서로 변환합니다. 변환된 텐서를 Matplotlib를 사용하여 시각화합니다.
1) 필요한 라이브러리 임포트
import albumentations as A
from albumentations.pytorch import ToTensorV2
Albumentations: 이미지 변환 및 데이터 증강을 위한 고성능 라이브러리.
ToTensorV2: Albumentations에서 PyTorch 텐서로 변환하는 모듈.
2) 이미지 불러오기 및 변환
# 이미지 파일 경로
image_path='dog.png'
image_color_open = Image.open(image_path)
image_color_open = image_color_open.convert("RGB") # 이미지를 RGB 형식으로 변환
image_color = np.array(image_color_open) # PIL.Image 객체를 numpy 배열로 변환
이미지 파일 경로 및 열기: 'dog.png 파일 경로에서 이미지를 열어 image_color_open 객체에 저장합니다.
이미지를 RGB 형식으로 변환: 이미지를 RGB 형식으로 변환합니다.
이미지를 NumPy 배열로 변환: PIL 이미지 객체를 NumPy 배열로 변환하여 이미지 데이터를 수치적으로 조작할 수 있게 합니다.
3) 이미지 변환 파이프라인 정의 및 변환 적용
# 이미지 변환 파이프라인 정의
transform = A.Compose([
A.Resize(224, 224), # 이미지를 224x224로 크기 조정
ToTensorV2() #이미지를 변환
])
# 이미지를 텐서로 변환
transformed = transform(image=image_color)
image_tensor = transformed['image']
이미지 변환 파이프라인 정의: A.Compose를 사용하여 변환을 순서대로 적용할 수 있는 파이프라인을 정의합니다.
A.Resize(224, 224): 이미지의 크기를 지정된 크기로 변경하는 변환입니다. (224, 224)로 지정하여 이미지를 224x224 픽셀 크기로 조정합니다.
ToTensorV2(): 이미지를 PyTorch 텐서로 변환합니다. 이 변환은 이미지를 [H, W, C] 형식의 NumPy 배열에서 [C, H, W] 형 식의 PyTorch 텐서로 변환합니다.
이미지 변환 적용: 정의된 변환 파이프라인을 사용하여 이미지를 텐서로 변환합니다. 변환된 결과는 딕셔너리 형태로 반환되며, 텐서는 transformed['image']에 저장됩니다.
4) 텐서를 다시 이미지로 변환하여 출력
# 텐서를 다시 이미지로 변환하여 출력
def imshow(img_tensor):
img=img_tensor.permute(1, 2, 0).cpu().numpy() #HWC로 변환
plt.imshow(img)
plt.axis('off') plt.show()
# 변환된 이미지 출력
imshow(image_tensor)
imshow 함수 정의: 텐서 형태의 이미지를 다시 시각화할 수 있도록 변환하는 함수입니다.
img = img_tensor.permute(1. 2. 0) cpu().numpy(): 텐서를 NumPy 배열로 변환하고, 차원 순서를 변경합니다. (PyTorch
텐서는 [C, H, W] 형식이며, Matplotlib는 [H, W, C] 형식을 사용합니다.)
'딥러닝 > 딥러닝: 이미지 분류' 카테고리의 다른 글
이미지 증강 1 (0) | 2025.02.20 |
---|---|
Fashion MNIST 이미지 분류 실습 (0) | 2025.02.16 |
PyTorch의 torchvision 패키지 (0) | 2025.02.12 |
평탄화 레이어(Flatten Layer)와 완전 연결 레이어(Fully Connected Layer) (0) | 2025.02.11 |
풀링(pooling) 기법: Max, Min, Average (0) | 2025.02.11 |