我在自定义svm中使用HOG。我使用了trainHOG 但是我的特征向量有2268个特征,get_svm_detector()给了我2269支持向量,这不给我错误,但是hog.detectMultiScale非常慢(~6 s),为什么?
使用svmLight我得到2268个支持向量,而hog.detectMultiScale大约需要64毫秒。
答案 0 :(得分:0)
我添加了代码:
Ptr<SVM> svm;
Ptr<TrainData> trainData = TrainData::loadFromCSV("./trainData.csv");
svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::LINEAR);
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, (int)1000, 1e-3));
svm->trainAuto(trainData,10,SVM::getDefaultGrid(SVM::C),SVM::getDefaultGrid(SVM::GAMMA),SVM::getDefaultGrid(SVM::P),SVM::getDefaultGrid(SVM::NU),SVM::getDefaultGrid(SVM::COEF),SVM::getDefaultGrid(SVM::DEGREE),true );
svm->save("model.yml");
在其他课程中:
HOGDescriptor hog;
Ptr<SVM> svm = StatModel::load<SVM>( "model.yml" );
vector< float > hog_detector;
// get the support vectors
Mat sv = svm->getSupportVectors();
const int sv_total = sv.rows;
// get the decision function
Mat alpha, svidx;
double rho = svm->getDecisionFunction(0, alpha, svidx);
CV_Assert( alpha.total() == 1 && svidx.total() == 1 && sv_total == 1 );
CV_Assert( (alpha.type() == CV_64F && alpha.at<double>(0) == 1.) ||
(alpha.type() == CV_32F && alpha.at<float>(0) == 1.f) );
CV_Assert( sv.type() == CV_32F );
hog_detector.clear();
hog_detector.resize(sv.cols + 1);
memcpy(&hog_detector[0], sv.ptr(), sv.cols*sizeof(hog_detector[0]));
hog_detector[sv.cols] = (float)-rho;
hog.setSVMDetector( hog_detector );
hog.detectMultiScale(img, detections, thresholdDetection, winStride, padding); // it take me about 6 s!!