Pytorch 在保持纵横比的同时调整特定维度的大小

问题描述 投票:0回答:1

我有图像,其中一些高度> =宽度,而其他高度Documentation),但是,我遇到了一个问题,我不知道如何使用库函数解决。

我有两种可能性,我可以提供两个整数,表示输出的大小,或者一个整数,表示调整大小后输出图像最小边的大小。

例如:image1 为 64x200 (HxW),而 image2 为 200x64。使用 resize(32, ..)(image) 调整大小将产生大小为 32x100 的 out_image1 和大小为 100x32 的 out_image2。但是,我希望第二张图片为 32x10。

那么我如何指定一个特定的维度,它要缩放到我指定的大小,而另一个总是隐式重新缩放同时保持纵横比?

编辑:所以我基本上解决了它,它需要我创建一个新的 Resize 实例,给它两个整数并要求我手动计算新的宽度。如果已经实施了更优雅的解决方案,我仍然很想知道。必须反复实例化 Resize 禁止我将我的 Dataset 类作为组合进行转换。相反,我必须直接在数据集getitem函数中实现调整大小转换,这使得它不太灵活,只需将我的数据集直接交给组合转换。

deep-learning pytorch neural-network transformation torchvision
1个回答
0
投票

您可以使用自定义变换,根据图像的纵横比调整图像的大小。此转换采用固定高度值并调整输入图像的大小。这是你应该如何进行的粗略模式。

import math
from torchvision.transforms import functional as F

class FixedHeightResize:
    def __init__(self, size):
        self.size = size
        
    def __call__(self, img):
        w, h = img.size
        aspect_ratio = float(h) / float(w)
        new_w = math.ceil(self.size / aspect_ratio)
        return F.resize(img, (self.size, new_w))

接下来,您可以使用它调整输入图像的大小,使其具有固定的 32 高度,同时保持纵横比。

img = Image.open("image.jpg")

transform = transforms.Compose([
    FixedHeightResize(32)
])

out_img = transform(img)
© www.soinside.com 2019 - 2024. All rights reserved.