SVM+HOG对图像进行多分类(OpenCV实现)
2017-08-09 16:51
751 查看
前几个月写了篇关于MATLAB实现SVM+HOG对图像进行多分类,链接:http://blog.csdn.net/cuixing001/article/details/70908064,先开始是用opencv实现的,可是识别效果很差,以为我写错代码了,后来纠结了好久好久,才发现是核函数选择有很大问题!这次改为线性核,效果在这些图片中(所用的图像数据集为:链接: https://pan.baidu.com/s/1i5OhC7z 密码:
utn7)表现不错。
OpenCV代码如下:
上面代码用到"myImageLabels.txt", "myImageList.txt","myImagetest.txt"分别为训练图像标记,训练图像路径,测试图像路径。
里面保存内容格式如下:
label=1,2,3,4,5分别表示airplanes,butterfly,camera,scissors,sunflower这五类,测试效果如下,改成RBF效果就很差了:
每按下一次空格键就预测一张图片。
utn7)表现不错。
OpenCV代码如下:
//SVM多分类训练测试 #include <opencv2/opencv.hpp> #include <iostream> #include <fstream> using namespace cv; using namespace std; Size imageSize = Size(64, 64); void coumputeHog(const Mat& src, vector<float> &descriptors) { HOGDescriptor myHog = HOGDescriptor(imageSize, Size(16, 16), cvSize(8, 8), cvSize(8, 8), 9); myHog.compute(src.clone(),descriptors,Size(1,1),Size(0,0)); } int main(int argc, char** argv){ ifstream inLabels("myImageLabels.txt"), inImages("myImageList.txt"),inTestimage("myImagetest.txt"); string imageName; signed imageLabel; vector<Mat> vecImages; vector<int> vecLabels; CvSVM *mySVM = new CvSVM(); CvSVMParams params = CvSVMParams(); params.svm_type = CvSVM::C_SVC; params.kernel_type = CvSVM::LINEAR; params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 10000, 1e-10); vector<float> vecDescriptors; #if(1) //是否需要训练 while ((inImages>>imageName)&&(inLabels>>imageLabel)) { Mat src = imread(imageName, 0); resize(src, src, imageSize); vecImages.push_back(src); vecLabels.push_back(imageLabel); } inLabels.close(); inImages.close(); Mat dataDescriptors; Mat dataResponse = (Mat)vecLabels; for (size_t i = 0; i < vecImages.size(); i++) { Mat src = vecImages[i]; Mat tempRow; coumputeHog(src, vecDescriptors); if (i == 0) { dataDescriptors = Mat::zeros(vecImages.size(), vecDescriptors.size(), CV_32FC1); } tempRow = ((Mat)vecDescriptors).t(); tempRow.row(0).copyTo(dataDescriptors.row(i)); } mySVM->train(dataDescriptors, dataResponse, Mat(), Mat(), params); string svmName = to_string(88) + "_mysvm.xml"; mySVM->save(svmName.c_str()); #else mySVM->load("mysvm.xml"); #endif // 预测 string testPath; while (inTestimage >> testPath) { Mat test = imread(testPath, 0); resize(test, test, imageSize); vector<float> imageDescriptor; coumputeHog(test, imageDescriptor); Mat testDescriptor = Mat::zeros(1, imageDescriptor.size(), CV_32FC1); for (size_t i = 0; i < imageDescriptor.size(); i++) { testDescriptor.at<float>(0, i) = imageDescriptor[i]; } float label = mySVM->predict(testDescriptor, false); cout << label << endl; imshow("test image", test); waitKey(0); } inTestimage.close(); delete mySVM; return 0; }
上面代码用到"myImageLabels.txt", "myImageList.txt","myImagetest.txt"分别为训练图像标记,训练图像路径,测试图像路径。
里面保存内容格式如下:
label=1,2,3,4,5分别表示airplanes,butterfly,camera,scissors,sunflower这五类,测试效果如下,改成RBF效果就很差了:
每按下一次空格键就预测一张图片。
相关文章推荐
- SVM+HOG对图像进行分类(MATLAB实现)
- matlab实现hog+svm图像二分类
- HOG+SVM进行图像分类
- 基于opencv的hog+svm简单分类实现
- 在opencv3中利用SVM进行图像目标检测和分类
- 利用SVM支持向量机对彩色图像进行分割并使用OpenCV进行实现
- hog matlab代码1——实现hog+svm图像二分类
- 在opencv3中利用SVM进行图像目标检测和分类
- 利用opencv的hog+svm实现细胞识别分类器
- OpenCV中的HOG+SVM物体分类
- Opencv实现图像无缝拼接,Sift查找特征点,Flann进行匹配
- OpenCV中的HOG+SVM物体分类
- matlab版hog+svm图像二分类
- 基于qt和opencv3实现机器学习之:对OCR进行分类
- 调用opencv中BP神经网络来对图像进行分类
- OpenCV中HOG+SVM物体分类
- OpenCV中的HOG+SVM物体分类
- opencv中的SVM图像分类(二)
- VS+Opencv3.3下用HOG+SVM实现INRIA行人检测
- 图像特征检测描述(一):SIFT、SURF、ORB、HOG、LBP特征的原理概述及OpenCV代码实现