Запуск iNaturalist .pb в OpenCV - PullRequest
       37

Запуск iNaturalist .pb в OpenCV

0 голосов
/ 16 февраля 2020

У меня были некоторые трудности с получением предварительно обученного днн для набора данных 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;
}

Спасибо! Люк

...