pytorch transforms.ToPILImage()与torchvision.utils.save_imag()结果不同

在复现模型过程中,发现由于使用transforms.ToPILImage()和torchvision.utils.save_image()进行图像转换的方式不同,导致保存的图片结果存在明显差异。关键在于transforms.ToPILImage()缺少了unnormalizing后的0.5偏移和值限制步骤,这影响了最终的像素值,从而造成结果不匹配。在源码中添加缺失的步骤后,两者可得到相同结果。
摘要由CSDN通过智能技术生成

复现模型时发现,和原始代码的结果始终不同。
排查后发现时transforms.ToPILImage()与torchvision.utils.save_imag()结果不同导致的

transforms.ToPILImage()的转换如下:

def save_img_from_tensor(tensor, path):
    tens = tensor.squeeze()
    trans = transforms.Compose([
        transforms.ToPILImage()
    ])
    img = trans(tens)
    img.save(path)

torchvision.utils.save_imag()的转换如下

def save_img_from_tensor(tensor,path):
    torchvision.utils.save_image(tensor.cpu(), path)

结果差异很明显
在这里插入图片描述

具体原因

torchvision.utils.save_imag()使用的方式是

darr = grid.mul(255).add_(0.5).clamp_(0, 255).permute(1, 2, 0).to('cpu', torch.uint8).numpy()

transforms.ToPILImage()使用的方式时

if pic.is_floating_point() and mode != 'F':
    pic = pic.mul(255).byte()
npimg = np.transpose(pic.cpu().numpy(), (1, 2, 0))

缺少了add_(0.5).clamp_(0, 255)
经过测试吗,如果在源码中加入,则两者生成完全一致
官方解释是:
Add 0.5 after unnormalizing to [0, 255] to round to nearest integer

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值