PyTorch에서 ImageFolder와 유사한 클래스를 구현해야 할 때 사용할 수 있는 코드 템플릿
기타2021. 3. 3. 18:03
728x90
반응형
아래 코드는 PyTorch에서 ImageFolder와 유사한 기능을 직접 구현해야 할 때 사용할 수 있는 코드다. ImageFolder는 기본적으로 (이미지, 레이블) 형태로 특정한 이미지 데이터를 가져올 수 있다. 이때 이미지 대신에 numpy 형태로 가져오거나 원하는 형식의 확장자를 사용하도록 하려면, 이러한 클래스를 직접 작성해 사용할 수 있을 것이다.
import torch.utils.data as data
from PIL import Image
import os
import os.path
IMG_EXTENSIONS = [
'.jpg', '.JPG', '.jpeg', '.JPEG',
'.png', '.PNG', '.ppm', '.PPM', '.bmp', '.BMP',
]
def is_image_file(filename):
return any(filename.endswith(extension) for extension in IMG_EXTENSIONS)
def find_classes(dir):
classes = [d for d in os.listdir(dir) if os.path.isdir(os.path.join(dir, d))]
classes.sort()
class_to_idx = {classes[i]: i for i in range(len(classes))}
return classes, class_to_idx
def make_dataset(dir, class_to_idx):
images = []
dir = os.path.expanduser(dir)
for target in sorted(os.listdir(dir)):
d = os.path.join(dir, target)
if not os.path.isdir(d):
continue
for root, _, fnames in sorted(os.walk(d)):
for fname in sorted(fnames):
if is_image_file(fname):
path = os.path.join(root, fname)
item = (path, class_to_idx[target])
images.append(item)
return images
def pil_loader(path):
# open path as file to avoid ResourceWarning (https://github.com/python-pillow/Pillow/issues/835)
with open(path, 'rb') as f:
with Image.open(f) as img:
return img.convert('RGB')
def accimage_loader(path):
import accimage
try:
return accimage.Image(path)
except IOError:
# Potentially a decoding problem, fall back to PIL.Image
return pil_loader(path)
def default_loader(path):
from torchvision import get_image_backend
if get_image_backend() == 'accimage':
return accimage_loader(path)
else:
return pil_loader(path)
class ImageFolder(data.Dataset):
"""A generic data loader where the images are arranged in this way: ::
root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png
root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png
Args:
root (string): Root directory path.
transform (callable, optional): A function/transform that takes in an PIL image
and returns a transformed version. E.g, ``transforms.RandomCrop``
target_transform (callable, optional): A function/transform that takes in the
target and transforms it.
loader (callable, optional): A function to load an image given its path.
Attributes:
classes (list): List of the class names.
class_to_idx (dict): Dict with items (class_name, class_index).
imgs (list): List of (image path, class_index) tuples
"""
def __init__(self, root, transform=None, target_transform=None,
loader=default_loader):
classes, class_to_idx = find_classes(root)
imgs = make_dataset(root, class_to_idx)
if len(imgs) == 0:
raise(RuntimeError("Found 0 images in subfolders of: " + root + "\n"
"Supported image extensions are: " + ",".join(IMG_EXTENSIONS)))
self.root = root
self.imgs = imgs
self.classes = classes
self.class_to_idx = class_to_idx
self.transform = transform
self.target_transform = target_transform
self.loader = loader
def __getitem__(self, index):
"""
Args:
index (int): Index
Returns:
tuple: (image, target) where target is class_index of the target class.
"""
path, target = self.imgs[index]
img = self.loader(path)
if self.transform is not None:
img = self.transform(img)
if self.target_transform is not None:
target = self.target_transform(target)
return img, target
def __len__(self):
return len(self.imgs)
▶ 출처: chsasank.github.io/vision/_modules/torchvision/datasets/folder.html
728x90
반응형
'기타' 카테고리의 다른 글
구글 코랩(Google Colab)에서 깃허브(GitHub) 연동하는 방법 및 Private Repository에서 소스 코드 가져오는 방법 (0) | 2021.03.06 |
---|---|
SSH Key를 이용해 GitHub 계정의 저장소(repository) 코드에 접근하기 (0) | 2021.03.06 |
Clarifai 이미지 인식 서비스 사용법 (Feat. 유명인 얼굴 인식 서비스) (1) | 2021.03.03 |
깃허브(GitHub)의 README 파일에 이미지/동영상 올리는 방법 (1) | 2021.03.01 |
얼굴 성별 분류(Gender Classification) 데이터셋 소개 및 다운로드 방법 (0) | 2021.02.27 |