방대한 데이터 이미지를 한번에 변형 시킬 필요가 자주 있다.
이때 일일이 수작업으로 이미지를 변환한다면 리소스 낭비가 이만저만이 아닐거다.
이에 대한 해결책으로 torchvision.transforms.Compose 소개하고자 한다.
이번 포스팅은 transforms.Compose 사용방법과 이미지가 어떻게 변화되는지 눈으로 확인해볼거다.
1) 필요한 모듈 import
from torchvision import transforms
2) transforms.Compose 정의
IMG_TRANSFORM = transforms.Compose([
transforms.Resize(size=(64, 64)),
transforms.RandomHorizontalFlip(p=0.5),
transforms.ToTensor()
])
함수 설명 | 내용 설명 |
transforms.Resize(size=(64, 64)) | 이미지크기를 (64, 64)로 변경 |
transforms.RandomHorizontalFlip(p=0.5) | 이미지를 좌우 반전 p=0.5 는 해당기능을 50%로 확률로 실행 |
transforms.ToTensor() | 이미지를 Pytorch tensors 타입으로 변형 pixels 값들을 [ 0~255 ] 에서 [ 0.0~1.0 ]으로 자동 변환 |
이외에도 다양한 이미지 변형 메소드가 있으니 아래 문서를 참조 하길 바란다.
3) transforms.Compose 적용/ 효과 확인
train_images = glob.glob("train/*/*.jpg") # jpg 이미지 추출
random_img_3 = random.sample(train_images, k=3) # 위 이미지중 랜덤하게 3개 추출
for rand_img in random_img_3:
with Image.open(rand_img) as img:
fig, ax = plt.subplots(1, 2)
ax[0].imshow(img)
ax[0].set_title("Original \nSize: {}".format(img.size))
ax[0].axis("off")
img_transformed = IMG_TRANSFORM(img).permute(1, 2, 0)
# 위에서 생성한 transforms.Compose 객체의 인자로 img를 넣어주고 permute(아래설명참조)
ax[1].imshow(img_transformed)
ax[1].set_title("Transformed \nSize: {}".format(img_transformed.shape))
ax[1].axis("off")
output:
+ permute 이해
random_tensor = torch.rand(size=(2, 3, 5))
print(random_tensor.shape) # torch.Size([2, 3, 5])
random_tensor = random_tensor.permute(1, 2, 0) # 각 차원의 순서를 변경하여 재배치 : [0, 1, 2] -> [1, 2, 0]
print(random_tensor.shape) # torch.Size([3, 5, 2])
넘파이 swapaxes와 비슷한 기능으로 인덱스 번호를 통해 차원의 위치를 변경해준다.
'머신러닝,딥러닝 > 딥러닝' 카테고리의 다른 글
[pytorch] model.eval() vs torch.no_grad() 차이 (1) | 2022.12.21 |
---|---|
[pytorch] ImageFolder 사용 방법 (0) | 2022.12.21 |
AutoEncoder(오토인코더) 예제 코드 (0) | 2022.12.19 |
python 딥러닝 폴더 구조 쉽게 나누는 방법(with splitfolders) (0) | 2022.11.15 |
[딥러닝 기초] Dense layer (0) | 2022.04.20 |
댓글