Commit e33657b4 authored by Jordi Inglada's avatar Jordi Inglada

ENH: simplify the vote counting

parent ecd14f9f
......@@ -23,50 +23,28 @@
class CV_EXPORTS_W CvRTreesWrapper : public CvRTrees
{
struct ClassVotes
{
unsigned int votes;
unsigned int class_idx;
};
struct MoreVotes
{
bool operator()(ClassVotes a, ClassVotes b)
{
return (a.votes > b.votes);
}
};
typedef std::vector<ClassVotes> ClassVotesVectorType;
public:
CV_WRAP CvRTreesWrapper(){};
CvRTreesWrapper(){};
virtual ~CvRTreesWrapper(){};
const int get_nclasses() const
{
return nclasses;
};
// CV_WRAP virtual float predict(const cv::Mat& sample, const cv::Mat& missing = cv::Mat() ) const{return CvRTrees::predict(sample,missing);};
virtual const float predict_confidence(const cv::Mat& sample, const cv::Mat& missing = cv::Mat()) const
float predict_confidence(const cv::Mat& sample,
const cv::Mat& missing =
cv::Mat()) const
{
cv::AutoBuffer<int> _votes(nclasses);
ClassVotesVectorType classVotes(nclasses);
std::vector<unsigned int> classVotes(nclasses);
for( int k = 0; k < ntrees; k++ )
{
CvDTreeNode* predicted_node = trees[k]->predict( sample, missing );
int class_idx = predicted_node->class_idx;
CV_Assert( 0 <= class_idx && class_idx < nclasses );
classVotes[class_idx].votes += 1;
classVotes[class_idx].class_idx = class_idx;
++classVotes[class_idx];
}
std::nth_element(classVotes.begin(), classVotes.begin()+1,
classVotes.end(), MoreVotes());
unsigned int maxVotes = classVotes[0].votes;
unsigned int secondVotes = classVotes[2].votes;
return static_cast<float>(maxVotes-secondVotes)/ntrees;
classVotes.end(), std::greater<>());
unsigned int maxVotes = classVotes[0];
unsigned int secondVotes = classVotes[1];
float confidence = static_cast<float>(maxVotes-secondVotes)/ntrees;
return confidence;
};
};
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment