0

我想对我的数据应用skimage 的本地二进制模式特征提取,并且想知道在我的手电筒的变换中是否有可能这样做,现在如下:

data_transforms = {
    'train': transforms.Compose([
        transforms.CenterCrop(178),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
    ]),
    'val': transforms.Compose([
        transforms.CenterCrop(178),
        transforms.ToTensor(),
        transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
    ]),
}

如果没有,我将如何实施?导入数据时我必须这样做吗?

4

2 回答 2

1

您可以使用 lamdba 函数实现变换。正如@dhananjay 正确指出的那样。基于该评论,实施将如下:

def lbp(x):
    radius = 2
    n_points = 8 * radius
    METHOD = 'uniform'

    lbp = local_binary_pattern(x, n_points, radius, METHOD)
    return lbp

data_transforms = {
    'train': transforms.Compose([
        transforms.CenterCrop(178),
        transforms.RandomHorizontalFlip(),
        transforms.Lambda(lbp),
        transforms.ToTensor(),
        transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
    ]),
    'val': transforms.Compose([
        transforms.CenterCrop(178),
        transforms.Lambda(lbp),
        transforms.ToTensor(),
        transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
    ]),
}

但。这是一个坏主意,因为它违背了 pytorch 转换的目的。转换对于满足以下任一条件的操作是理想的。 1. 可以从原始数据中简单地计算(以低计算成本)。因此,将其应用于您的数据并存储副本没有任何好处。归一化就是这样一种变换。2. 在原始数据中引入随机性或随机扰动的元素。例如 RandomHorizo​​ntalFlip 等。

要记住的关键是,您的转换将在学习时在每个批次中应用于数据集。

考虑到上述情况,您绝对不想将 lbp 实现为转换。最好离线计算并存储。否则,您将显着减慢批处理加载速度。

于 2019-12-18T08:04:23.713 回答
0

您可以使用torchvision.transforms.Lambda
它允许您将自定义 lambda 函数用作转换。

就像是transforms.Lambda(lambda x: local_binary_pattern(x))

于 2019-12-18T04:00:17.087 回答