2017-12-25 6 views
1

내 목표는 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 모델이 완벽하게 예측되지만 명백히 부정 행위입니다.

은 다음 이미지는 결과를 보여 주며, 테스트 이미지 여기

results

의 예를 들어 내가 코드를 모르겠어요 때문에 내 코드, 나는 그것의 대부분을 포함하지 않았다이다 문제. 먼저 긍정적 인 이미지를 찍어 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); 
} 
+0

교육이 잘되지 않습니다. 아마도 overfitting => 더 많은 샘플을 얻습니다. – Micka

답변

0

두 가지가이 문제를 해결했다. 나는 훈련 부분을 위해 약 400 SUV 이미지와 400의 세단 이미지를 사용했고 테스트 부분을 위해 또 다른 50 이미지를 사용했다.

2) Mat HOGFeat_test (1, derSize, CV_32FC1)에서 나는 약 1 배 정도 큰 derSize를 가졌습니다. 실제 크기는 15120이지만 매트에 113400 열이 있습니다. 따라서 유용한 테이터 매트를 테스트 매트의 약 10 % 만 채웠으므로 SUV와 세단의 차이점을 SVM이 알려주는 것이 훨씬 더 어려웠습니다.

이제는 선형 및 다중 커널 (C = 10)에서 모두 훌륭하게 작동하며 내 정확도가 96 %에서 예상했던 것보다 낫습니다.

관련 문제