首页 > 解决方案 > 如何在 pytorch 中将多个灰度图像作为单个张量加载?

问题描述

我目前正在尝试使用堆栈一组图像作为每个标签的单个实体来训练 CNN 使用交叉验证。给定一个 224x224x1 灰度图像的数据集,按以下方式排序:

Root/
    Class0/image0_view0.png
    Class0/image0_view1.png
    Class0/image0_view2.png
    ...
    Class1/image0_view0.png
    Class1/image0_view1.png
    Class1/image0_view2.png

我将如何将 3 个图像(视图 0、1 和 2)作为尺寸为 224x224x3(3 个灰度图像)的单个张量流动?换句话说,我将如何使用 ImageFolder/DatasetFolder 和 DataLoader 在 pytorch 中创建图像堆栈数据集?我是否必须重新组织我的文件夹和类,或者当我为交叉验证进行拆分时更容易制作堆栈?

感谢您的时间和帮助!让我知道我是否可以提供更多信息。

标签: deep-learningconv-neural-networkpytorch

解决方案


我有一个非常相似的任务。我需要加载 3 张图像的随机序列作为批次的一个元素,以便不是在单独的图像上而是在图像序列上训练网络。对于批量大小 8,我有 8 x 3 = 24 张图像。在您的情况下,这似乎与不同的观点非常相似。我使用了 skimage.io 的 imread_collection 功能。我在 Dataset 类中添加了这样一个getitem :

def __getitem__(self, idx):
    idx_q = int(torch.randint(0 + self.boundary, self.length - self.boundary, (1,))) 
    
    q = imread_collection([self.image_paths[idx_q-1], self.image_paths[idx_q], self.image_paths[idx_q+1]], conserve_memory=True)
            
    if self.transform:
        q = torch.stack([self.transform(img) for img in q])

    return q, p, n

这里我生成一个图像的随机索引,然后使用 imread_collection 和 self.image_paths 加载三个连续的图像,这是包含所有图像路径的列表。然后我对每个图像进行转换并将它们堆叠起来。在您的情况下,您应该考虑使用正确的索引,也许通过在 self.image_paths 的长度上应用滑动窗口。

更多信息可以在火炬论坛上找到。我也试图询问并找到一个更优雅的解决方案,但无法成功地用这种方法训练模型。


推荐阅读