我训练了一个 keras 模型,然后使用 mmdnn 将其转换为pytorch。然后我尝试在 c++ 代码中使用它:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <torch.h>
int main()
{
cv::Mat image;
image= cv::imread("test_img.png", cv::IMREAD_GRAYSCALE); // Read the file
try
{
torch::jit::script::Module module;
module = torch::jit::load("my_model.pth");
torch::IntArrayRef input_dim = std::vector<int64_t>({ 1, 2, 256, 256});
cv::Mat input_img;
image.convertTo(input_img, CV_32FC3, 1 / 255.0);
torch::Tensor x = torch::from_blob(input_img.data, { 1, 2, 256, 256 }, torch::kFloat);
torch::NoGradGuard no_grad;
auto output = module.forward({ x });
float* data = static_cast<float*>(output.toTensor().data_ptr());
cv::Mat output_img = cv::Mat(256, 256, CV_32FC3, data);
cv::imwrite("output_img.png", output_img);
}
catch (std::exception &ex)
{
std::cout << "exception! " << ex.what() << std::endl;
}
return 0;
}
作为启动的结果,收到了一个异常:
例外!isTensor() INTERNAL ASSERT FAILED at E:\20B\pytorch\pytorch\aten\src\ATen/core/ivalue_inl.h:112,请向 PyTorch 报告错误。预期张量但得到元组(toTensor at E:\20B\pytorch\pytorch\aten\src\ATen/core/ivalue_inl.h:112)(没有可用的回溯)
float* data = static_cast<float*>(output.toTensor().data_ptr());调用toTensor(). _ 如果改为使用toTuple(),则生成的对象没有data_ptr()我需要获取包含神经网络响应的数据的方法(然后将其放入opencv图片中以稍后保存)。
如何仍然从神经网络的响应中提取图片?
在这种情况下,神经网络响应包含一个 blob 数组(元组),因此要将它们提取为张量,您需要使用以下调用:
现在在具有两个神经网络响应的变量
t0和张量中。t1