【问题标题】:error: (-215:Assertion failed) m.dims <= 2 in function 'FormattedImpl' in cv::dnn错误:(-215:断言失败)m.dims <= 2 in function 'FormattedImpl' in cv::dnn
【发布时间】:2020-12-13 19:47:50
【问题描述】:

我正在使用以下代码在 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

【问题讨论】:

    标签: c++ opencv deep-learning object-detection opencv4


    【解决方案1】:

    出现此错误是因为您尝试将cv::Mat 打印到具有超过 2 维的标准输出。使用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 &lt;&lt; output &lt;&lt; std::endl; 打印出来。

    【讨论】:

    • 感谢您回复@rayryeng。我确实在尝试检测对象并正在加载预先训练的 mobilenet SSD。但是,除了最后一行,我没有在任何地方打印cv::Matcout&lt;&lt;Now setting Input 也没有被打印。另一方面,当我之前没有cout&lt;&lt;image 时,它确实打印到了标准输出(尽管它全为零我不知道为什么)..
    • 现在删除最后一行并运行工作,非常感谢@rayryeng。但是我仍然无法理解为什么'blobFromImage'之后的打印语句不起作用....
    • 请记住,cv::Mats 上的某些操作是异步的,因此它可能在完成其他所有操作之前就已经结束了。
    猜你喜欢
    • 2020-08-21
    • 2020-10-23
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2020-02-03
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多