我正在使用以下代码在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, cv::Size(300, 300),
cv::Scalar(127.5, 127.5, 127.5),
false, 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
发生此错误的原因是您尝试将a打印cv::Mat
到具有2个以上尺寸的标准输出中。使用cv::dnn
,使用后的输出net.forward()
为4维。但是我不知道您使用的是哪种模型,因为blob的输出结构根据您要执行的任务而有所不同。如果我不得不猜测,考虑到变量名的选择,您正在进行某种对象检测。在这种情况下,通常第一维是批处理大小,并且由于仅使用一个图像,因此批处理大小为1。第二维是输出中的通道数。当您在图像上进行对象检测时,其大小也将为1。第三个和第四个维度是最终输出层的行数和列数。
坚持下去,您可以执行以下操作来提取此版本的2D版本cv::Mat
以打印到标准输出:
cv::Mat output(detections.size[2], detections.size[3], CV_32F, detection.ptr<float>());
现在,这是一个2D矩阵,您可以改为打印出来std::cout << output << std::endl;
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句