/// <summary> /// predict /// </summary> /// <param name="svm"></param> /// <param name="src"></param> /// <returns></returns> static float Predict(SVM svm, Mat src) { var hog = new HOGDescriptor(new Size(64, 64), new Size(16, 16), new Size(8, 8), new Size(8, 8)); Mat data = Mat.Zeros(1, hog.GetDescriptorSize(), MatType.CV_32FC1); Cv2.Resize(src, src, new Size(64, 64)); src = src.Threshold(200, 255, ThresholdTypes.Binary); MoveToCenter(src); var descriptors = hog.Compute(src, new Size(1, 1), new Size(0, 0)); for (var i = 0; i < descriptors.Length; i++) { data.Set(0, i, descriptors[i]); } return(svm.Predict(data)); }
/// <summary> /// train model /// </summary> static void Train() { //load catalog var paras = File.ReadAllLines("JPEGImages\\SVM_Train.txt"); var imgPath = new List <string>(); var imgCatg = new List <int>(); var nImgCnt = paras.Length; foreach (var i in paras) { var temp = i.Split(':'); imgPath.Add(temp[1]); imgCatg.Add(Convert.ToInt32(temp[0])); } //create HOG var hog = new HOGDescriptor(new Size(64, 64), new Size(16, 16), new Size(8, 8), new Size(8, 8)); Mat data = Mat.Zeros(nImgCnt, hog.GetDescriptorSize(), MatType.CV_32FC1); Mat res = Mat.Zeros(nImgCnt, 1, MatType.CV_32SC1); for (var z = 0; z < nImgCnt; z++) { //load img Mat src = Cv2.ImRead(imgPath[z], ImreadModes.GrayScale); Console.WriteLine($"Processing: {Path.GetFileNameWithoutExtension(imgPath[z])}"); //resize to 64*64 Cv2.Resize(src, src, new Size(64, 64)); //threshold src = src.Threshold(200, 255, ThresholdTypes.Binary); //center image MoveToCenter(src); //computer descriptors var descriptors = hog.Compute(src, new Size(1, 1), new Size(0, 0)); for (var i = 0; i < descriptors.Length; i++) { data.Set(z, i, descriptors[i]); } res.Set(z, 0, imgCatg[z]); src.Release(); } Console.WriteLine("Start training"); //create svm var svm = SVM.Create(); svm.TermCriteria = new TermCriteria(CriteriaType.Eps, 1000, float.Epsilon); svm.Type = SVM.Types.CSvc; svm.KernelType = SVM.KernelTypes.Rbf; svm.Degree = 10; svm.Gamma = 0.09; svm.Coef0 = 1; svm.C = 10; svm.Nu = 0.5; svm.P = 1; //training svm.Train(data, SampleTypes.RowSample, res); //save result svm.Save("SVM_RESULT.xml"); }