使用opencv加载的Torch Cyclegan模型无法输出所需的图像

时间:2019-01-17 18:28:29

标签: python opencv torch

我正在尝试在OpenCV中加载预先训练的割炬(.t7)模型。该模型是一个CycleGAN,它将马图像转换为斑马图像。该模型可以在这里找到:https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/models/

我已经使用了horse2zebra.t7和horse2zebra_cpu.t7模型,但是它们都返回平铺的黑白图像而不是斑马图像。

这是示例输入图像:

enter image description here

这是输出:

enter image description here

代码:

var myDate = new Date('2019-01-17T00:00:00.000-08:00');
console.log(myDate);
console.log(myDate.getDate()); // 17

1 个答案:

答案 0 :(得分:1)

有两件事错过了。第一个是model.forward()[0,:,:,:]返回3x256x256 3D Blob(平面图像,通道位于第二维)。但是OpenCV可以处理交错图像,因此您需要按np.transpose256x256x3来置换尺寸。

输出值范围也很重要。对于问题图像,我从[-0.832621, 0.891473]获得了值。我们需要将其标准化为Uint8类型的[0, 255]。全部由cv::normalize完成。

import cv2
import numpy as np

model = cv2.dnn.readNetFromTorch('./horse2zebra_cpu.t7')

image = cv2.imread('./images/1.jpg')

blob = cv2.dnn.blobFromImage(image, 1, (256, 256))
model.setInput(blob)

out = model.forward()[0,:,:,:]
out = cv2.normalize(out, dst=None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)

out = np.transpose(out, (1, 2, 0))

cv2.imshow('image', out)
cv2.waitKey(0)

cv2.imwrite('out.png', out)

请注意,原始框架可能具有不同的后处理程序。如果您可以比较OpenCV和Torch的输出,那就太好了。这是我从上面的脚本中获得的图像:

enter image description here