错误:-215:声明失败cv :: dnn中的函数'FormattedImpl'中的m.dims <= 2

问题描述

我正在使用以下代码在opencv dnn模块中加载预训练的TensorFlow模型-

cv::dnn::Net net = cv::dnn::readNetFromTensorflow("frozen_inference_graph.pb","graph.pbtxt");

net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA); //Run model on GPU
net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);

Mat image = imread("img.jpeg");
Mat resized;
cv::resize(image,resized,cv::Size(300,300));
cout<<resized.size()<<endl;
cout<<"Resized"<<endl;
auto input_image = dnn::blobFromImage(image,1.0,300),cv::Scalar(127.5,127.5,127.5),false,CV_32F);
cout<<"Now setting Input";
net.setInput(input_image);
auto detections = net.forward();
cout<<detections;
return 0;

但是我遇到了问题中提到的以下错误-

what():  OpenCV(4.4.0) /home/atharva/opencv-4.4.0/modules/core/src/out.cpp:87: error: (-215:Assertion Failed) m.dims <= 2 in function 'FormattedImpl'

有人可以指出错误是什么吗?我相信BlobFromImage中存在一些问题,因为打印后什么也没有。 TIA

解决方法

发生此错误的原因是,您试图将cv::Mat打印到二维输出的标准输出中。对于cv::dnn,使用net.forward()之后的输出是4维的。但是我不知道您使用的是什么模型,因为blob的输出结构根据您要执行的任务而有所不同。如果我不得不猜测,考虑到变量名的选择,您正在进行某种对象检测。在这种情况下,通常第一维是批处理大小,并且由于您仅使用一个图像,因此批处理大小为1。第二维是输出中的通道数。在图像上进行对象检测时,其大小也将为1。第三个和第四个维度是最终输出层的行数和列数。

坚持下去,您可以提取此cv::Mat的2D版本,以执行以下操作以打印到标准输出:

cv::Mat output(detections.size[2],detections.size[3],CV_32F,detection.ptr<float>());

现在这是一个2D矩阵,您可以执行std::cout << output << std::endl;来打印出来。