zdou0830's picture
desco
749745d
raw
history blame
2.03 kB
import os
import os.path
import json
from PIL import Image
import torch.utils.data as data
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:
img = Image.open(f)
return img.convert("RGB")
class ImageNet(data.Dataset):
"""ImageNet
Args:
root (string): Root directory where images are downloaded to.
annFile (string): Path to json annotation file.
transform (callable, optional): A function/transform that takes in an PIL image
and returns a transformed version. E.g, ``transforms.ToTensor``
"""
def __init__(self, ann_file, root, remove_images_without_annotations=None, transforms=None):
self.root = root
self.transform = transforms
meta_file = os.path.join(root, ann_file)
assert os.path.exists(meta_file), "meta file %s under root %s not found" % (os.path.basename(meta_file), root)
with open(meta_file, "r") as f:
meta = json.load(f)
self.classes = meta["classes"]
self.class_to_idx = meta["class_to_idx"]
self.samples = meta["samples"]
self.num_sample = len(self.samples)
self.allsamples = self.samples
def select_class(self, cls):
new_samples = [sample for sample in self.allsamples if sample[-1] in cls]
self.samples = new_samples
self.num_sample = len(self.samples)
def __getitem__(self, index):
"""
Args:
index (int): Index
Returns:
tuple: (sample, target) where target is class_index of the target class.
"""
img_path, target = self.samples[index]
sample = pil_loader(self.root + "/" + img_path)
if self.transform is not None:
sample = self.transform(sample)
return sample, target, index
def __len__(self):
return len(self.samples)