This post introduces the method to use machine learning of SVM.
Firstly, you have to prepare postive hog features data and negative hog features data by XML, or TXT, and so on...
The method to get Hog feature, refer to this page -> http://feelmare.blogspot.kr/2014/04/example-source-code-of-extract-hog.html
I already got postive.xml and negative.xml from images.
This example source code learn using SVM from postive.xml, negative.xml.
And save the result fo learning to XML file.
After get SVM trained xml data, we can classify input data whether positive or not.
This is training source code using SVM.
#include < stdio.h> #include < opencv2\opencv.hpp> //#include < opencv2\gpu\gpu.hpp> using namespace cv; using namespace std; #ifdef _DEBUG #pragma comment(lib, "opencv_core247d.lib") #pragma comment(lib, "opencv_imgproc247d.lib") //MAT processing #pragma comment(lib, "opencv_objdetect247d.lib") //HOGDescriptor //#pragma comment(lib, "opencv_gpu247d.lib") //#pragma comment(lib, "opencv_features2d247d.lib") #pragma comment(lib, "opencv_highgui247d.lib") #pragma comment(lib, "opencv_ml247d.lib") //#pragma comment(lib, "opencv_stitching247d.lib"); //#pragma comment(lib, "opencv_nonfree247d.lib"); #else #pragma comment(lib, "opencv_core247.lib") #pragma comment(lib, "opencv_imgproc247.lib") #pragma comment(lib, "opencv_objdetect247.lib") //#pragma comment(lib, "opencv_gpu247.lib") //#pragma comment(lib, "opencv_features2d247.lib") #pragma comment(lib, "opencv_highgui247.lib") #pragma comment(lib, "opencv_ml247.lib") //#pragma comment(lib, "opencv_stitching247.lib"); //#pragma comment(lib, "opencv_nonfree247.lib"); #endif void main() { //Read Hog feature from XML file /////////////////////////////////////////////////////////////////////////// printf("1. Feature data xml load\n"); //create xml to read FileStorage read_PositiveXml("Positive.xml", FileStorage::READ); FileStorage read_NegativeXml("Negative.xml", FileStorage::READ); //Positive Mat Mat pMat; read_PositiveXml["Descriptor_of_images"] >> pMat; //Read Row, Cols int pRow,pCol; pRow = pMat.rows; pCol = pMat.cols; //Negative Mat Mat nMat; read_NegativeXml["Descriptor_of_images"] >> nMat; //Read Row, Cols int nRow,nCol; nRow = nMat.rows; nCol = nMat.cols; //Rows, Cols printf printf(" pRow=%d pCol=%d, nRow=%d nCol=%d\n", pRow, pCol, nRow, nCol ); //release read_PositiveXml.release(); //release read_NegativeXml.release(); ///////////////////////////////////////////////////////////////////////////////// //Make training data for SVM ///////////////////////////////////////////////////////////////////////////////// printf("2. Make training data for SVM\n"); //descriptor data set Mat PN_Descriptor_mtx( pRow + nRow, pCol, CV_32FC1 ); //in here pCol and nCol is descriptor number, so two value must be same; memcpy(PN_Descriptor_mtx.data, pMat.data, sizeof(float) * pMat.cols * pMat.rows ); int startP = sizeof(float) * pMat.cols * pMat.rows; memcpy(&(PN_Descriptor_mtx.data[ startP ]), nMat.data, sizeof(float) * nMat.cols * nMat.rows ); //data labeling Mat labels( pRow + nRow, 1, CV_32FC1, Scalar(-1.0) ); labels.rowRange( 0, pRow ) = Scalar( 1.0 ); ///////////////////////////////////////////////////////////////////////////////// //Set svm parameter ///////////////////////////////////////////////////////////////////////////////// printf("4. SVM training\n"); CvSVM svm; CvSVMParams params; params.svm_type = CvSVM::C_SVC; params.kernel_type = CvSVM::LINEAR; params.term_crit = cvTermCriteria( CV_TERMCRIT_ITER, 10000, 1e-6 ); ///////////////////////////////////////////////////////////////////////////////// //Training ///////////////////////////////////////////////////////////////////////////////// svm.train(PN_Descriptor_mtx, labels, Mat(), Mat(), params); //Trained data save ///////////////////////////////////////////////////////////////////////////////// printf("5. SVM xml save\n"); svm.save( "trainedSVM.xml" ); // FileStorage hogXml("testXML.xml", FileStorage::WRITE); //FileStorage::READ // write(hogXml, "Data", PN_Descriptor_mtx); // write(hogXml, "Label", labels); // hogXml.release(); }---
After learning, the method to classify is refer to http://feelmare.blogspot.kr/2014/04/to-test-svm-trained-data-is-whether.html
No comments:
Post a Comment