【问题标题】:Training of SVM classifier in OpenCV using SIFT and ORB features使用 SIFT 和 ORB 特征在 OpenCV 中训练 SVM 分类器
【发布时间】:2012-09-17 22:48:53
【问题描述】:

我正在尝试训练一个 SVM 分类器来识别一组 64x128 图像中的行人。我已经使用 HOG 功能完成了这项工作,现在我需要使用 SIFT 和 ORB 来实现相同的功能。对于 HOG 特征,我始终拥有相同数量的特征 (3780),因此火车的矩阵是 image_number 乘以 3780。现在,使用 SIFT 提取器,我得到了不同大小的关键点。如何使用这些不同大小的关键点为分类器创建矩阵?

非常感谢您的帮助!

我解决了描述符的问题,将它们全部放在同一行。但是,我发现大多数描述符的值为 0,因此分类器无法正常工作。你知道我该如何解决这个问题吗?

这是一段代码:

DenseFeatureDetector detector;
SiftDescriptorExtractor descriptor;
vector<KeyPoint> keypoints;


//for every image I compute te SIFT
detector.detect(image, keypoints);
Mat desc;
descriptor.compute(image,keypoints, desc);
Mat v(1,30976,CV_32FC1);
    for (int j = 0; j<desc.rows; j++){
        for(int k = 0; k<desc.cols; k++){
            v.at<float>(0,128*j+k) = desc.at<float>(j,k);

        }
    } //now in vector v there are all the descriptors (the problem is that most of them have 0 value)

descriptormat.push_back(v);  //descriptormat is the cv::Mat that I use to train the SVM

【问题讨论】:

    标签: visual-c++ opencv svm sift


    【解决方案1】:

    通常,人们对 SIFT 或 ORB 特征进行矢量量化并构建直方图(词袋模型)。这将为每个训练和测试图像提供一个固定大小的向量。

    【讨论】:

    • +1 用于矢量量化(或者只是简单的 k-means k 聚类来自 n SIFT 矢量特征)。
    • 谢谢,但是你能解释一下这个量化到底是什么吗?我是否有 N (128x1) 个向量的平均值,其中 N 是关键点的数量?
    • @CengizFrostclaw 请参阅Visual Categorization with Bags of Keypoints 的第 2.3 节,或来自Visual Word Ambiguity 的图 1。量化通常将 128 维空间分成 K 个区域,每个区域由一个聚类中心定义。特征根据最接近的聚类中心进行量化。
    【解决方案2】:

    您可以创建一个大矩阵并 push_back 为每个图像计算的描述符。示例(未选中)

    int main(int argc, char**argv)
    {
        cv::SIFT sift;
        cv::Mat dataMatrix(0, 128, CV_32F); // 0 rows, 128 cols is SIFT dimension, I think there is a method that gives you the descriptor dimension exactly. type is 32F if I remember well, must check
        for (int i = 1; i < argc; ++i) {
          cv::Mat img = cv::imread(argv[i]);
          std::vector<cv::KeyPoints> kp;
          cv::Mat desc;
          sift(img, cv::noArray(), keypoints, desc);
          dataMatrix.push_back(desc);
        }
    
        // Now train SVM with dataMatrix
        assert(dataMatrix.rows > 0);
    }
    

    【讨论】:

    • 非常感谢您的回复。我遵循了您的建议,至于筛选提取它运行良好,但是当我训练和测试 svm 时出现此错误:“OpenCV 错误:输入数组的大小不正确”。我不知道我是如何解决这个问题的,因为对于 HOG,我对每个图像都有一个描述符,但是现在对于每个图像,我有一个描述符矩阵,其描述符与关键点的数量一样多:我如何在这个中训练和测试 svm情况?
    • 您找到解决方案了吗?
    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2013-11-27
    • 2018-05-26
    • 2015-10-30
    • 2017-10-19
    • 2014-11-21
    • 2016-06-16
    相关资源
    最近更新 更多