mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 07:43:03 +04:00
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
This commit is contained in:
@@ -101,7 +101,7 @@ medianPartition( size_t* ofs, int a, int b, const float* vals )
|
||||
int i0 = a, i1 = (a+b)/2, i2 = b;
|
||||
float v0 = vals[ofs[i0]], v1 = vals[ofs[i1]], v2 = vals[ofs[i2]];
|
||||
int ip = v0 < v1 ? (v1 < v2 ? i1 : v0 < v2 ? i2 : i0) :
|
||||
v0 < v2 ? i0 : (v1 < v2 ? i2 : i1);
|
||||
v0 < v2 ? (v1 == v0 ? i2 : i0): (v1 < v2 ? i2 : i1);
|
||||
float pivot = vals[ofs[ip]];
|
||||
std::swap(ofs[ip], ofs[i2]);
|
||||
|
||||
@@ -131,7 +131,6 @@ medianPartition( size_t* ofs, int a, int b, const float* vals )
|
||||
CV_Assert(vals[ofs[k]] >= pivot);
|
||||
more += vals[ofs[k]] > pivot;
|
||||
}
|
||||
CV_Assert(std::abs(more - less) <= 1);
|
||||
|
||||
return vals[ofs[middle]];
|
||||
}
|
||||
|
||||
@@ -381,36 +381,23 @@ public:
|
||||
Mat res, nr, d;
|
||||
if( _results.needed() )
|
||||
{
|
||||
_results.create(testcount, 1, CV_32F);
|
||||
res = _results.getMat();
|
||||
}
|
||||
if( _neighborResponses.needed() )
|
||||
{
|
||||
_neighborResponses.create(testcount, k, CV_32F);
|
||||
nr = _neighborResponses.getMat();
|
||||
}
|
||||
if( _dists.needed() )
|
||||
{
|
||||
_dists.create(testcount, k, CV_32F);
|
||||
d = _dists.getMat();
|
||||
}
|
||||
|
||||
for (int i=0; i<test_samples.rows; ++i)
|
||||
{
|
||||
Mat _res, _nr, _d;
|
||||
if (res.rows>i)
|
||||
{
|
||||
_res = res.row(i);
|
||||
}
|
||||
if (nr.rows>i)
|
||||
{
|
||||
_nr = nr.row(i);
|
||||
}
|
||||
if (d.rows>i)
|
||||
{
|
||||
_d = d.row(i);
|
||||
}
|
||||
tr.findNearest(test_samples.row(i), k, Emax, _res, _nr, _d, noArray());
|
||||
res.push_back(_res.t());
|
||||
_results.assign(res);
|
||||
}
|
||||
|
||||
return result; // currently always 0
|
||||
|
||||
@@ -216,13 +216,14 @@ public:
|
||||
sample = Mat( nallvars, 1, CV_32F, psamples + sstep0*w->sidx[j], sstep1*sizeof(psamples[0]) );
|
||||
|
||||
double val = predictTrees(Range(treeidx, treeidx+1), sample, predictFlags);
|
||||
double sample_weight = w->sample_weights[w->sidx[j]];
|
||||
if( !_isClassifier )
|
||||
{
|
||||
oobres[j] += val;
|
||||
oobcount[j]++;
|
||||
double true_val = w->ord_responses[w->sidx[j]];
|
||||
double a = oobres[j]/oobcount[j] - true_val;
|
||||
oobError += a*a;
|
||||
oobError += sample_weight * a*a;
|
||||
val = (val - true_val)/max_response;
|
||||
ncorrect_responses += std::exp( -val*val );
|
||||
}
|
||||
@@ -237,7 +238,7 @@ public:
|
||||
if( votes[best_class] < votes[k] )
|
||||
best_class = k;
|
||||
int diff = best_class != w->cat_responses[w->sidx[j]];
|
||||
oobError += diff;
|
||||
oobError += sample_weight * diff;
|
||||
ncorrect_responses += diff == 0;
|
||||
}
|
||||
}
|
||||
@@ -421,6 +422,10 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
double getOOBError() const {
|
||||
return oobError;
|
||||
}
|
||||
|
||||
RTreeParams rparams;
|
||||
double oobError;
|
||||
vector<float> varImportance;
|
||||
@@ -500,6 +505,8 @@ public:
|
||||
const vector<Node>& getNodes() const CV_OVERRIDE { return impl.getNodes(); }
|
||||
const vector<Split>& getSplits() const CV_OVERRIDE { return impl.getSplits(); }
|
||||
const vector<int>& getSubsets() const CV_OVERRIDE { return impl.getSubsets(); }
|
||||
double getOOBError() const CV_OVERRIDE { return impl.getOOBError(); }
|
||||
|
||||
|
||||
DTreesImplForRTrees impl;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user