--- /dev/null
+/*M///////////////////////////////////////////////////////////////////////////////////////
+//
+// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
+//
+// By downloading, copying, installing or using the software you agree to this license.
+// If you do not agree to this license, do not download, install,
+// copy or use the software.
+//
+//
+// Intel License Agreement
+// For Open Source Computer Vision Library
+//
+// Copyright (C) 2000, Intel Corporation, all rights reserved.
+// Third party copyrights are property of their respective owners.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// * Redistribution's of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// * Redistribution's in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// * The name of Intel Corporation may not be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// This software is provided by the copyright holders and contributors "as is" and
+// any express or implied warranties, including, but not limited to, the implied
+// warranties of merchantability and fitness for a particular purpose are disclaimed.
+// In no event shall the Intel Corporation or contributors be liable for any direct,
+// indirect, incidental, special, exemplary, or consequential damages
+// (including, but not limited to, procurement of substitute goods or services;
+// loss of use, data, or profits; or business interruption) however caused
+// and on any theory of liability, whether in contract, strict liability,
+// or tort (including negligence or otherwise) arising in any way out of
+// the use of this software, even if advised of the possibility of such damage.
+//
+//M*/
+
+/*
+ * File cvclassifier.h
+ *
+ * Classifier types
+ */
+
+#ifndef _CVCLASSIFIER_H_
+#define _CVCLASSIFIER_H_
+
+#include <cmath>
+#include <cxcore.h>
+
+#define CV_BOOST_API
+
+/* Convert matrix to vector */
+#define CV_MAT2VEC( mat, vdata, vstep, num ) \
+ assert( (mat).rows == 1 || (mat).cols == 1 ); \
+ (vdata) = ((mat).data.ptr); \
+ if( (mat).rows == 1 ) \
+ { \
+ (vstep) = CV_ELEM_SIZE( (mat).type ); \
+ (num) = (mat).cols; \
+ } \
+ else \
+ { \
+ (vstep) = (mat).step; \
+ (num) = (mat).rows; \
+ }
+
+/* Set up <sample> matrix header to be <num> sample of <trainData> samples matrix */
+#define CV_GET_SAMPLE( trainData, tdflags, num, sample ) \
+if( CV_IS_ROW_SAMPLE( tdflags ) ) \
+{ \
+ cvInitMatHeader( &(sample), 1, (trainData).cols, \
+ CV_MAT_TYPE( (trainData).type ), \
+ ((trainData).data.ptr + (num) * (trainData).step), \
+ (trainData).step ); \
+} \
+else \
+{ \
+ cvInitMatHeader( &(sample), (trainData).rows, 1, \
+ CV_MAT_TYPE( (trainData).type ), \
+ ((trainData).data.ptr + (num) * CV_ELEM_SIZE( (trainData).type )), \
+ (trainData).step ); \
+}
+
+#define CV_GET_SAMPLE_STEP( trainData, tdflags, sstep ) \
+(sstep) = ( ( CV_IS_ROW_SAMPLE( tdflags ) ) \
+ ? (trainData).step : CV_ELEM_SIZE( (trainData).type ) );
+
+
+#define CV_LOGRATIO_THRESHOLD 0.00001F
+
+/* log( val / (1 - val ) ) */
+CV_INLINE float cvLogRatio( float val );
+
+CV_INLINE float cvLogRatio( float val )
+{
+ float tval;
+
+ tval = MAX(CV_LOGRATIO_THRESHOLD, MIN( 1.0F - CV_LOGRATIO_THRESHOLD, (val) ));
+ return logf( tval / (1.0F - tval) );
+}
+
+
+/* flags values for classifier consturctor flags parameter */
+
+/* each trainData matrix column is a sample */
+#define CV_COL_SAMPLE 0
+
+/* each trainData matrix row is a sample */
+#define CV_ROW_SAMPLE 1
+
+#define CV_IS_ROW_SAMPLE( flags ) ( ( flags ) & CV_ROW_SAMPLE )
+
+/* Classifier supports tune function */
+#define CV_TUNABLE (1 << 1)
+
+#define CV_IS_TUNABLE( flags ) ( (flags) & CV_TUNABLE )
+
+
+/* classifier fields common to all classifiers */
+#define CV_CLASSIFIER_FIELDS() \
+ int flags; \
+ float(*eval)( struct CvClassifier*, CvMat* ); \
+ void (*tune)( struct CvClassifier*, CvMat*, int flags, CvMat*, CvMat*, CvMat*, \
+ CvMat*, CvMat* ); \
+ int (*save)( struct CvClassifier*, const char* file_name ); \
+ void (*release)( struct CvClassifier** );
+
+typedef struct CvClassifier
+{
+ CV_CLASSIFIER_FIELDS()
+} CvClassifier;
+
+#define CV_CLASSIFIER_TRAIN_PARAM_FIELDS()
+typedef struct CvClassifierTrainParams
+{
+ CV_CLASSIFIER_TRAIN_PARAM_FIELDS()
+} CvClassifierTrainParams;
+
+
+/*
+ Common classifier constructor:
+ CvClassifier* cvCreateMyClassifier( CvMat* trainData,
+ int flags,
+ CvMat* trainClasses,
+ CvMat* typeMask,
+ CvMat* missedMeasurementsMask CV_DEFAULT(0),
+ CvCompIdx* compIdx CV_DEFAULT(0),
+ CvMat* sampleIdx CV_DEFAULT(0),
+ CvMat* weights CV_DEFAULT(0),
+ CvClassifierTrainParams* trainParams CV_DEFAULT(0)
+ )
+
+ */
+
+typedef CvClassifier* (*CvClassifierConstructor)( CvMat*, int, CvMat*, CvMat*, CvMat*,
+ CvMat*, CvMat*, CvMat*,
+ CvClassifierTrainParams* );
+
+typedef enum CvStumpType
+{
+ CV_CLASSIFICATION = 0,
+ CV_CLASSIFICATION_CLASS = 1,
+ CV_REGRESSION = 2
+} CvStumpType;
+
+typedef enum CvStumpError
+{
+ CV_MISCLASSIFICATION = 0,
+ CV_GINI = 1,
+ CV_ENTROPY = 2,
+ CV_SQUARE = 3
+} CvStumpError;
+
+
+typedef struct CvStumpTrainParams
+{
+ CV_CLASSIFIER_TRAIN_PARAM_FIELDS()
+ CvStumpType type;
+ CvStumpError error;
+} CvStumpTrainParams;
+
+typedef struct CvMTStumpTrainParams
+{
+ CV_CLASSIFIER_TRAIN_PARAM_FIELDS()
+ CvStumpType type;
+ CvStumpError error;
+ int portion; /* number of components calculated in each thread */
+ int numcomp; /* total number of components */
+
+ /* callback which fills <mat> with components [first, first+num[ */
+ void (*getTrainData)( CvMat* mat, CvMat* sampleIdx, CvMat* compIdx,
+ int first, int num, void* userdata );
+ CvMat* sortedIdx; /* presorted samples indices */
+ void* userdata; /* passed to callback */
+} CvMTStumpTrainParams;
+
+typedef struct CvStumpClassifier
+{
+ CV_CLASSIFIER_FIELDS()
+ int compidx;
+
+ float lerror; /* impurity of the right node */
+ float rerror; /* impurity of the left node */
+
+ float threshold;
+ float left;
+ float right;
+} CvStumpClassifier;
+
+typedef struct CvCARTTrainParams
+{
+ CV_CLASSIFIER_TRAIN_PARAM_FIELDS()
+ /* desired number of internal nodes */
+ int count;
+ CvClassifierTrainParams* stumpTrainParams;
+ CvClassifierConstructor stumpConstructor;
+
+ /*
+ * Split sample indices <idx>
+ * on the "left" indices <left> and "right" indices <right>
+ * according to samples components <compidx> values and <threshold>.
+ *
+ * NOTE: Matrices <left> and <right> must be allocated using cvCreateMat function
+ * since they are freed using cvReleaseMat function
+ *
+ * If it is NULL then the default implementation which evaluates training
+ * samples from <trainData> passed to classifier constructor is used
+ */
+ void (*splitIdx)( int compidx, float threshold,
+ CvMat* idx, CvMat** left, CvMat** right,
+ void* userdata );
+ void* userdata;
+} CvCARTTrainParams;
+
+typedef struct CvCARTClassifier
+{
+ CV_CLASSIFIER_FIELDS()
+ /* number of internal nodes */
+ int count;
+
+ /* internal nodes (each array of <count> elements) */
+ int* compidx;
+ float* threshold;
+ int* left;
+ int* right;
+
+ /* leaves (array of <count>+1 elements) */
+ float* val;
+} CvCARTClassifier;
+
+CV_BOOST_API
+void cvGetSortedIndices( CvMat* val, CvMat* idx, int sortcols CV_DEFAULT( 0 ) );
+
+CV_BOOST_API
+void cvReleaseStumpClassifier( CvClassifier** classifier );
+
+CV_BOOST_API
+float cvEvalStumpClassifier( CvClassifier* classifier, CvMat* sample );
+
+CV_BOOST_API
+CvClassifier* cvCreateStumpClassifier( CvMat* trainData,
+ int flags,
+ CvMat* trainClasses,
+ CvMat* typeMask,
+ CvMat* missedMeasurementsMask CV_DEFAULT(0),
+ CvMat* compIdx CV_DEFAULT(0),
+ CvMat* sampleIdx CV_DEFAULT(0),
+ CvMat* weights CV_DEFAULT(0),
+ CvClassifierTrainParams* trainParams CV_DEFAULT(0) );
+
+/*
+ * cvCreateMTStumpClassifier
+ *
+ * Multithreaded stump classifier constructor
+ * Includes huge train data support through callback function
+ */
+CV_BOOST_API
+CvClassifier* cvCreateMTStumpClassifier( CvMat* trainData,
+ int flags,
+ CvMat* trainClasses,
+ CvMat* typeMask,
+ CvMat* missedMeasurementsMask,
+ CvMat* compIdx,
+ CvMat* sampleIdx,
+ CvMat* weights,
+ CvClassifierTrainParams* trainParams );
+
+/*
+ * cvCreateCARTClassifier
+ *
+ * CART classifier constructor
+ */
+CV_BOOST_API
+CvClassifier* cvCreateCARTClassifier( CvMat* trainData,
+ int flags,
+ CvMat* trainClasses,
+ CvMat* typeMask,
+ CvMat* missedMeasurementsMask,
+ CvMat* compIdx,
+ CvMat* sampleIdx,
+ CvMat* weights,
+ CvClassifierTrainParams* trainParams );
+
+CV_BOOST_API
+void cvReleaseCARTClassifier( CvClassifier** classifier );
+
+CV_BOOST_API
+float cvEvalCARTClassifier( CvClassifier* classifier, CvMat* sample );
+
+/****************************************************************************************\
+* Boosting *
+\****************************************************************************************/
+
+/*
+ * CvBoostType
+ *
+ * The CvBoostType enumeration specifies the boosting type.
+ *
+ * Remarks
+ * Four different boosting variants for 2 class classification problems are supported:
+ * Discrete AdaBoost, Real AdaBoost, LogitBoost and Gentle AdaBoost.
+ * The L2 (2 class classification problems) and LK (K class classification problems)
+ * algorithms are close to LogitBoost but more numerically stable than last one.
+ * For regression three different loss functions are supported:
+ * Least square, least absolute deviation and huber loss.
+ */
+typedef enum CvBoostType
+{
+ CV_DABCLASS = 0, /* 2 class Discrete AdaBoost */
+ CV_RABCLASS = 1, /* 2 class Real AdaBoost */
+ CV_LBCLASS = 2, /* 2 class LogitBoost */
+ CV_GABCLASS = 3, /* 2 class Gentle AdaBoost */
+ CV_L2CLASS = 4, /* classification (2 class problem) */
+ CV_LKCLASS = 5, /* classification (K class problem) */
+ CV_LSREG = 6, /* least squares regression */
+ CV_LADREG = 7, /* least absolute deviation regression */
+ CV_MREG = 8, /* M-regression (Huber loss) */
+} CvBoostType;
+
+/****************************************************************************************\
+* Iterative training functions *
+\****************************************************************************************/
+
+/*
+ * CvBoostTrainer
+ *
+ * The CvBoostTrainer structure represents internal boosting trainer.
+ */
+typedef struct CvBoostTrainer CvBoostTrainer;
+
+/*
+ * cvBoostStartTraining
+ *
+ * The cvBoostStartTraining function starts training process and calculates
+ * response values and weights for the first weak classifier training.
+ *
+ * Parameters
+ * trainClasses
+ * Vector of classes of training samples classes. Each element must be 0 or 1 and
+ * of type CV_32FC1.
+ * weakTrainVals
+ * Vector of response values for the first trained weak classifier.
+ * Must be of type CV_32FC1.
+ * weights
+ * Weight vector of training samples for the first trained weak classifier.
+ * Must be of type CV_32FC1.
+ * type
+ * Boosting type. CV_DABCLASS, CV_RABCLASS, CV_LBCLASS, CV_GABCLASS
+ * types are supported.
+ *
+ * Return Values
+ * The return value is a pointer to internal trainer structure which is used
+ * to perform next training iterations.
+ *
+ * Remarks
+ * weakTrainVals and weights must be allocated before calling the function
+ * and of the same size as trainingClasses. Usually weights should be initialized
+ * with 1.0 value.
+ * The function calculates response values and weights for the first weak
+ * classifier training and stores them into weakTrainVals and weights
+ * respectively.
+ * Note, the training of the weak classifier using weakTrainVals, weight,
+ * trainingData is outside of this function.
+ */
+CV_BOOST_API
+CvBoostTrainer* cvBoostStartTraining( CvMat* trainClasses,
+ CvMat* weakTrainVals,
+ CvMat* weights,
+ CvMat* sampleIdx,
+ CvBoostType type );
+/*
+ * cvBoostNextWeakClassifier
+ *
+ * The cvBoostNextWeakClassifier function performs next training
+ * iteration and caluclates response values and weights for the next weak
+ * classifier training.
+ *
+ * Parameters
+ * weakEvalVals
+ * Vector of values obtained by evaluation of each sample with
+ * the last trained weak classifier (iteration i). Must be of CV_32FC1 type.
+ * trainClasses
+ * Vector of classes of training samples. Each element must be 0 or 1,
+ * and of type CV_32FC1.
+ * weakTrainVals
+ * Vector of response values for the next weak classifier training
+ * (iteration i+1). Must be of type CV_32FC1.
+ * weights
+ * Weight vector of training samples for the next weak classifier training
+ * (iteration i+1). Must be of type CV_32FC1.
+ * trainer
+ * A pointer to internal trainer returned by the cvBoostStartTraining
+ * function call.
+ *
+ * Return Values
+ * The return value is the coefficient for the last trained weak classifier.
+ *
+ * Remarks
+ * weakTrainVals and weights must be exactly the same vectors as used in
+ * the cvBoostStartTraining function call and should not be modified.
+ * The function calculates response values and weights for the next weak
+ * classifier training and stores them into weakTrainVals and weights
+ * respectively.
+ * Note, the training of the weak classifier of iteration i+1 using
+ * weakTrainVals, weight, trainingData is outside of this function.
+ */
+CV_BOOST_API
+float cvBoostNextWeakClassifier( CvMat* weakEvalVals,
+ CvMat* trainClasses,
+ CvMat* weakTrainVals,
+ CvMat* weights,
+ CvBoostTrainer* trainer );
+
+/*
+ * cvBoostEndTraining
+ *
+ * The cvBoostEndTraining function finishes training process and releases
+ * internally allocated memory.
+ *
+ * Parameters
+ * trainer
+ * A pointer to a pointer to internal trainer returned by the cvBoostStartTraining
+ * function call.
+ */
+CV_BOOST_API
+void cvBoostEndTraining( CvBoostTrainer** trainer );
+
+/****************************************************************************************\
+* Boosted tree models *
+\****************************************************************************************/
+
+/*
+ * CvBtClassifier
+ *
+ * The CvBtClassifier structure represents boosted tree model.
+ *
+ * Members
+ * flags
+ * Flags. If CV_IS_TUNABLE( flags ) != 0 then the model supports tuning.
+ * eval
+ * Evaluation function. Returns sample predicted class (0, 1, etc.)
+ * for classification or predicted value for regression.
+ * tune
+ * Tune function. If the model supports tuning then tune call performs
+ * one more boosting iteration if passed to the function flags parameter
+ * is CV_TUNABLE otherwise releases internally allocated for tuning memory
+ * and makes the model untunable.
+ * NOTE: Since tuning uses the pointers to parameters,
+ * passed to the cvCreateBtClassifier function, they should not be modified
+ * or released between tune calls.
+ * save
+ * This function stores the model into given file.
+ * release
+ * This function releases the model.
+ * type
+ * Boosted tree model type.
+ * numclasses
+ * Number of classes for CV_LKCLASS type or 1 for all other types.
+ * numiter
+ * Number of iterations. Number of weak classifiers is equal to number
+ * of iterations for all types except CV_LKCLASS. For CV_LKCLASS type
+ * number of weak classifiers is (numiter * numclasses).
+ * numfeatures
+ * Number of features in sample.
+ * trees
+ * Stores weak classifiers when the model does not support tuning.
+ * seq
+ * Stores weak classifiers when the model supports tuning.
+ * trainer
+ * Pointer to internal tuning parameters if the model supports tuning.
+ */
+typedef struct CvBtClassifier
+{
+ CV_CLASSIFIER_FIELDS()
+
+ CvBoostType type;
+ int numclasses;
+ int numiter;
+ int numfeatures;
+ union
+ {
+ CvCARTClassifier** trees;
+ CvSeq* seq;
+ };
+ void* trainer;
+} CvBtClassifier;
+
+/*
+ * CvBtClassifierTrainParams
+ *
+ * The CvBtClassifierTrainParams structure stores training parameters for
+ * boosted tree model.
+ *
+ * Members
+ * type
+ * Boosted tree model type.
+ * numiter
+ * Desired number of iterations.
+ * param
+ * Parameter Model Type Parameter Meaning
+ * param[0] Any Shrinkage factor
+ * param[1] CV_MREG alpha. (1-alpha) determines "break-down" point of
+ * the training procedure, i.e. the fraction of samples
+ * that can be arbitrary modified without serious
+ * degrading the quality of the result.
+ * CV_DABCLASS, Weight trimming factor.
+ * CV_RABCLASS,
+ * CV_LBCLASS,
+ * CV_GABCLASS,
+ * CV_L2CLASS,
+ * CV_LKCLASS
+ * numsplits
+ * Desired number of splits in each tree.
+ */
+typedef struct CvBtClassifierTrainParams
+{
+ CV_CLASSIFIER_TRAIN_PARAM_FIELDS()
+
+ CvBoostType type;
+ int numiter;
+ float param[2];
+ int numsplits;
+} CvBtClassifierTrainParams;
+
+/*
+ * cvCreateBtClassifier
+ *
+ * The cvCreateBtClassifier function creates boosted tree model.
+ *
+ * Parameters
+ * trainData
+ * Matrix of feature values. Must have CV_32FC1 type.
+ * flags
+ * Determines how samples are stored in trainData.
+ * One of CV_ROW_SAMPLE or CV_COL_SAMPLE.
+ * Optionally may be combined with CV_TUNABLE to make tunable model.
+ * trainClasses
+ * Vector of responses for regression or classes (0, 1, 2, etc.) for classification.
+ * typeMask,
+ * missedMeasurementsMask,
+ * compIdx
+ * Not supported. Must be NULL.
+ * sampleIdx
+ * Indices of samples used in training. If NULL then all samples are used.
+ * For CV_DABCLASS, CV_RABCLASS, CV_LBCLASS and CV_GABCLASS must be NULL.
+ * weights
+ * Not supported. Must be NULL.
+ * trainParams
+ * A pointer to CvBtClassifierTrainParams structure. Training parameters.
+ * See CvBtClassifierTrainParams description for details.
+ *
+ * Return Values
+ * The return value is a pointer to created boosted tree model of type CvBtClassifier.
+ *
+ * Remarks
+ * The function performs trainParams->numiter training iterations.
+ * If CV_TUNABLE flag is specified then created model supports tuning.
+ * In this case additional training iterations may be performed by
+ * tune function call.
+ */
+CV_BOOST_API
+CvClassifier* cvCreateBtClassifier( CvMat* trainData,
+ int flags,
+ CvMat* trainClasses,
+ CvMat* typeMask,
+ CvMat* missedMeasurementsMask,
+ CvMat* compIdx,
+ CvMat* sampleIdx,
+ CvMat* weights,
+ CvClassifierTrainParams* trainParams );
+
+/*
+ * cvCreateBtClassifierFromFile
+ *
+ * The cvCreateBtClassifierFromFile function restores previously saved
+ * boosted tree model from file.
+ *
+ * Parameters
+ * filename
+ * The name of the file with boosted tree model.
+ *
+ * Remarks
+ * The restored model does not support tuning.
+ */
+CV_BOOST_API
+CvClassifier* cvCreateBtClassifierFromFile( const char* filename );
+
+/****************************************************************************************\
+* Utility functions *
+\****************************************************************************************/
+
+/*
+ * cvTrimWeights
+ *
+ * The cvTrimWeights function performs weight trimming.
+ *
+ * Parameters
+ * weights
+ * Weights vector.
+ * idx
+ * Indices vector of weights that should be considered.
+ * If it is NULL then all weights are used.
+ * factor
+ * Weight trimming factor. Must be in [0, 1] range.
+ *
+ * Return Values
+ * The return value is a vector of indices. If all samples should be used then
+ * it is equal to idx. In other case the cvReleaseMat function should be called
+ * to release it.
+ *
+ * Remarks
+ */
+CV_BOOST_API
+CvMat* cvTrimWeights( CvMat* weights, CvMat* idx, float factor );
+
+/*
+ * cvReadTrainData
+ *
+ * The cvReadTrainData function reads feature values and responses from file.
+ *
+ * Parameters
+ * filename
+ * The name of the file to be read.
+ * flags
+ * One of CV_ROW_SAMPLE or CV_COL_SAMPLE. Determines how feature values
+ * will be stored.
+ * trainData
+ * A pointer to a pointer to created matrix with feature values.
+ * cvReleaseMat function should be used to destroy created matrix.
+ * trainClasses
+ * A pointer to a pointer to created matrix with response values.
+ * cvReleaseMat function should be used to destroy created matrix.
+ *
+ * Remarks
+ * File format:
+ * ============================================
+ * m n
+ * value_1_1 value_1_2 ... value_1_n response_1
+ * value_2_1 value_2_2 ... value_2_n response_2
+ * ...
+ * value_m_1 value_m_2 ... value_m_n response_m
+ * ============================================
+ * m
+ * Number of samples
+ * n
+ * Number of features in each sample
+ * value_i_j
+ * Value of j-th feature of i-th sample
+ * response_i
+ * Response value of i-th sample
+ * For classification problems responses represent classes (0, 1, etc.)
+ * All values and classes are integer or real numbers.
+ */
+CV_BOOST_API
+void cvReadTrainData( const char* filename,
+ int flags,
+ CvMat** trainData,
+ CvMat** trainClasses );
+
+
+/*
+ * cvWriteTrainData
+ *
+ * The cvWriteTrainData function stores feature values and responses into file.
+ *
+ * Parameters
+ * filename
+ * The name of the file.
+ * flags
+ * One of CV_ROW_SAMPLE or CV_COL_SAMPLE. Determines how feature values
+ * are stored.
+ * trainData
+ * Feature values matrix.
+ * trainClasses
+ * Response values vector.
+ * sampleIdx
+ * Vector of idicies of the samples that should be stored. If it is NULL
+ * then all samples will be stored.
+ *
+ * Remarks
+ * See the cvReadTrainData function for file format description.
+ */
+CV_BOOST_API
+void cvWriteTrainData( const char* filename,
+ int flags,
+ CvMat* trainData,
+ CvMat* trainClasses,
+ CvMat* sampleIdx );
+
+/*
+ * cvRandShuffle
+ *
+ * The cvRandShuffle function perfroms random shuffling of given vector.
+ *
+ * Parameters
+ * vector
+ * Vector that should be shuffled.
+ * Must have CV_8UC1, CV_16SC1, CV_32SC1 or CV_32FC1 type.
+ */
+CV_BOOST_API
+void cvRandShuffleVec( CvMat* vector );
+
+#endif /* _CVCLASSIFIER_H_ */