【问题标题】:Apply preprocessing to the dataset对数据集应用预处理
【发布时间】:2023-04-04 19:33:02
【问题描述】:

我正在用 pytorch 实现一篇关于图像分割的论文。我需要做一些预处理步骤,但因为我是第一次尝试,所以我无法将它们合并到传统的管道中。 以下是预处理步骤-

1) N(w, h) = I(w, h) - G(w, h), (1) 其中 N 是归一化图像,I 是原始图像,G 是高斯模糊图像,内核大小为 65*65,均值为 0,标准差为 10。

2)对平均图像进行归一化,并将每个像素除以平均标准差。

以下是上述步骤的代码 sn-p-

def gaussian_blur(img):
    image = cv2.GaussianBlur(image,(65,65),10)
    new_image = img - image
return image

def normalise(img):
    img_normalised = np.empty(img.shape)
    img_std = np.std(img)
    img_mean = np.mean(img)
    img_normalized = (img-img_mean)/imgs_std

    for i in range(img.shape[1]):
        img_normalized[i] = (img_normalized - 
         np.mean(img_normalized))/np.std(img_normalized)
return img_normalized

我真的不知道如何在传统的 pytorch 数据加载器管道中添加上述函数,比如首先我应该使用 ImageFolder 加载数据集,然后应用或先应用然后使用 ImageFolder 方法。

【问题讨论】:

  • 我现在懒得提供工作代码,但您可以阅读有关 Generic Transforms 的信息以轻松完成。
  • 正如@Berriel 所说,通用转换工作正常,但我也向您推荐imgaug。您可能会在那里找到一些有用的代码。
  • @Berriel 关于如何为多个表达式编写 lambda 函数的任何想法,因为我的高斯模糊函数有 2 个表达式,我想了很久但无法弄清楚。
  • @Mark 如果您查看transforms.Lambda(...) 的代码,您会注意到您可以传递任何可调用对象。将您的转换包装在一个函数中并传递它。它应该可以工作。

标签: python-3.x deep-learning pytorch image-preprocessing


【解决方案1】:

我就是这样做的-

第一部分的解决方案是首先定义所需的函数,然后通过以下方式使用通用转换调用转换-

def gaussian_blur(img):
   image = np.array(img)
   image_blur = cv2.GaussianBlur(image,(65,65),10)
   new_image = image - image_blur
   im = Image.fromarray(new_image)
return im

第二部分的解决方案是遍历每个图像并计算均值和标准偏差,然后最终在变换中调用均值和标准偏差值。-

   train_mean = []
   train_std = []

   for i,image in enumerate(train_loader,0):
       numpy_image = image[0].numpy()
       batch_mean = np.mean(numpy_image, axis=(0, 2, 3))
       batch_std = np.std(numpy_image, axis=(0, 2, 3))

       train_mean.append(batch_mean)
       train_std.append(batch_std)

   train_mean = torch.tensor(np.mean(train_mean, axis=0))
   train_std = torch.tensor(np.mean(train_std, axis=0))

    print('Mean:', train_mean)
    print('Std Dev:', train_std)

最终的转换调用看起来像这样-

data_transforms = transforms.Compose([transforms.RandomCrop(512,512),
                                 transforms.Lambda(gaussian_blur),
                                 transforms.RandomRotation([+90,+180]),
                                 transforms.RandomRotation([+180,+270]),
                                 transforms.RandomHorizontalFlip(),
                                 transforms.ToTensor(),
                                 transforms.Normalize(mean=train_mean, std=train_std)
                               ])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 2023-03-15
    • 2019-09-21
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多