使用SVM和HOG特征对车辆进行分类

我的目标是使用SVM和HOG特征来区分SUV和轿车。

首先,我读取了86张训练图像,为每张图像计算HOG特征,并将它们放入一个名为HOGFeat_train的86xdescriptorSize大小的训练Mat中。

Mat HOGFeat_train(num_train_images, derSize, CV_32FC1); //86xdescriptor size training Matfor (int file_count = 1; file_count < (num_train_images + 1); file_count++) {    ss << name << file_count << type;       //'Vehicle_1.jpg' ... 'Vehicle_2.jpg' ... etc ...    string filename = ss.str();    ss.str("");    Mat training_img = imread(filename, 0);     //从文件夹中读取训练图像    HOGDescriptor hog_train;    vector<float> descriptors_train;    vector<Point> locations_train;    hog_train.compute(training_img, descriptors_train, Size(16, 16), Size(0, 0), locations_train); //对这些值不太确定    for (int i = 0; i < descriptors_train.size(); i++)        HOGFeat_train.at<float>(file_count-1, i) = descriptors_train.at(i);}

接下来,我为SVM的监督学习部分创建了一个包含86个标签的labels_mat(我知道这种方法不实用且耗时,我稍后会改进)。1表示SUV,-1表示轿车。我对这些SVM参数不太确定,但我尝试了不同的类型和值,但所有结果都相同。

float labels[86] = { 1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, -1, 1, -1};Mat labels_mat(num_train_images, 1, CV_32S);cout << "开始训练..." << endl;Ptr<SVM> svm = SVM::create();svm->setType(SVM::C_SVC);svm->setKernel(SVM::LINEAR);//svm->setDegree(3);//svm->setGamma(2);//svm->setC(.5);cout << "参数设置完成..." << endl;svm->train(HOGFeat_train, ROW_SAMPLE, labels_mat);cout << "训练成功" << endl;

接下来,我以与训练图像相同的方式读取10张测试图像,并再次计算HOG特征。计算HOG特征后,将它们放入1行x descriptorSized的HOGFeat_test Mat中,然后我对该HOGFeat_test Mat使用svm->predict方法,该方法应返回-1以表示轿车,或返回1以表示SUV。

    Mat HOGFeat_test(1, derSize, CV_32FC1); //创建一个1 x descriptorSize的Mat来存放测试图像的HOG特征for (int file_count = 1; file_count < (num_test_images + 1); file_count++){    ss2 << name2 << file_count << type2;        //'Test_1.jpg' ... 'Test_2.jpg' ... etc ...    string filename2 = ss2.str();    ss2.str("");    Mat test_image = imread(filename2, 0);          //读取文件文件夹    HOGDescriptor hog_test;    vector<float> descriptors_test;    vector<Point> locations_test;    hog_test.compute(test_image, descriptors_test, Size(16, 16), Size(0, 0), locations_test);    for (int i = 0; i < descriptors_test.size(); i++)        HOGFeat_test.at<float>(0, i) = descriptors_test.at(i);    namedWindow("测试图像", CV_WINDOW_NORMAL);    imshow("测试图像", test_image);    //如果是SUV应返回1,如果是轿车应返回-1    float result = svm->predict(HOGFeat_test);    if (result <= 0)        cout << "轿车" << endl;    else        cout << "SUV" << endl;    cout << "结果: " << result << endl;

下图显示了结果、一张测试图像以及HOGFeat_train Mat,以防对任何人有用。结果(轿车,-8.412e08)无论我使用什么值、参数或图像都始终相同。结果不是-1或1,而是-800000000000,我假设负值对应于-1,但最重要的是我想知道为什么结果没有变化。有人对此有任何见解吗?谢谢。 enter image description here

编辑—————————————-

我删除了float labels[86]中的所有1,只保留了float labels[86]; //{1, 1, -1, 等…}

这对SVM结果没有影响,仍然能够成功训练。这告诉我我的标签没有通过svm->train函数或其他什么。我将继续调查。


回答:

所以这只是我自己犯的一个愚蠢的错误。我用float labels[86];替换了标签。基本上我只是移除了SVM的监督学习部分,但我得到了完全相同的结果。经检查,我意识到我没有将标签填入labels_mat中!!!!

因此,执行以下操作会得到一个清晰的解决方案。此外,结果变为1和-1,而不是-8.412e-8。

Mat labels_mat(num_train_images, 1, CV_32S, labels);

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注