Albumentations
- Albumentations 는 Python에서 이미지 전처리 및 데이터 증강 을 위한 라이브러리 중 하나입니다. 딥 러닝 모델의 훈련을 위한 데이터 증강 기술을 쉽게 사용할 수 있도록하는 도구로, 이미지를 변환하여 데이터 세트의 크기를 늘리고, 모델의 로버스트한 학습을 돕는 데 사용됩니다.
저는 이 라이브러리를 이용해서 웰시코기의 사진을 다음과 같이 변경했습니다.
코랩 환경에서 작업 했습니다. 코드는 다음과 같습니다. (코랩 설정에 능한 사람은 아래 파란글씨부터 보세요!)
from google.colab import drive
drive.mount('/content/drive')
import torch
import torchvision
from torchvision import transforms
import os
import glob
from PIL import Image as PILImage
현재 사용 가능한 디바이스가 GPU인지 확인
device='cuda' if torch.cuda.is_available() else 'cpu'
GPU를 사용할 경우, torch.cuda.manual_seed_all() 함수를 사용하여 GPU에서 발생하는 난수도 동일한 시드를 사용하도록 설정
이는 GPU를 사용하는 경우에도 실험의 재현성을 보장하기 위해 필요
if device=='cuda':
torch.cuda.manual_seed_all(42) # 같은 랜덤 값을 생성
파이토치 데이터셋 클래스 직접 만들기
from torch.utils.data import Dataset, DataLoader
import cv2
import os
class Custom_dataset(Dataset):
def __init__(self, root_path, transform=None):
self.all_data = sorted(glob.glob(os.path.join(root_path,'*'))) # 데이터 경로
self.transform = transform
def __getitem__(self, index):
if torch.is_tensor(index):
index = index.tolist()
# 이미지 읽기
data_path = self.all_data[index]
img = cv2.imread(data_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #채널 측 : BGR -> RGB
# transform(Augmentation(증강))
if self.transform is not None: #클래스 생성할 때 인자를 안 넣었으면
augmentation = self.transform(image = img )
img = augmentation['image']
return img
def __len__(self):
length = len(self.all_data) # 전체데이터개수
return length
원본이미지 출력
from google.colab.patches import cv2_imshow
import numpy as np
pytorch_dataset_original = Custom_dataset(root_path = root_path)
cv2.cvtColor(pytorch_dataset_original[0],cv2.COLOR_BGR2RGB)
cv2_imshow(cv2.cvtColor(pytorch_dataset_original[0],cv2.COLOR_BGR2RGB))
Albumentations 사용 밑 변경 이미지 출력
import albumentations
import albumentations.pytorch
albumentations = albumentations.Compose([
albumentations.Resize(224, 224), # 이미지 크기를 224x224로 조정합니다.
#뒤집기, 돌리기
albumentations.OneOf([ # 여러 변환 중 하나를 랜덤하게 선택합니다.
albumentations.HorizontalFlip(p=0.8), # 좌우 반전
albumentations.VerticalFlip(p=0.8), # 상하 반전
albumentations.RandomRotate90(p=0.8),# 90도 간격으로 회전
albumentations.Rotate(limit=45, p=0.5) # 최대 45도까지 회전
], p = 1),
#픽셀값 장난
albumentations.OneOf([
albumentations.MotionBlur(p=0.8), # 흐리게
albumentations.OpticalDistortion(p=0.8), # 왜곡 넣기
albumentations.GaussNoise(p=0.8), # 노이즈 넣기
albumentations.Blur(p=0.2), # 모자이크 처리
], p = 1),
# 픽셀값 누락
albumentations.OneOf([
albumentations.CoarseDropout(max_holes=10, max_height=5, max_width=5, p=0.5), # 이미지에서 임의의 사각형 영역을 제거합니다.
albumentations.Cutout(num_holes=10, max_h_size=5, max_w_size=5, p=0.5), # 이미지에서 임의의 원형 영역을 제거합니다.
]),
# 채도 변경
albumentations.ColorJitter(
brightness=0.1,
contrast=0.1,
saturation=0.2,
p=0.8
),
#이미지의 색상(Hue), 채도(Saturation), 밝기(Value)를 임의로 변화시킵니다.
albumentations.HueSaturationValue(
hue_shift_limit=20,
sat_shift_limit=50,
p=0.8
),
# 이미지의 밝기를 랜덤하게 조정합니다.
albumentations.RandomGamma(
gamma_limit=(80, 120),
p=0.5
)
#albumentations.pytorch.transforms.ToTensorV2() #0~1만들기
])
pytorch_dataset_copy = Custom_dataset(root_path = root_path, transform=albumentations)
cv2_imshow(cv2.cvtColor(pytorch_dataset_copy[0],cv2.COLOR_BGR2RGB))
다음에는 이 변경 이미지들을 저장하는 방법을 쓰도록 하겠습니다:)