对数据集应用预处理
Apply preprocessing to the dataset
我正在用 pytorch 实现图像分割的论文。我需要做一些预处理步骤,但由于我是第一次尝试,所以我无法将它们合并到传统管道中。
以下是预处理步骤-
1) N(w, h) = I(w, h) − G(w, h), (1)
其中N为归一化图像,I为原始图像,G为核大小为65*65,均值为0,标准差为10的高斯模糊图像。
2)归一化平均图像并将每个像素除以平均标准差。
以下是上述步骤的代码片段-
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
方法。
我是这样做的-
第一部分的解决方案是首先定义所需的函数,然后按以下方式使用通用转换调用转换-
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)
])
我正在用 pytorch 实现图像分割的论文。我需要做一些预处理步骤,但由于我是第一次尝试,所以我无法将它们合并到传统管道中。
以下是预处理步骤-
1) N(w, h) = I(w, h) − G(w, h), (1) 其中N为归一化图像,I为原始图像,G为核大小为65*65,均值为0,标准差为10的高斯模糊图像。
2)归一化平均图像并将每个像素除以平均标准差。
以下是上述步骤的代码片段-
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
方法。
我是这样做的-
第一部分的解决方案是首先定义所需的函数,然后按以下方式使用通用转换调用转换-
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)
])