【问题标题】:Assertion Failed (Layer_sizes!=0) CvANN_MLP::predict断言失败 (Layer_sizes!=0) CvANN_MLP::predict
【发布时间】:2015-07-08 13:44:40
【问题描述】:

我正在尝试使用我已经制作的 .xml 文件的分类功能对我的输入图像进行分类。 这是用人工神经网络(ANN)训练 我不知道出了什么问题 我正在尝试完全像“opencv 实用项目”这本书一样编写代码 本书的完整代码可在 github 中找到: https://github.com/MasteringOpenCV/code/tree/master/Chapter5_NumberPlateRecognition

从技术上讲,我用自己的方式从全图中提取数字段 我创建了 ocr.xlm 文件。

我真的不知道为什么当我尝试对输入分段图像(Mat 输入数组)进行分类时,我看到错误:Assertion Failed (Layer_sizes!=0) CvANN_MLP::predict

这是我的代码

char const strCharacters[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
int const numCharacters = 9;
CvANN_MLP ann;


void train(Mat TrainData, Mat classes, int nlayers){

    FileStorage fs;
    fs.open("OCR.xml", FileStorage::READ);
    Mat trainData;
    fs["TrainingData"] >> trainData;
    fs["classes"] >> classes;


    Mat layers(1, 3, CV_32SC1);

    layers.at<int>(0,0) = TrainData.cols;//input layer
    layers.at<int>(1,0) = nlayers;//hidden layer
    layers.at<int>(2,0) = numCharacters;//output layer
    int buffer[] = { trainData.cols, 16, numCharacters };
    ann.create(layers, CvANN_MLP::SIGMOID_SYM, 1, 1);
    //Prepare trainClases
    //Create a mat with n trained data by m classes
    Mat trainClasses;
    trainClasses.create(TrainData.rows, numCharacters, CV_32F);
    for (int i = 0; i < trainClasses.rows; i++)
    {
        for (int k = 0; k < trainClasses.cols; k++)
        {
            //If class of data i is same than a k class
            if (k == classes.at<int>(i))
                trainClasses.at<float>(i, k) = 1;
            else
                trainClasses.at<float>(i, k) = 0;
        }
    }

    Mat weights(1, TrainData.rows, CV_32FC1, Scalar::all(1));

    //Learn classifier
    ann.train(TrainData, trainClasses, weights);
}


int classify(Mat f){

    float result = -1;
    Mat output(1, numCharacters, CV_32FC1);
    ann.predict(f, output);
    Point maxLoc;
    double maxVal;
    minMaxLoc(output, 0, &maxVal, 0, &maxLoc);
    //We need know where in output is the max val, the x (cols) is the class.
    //  result = output.at < float >(0, 0);

    return maxLoc.x;
}

我在我的主代码中这样调用 calssify:

int character = classify(roiResized);

非常感谢您的帮助。有什么建议吗?

【问题讨论】:

    标签: opencv


    【解决方案1】:

    我知道这篇文章很旧,但答案可能对其他人有用。 在使用预测之前,您必须在神经网络中添加层。

    例如:

    // define the parameters for the neural network (MLP)
    
    // set the network to be 3 layer 256->10->10
    // - one input node per attribute in a sample
    // - 10 hidden nodes
    // - one output node per class
    
    int layers_d[] = { attributes_per_sample, 10,  number_of_classes};
    CvMat* layers = cvCreateMatHeader(1,3,CV_32SC1);
    cvInitMatHeader(layers, 1,3,CV_32SC1, layers_d);
    
    // create the network using a sigmoid function with alpha and beta
    // parameters 0.6 and 1 specified respectively (refer to manual)
    
    CvANN_MLP* nnetwork = new CvANN_MLP;
    nnetwork->create(layers, CvANN_MLP::SIGMOID_SYM, 0.6, 1);
    

    来源:https://github.com/arnaudgelas/OpenCVExamples/blob/master/NeuralNetwork/NeuralNetwork.cpp

    【讨论】:

    • 不幸的是,您的解决方案已经过时,您不应该向这里的任何人推荐使用 opencv 不再维护的 c-api。
    • 你的意思是转换 CvMat* 层 = cvCreateMatHeader(1,3,CV_32SC1);到 Mat* 层 = new Mat(1,3,CV_32SC1);例如?
    猜你喜欢
    • 2014-01-16
    • 2018-06-02
    • 2011-04-02
    • 2014-12-18
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    相关资源
    最近更新 更多