0

在该runAt方法的开放 CV 文档中,也为detectMultiScale 方法。有一个神秘的未记录的“权重”输出参数。

通过对我的 2 阶段分类器进行试验,我看到它吐出如下值:

-2.093535
-2.715030
2.000000   // Positive values seem to be output when the classifier was successful
0.034417

我还查看了源代码,发现该groupRectangles方法使用权重。

void groupRectangles(vector<Rect>& rectList, 
                     int groupThreshold, 
                     double eps, 
                     vector<int>* weights, 
                     vector<double>* levelWeights);

我猜它是某种参数,表明分类器找到对象的确定程度,但是,我不知道细节:

  • 最小值和最大值是多少?
  • 正值和负值是什么意思?
  • 它是线性的还是指数的?
  • 它与分类器的阶段有关吗?
4

1 回答 1

0

我已经从cascadedetect 源代码中弄清楚了。它使用重量的符号sum

代码(如下)遍历给定阶段中的树并添加到sum变量。在阶段结束时,总和必须大于阶段的阈值(可以为负)才能继续。然后在每个新阶段开始时将总和重置为零。

因此,权重输出参数是:

  • 失败的值大于失败阶段的阈值。
  • OR .. 通过分类器最后阶段的值。

我仍然不明白它的绝对含义是什么。

inline int predictOrderedStump( CascadeClassifier& cascade, Ptr<FeatureEvaluator> &_featureEvaluator, double& sum )
{
    int nodeOfs = 0, leafOfs = 0;
    FEval& featureEvaluator = (FEval&)*_featureEvaluator;
    float* cascadeLeaves = &cascade.data.leaves[0];
    CascadeClassifier::Data::DTreeNode* cascadeNodes = &cascade.data.nodes[0];
    CascadeClassifier::Data::Stage* cascadeStages = &cascade.data.stages[0];

    int nstages = (int)cascade.data.stages.size();
    for( int stageIdx = 0; stageIdx < nstages; stageIdx++ )
    {
        CascadeClassifier::Data::Stage& stage = cascadeStages[stageIdx];
        sum = 0.0;

        int ntrees = stage.ntrees;
        for( int i = 0; i < ntrees; i++, nodeOfs++, leafOfs+= 2 )
        {
            CascadeClassifier::Data::DTreeNode& node = cascadeNodes[nodeOfs];
            double value = featureEvaluator(node.featureIdx);
            sum += cascadeLeaves[ value < node.threshold ? leafOfs : leafOfs + 1 ];
        }

        if( sum < stage.threshold )
            return -stageIdx;
    }

    return 1;
}
于 2013-10-22T21:33:53.337 回答