这里写自定义目录标题
torch::from_blob() 从Mat转成Tensor的问题
就在上午,我准备使用libtorch的torch::from_blob(),将cv::Mat 转成Tensor时,运行始终不通过,不觉地对自己的智商产生了怀疑(常有的事…)。遂,记录一下。
问题来源
首先,贴上问题代码:
//以灰度形式读取图片
cv::Mat img = cv::imread("/home/zdd/Documents/codes/seg_postprocess/test.jpg",0);
// img.convertTo(img, cv::CV_32FC1, 1.0f / 255.0f);
//打印尺寸 360,640,1
std::cout << img.rows <<" " << img.cols <<" " << img.channels() << std::endl;
//std::cout << img.type() <<std::endl;
int maxValue = *max_element(img.begin<u_char>(), img.end<u_char>());
int minValue = *min_element(img.begin<u_char>(), img.end<u_char>());
std::cout << maxValue << " " << minValue << std::endl;
torch::Tensor output = torch::from_blob(img.data, {1,360, 640,1}).toType(torch::kByte);
执行日志:
360 640 1
0
2 0
Segmentation fault (core dumped)
而当我把图片替换,并修改了尺寸之后(如下),结果又能通过了!!!WTF!
cv::Mat img = cv::imread("../b1d0a191-2ed2269e.jpg",0);
// img.convertTo(img, cv::CV_32FC1, 1.0f / 255.0f);
std::cout << img.rows <<" " << img.cols <<" " << img.channels() << std::endl;
std::cout << img.type() <<std::endl;
int maxValue = *max_element(img.begin<u_char>(), img.end<u_char>());
int minValue = *min_element(img.begin<u_char>(), img.end<u_char>());
std::cout << maxValue << " " << minValue << std::endl;
torch::Tensor output = torch::from_blob(img.data, {1,720, 1280,1}).toType(torch::kByte);
哦豁,这究竟时为啥呢?
查阅资料中…
2021.10.29
Segmentation fault (core dumped) ,导致此错误的原因主要有3个,分别是:
-
数组超出范围
-
修改了只读内存
-
递归没有终止条件
这里没有递归,也没有修改只读内存,所以只能是数组越界,但是尺寸明明是匹配的啊…
(我人麻了)
解决方案
重点来了,当我在查找解决方案时,发现了有人整理的libtorch常用的api
里头又关于torch::from_blob的说明中有一句:
随即我就将tpye 改为torch::kFloat32,结果就通过了??????????????WTF?
查阅资料中…