2

我想使用 AdaBoost 从大量(~100k)中选择一组好的特征。AdaBoost 通过迭代特征集并根据它们的执行情况添加特征来工作。它选择在被现有特征集错误分类的样本上表现良好的特征。

我目前在 Open CV 中使用CvBoost。我有一个工作示例,但从文档中不清楚如何提取它使用的功能索引。

使用CvBoost3rd 方库或自己实现它,如何使用 AdaBoot 从大型功能集中提取一组功能?

4

2 回答 2

3

在@greeness 回答的帮助下,我创建了一个子类CvBoost

std::vector<int> RSCvBoost::getFeatureIndexes() {

    CvSeqReader reader;
    cvStartReadSeq( weak, &reader );
    cvSetSeqReaderPos( &reader, 0 );

    std::vector<int> featureIndexes;

    int weak_count = weak->total;
    for( int i = 0; i < weak_count; i++ ) {
        CvBoostTree* wtree;
        CV_READ_SEQ_ELEM( wtree, reader );

        const CvDTreeNode* node = wtree->get_root();
        CvDTreeSplit* split = node->split;
        const int index = split->condensed_idx;

        // Only add features that are not already added
        if (std::find(featureIndexes.begin(),
                      featureIndexes.end(),
                      index) == featureIndexes.end()) {

            featureIndexes.push_back(index);
        }

    }

    return featureIndexes;
}
于 2014-09-27T19:48:57.283 回答
2

声明:我不是 opencv 的用户。从文档来看,opencv 的 adaboost 使用决策树(分类树或回归树)作为基本的弱学习器。

在我看来,这是获得下划线弱学习者的方法:

CvBoost::get_weak_predictors
Returns the sequence of weak tree classifiers.

C++: CvSeq* CvBoost::get_weak_predictors()
The method returns the sequence of weak classifiers. 
Each element of the sequence is a pointer to the CvBoostTree class or 
to some of its derivatives.

一旦您可以访问 的序列CvBoostTree*,您应该能够检查树中包含哪些特征以及拆分值是什么等。

如果每棵树只是一个决策树桩,那么每个弱学习器中只包含一个特征。但是,如果我们允许树的深度更深,则每个弱学习器中都可能存在特征组合。

我进一步看了看CvBoostTree ;不幸的是,该类本身并没有提供公共方法来检查所使用的内部功能。但是您可能希望创建自己的子类,继承CvBoostTree并公开任何功能。

于 2014-09-21T21:44:29.707 回答