Pytorch и увеличение данных: как увеличить данные с помощью размытия, вращения и т. Д. - PullRequest
0 голосов
/ 06 августа 2020

Я хочу увеличить данные с помощью Pytorch, но я не очень хорошо знаю библиотеки:

Я пробовал это:

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


data_transforms = {
    'train': transforms.Compose([
        transforms.RandomRotation([-8,+8]),
        transforms.Lambda(gaussian_blur),
        transforms.ColorJitter(brightness=0, contrast=0.4, saturation=0, hue=0),
        transforms.Compose([transforms.Lambda(lambda x : x + torch.randn_like(x))]),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.RandomRotation([-8,+8]),
        transforms.Lambda(gaussian_blur),
        transforms.ColorJitter(brightness=0, contrast=0.4, saturation=0, hue=0),
        transforms.Compose([transforms.Lambda(lambda x : x + torch.randn_like(x))]),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

Потому что эффекты, которые я хочу сделать являются: gaussian blur/rotation/contrast/gamma+random noise

Но у меня есть ошибки, учитывающие несколько аспектов, например, размер изображений не совпадает.

Есть предложения?

1 Ответ

0 голосов
/ 06 августа 2020

Если входные изображения имеют разные размеры, у вас есть разные варианты в зависимости от вашего проекта. Например, вы можете просто изменить размер изображения, используя transforms.Resize((w, h)) или transforms.CenterCrop((w, h)). Есть несколько вариантов изменения размера ваших изображений, чтобы все они имели одинаковый размер, см. документацию .

Кроме того, вы можете создавать свои собственные преобразования вместо использования Lambda. Вы могли бы сделать что-то вроде этого

def GaussianBlur(torch.nn.Module):
    def __init__(self, kernel_size, std_dev):
        self.kernel_size = kernel_size
        self.std_dev = std_dev

    def forward(self, img):
        image = np.array(img)
        image_blur = cv2.GaussianBlur(image, self.kernel_size, self.std_dev)
        return Image.fromarray(image_blur)


data_transforms = {
    'train': transforms.Compose([
        transforms.CenterCrop(416),
        transforms.RandomRotation([-8,+8]),
        GaussianBlur((65, 65), 10),
        transforms.ColorJitter(brightness=0, contrast=0.4, saturation=0, hue=0),
        transforms.ToTensor(),
        transforms.Lambda(lambda x : x + torch.randn_like(x)),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.CenterCrop(416),
        transforms.RandomRotation([-8,+8]),
        GaussianBlur((65, 65), 10),
        transforms.ColorJitter(brightness=0, contrast=0.4, saturation=0, hue=0),
        transforms.ToTensor(),
        transforms.Lambda(lambda x : x + torch.randn_like(x)),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

Я удалил бесполезный Compose внутри Compose и в этом примере использовал CenterCrop для получения изображения 416 x 416. Если у вас есть другие ошибки, возможно, их стоит опубликовать.

...