将 dlib::array2d<dlib::rgb_pixel> 转换为 torch::Tensor

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

我使用本教程训练了 torch 模型并将 pth 转换为脚本模块。然后我制作了自定义 C++ 项目就像这里

修改此示例以输入如下张量:

const std::vector<torch::jit::IValue> inputs(1, torch::ones({1, 3, inputSize, inputSize}));
auto output = module.forward(inputs).toTensor();
std::cout << "raw output: " << output << '\n'
          << "soft max: " << torch::softmax(output, 1)
          << '\n';

NB1

inputSize
大约 128 或 256 像素(导出模块很少)。这个输入有效

现在我有了像

dlib::array2d<dlib::rgb_pixel>
这样的dlib图像。我尝试加载 blob 数据:

at::Tensor convert(const dlib::array2d<dlib::rgb_pixel> & img)
{
    auto options = torch::TensorOptions().dtype(torch::kUInt8);
    std::vector<int64_t> dims = {1, 3, img.nr(), img.nc()};
    auto t = torch::from_blob((void*)img.begin(), dims/*, options*/).clone();

    return t;
}

但是如果我计算出结果张量,有几个数字为 1e+38 或 1e+40;通过模型转发后的结果我在

nan
中有
module.forward(tensorFromConverFunction).toTensor()

NB2也许一些

slice
可能有帮助,但我无法找出解决方案。

c++ torch dlib
1个回答
0
投票
at::Tensor convert(const dlib::array2d<dlib::rgb_pixel> & img)
{
    const auto height = img.nr();
    const auto width = img.nc();
    auto tensor = at::zeros({1, 3, height, width});

    for (int y = 0; y < height; ++y)
    {
        for (int x = 0; x < width; ++x)
        {
            tensor[0][0][y][x] = img[y][x].blue;
            tensor[0][1][y][x] = img[y][x].green;
            tensor[0][2][y][x] = img[y][x].red;
        }
    }

    return tensor;
}
© www.soinside.com 2019 - 2024. All rights reserved.