簡體   English   中英

OpenCV:訓練SVM錯誤-斷言失敗

[英]OpenCV : Training SVM Error - Assertion failed

我正在編寫程序來使用SVM和BoW對對象進行分類。 嘗試使用TrainData :: create()成員函數創建訓練SVM分類器所需的數據時,出現以下錯誤。

OpenCV錯誤:setData中的斷言失敗(responses.type()== CV_32F || response.type()== CV_32S)

這是我的功能,用於從導演那里讀取火車數據,為每個火車圖像計算BoW直方圖,在矩陣中創建所有火車圖像的所有描述符的矩陣,並創建火車數據,標簽,然后訓練SVM

void trainClassifier(string dictionaryPath, string trainDataPath, string saveClassifierPath, int samples){

//Write file
FileStorage readFile(dictionaryPath, FileStorage::READ);

//Load into Dictionary matrix
readFile["Data"] >> dictionary;

if(dictionary.empty() == false)
{
    cout << "Error loading visual vocalbulary" << endl;
}

//Set the Bow descripter with the dictionary
testBOW.setVocabulary(dictionary);

//Inititate variables
vector<KeyPoint> keypointTrain;
vector<DMatch> matchTrain;
Mat descriptorTrain;

//inputTrain -> input images, inputFeatures -> BoW descriptor output
Mat inputTrain;
Mat inputFeatures;

//Label array
vector<string> label;

//Create a string to read files from directory
string updatedDataPath;

for(int i = 1; i <= samples; i++)
{
    //Update the string updateDataPath to correspond the image FILENAME with each iteration
    updatedDataPath.append(trainDataPath);
    updatedDataPath += to_string(i);
    updatedDataPath.append(".JPEG");

    //Read FILE from the updated datapath
    inputTrain = imread(updatedDataPath);

    //Convert to single channel, since classifier takes only single channel data
    cvtColor(inputTrain, inputTrain, CV_BGR2GRAY);

    //Generate BoW features/histogram for the train image
    testBOW.compute(inputTrain, keypointTrain, inputFeatures);

    //Load the data in the descriptor Matrix
    descriptorTrain.push_back(inputFeatures);

    //Generate label according to the sample
    if(samples > 1 && samples <= 10)
    {
        label.push_back("OBJ1 POSSITIVE");
    }
    else if (samples > 11 && samples <= 20)
    {
        label.push_back("OBJ1 NEGATIVE");
    }

    //Reset data path
    updatedDataPath.clear();
}

//Convert the descriptor matrix into 32-pt float to make it compatible with classifier
if(descriptorTrain.type() != CV_32F)
{
    descriptorTrain.convertTo(descriptorTrain, CV_32F);
}

//Create train data using TrainData::create()
Ptr<TrainData> trainData = TrainData::create(descriptorTrain, ROW_SAMPLE, label);
//Iniitialize Support vector based classifier (SVM) to classify and detect object
Ptr<SVM>SVM = SVM::create();
SVM->setType(SVM::C_SVC);
SVM->setKernel(SVM::LINEAR);
SVM->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));

//Now train the SVM
SVM->trainAuto(trainData);
SVM->save(saveClassifierPath);

cout << "Classifier training status: SUCCESSFUL" << endl;}

任何幫助表示贊賞。 謝謝和歡呼:)

您正在使用vector<string>作為TrainData響應。

//Label array
vector<string> label;

// [long code]

//Create train data using TrainData::create()
Ptr<TrainData> trainData = TrainData::create(descriptorTrain, ROW_SAMPLE, label);

如錯誤CV_32S ,它應該是Mat CV_32FCV_32S

您可以通過以下方式確認:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM