在我的模型中使用Pytorch SSIM损失函数

问题描述 投票:2回答:2

我正在尝试使用this repo的SSIM丢失工具进行图像恢复。

作为作者GitHub上原始示例代码的参考,我尝试过:

model.train()
for epo in range(epoch):
    for i, data in enumerate(trainloader, 0):
        inputs = data
        inputs = Variable(inputs)
        optimizer.zero_grad()
        inputs = inputs.view(bs, 1, 128, 128)
        top = model.upward(inputs)
        outputs = model.downward(top, shortcut = True)
        outputs = outputs.view(bs, 1, 128, 128)

        if i % 20 == 0:
            out = outputs[0].view(128, 128).detach().numpy() * 255
            cv2.imwrite("/home/tk/Documents/recover/SSIM/" + str(epo) + "_" + str(i) + "_re.png", out)

        loss = - criterion(inputs, outputs)
        ssim_value = - loss.data.item()
        print (ssim_value)
        loss.backward()
        optimizer.step()

但是,结果没有达到我的预期。在前10个时期之后,打印的结果图像全部为黑色。

[loss = - criterion(inputs, outputs)由作者提出,但是,对于经典的Pytorch训练代码,该值为loss = criterion(y_pred, target),因此此处应为loss = criterion(inputs, outputs)

但是,我尝试了loss = criterion(inputs, outputs),但结果仍然相同。

任何人都可以分享有关如何正确利用SSIM损失的想法吗?谢谢。

python deep-learning pytorch image-segmentation ssim
2个回答
1
投票

作者正在尝试最大化SSIM值。对pytorch损失函数和优化器工作的自然了解是减少损失。但是SSIM值是质量度量,因此越高越好。因此,作者使用loss = - criterion(inputs, outputs)您可以改为尝试使用loss = 1 - criterion(inputs, outputs)paper中所述。修改后的代码(max_ssim.py),用于使用this repo

测试上述内容
import pytorch_ssim
import torch
from torch.autograd import Variable
from torch import optim
import cv2
import numpy as np

npImg1 = cv2.imread("einstein.png")

img1 = torch.from_numpy(np.rollaxis(npImg1, 2)).float().unsqueeze(0)/255.0
img2 = torch.rand(img1.size())

if torch.cuda.is_available():
    img1 = img1.cuda()
    img2 = img2.cuda()


img1 = Variable( img1,  requires_grad=False)
img2 = Variable( img2, requires_grad = True)

print(img1.shape)
print(img2.shape)
# Functional: pytorch_ssim.ssim(img1, img2, window_size = 11, size_average = True)
ssim_value = 1-pytorch_ssim.ssim(img1, img2).item()
print("Initial ssim:", ssim_value)

# Module: pytorch_ssim.SSIM(window_size = 11, size_average = True)
ssim_loss = pytorch_ssim.SSIM()

optimizer = optim.Adam([img2], lr=0.01)

while ssim_value > 0.05:
    optimizer.zero_grad()
    ssim_out = 1-ssim_loss(img1, img2)
    ssim_value = ssim_out.item()
    print(ssim_value)
    ssim_out.backward()
    optimizer.step()
    cv2.imshow('op',np.transpose(img2.cpu().detach().numpy()[0],(1,2,0)))
    cv2.waitKey()


0
投票

我正在将该ms_ssim的存储库用作损失函数;它产生奇怪的输出图像。首先,我将mse用作损失函数,产生了看起来不错的图像。但是,当使用ms_ssim作为损失函数时,它会生成中间有分散颜色的白色图像。我正在使用uscd bird数据集进行图像自动编码器。有什么主意吗?

© www.soinside.com 2019 - 2024. All rights reserved.