【发布时间】:2021-04-05 00:58:47
【问题描述】:
我想将 cv::Mat 类转换为 torch::Tensor 类,并将它们放入 libtorch 的 CNN 模块中进行预测。我应该如何将 Mat 类转换为 Tensor 类?我的 CNN 模块是使用 mnist 训练集生成的 pt 文件。这个mnist训练集的训练图像是单通道灰度图像。如果我要测试,它应该加载一个灰度图,所以我想将单通道灰度图转换为张量。我使用的语言是c++。
【问题讨论】:
我想将 cv::Mat 类转换为 torch::Tensor 类,并将它们放入 libtorch 的 CNN 模块中进行预测。我应该如何将 Mat 类转换为 Tensor 类?我的 CNN 模块是使用 mnist 训练集生成的 pt 文件。这个mnist训练集的训练图像是单通道灰度图像。如果我要测试,它应该加载一个灰度图,所以我想将单通道灰度图转换为张量。我使用的语言是c++。
【问题讨论】:
想法是将内存从 cv::Mat 对象复制到 torch::Tensor 对象:
cv::Mat img =cv::imread("path/to/file.png");
cv::cvtColor(img,img,cv::COLOR_BGR2GRAY);
torch::Tensor tensor = torch::empty({img.cols,img.rows},torch::TensorOptions().dtype(torch::kUInt8));
memcpy(tensor.data<void>(),img.data,img.rows*img.cols);
【讨论】:
感谢您的帮助。最后,我找到了解决方案。之前,我对张量类了解不多。一个张量有四个元素,分别是图片的个数、高度、宽度和字节深度。
std::string p1 = "D:";
std::string p2;
std::cin >> p2;
std::string p3 = ".png";
std::string path = p1 + p2 + p3;
cv::Mat image = cv::imread(path,cv::IMREAD_GRAYSCALE);
torch::Tensor img_tensor = torch::from_blob(image.data, { 1, image.rows, image.cols, 1 }, torch::kByte);
img_tensor = img_tensor.permute({ 0, 3, 1, 2 });
img_tensor = img_tensor.toType(torch::kFloat);
img_tensor = img_tensor.div(255);
auto a = net->predict(img_tensor);
std::cout << a.argmax() << std::endl;
【讨论】:
我使用这种组合将 openCV 图像转换为 libtorch 的张量。 我使用 libtorch-cxx11-abi-shared-with-deps-1.10.0+cu102 和 C++ STANDARD 14。
cv::Mat image = cv::imread("test.jpeg")// Any image to load...
cv::Mat input; // Conversion of image in to color format or any format [1].
cv::cvtColor(image, input, cv::COLOR_RGBGRAY);
//cv::cvtColor(image, input, cv::COLOR_BGR2RGB); //or for color
std::cout << "Check image dimentions" <<std::endl; // Check conversion
std::cout << "pixel dim x: "<<input.rows<< std::endl;
std::cout << "pixel dim x: "<<input.cols<< std::endl;
//Image to tensor conversion.
torch::Tensor tensor_image = torch::from_blob(input.data, {1, input.rows, input.cols, 3}, torch::kByte);
//Permute data structure to Tensor format.
tensor_image = tensor_image.permute({0, 3, 1, 2});
tensor_image = tensor_image.toType(torch::kFloat);
tensor_image = tensor_image.div(255);
//load to CUDA device if need...
tensor_image = tensor_image.to(torch::kCUDA);
std::cout<<"Img to Tensor converted!"<<std::endl;
[1]https://docs.opencv.org/3.4/d8/d01/group__imgproc__color__conversions.html
【讨论】: