我使用本教程训练了 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()
。
slice
可能有帮助,但我无法找出解决方案。
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;
}