Как решить это исключение нарушения доступа OpenCV.dnn Net.forward()?

#c #opencv #deep-learning #caffe

#c #opencv #глубокое обучение #caffe

Вопрос:

При использовании функции переадресации OpenCV ::dnn ::Net возникает исключение нарушения доступа.

 std::string m_pathCaffeModel;
std::string m_pathConfig;
m_pathCaffeModel = "model.caffemodel";
m_pathConfig = "model.prototxt";
cv::dnn::Net m_net;
m_net = cv::dnn::readNetFromCaffe(m_pathConfig, m_pathCaffeModel);
cv::Mat blob; 
cv::dnn::blobFromImage(resized, blob, 1.0, cv::Size(), cv::Scalar(), false, false, CV_32F);
m_net.setInput(blob);
m_net.forward();
 

Когда я вызываю net.forward(), я получаю следующую ошибку:

Исключение, вызванное 0x00007FFD2C1B12DE (vcruntime140.dll ) в my_exe.exe : 0xC0000005: Местоположение чтения с нарушением доступа 0x000001C521201000

Я проверил печать входного изображения (называемого «измененным размером» в коде), и это выглядит хорошо. Его размеры и данные также выглядят корректно.

входные данные изображения (называемые измененными)

Для меня большой двоичный объект выглядит подозрительно, потому что в нем -1 строка и -1 столбец. Я не знаю, является ли это проблемой. большой двоичный объект

Модель принимает 3-канальные изображения размером 40×40.

У кого-нибудь есть предложения о том, в чем причина проблемы и как ее исправить?

Комментарии:

1. Все большие двоичные объекты имеют cv::Mat::cols значение и cv::Mat::rows , -1 поскольку входные размеры сети могут быть представлены не в 2D.

Ответ №1:

Используя C и OpenCV ::dnn::Net, необходимо определить некоторые дополнительные настройки:

 net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
 

(приведенное выше для вывода процессора)

с этими двумя строками перед net.forward() ошибка исчезает, и она работает.

Комментарии:

1. у меня не сработало..