使用 SVM 和 BOW 进行图像分类
image classification using SVM and BOW?
我对openCV不太有经验。我有一些图像,我想检查它们是否包含我正在寻找的标志。所以,我想使用我有一些代码的 SVM 技术。我已经理解了代码的大部分部分,但我不知道如何实现这段代码。该代码有三个功能,即 createTrainDataUsingBow()
第二个是 int trainSVM
和int svmPredict
.
问题:我知道首先我必须训练 SVM,然后使用 predict((。但是,我不明白在他们通话期间要传递的论点。我的意思是,如果我创建一个main()
那么我应该用什么参数来调用int trainSVM
.
整个代码给出如下:
1. 创建训练数据使用弓(( 的代码
void createTrainDataUsingBow(std::vector<char*> files, cv::Mat& train, cv::Mat& response, int label)
{
cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create("FlannBased");
cv::Ptr<cv::DescriptorExtractor> extractor = new cv::SurfDescriptorExtractor();
cv::BOWImgDescriptorExtractor dextract( extractor, matcher );
cv::SurfFeatureDetector detector(500);
// cluster count
int cluster = 100;
// create the object for the vocabulary.
cv::BOWKMeansTrainer bow( cluster,cv::TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, FLT_EPSILON), 1, cv::KMEANS_PP_CENTERS );
// get SURF descriptors and add to BOW each input files
std::vector<char*>::const_iterator file;
for( file = files.begin(); file != files.end(); file++)
{
cv::Mat img = cv::imread( *file, CV_LOAD_IMAGE_GRAYSCALE );
std::vector<cv::KeyPoint> keypoints = detector.detect( img, keypoints);
cv::Mat descriptors;
extractor->compute( img, keypoints, descriptors);
if ( !descriptors.empty() ) bow.add( descriptors );
}
// Create the vocabulary with KMeans.
cv::Mat vocabulary;
vocabulary = bow.cluster();
for( file = files.begin(); file != files.end(); file++)
{
// set training data using BOWImgDescriptorExtractor
dextract.setVocabulary( vocabulary );
std::vector<cv::KeyPoint> keypoints;
cv::Mat img = cv::imread( *file, CV_LOAD_IMAGE_GRAYSCALE );
detector.detect( img, keypoints);
cv::Mat desc;
dextract.compute( img, keypoints, desc );
if ( !desc.empty() )
{
train.push_back( desc ); // update training data
response.push_back( label ); // update response data
}
}
}
2. 训练SVM((的代码
int trainSVM((std::vector<char*> positive, std::vector<char*> negative)
{
// create training data
cv::Mat train;
cv::Mat response;
createTrainDataUsingBow(positive, train, response, 1.0);
createTrainDataUsingBow(negative, train, response, -1.0);
// svm parameters
CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);
CvSVMParams svm_param = CvSVMParams( CvSVM::C_SVC, CvSVM::RBF, 10.0, 8.0, 1.0, 10.0, 0.5, 0.1, NULL, criteria);
// train svm
cv::SVM svm;
svm.train(train, response, cv::Mat(), cv::Mat(), svm_param);
svm.save("svm-classifier.xml");
return 0;
}
3. svmPredict(( 的代码
int svmPredict(const char* classifier, const char* vocaname, const char* query, const char* method)
{
// load image
cv::Mat img = cv::imread(query, CV_LOAD_IMAGE_GRAYSCALE);
// load svm
cv::SVM svm;
svm.load(classifier);
// declare BOWImgDescriptorExtractor
cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create("FlannBased");
cv::Ptr<cv::DescriptorExtractor> extractor = new cv::SurfDescriptorExtractor();
cv::BOWImgDescriptorExtractor dextract( extractor, matcher );
// load vocabulary data
cv::Mat vocabulary;
cv::FileStorage fs( vocaname, cv::FileStorage::READ);
fs["vocabulary data"] >> vocabulary;
fs.release();
if( vocabulary.empty() ) return 1;
// Set the vocabulary
dextract.setVocabulary( vocabulary );
std::vector<cv::KeyPoint> keypoints;
detector.detect( img, keypoints);
cv::Mat desc_bow;
dextract.compute( img, keypoints, desc_bow );
if( desc_bow.empty() ) return 1;
// svm predict
float predict = svm.predict(centroids, true);
std::cout << predict << std::endl;
return 0;
}
我应该调用 int trainSVM 的参数。
trainSVM(( 采用两个 char* 向量,分别是正样本和负样本的图像文件名列表。最好创建一个包含正图像文件名列表的文件,负片也是如此,并读取这些文件名。
顺便说一句,这一行有一个语法错误:
int trainSVM((std::vector<char*> positive, std::vector<char*> negative)
一个更大的问题是您将如何对数据进行本地化,以及如何进行交叉验证以获得正确的svm_params值?
此外,由于svmPredict()
为每个测试用例重新加载所有内容,因此效率非常低。
在知道它是否可以正常工作之前,最好使用 libsvm 命令行工具。以 libsvm 格式转储createTrainDataUsingBow()
数据中的 mats 输出是微不足道的。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 神经网络和图像分类
- OpenCV SVM 分类器图像识别
- 使用OpenCV在Android上使用神经网络进行灰度图像分类
- 使用Caffe从图像中分类手写数字
- 如何训练svm对英文字母图像进行分类
- 使用 SVM 和 BOW 进行图像分类
- 具有概率估计的多类图像分类
- haar分类器是否可以用于特定ROI中的检测而不是整个图像中的检测
- 用于对整个图像进行分类的OpenCV中的HOG
- 如何在OpenCV和c++中配置CvSVM进行图像分类
- 神经网络图像分类,最有效的解决方案/建议
- 图像中闪电类型的分类