使用SVM和BOW进行图像分类?

平方公里

我对openCV不太了解。我有一些图像,我想检查它们是否包含我正在寻找的标志。因此,我想使用我有一些代码的SVM技术。我已经了解了代码的大部分内容,但是我不知道如何实现此代码。该代码具有三个功能,即createTrainDataUsingBow()第二个isint trainSVMint svmPredict

问题:我知道我首先必须训练SVM,然后使用predict()。但是,我不理解在通话期间要传递的参数。我的意思是,如果我创建了一个main()带有什么参数的,我应该称之为int trainSVM

整个代码如下:

1. createTrainDataUsingBow()的代码

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. trainSVM()的代码

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命令行工具可能会更好,直到您知道它是否将正常工作为止。createTrainDataUsingBow()以libsvm格式转储来自数据的mats输出将是微不足道的

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用BOW选择适当的正面和负面训练图像集进行图像分类

来自分类Dev

使用要点和SVM训练进行图像分类

来自分类Dev

使用SVM进行分类

来自分类Dev

如何使用SIFT和SVM实现常规图像分类器

来自分类Dev

如何使用tensorflow对图像进行分类和裁剪?

来自分类Dev

使用 Caffe 进行多类和多标签图像分类

来自分类Dev

使用R和SVM进行文本分类。矩阵功能

来自分类Dev

Scikit学习-如何使用SVM和随机森林进行文本分类?

来自分类Dev

在Java代码中使用哪些Weka和LibSVM .jar文件进行SVM分类

来自分类Dev

如何在Python中进行PCA和SVM分类

来自分类Dev

如何正确使用BoW训练OpenCV SVM

来自分类Dev

使用图像训练 SVM 并进行预测

来自分类Dev

使用R中的SVM进行一类分类

来自分类Dev

使用Watson Image Recognition对图像进行“分类”

来自分类Dev

使用 TensorFlow 进行图像分类,值错误

来自分类Dev

使用 tensorflow 进行基本图像分类

来自分类Dev

如何使用彩色图像进行 Tensorflow 图像分类?

来自分类Dev

在SVM多类图像分类中使用图像的哪些特征会产生良好的效果?

来自分类Dev

存储和分类图像

来自分类Dev

如何使用张量流实时对图像进行分类?

来自分类Dev

pytorch中使用4通道图像进行分类

来自分类Dev

在MatLab中使用LIBSVM进行多类图像分类

来自分类Dev

如何使用张量流实时对图像进行分类?

来自分类Dev

使用 Keras 进行多类图像分类的多重预测

来自分类Dev

使用预训练的 caffe 模型进行图像分类

来自分类Dev

使用预制字典进行文本分类的SVM特征向量表示

来自分类Dev

使用具有单个功能的径向基内核SVM进行二进制分类

来自分类Dev

使用预制字典进行文本分类的SVM特征向量表示

来自分类Dev

使用SVM分类器和多种算法提高准确率

Related 相关文章

  1. 1

    如何使用BOW选择适当的正面和负面训练图像集进行图像分类

  2. 2

    使用要点和SVM训练进行图像分类

  3. 3

    使用SVM进行分类

  4. 4

    如何使用SIFT和SVM实现常规图像分类器

  5. 5

    如何使用tensorflow对图像进行分类和裁剪?

  6. 6

    使用 Caffe 进行多类和多标签图像分类

  7. 7

    使用R和SVM进行文本分类。矩阵功能

  8. 8

    Scikit学习-如何使用SVM和随机森林进行文本分类?

  9. 9

    在Java代码中使用哪些Weka和LibSVM .jar文件进行SVM分类

  10. 10

    如何在Python中进行PCA和SVM分类

  11. 11

    如何正确使用BoW训练OpenCV SVM

  12. 12

    使用图像训练 SVM 并进行预测

  13. 13

    使用R中的SVM进行一类分类

  14. 14

    使用Watson Image Recognition对图像进行“分类”

  15. 15

    使用 TensorFlow 进行图像分类,值错误

  16. 16

    使用 tensorflow 进行基本图像分类

  17. 17

    如何使用彩色图像进行 Tensorflow 图像分类?

  18. 18

    在SVM多类图像分类中使用图像的哪些特征会产生良好的效果?

  19. 19

    存储和分类图像

  20. 20

    如何使用张量流实时对图像进行分类?

  21. 21

    pytorch中使用4通道图像进行分类

  22. 22

    在MatLab中使用LIBSVM进行多类图像分类

  23. 23

    如何使用张量流实时对图像进行分类?

  24. 24

    使用 Keras 进行多类图像分类的多重预测

  25. 25

    使用预训练的 caffe 模型进行图像分类

  26. 26

    使用预制字典进行文本分类的SVM特征向量表示

  27. 27

    使用具有单个功能的径向基内核SVM进行二进制分类

  28. 28

    使用预制字典进行文本分类的SVM特征向量表示

  29. 29

    使用SVM分类器和多种算法提高准确率

热门标签

归档