내 목표는 SVM w/HOG 기능을 사용하여 세단 및 SUV에서 차량을 분류하는 것입니다.다른 매개 변수를 사용하여 내 SVM 모델을 테스트하면 똑같은 결과가 나타납니다.
필자는 다양한 커널 (RBF, LINEAR, POLY)을 사용했으며 각기 다른 결과를 주었지만 매개 변수가 변경 되더라도 동일한 결과를 제공합니다. 예를 들어 POLY 커널을 사용하고 학위가 .65보다 크거나 같으면 SUV로 모든 것을 분류합니다. 0.65 미만이면 모든 테스트 이미지를 세단으로 분류합니다.
LINEAR 커널에서 변경된 매개 변수는 C뿐입니다. 매개 변수 C가 무엇이든 관계없이 항상 8/10 이미지를 SUV로 분류하고 SUV로 분류 된 이미지를 얻습니다.
이제는 약 70 개의 교육 이미지와 10 개의 테스트 이미지 만 제공합니다.이 이미지를 사용하는 다리에서 볼 때 후방에서 차량의 좋은 데이터 세트를 찾을 수 없었습니다. 문제가이 작은 데이터 세트 또는 매개 변수 또는 다른 것 때문일 수 있습니까? 또한 70 개의 교육 이미지 중 58 개와 같이 지원 벡터가 대개 매우 높기 때문에 데이터 세트에 문제가있을 수 있습니다. 어떻게 든 훈련 점을 시각화 할 수있는 방법이 있습니까? SVM 예제에서 그들은 항상 점의 멋진 2D 플롯을 가지며 선을 그립니다. 그러나 이미지로 점을 그릴 수있는 방법이 있습니다. 내 데이터는 선형으로 분리 가능하며 그에 따라 조정할 수 있습니까? 내 호그 매개 변수가 자동차의 150x200 이미지에 대해 정확합니까?
또한 교육용 이미지와 동일한 테스트 이미지를 사용하면 SVM 모델이 완벽하게 예측되지만 명백히 부정 행위입니다.
은 다음 이미지는 결과를 보여 주며, 테스트 이미지 여기
의 예를 들어 내가 코드를 모르겠어요 때문에 내 코드, 나는 그것의 대부분을 포함하지 않았다이다 문제. 먼저 긍정적 인 이미지를 찍어 HOG 피쳐를 추출한 다음 Training Mat에로드 한 다음 포함 된 테스트 파트에서와 같은 방식으로 네거티브 이미지에 대해서도 동일하게 수행합니다. 나는 차량의 더 큰 데이터 세트를 가지고
1) :
//Set SVM Parameters (not sure about these values, but just wanna see something)
Ptr<SVM> svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::POLY);
svm->setC(50);
svm->setGamma(100);
svm->setDegree(.65);
//svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
cout << "Parameters Set..." << endl;
svm->train(HOGFeat_train, ROW_SAMPLE, labels_mat);
Mat SV = svm->getSupportVectors();
Mat USV = svm->getUncompressedSupportVectors();
cout << "Support Vectors: " << SV.rows << endl;
cout << "Uncompressed Support Vectors: " << USV.rows << endl;
cout << "Training Successful" << endl;
waitKey(0);
//TESTING PORTION
cout << "Begin Testing..." << endl;
int num_test_images = 10;
Mat HOGFeat_test(1, derSize, CV_32FC1); //Creates a 1 x descriptorSize Mat to house the HoG features from the test image
for (int file_count = 1; file_count < (num_test_images + 1); file_count++)
{
test << nameTest << file_count << type; //'Test_1.jpg' ... 'Test_2.jpg' ... etc ...
string filenameTest = test.str();
test.str("");
Mat test_image = imread(filenameTest, 0); //Read the file folder
HOGDescriptor hog_test;// (Size(64, 64), Size(32, 32), Size(16, 16), Size(32, 32), 9, 1, -1, 0, .2, 1, 64, false);
vector<float> descriptors_test;
vector<Point> locations_test;
hog_test.compute(test_image, descriptors_test, Size(64, 64), 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("Test Image", CV_WINDOW_NORMAL);
imshow("Test Image", test_image);
//Should return a 1 if its an SUV, or a -1 if its a sedan
float result = svm->predict(HOGFeat_test);
if (result <= 0)
cout << "Sedan" << endl;
else
cout << "SUV" << endl;
cout << "Result: " << result << endl;
waitKey(0);
}
교육이 잘되지 않습니다. 아마도 overfitting => 더 많은 샘플을 얻습니다. – Micka