У меня были некоторые трудности с получением предварительно обученного днн для набора данных iNatualist для работы с моей программой. Когда я запускаю программу, используя примеры GoogL eNet .prototxt и .caffemodel, найденные здесь , программа работает нормально. Однако, когда я переключаюсь на использование файлов .pb и .pbtxt, найденных здесь .
, я получаю ошибку bad_allo c. Я пытался играть с разными размерами в функции blobFromImage, но это, похоже, ничего не делает. Я совершенно новичок в нейронных сетях в целом, и мне трудно найти что-нибудь, что могло бы объяснить, почему это происходит. Вот код для моей программы:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <thread>
#include <mutex>
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
static string network = "/home/userName/Desktop/Sentry/faster_rcnn_resnet101_fgvc_2018_07_19/frozen_inference_graph.pb";
static string config = "/home/userName/Desktop/Sentry/faster_rcnn_resnet101_fgvc_2018_07_19/fgvc_2854_classes_label_map.pbtxt";
static int grabFrame(void);
bool retrieveFrame(cv::InputOutputArray current_frame);
static std::mutex lock_video;
Mat image, blob;
Mat prob;
VideoCapture cam0;
vector<string> classes;
int main(int argc, char **argv)
{
cam0.open(0,cv::CAP_V4L2);
if(cam0.isOpened() == false)
{
puts("No camera found. Aborting \n");
return -1;
}
std::thread get_frame(grabFrame);
this_thread::sleep_for(chrono::milliseconds(100));
// dnn::Net iNat = dnn::readNet(network, config, "");
dnn::Net iNat = dnn::readNetFromTensorflow(network, config);
for(;;)
{
retrieveFrame(image);
resize(image, image, Size(), 2, 2); // Resize so smallest dim is at least 600
imshow("Frame", image);
waitKey(0);
dnn::blobFromImage(image, blob, 1.0, Size(600, 600), Scalar(), false, true, CV_32F);
iNat.setInput(blob);
prob = iNat.forward();
// Do some stuff with prob
}
return 0;
}
int grabFrame(void)
{
bool wasSuccess = true;
do
{
lock_video.lock();
wasSuccess = cam0.grab();
lock_video.unlock();
this_thread::sleep_for(chrono::milliseconds(8));
}while(wasSuccess);
puts("Thread 'grabFrame' ended for some reason; check camera connection \n");
return -1;
}
bool retrieveFrame(cv::InputOutputArray current_frame)
{
bool val;
lock_video.lock();
val = cam0.retrieve(current_frame);
lock_video.unlock();
return val;
}
Спасибо! Люк