Доступ и изменение узлов дерева решений OpenCV при использовании Adaboost

Я изучаю увеличенное дерево из 30000 случайно сгенерированных функций. Обучение ограничено, чтобы сказать только лучшие 100 функций. После изучения того, как извлечь из объекта CvBoost индексы функций, используемых в дереве решений.

Моя мотивация для этого состоит в том, чтобы отменить требование генерировать все 30000 функций и вычислять только те функции, которые будут использоваться. Я включил распечатку файла yml, сгенерированного из функции CvBoost.save. Я думаю, что я хочу, это значение называется sample_count которая идентифицирует функцию, как показано ниже в дереве решений глубины 1:

 trees:
      -
         best_tree_idx: -1
         nodes:
            -
               depth: 0
               sample_count: 11556
               value: -1.8339875099775065e+00
               norm_class_idx: 0
               Tn: 0
               complexity: 0
               alpha: 0.
               node_risk: 0.
               tree_risk: 0.
               tree_error: 0.
               splits:
                  - { var:497, quality:8.6223608255386353e-01,
                      le:5.3123302459716797e+00 }
            -
               depth: 1
               sample_count: 10702
               value: -1.8339875099775065e+00
               norm_class_idx: 0
               Tn: 0
               complexity: 0
               alpha: 0.
               node_risk: 0.
               tree_risk: 0.
               tree_error: 0.
            -
               depth: 1
               sample_count: 854
               value: 1.8339875099775065e+00
               norm_class_idx: 1
               Tn: 0
               complexity: 0
               alpha: 0.
               node_risk: 0.
               tree_risk: 0.
               tree_error: 0.

РЕДАКТИРОВАТЬ

В настоящее время у меня есть следующий код для доступа к данным:

//Interrogate the Decision Tree. Each element is a Decision Tree, making up the classifer
    CvSeq* decisionTree = boostDevice.get_weak_predictors();

    simplifyFeatureSet(decisionTree, firstOrderROIs );

эта функция:

inline void Chnftrs::simplifyFeatureSet(CvSeq* decisionTree, std::vector<boost::tuple<int, cv::Rect> >& rois)
{
    //This variable stores the index of the feature used from rois and a pointer to the split so that the variable there can
    //be updated when the rois are pruned and reordered.
    std::vector<boost::tuple<int, CvDTreeSplit* > > featureIdx;

    //Determine the max depth of the tree

    printf("Size of boost %d \n", decisionTree->total);

    for (int i = 0; i < decisionTree->total; i++)
    {
            //Get the root of the tree
            CvBoostTree *tree =0;
            tree = (CvBoostTree*)cvGetSeqElem(decisionTree, i);

            if(tree == 0)
                printf("Tree is NULL\n");
            else
                printf("Tree Addr %ld\n", tree);            

            const CvDTreeNode *root = tree->get_root();

            printf("Class_idx %d, Value %f ", root->sample_count, root->value);

            featureIdx.push_back(boost::tuple<int, CvDTreeSplit*>(root->split->var_idx, root->split)); 

                    //Search down the right hand side
            depthFirstSearch(root->right, featureIdx);

            //Search down the left hand side
            depthFirstSearch(root->left, featureIdx);


    }
}

Однако, когда я пытаюсь получить доступ к любым членам root, таких как в root->sample_count Я получаю ошибку сегментации. Возможно, что члены CvTree недоступны, если только для CvTreeTrainData.shared не установлено значение true (по умолчанию это значение false). как указано здесь

любая помощь будет отличной

ура

Питер

1 ответ

Хорошо,

Был в состоянии редактировать дерево решений, следуя методам в источнике, как классификатор CvBoost сохранил и считал себя с диска. По какой-то причине cvGetSeqElem() не возвращает действительные указатели из переданного ему объекта CvSeq для объекта типа дерева решений.

Чтобы получить копию дерева решений, CvSeqReader и макрос cvStartReadSeq работали лучше всего. Макрос CV_READ_SEQ_ELEM(), кажется, обновляется во время цикла, получая следующее дерево в Seq.:

    CvSeqReader reader;
    cvStartReadSeq( weak, &reader );

     for (int i = 0; i < weak->total; i++)
        {

            CvBoostTree* tree;
            CV_READ_SEQ_ELEM( tree, reader );

                const CvDTreeNode *root = 0;
                root = tree->get_root();

                printf("Root Split VarIdx : %d c: %f, ", root->split->var_idx, root->split->ord.c);

                featureIdx.push_back(boost::tuple<int, CvDTreeSplit*>(root->split->var_idx, root->split)); 

                //Search down the right hand side
                depthFirstSearch(root->right, featureIdx);

                //Search down the left hand side
                depthFirstSearch(root->left, featureIdx);


        }
Другие вопросы по тегам