본문 바로가기

카테고리 없음

이미지전처리(Albumentations)

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))

 

 

다음에는 이 변경 이미지들을 저장하는 방법을 쓰도록 하겠습니다:)