1

我正在尝试从我之前创建的张量中取回图像并将其可视化,但是,生成的图像似乎失真/垃圾。这就是我将 aCV_8UC3转换为相应的方法at::Tensor

at::Tensor tensor_image = torch::from_blob(img.data, { img.rows, img.cols, 3 }, at::kByte);

这就是我将其转换回图像的方式:

auto ToCvImage(at::Tensor tensor)
{
    int width = tensor.sizes()[0];
    int height = tensor.sizes()[1];
    try
    {
        cv::Mat output_mat(cv::Size{ height, width }, CV_8UC3, tensor.data_ptr<int>());
        return output_mat.clone();
    }
    catch (const c10::Error& e)
    {
        std::cout << "an error has occured : " << e.msg() << std::endl;
    }
    return cv::Mat(height, width, CV_8UC3);
}

这是原始图像的样子:

在此处输入图像描述

这就是我转换后得到的:

在此处输入图像描述

现在,如果我在创建张量期间使用at::kInt而不是:kByte

at::Tensor tensor_image = torch::from_blob(img.data, { img.rows, img.cols, 3 }, at::kByte);

我不再得到扭曲的图像!但是,网络输出将关闭,这意味着输入出现问题!

这里有什么问题,我应该怎么做?

4

1 回答 1

1

当使用 ac10::kByte为演员创建张量时,我们需要使用uchar而不是charoruint等​​。所以为了解决这个问题,我只需要使用uchar而不是int

auto ToCvImage(at::Tensor tensor)
{
    int width = tensor.sizes()[0];
    int height = tensor.sizes()[1];
    try
    {
        cv::Mat output_mat(cv::Size{ height, width }, CV_8UC3, tensor.data_ptr<uchar>());
        return output_mat.clone();
    }
    catch (const c10::Error& e)
    {
        std::cout << "an error has occured : " << e.msg() << std::endl;
    }
    return cv::Mat(height, width, CV_8UC3);
}

旁注:如果您使用任何其他类型创建了张量,请确保Tensor::totype()有效使用并事先转换为正确的类型。那是在我将此张量提供给我的网络之前,例如,我将其转换为KFloat 然后继续!这是一个很明显的点,很可能会被忽略并花费您数小时的调试时间!

于 2020-07-29T15:36:06.013 回答