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