2017-02-23 8 views
2

を失敗した私は、単純なデータで試したと私はエラーを取得すると言う:OpenCV Error : asserion failed ((unsigned)(i1 *datatype<_tp>::channels)) < unsigned(size.p[1]* channels())) in cv::mat::atANN OpenCVのエラーアサーションが、私は 、QTでOpenCVの持つシンプルなANNのネットワークを作り、もっと後でそれを開発しようとしている

ここでのコード私はです

#include <iostream> 
#include <opencv2/ml.hpp> 
#include <opencv/cv.h> 
#include <opencv2/core.hpp> 
#include <opencv2/imgcodecs.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include "nnet.h" 
using namespace std; 
using namespace cv; 


int main() 
{ 
string filename="data.csv"; 
Ptr<cv::ml::TrainData> tdata =  cv::ml::TrainData::loadFromCSV(filename,0,-1,-1); 

Mat trainData = tdata->getTrainSamples(); 
Mat trainLabels = tdata->getTrainResponses(); 
int numClasses = 3; 

Mat hot(trainLabels.rows, numClasses, CV_32F, 0.0f); 

for (int i=0; i<trainLabels.rows; i++) { 
     int id = (int)trainLabels.at<float>(i); 
     hot.at<float>(i, id) = 1.0f; 
} 

    int input_neurons = 5; 
    int hidden_neurons = 5; 
    int output_neurons = 3; 

    Mat layerSizes = Mat(3, 1, CV_32SC1); 
    layerSizes.row(0) = Scalar(input_neurons); 
    layerSizes.row(1) = Scalar(hidden_neurons); 
    layerSizes.row(2) = Scalar(output_neurons); 

    Ptr<cv::ml::ANN_MLP> myNetwork = cv::ml::ANN_MLP::create(); 

    myNetwork->setLayerSizes(layerSizes); 
    myNetwork->setTrainMethod(ml::ANN_MLP::SIGMOID_SYM); 
    myNetwork->setTermCriteria(TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 1000, 0.00001f)); 
    myNetwork->setTrainMethod(ml::ANN_MLP::BACKPROP,0.1f,0.1f); 
    myNetwork->setActivationFunction(ml::ANN_MLP::SIGMOID_SYM, 1, 1); 

    myNetwork->train(trainData, 0, hot); 

    string testfilename="test-data.csv"; 

    Ptr<cv::ml::TrainData> testdata = cv::ml::TrainData::loadFromCSV(testfilename, 0,0,-1); 

     Mat testData = testdata->getTrainSamples(); 
     Mat testLabels = testdata->getTrainResponses(); 
     Mat testResults; 

     myNetwork->predict(testData, testResults); 
     float accuracy = float(countNonZero(testResults == testLabels))/testLabels.rows; 
     printf("%f",accuracy); 

return 0; 
} 

と私は

data.csvが

1,2,3,7,2 
7,1,7,7,5 
9,7,5,3,2 
12,21,32,71,8 
012が含まれている必要があり、データセットのために書きました

およびデータのtest.CSVは含まれています

1,2,1,1,2, 
9,1,2,12,5, 
11,28,14,50,8, 
3,1,2,12,5, 
11,28,24,20,8, 

あなたの助けを事前に感謝します。

答えて

0

私は3つのクラスを持っており、応答値は[0..2]とする必要があります。私は乱数5と8を与えて、この問題を解決しました。

+0

質問を編集して見つけた解決策を最後に追加することをお勧めします。 – Samer

関連する問題