【问题标题】:pytorch 4d numpy array applying transfroms inside custom datasetpytorch 4d numpy 数组在自定义数据集中应用转换
【发布时间】:2020-10-06 09:08:48
【问题描述】:

在我的自定义数据集中,我想将transforms.Compose() 应用于 NumPy 数组。

我的图像采用 NumPy 数组格式,形状为 (num_samples, width, height, channels)

如何将以下转换应用于完整的 numpy 数组?

img_transform = transforms.Compose([ transforms.Scale((224,224)), transforms.ToTensor(), transforms.Normalize([0.46, 0.48, 0.51], [0.32, 0.32, 0.32]) ])

我的尝试以多个错误结束,因为转换接受 PIL 图像而不是 4 维 NumPy 数组。

from torchvision import transforms
import numpy as np
import torch

img_transform = transforms.Compose([
        transforms.Scale((224,224)),
        transforms.ToTensor(),
        transforms.Normalize([0.46, 0.48, 0.51], [0.32, 0.32, 0.32])
    ])

a = np.random.randint(0,256, (299,299,3))
print(a.shape)

img_transform(a)

【问题讨论】:

    标签: pytorch torchvision


    【解决方案1】:

    所有的 torchvision 变换都对单个图像进行操作,而不是批量图像,因此不能使用 4D 数组。

    以 NumPy 数组形式提供的单个图像(如您的代码示例中所示)可以通过将它们转换为 PIL 图像来使用。您可以简单地将transforms.ToPILImage 添加到转换管道的开头,因为它将张量或 NumPy 数组转换为 PIL 图像。

    img_transform = transforms.Compose([
            transforms.ToPILImage(),
            transforms.Resize((224,224)),
            transforms.ToTensor(),
            transforms.Normalize([0.46, 0.48, 0.51], [0.32, 0.32, 0.32])
        ])
    

    注意:transforms.Scale 已被弃用,取而代之的是 transforms.Resize

    在您的示例中,您使用了np.random.randint,默认情况下使用 int64 类型,但图像必须是 uint8。加载图像时,OpenCV 等库会返回 uint8 数组。

    a = np.random.randint(0,256, (299,299,3), dtype=np.uint8)
    

    【讨论】:

    • 谢谢,那么我应该对自定义数据集(4-d NumPy 数组)中的每个图像单独应用转换吗?我有几百万张图片(单独申请可能会变慢),你认为这是要走的路吗?
    • 如果您有一百万张图像,您应该在数据集的__getitem__ 中按需加载它们,然后将转换应用于单个图像。这样,当使用DataLoader 时,图像可以在后台工作人员中加载和转换,而不必在主进程中进行。
    • 谢谢,这是有道理的。所以,在__getitem__ 内部,一个图像的idx 将被传递,我可以在那里应用变换。据我所知,__getitem__ 使用数据集中的单个数据点,如果我没记错的话。
    • 是的,这是一张图片。但是我所说的按需加载图像的意思是,您只保留数据集中图像的路径,而不是内存中的所有图像,然后加载指定 id 的图像,然后应用转换。将一百万张图片保存在内存中可能会有问题,或者至少需要大量 RAM。
    • 感谢您的建议,就我而言,原始数据集是一个大的 NumPy 数组,好主意,也许我可以将它们恢复为图像以节省一些内存。不过,就我而言,我的 ram 似乎并不麻烦(128 gigs),除了我的训练是在 GPU 上进行的,所以加载完整的 NumPy 数组对我来说有点快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2018-09-17
    • 2020-02-18
    • 1970-01-01
    • 2022-01-20
    • 2019-09-30
    相关资源
    最近更新 更多