使用 PyTorch 加载自定义图像数据集
Loading custom dataset of images using PyTorch
我正在使用 coil-100 数据集,该数据集包含 100 个对象的图像,每个对象 72 张图像,通过将每个图像的对象旋转 5 度从固定相机拍摄。以下是我正在使用的文件夹结构:
data/train/obj1/obj01_0.png, obj01_5.png ... obj01_355.png
.
.
data/train/obj85/obj85_0.png, obj85_5.png ... obj85_355.png
.
.
data/test/obj86/obj86_0.ong, obj86_5.png ... obj86_355.png
.
.
data/test/obj100/obj100_0.ong, obj100_5.png ... obj100_355.png
我用过图像加载器和数据加载器 classes。训练和测试数据集正确加载,我可以打印 class 名称。
train_path = 'data/train/'
test_path = 'data/test/'
data_transforms = {
transforms.Compose([
transforms.Resize(224, 224),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
}
train_data = torchvision.datasets.ImageFolder(
root=train_path,
transform= data_transforms
)
test_data = torchvision.datasets.ImageFolder(
root = test_path,
transform = data_transforms
)
train_loader = torch.utils.data.DataLoader(
train_data,
batch_size=None,
num_workers=1,
shuffle=False
)
test_loader = torch.utils.data.DataLoader(
test_data,
batch_size=None,
num_workers=1,
shuffle=False
)
print(len(train_data))
print(len(test_data))
classes = train_data.class_to_idx
print("detected classes: ", classes)
在我的模型中,我希望通过预训练的 resnet 传递每张图像,并根据 resnet 的输出制作一个数据集,以输入双向 LSTM。
为此,我需要通过 class 名称和索引访问图像。
例如。 pre_resnet_train_data['obj01'][0]
应该是 obj01_0.png
而 post_resnet_train_data['obj01'][0]
应该是 obj01_0.png
的 resnet 输出等等。
我是 Pytorch 的初学者,在过去的 2 天里,我阅读了许多关于创建自定义数据集的教程和 Whosebug 问题 class 但无法弄清楚如何实现我想要的。
请帮忙!
假设您只打算 运行 对图像重发一次并保存输出以备后用,我建议您编写自己的 data set, derived from ImageFolder
.
将每个 resnet 输出保存在与图像文件相同的位置,扩展名为 .pth
。
class MyDataset(torchvision.datasets.ImageFolder):
def __init__(self, root, transform):
super(MyDataset, self).__init__(root, transform)
def __getitem__(self, index):
# override ImageFolder's method
"""
Args:
index (int): Index
Returns:
tuple: (sample, resnet, target) where target is class_index of the target class.
"""
path, target = self.samples[index]
sample = self.loader(path)
if self.transform is not None:
sample = self.transform(sample)
if self.target_transform is not None:
target = self.target_transform(target)
# this is where you load your resnet data
resnet_path = os.path.join(os.path.splitext(path)[0], '.pth') # replace image extension with .pth
resnet = torch.load(resnet_path) # load the stored features
return sample, resnet, target
我正在使用 coil-100 数据集,该数据集包含 100 个对象的图像,每个对象 72 张图像,通过将每个图像的对象旋转 5 度从固定相机拍摄。以下是我正在使用的文件夹结构:
data/train/obj1/obj01_0.png, obj01_5.png ... obj01_355.png
.
.
data/train/obj85/obj85_0.png, obj85_5.png ... obj85_355.png
.
.
data/test/obj86/obj86_0.ong, obj86_5.png ... obj86_355.png
.
.
data/test/obj100/obj100_0.ong, obj100_5.png ... obj100_355.png
我用过图像加载器和数据加载器 classes。训练和测试数据集正确加载,我可以打印 class 名称。
train_path = 'data/train/'
test_path = 'data/test/'
data_transforms = {
transforms.Compose([
transforms.Resize(224, 224),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
}
train_data = torchvision.datasets.ImageFolder(
root=train_path,
transform= data_transforms
)
test_data = torchvision.datasets.ImageFolder(
root = test_path,
transform = data_transforms
)
train_loader = torch.utils.data.DataLoader(
train_data,
batch_size=None,
num_workers=1,
shuffle=False
)
test_loader = torch.utils.data.DataLoader(
test_data,
batch_size=None,
num_workers=1,
shuffle=False
)
print(len(train_data))
print(len(test_data))
classes = train_data.class_to_idx
print("detected classes: ", classes)
在我的模型中,我希望通过预训练的 resnet 传递每张图像,并根据 resnet 的输出制作一个数据集,以输入双向 LSTM。
为此,我需要通过 class 名称和索引访问图像。
例如。 pre_resnet_train_data['obj01'][0]
应该是 obj01_0.png
而 post_resnet_train_data['obj01'][0]
应该是 obj01_0.png
的 resnet 输出等等。
我是 Pytorch 的初学者,在过去的 2 天里,我阅读了许多关于创建自定义数据集的教程和 Whosebug 问题 class 但无法弄清楚如何实现我想要的。
请帮忙!
假设您只打算 运行 对图像重发一次并保存输出以备后用,我建议您编写自己的 data set, derived from ImageFolder
.
将每个 resnet 输出保存在与图像文件相同的位置,扩展名为 .pth
。
class MyDataset(torchvision.datasets.ImageFolder):
def __init__(self, root, transform):
super(MyDataset, self).__init__(root, transform)
def __getitem__(self, index):
# override ImageFolder's method
"""
Args:
index (int): Index
Returns:
tuple: (sample, resnet, target) where target is class_index of the target class.
"""
path, target = self.samples[index]
sample = self.loader(path)
if self.transform is not None:
sample = self.transform(sample)
if self.target_transform is not None:
target = self.target_transform(target)
# this is where you load your resnet data
resnet_path = os.path.join(os.path.splitext(path)[0], '.pth') # replace image extension with .pth
resnet = torch.load(resnet_path) # load the stored features
return sample, resnet, target