• 13~16행 HOGDescriptor 클래스 구현상의 문제로 svmdigits 프로그램은 디버그 모드에서 실행 시 에러가 발생합니다. 그러므로 디버그 모드로 실행할 때에는 문자열을 출력한 후 종료합니다.
• 18행 HOGDescriptor 객체 hog를 생성합니다.
• 20행 train_hog_svm() 함수를 이용하여 SVM을 학습시킵니다.
• 37~46행 img 창에서 Space 키를 누르면 img 영상을 20×20 크기로 변환한 후 HOG 특징 벡터를 계산합니다. 계산된 HOG 특징 벡터를 1×324 크기의 행렬로 변환하여 SVM 결과를 예측하고, 그 결과를 콘솔 창에 출력합니다.
• 65~78행 digits.png에 포함된 5000개의 필기체 숫자 부분 영상으로부터 각각 HOG 특징 벡터를 추출하여 5000×324 크기의 train_hog 행렬과 5000×1 크기의 train_labels 행렬을 생성합니다.
• 80행 SVM 객체를 생성합니다.
• 81~82행 SVM 타입은 C_SVC로 설정하고, 커널 함수는 RBF로 설정합니다.
• 83~84행 파라미터 C와 Gamma 값을 각각 2.5, 0.50625로 설정합니다.
• 85행 SVM 학습을 진행합니다.
• 90~107행 마우스를 이용하여 숫자 영상을 그립니다.
코드 15-6에서 SVM 알고리즘을 학습시키는 코드에 대해 살펴보겠습니다. 코드 15-6의 83~84행에서 설정한 C와 Gamma 파라미터 값은 사실 SVM::trainAuto() 함수를 이용하여 구한 값입니다. 즉, 85행 svm->train(); 함수 호출 코드 대신 다음 코드를 실행하고, 콘솔 창에 출력되는 C와 Gamma 값을 코드 15-6의 83~84행에서 사용한 것입니다.
svm->trainAuto(train_hog, ROW_SAMPLE, train_labels); cout << "C: " << svm->getC() << endl; cout << "Gamma: " << svm->getGamma() << endl;