/*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. // // // License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000, Intel Corporation, all rights reserved. // Copyright (C) 2013, OpenCV Foundation, all rights reserved. // Copyright (C) 2014, Itseez Inc, 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 the copyright holders 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*/ #ifndef __OPENCV_ML_HPP__ #define __OPENCV_ML_HPP__ #ifdef __cplusplus # include "opencv2/core.hpp" #endif #ifdef __cplusplus #include #include #include namespace cv { namespace ml { /* Variable type */ enum { VAR_NUMERICAL =0, VAR_ORDERED =0, VAR_CATEGORICAL =1 }; enum { TEST_ERROR = 0, TRAIN_ERROR = 1 }; enum { ROW_SAMPLE = 0, COL_SAMPLE = 1 }; class CV_EXPORTS_W_MAP ParamGrid { public: ParamGrid(); ParamGrid(double _minVal, double _maxVal, double _logStep); CV_PROP_RW double minVal; CV_PROP_RW double maxVal; CV_PROP_RW double logStep; }; class CV_EXPORTS TrainData { public: static inline float missingValue() { return FLT_MAX; } virtual ~TrainData(); virtual int getLayout() const = 0; virtual int getNTrainSamples() const = 0; virtual int getNTestSamples() const = 0; virtual int getNSamples() const = 0; virtual int getNVars() const = 0; virtual int getNAllVars() const = 0; virtual void getSample(InputArray varIdx, int sidx, float* buf) const = 0; virtual Mat getSamples() const = 0; virtual Mat getMissing() const = 0; virtual Mat getTrainSamples(int layout=ROW_SAMPLE, bool compressSamples=true, bool compressVars=true) const = 0; virtual Mat getTrainResponses() const = 0; virtual Mat getTrainNormCatResponses() const = 0; virtual Mat getTestResponses() const = 0; virtual Mat getTestNormCatResponses() const = 0; virtual Mat getResponses() const = 0; virtual Mat getNormCatResponses() const = 0; virtual Mat getSampleWeights() const = 0; virtual Mat getTrainSampleWeights() const = 0; virtual Mat getTestSampleWeights() const = 0; virtual Mat getVarIdx() const = 0; virtual Mat getVarType() const = 0; virtual int getResponseType() const = 0; virtual Mat getTrainSampleIdx() const = 0; virtual Mat getTestSampleIdx() const = 0; virtual void getValues(int vi, InputArray sidx, float* values) const = 0; virtual void getNormCatValues(int vi, InputArray sidx, int* values) const = 0; virtual Mat getDefaultSubstValues() const = 0; virtual int getCatCount(int vi) const = 0; virtual Mat getClassLabels() const = 0; virtual Mat getCatOfs() const = 0; virtual Mat getCatMap() const = 0; virtual void setTrainTestSplit(int count, bool shuffle=true) = 0; virtual void setTrainTestSplitRatio(double ratio, bool shuffle=true) = 0; virtual void shuffleTrainTest() = 0; static Mat getSubVector(const Mat& vec, const Mat& idx); static Ptr loadFromCSV(const String& filename, int headerLineCount, int responseStartIdx=-1, int responseEndIdx=-1, const String& varTypeSpec=String(), char delimiter=',', char missch='?'); static Ptr create(InputArray samples, int layout, InputArray responses, InputArray varIdx=noArray(), InputArray sampleIdx=noArray(), InputArray sampleWeights=noArray(), InputArray varType=noArray()); }; class CV_EXPORTS_W StatModel : public Algorithm { public: enum { UPDATE_MODEL = 1, RAW_OUTPUT=1, COMPRESSED_INPUT=2, PREPROCESSED_INPUT=4 }; virtual void clear(); virtual int getVarCount() const = 0; virtual bool isTrained() const = 0; virtual bool isClassifier() const = 0; virtual bool train( const Ptr& trainData, int flags=0 ); virtual bool train( InputArray samples, int layout, InputArray responses ); virtual float calcError( const Ptr& data, bool test, OutputArray resp ) const; virtual float predict( InputArray samples, OutputArray results=noArray(), int flags=0 ) const = 0; template static Ptr<_Tp> load(const String& filename) { FileStorage fs(filename, FileStorage::READ); Ptr<_Tp> model = _Tp::create(); model->read(fs.getFirstTopLevelNode()); return model->isTrained() ? model : Ptr<_Tp>(); } template static Ptr<_Tp> train(const Ptr& data, const typename _Tp::Params& p, int flags=0) { Ptr<_Tp> model = _Tp::create(p); return !model.empty() && model->train(data, flags) ? model : Ptr<_Tp>(); } template static Ptr<_Tp> train(InputArray samples, int layout, InputArray responses, const typename _Tp::Params& p, int flags=0) { Ptr<_Tp> model = _Tp::create(p); return !model.empty() && model->train(TrainData::create(samples, layout, responses), flags) ? model : Ptr<_Tp>(); } virtual void save(const String& filename) const; virtual String getDefaultModelName() const = 0; }; /****************************************************************************************\ * Normal Bayes Classifier * \****************************************************************************************/ /* The structure, representing the grid range of statmodel parameters. It is used for optimizing statmodel accuracy by varying model parameters, the accuracy estimate being computed by cross-validation. The grid is logarithmic, so must be greater then 1. */ class CV_EXPORTS_W NormalBayesClassifier : public StatModel { public: class CV_EXPORTS_W Params { public: Params(); }; virtual float predictProb( InputArray inputs, OutputArray outputs, OutputArray outputProbs, int flags=0 ) const = 0; virtual void setParams(const Params& params) = 0; virtual Params getParams() const = 0; static Ptr create(const Params& params=Params()); }; /****************************************************************************************\ * K-Nearest Neighbour Classifier * \****************************************************************************************/ // k Nearest Neighbors class CV_EXPORTS_W KNearest : public StatModel { public: class CV_EXPORTS_W_MAP Params { public: Params(int defaultK=10, bool isclassifier_=true, int Emax_=INT_MAX, int algorithmType_=BRUTE_FORCE); CV_PROP_RW int defaultK; CV_PROP_RW bool isclassifier; CV_PROP_RW int Emax; // for implementation with KDTree CV_PROP_RW int algorithmType; }; virtual void setParams(const Params& p) = 0; virtual Params getParams() const = 0; virtual float findNearest( InputArray samples, int k, OutputArray results, OutputArray neighborResponses=noArray(), OutputArray dist=noArray() ) const = 0; enum { BRUTE_FORCE=1, KDTREE=2 }; static Ptr create(const Params& params=Params()); }; /****************************************************************************************\ * Support Vector Machines * \****************************************************************************************/ // SVM model class CV_EXPORTS_W SVM : public StatModel { public: class CV_EXPORTS_W_MAP Params { public: Params(); Params( int svm_type, int kernel_type, double degree, double gamma, double coef0, double Cvalue, double nu, double p, const Mat& classWeights, TermCriteria termCrit ); CV_PROP_RW int svmType; CV_PROP_RW int kernelType; CV_PROP_RW double gamma, coef0, degree; CV_PROP_RW double C; // for CV_SVM_C_SVC, CV_SVM_EPS_SVR and CV_SVM_NU_SVR CV_PROP_RW double nu; // for CV_SVM_NU_SVC, CV_SVM_ONE_CLASS, and CV_SVM_NU_SVR CV_PROP_RW double p; // for CV_SVM_EPS_SVR CV_PROP_RW Mat classWeights; // for CV_SVM_C_SVC CV_PROP_RW TermCriteria termCrit; // termination criteria }; class CV_EXPORTS Kernel : public Algorithm { public: virtual int getType() const = 0; virtual void calc( int vcount, int n, const float* vecs, const float* another, float* results ) = 0; }; // SVM type enum { C_SVC=100, NU_SVC=101, ONE_CLASS=102, EPS_SVR=103, NU_SVR=104 }; // SVM kernel type enum { CUSTOM=-1, LINEAR=0, POLY=1, RBF=2, SIGMOID=3, CHI2=4, INTER=5 }; // SVM params type enum { C=0, GAMMA=1, P=2, NU=3, COEF=4, DEGREE=5 }; virtual bool trainAuto( const Ptr& data, int kFold = 10, ParamGrid Cgrid = SVM::getDefaultGrid(SVM::C), ParamGrid gammaGrid = SVM::getDefaultGrid(SVM::GAMMA), ParamGrid pGrid = SVM::getDefaultGrid(SVM::P), ParamGrid nuGrid = SVM::getDefaultGrid(SVM::NU), ParamGrid coeffGrid = SVM::getDefaultGrid(SVM::COEF), ParamGrid degreeGrid = SVM::getDefaultGrid(SVM::DEGREE), bool balanced=false) = 0; CV_WRAP virtual Mat getSupportVectors() const = 0; virtual void setParams(const Params& p, const Ptr& customKernel=Ptr()) = 0; virtual Params getParams() const = 0; virtual Ptr getKernel() const = 0; virtual double getDecisionFunction(int i, OutputArray alpha, OutputArray svidx) const = 0; static ParamGrid getDefaultGrid( int param_id ); static Ptr create(const Params& p=Params(), const Ptr& customKernel=Ptr()); }; /****************************************************************************************\ * Expectation - Maximization * \****************************************************************************************/ class CV_EXPORTS_W EM : public StatModel { public: // Type of covariation matrices enum {COV_MAT_SPHERICAL=0, COV_MAT_DIAGONAL=1, COV_MAT_GENERIC=2, COV_MAT_DEFAULT=COV_MAT_DIAGONAL}; // Default parameters enum {DEFAULT_NCLUSTERS=5, DEFAULT_MAX_ITERS=100}; // The initial step enum {START_E_STEP=1, START_M_STEP=2, START_AUTO_STEP=0}; class CV_EXPORTS_W_MAP Params { public: explicit Params(int nclusters=DEFAULT_NCLUSTERS, int covMatType=EM::COV_MAT_DIAGONAL, const TermCriteria& termCrit=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, EM::DEFAULT_MAX_ITERS, 1e-6)); CV_PROP_RW int nclusters; CV_PROP_RW int covMatType; CV_PROP_RW TermCriteria termCrit; }; virtual void setParams(const Params& p) = 0; virtual Params getParams() const = 0; virtual Mat getWeights() const = 0; virtual Mat getMeans() const = 0; virtual void getCovs(std::vector& covs) const = 0; CV_WRAP virtual Vec2d predict2(InputArray sample, OutputArray probs) const = 0; virtual bool train( const Ptr& trainData, int flags=0 ) = 0; static Ptr train(InputArray samples, OutputArray logLikelihoods=noArray(), OutputArray labels=noArray(), OutputArray probs=noArray(), const Params& params=Params()); static Ptr train_startWithE(InputArray samples, InputArray means0, InputArray covs0=noArray(), InputArray weights0=noArray(), OutputArray logLikelihoods=noArray(), OutputArray labels=noArray(), OutputArray probs=noArray(), const Params& params=Params()); static Ptr train_startWithM(InputArray samples, InputArray probs0, OutputArray logLikelihoods=noArray(), OutputArray labels=noArray(), OutputArray probs=noArray(), const Params& params=Params()); static Ptr create(const Params& params=Params()); }; /****************************************************************************************\ * Decision Tree * \****************************************************************************************/ class CV_EXPORTS_W DTrees : public StatModel { public: enum { PREDICT_AUTO=0, PREDICT_SUM=(1<<8), PREDICT_MAX_VOTE=(2<<8), PREDICT_MASK=(3<<8) }; class CV_EXPORTS_W_MAP Params { public: Params(); Params( int maxDepth, int minSampleCount, double regressionAccuracy, bool useSurrogates, int maxCategories, int CVFolds, bool use1SERule, bool truncatePrunedTree, const Mat& priors ); CV_PROP_RW int maxCategories; CV_PROP_RW int maxDepth; CV_PROP_RW int minSampleCount; CV_PROP_RW int CVFolds; CV_PROP_RW bool useSurrogates; CV_PROP_RW bool use1SERule; CV_PROP_RW bool truncatePrunedTree; CV_PROP_RW float regressionAccuracy; CV_PROP_RW Mat priors; }; class CV_EXPORTS Node { public: Node(); double value; int classIdx; int parent; int left; int right; int defaultDir; int split; }; class CV_EXPORTS Split { public: Split(); int varIdx; bool inversed; float quality; int next; float c; int subsetOfs; }; virtual void setDParams(const Params& p); virtual Params getDParams() const; virtual const std::vector& getRoots() const = 0; virtual const std::vector& getNodes() const = 0; virtual const std::vector& getSplits() const = 0; virtual const std::vector& getSubsets() const = 0; static Ptr create(const Params& params=Params()); }; /****************************************************************************************\ * Random Trees Classifier * \****************************************************************************************/ class CV_EXPORTS_W RTrees : public DTrees { public: class CV_EXPORTS_W_MAP Params : public DTrees::Params { public: Params(); Params( int maxDepth, int minSampleCount, double regressionAccuracy, bool useSurrogates, int maxCategories, const Mat& priors, bool calcVarImportance, int nactiveVars, TermCriteria termCrit ); CV_PROP_RW bool calcVarImportance; // true <=> RF processes variable importance CV_PROP_RW int nactiveVars; CV_PROP_RW TermCriteria termCrit; }; virtual void setRParams(const Params& p) = 0; virtual Params getRParams() const = 0; virtual Mat getVarImportance() const = 0; static Ptr create(const Params& params=Params()); }; /****************************************************************************************\ * Boosted tree classifier * \****************************************************************************************/ class CV_EXPORTS_W Boost : public DTrees { public: class CV_EXPORTS_W_MAP Params : public DTrees::Params { public: CV_PROP_RW int boostType; CV_PROP_RW int weakCount; CV_PROP_RW double weightTrimRate; Params(); Params( int boostType, int weakCount, double weightTrimRate, int maxDepth, bool useSurrogates, const Mat& priors ); }; // Boosting type enum { DISCRETE=0, REAL=1, LOGIT=2, GENTLE=3 }; virtual Params getBParams() const = 0; virtual void setBParams(const Params& p) = 0; static Ptr create(const Params& params=Params()); }; /****************************************************************************************\ * Gradient Boosted Trees * \****************************************************************************************/ /*class CV_EXPORTS_W GBTrees : public DTrees { public: struct CV_EXPORTS_W_MAP Params : public DTrees::Params { CV_PROP_RW int weakCount; CV_PROP_RW int lossFunctionType; CV_PROP_RW float subsamplePortion; CV_PROP_RW float shrinkage; Params(); Params( int lossFunctionType, int weakCount, float shrinkage, float subsamplePortion, int maxDepth, bool useSurrogates ); }; enum {SQUARED_LOSS=0, ABSOLUTE_LOSS, HUBER_LOSS=3, DEVIANCE_LOSS}; virtual void setK(int k) = 0; virtual float predictSerial( InputArray samples, OutputArray weakResponses, int flags) const = 0; static Ptr create(const Params& p); };*/ /****************************************************************************************\ * Artificial Neural Networks (ANN) * \****************************************************************************************/ /////////////////////////////////// Multi-Layer Perceptrons ////////////////////////////// class CV_EXPORTS_W ANN_MLP : public StatModel { public: struct CV_EXPORTS_W_MAP Params { Params(); Params( const Mat& layerSizes, int activateFunc, double fparam1, double fparam2, TermCriteria termCrit, int trainMethod, double param1, double param2=0 ); enum { BACKPROP=0, RPROP=1 }; CV_PROP_RW Mat layerSizes; CV_PROP_RW int activateFunc; CV_PROP_RW double fparam1; CV_PROP_RW double fparam2; CV_PROP_RW TermCriteria termCrit; CV_PROP_RW int trainMethod; // backpropagation parameters CV_PROP_RW double bpDWScale, bpMomentScale; // rprop parameters CV_PROP_RW double rpDW0, rpDWPlus, rpDWMinus, rpDWMin, rpDWMax; }; // possible activation functions enum { IDENTITY = 0, SIGMOID_SYM = 1, GAUSSIAN = 2 }; // available training flags enum { UPDATE_WEIGHTS = 1, NO_INPUT_SCALE = 2, NO_OUTPUT_SCALE = 4 }; virtual Mat getWeights(int layerIdx) const = 0; virtual void setParams(const Params& p) = 0; virtual Params getParams() const = 0; static Ptr create(const Params& params=Params()); }; /****************************************************************************************\ * Logistic Regression * \****************************************************************************************/ class CV_EXPORTS LogisticRegression : public StatModel { public: class CV_EXPORTS Params { public: Params(double learning_rate = 0.001, int iters = 1000, int method = LogisticRegression::BATCH, int normlization = LogisticRegression::REG_L2, int reg = 1, int batch_size = 1); double alpha; int num_iters; int norm; int regularized; int train_method; int mini_batch_size; TermCriteria term_crit; }; enum { REG_L1 = 0, REG_L2 = 1}; enum { BATCH = 0, MINI_BATCH = 1}; // Algorithm interface virtual void write( FileStorage &fs ) const = 0; virtual void read( const FileNode &fn ) = 0; // StatModel interface virtual bool train( const Ptr& trainData, int flags=0 ) = 0; virtual float predict( InputArray samples, OutputArray results=noArray(), int flags=0 ) const = 0; virtual void clear() = 0; virtual Mat get_learnt_thetas() const = 0; static Ptr create( const Params& params = Params() ); }; /****************************************************************************************\ * Auxilary functions declarations * \****************************************************************************************/ /* Generates from multivariate normal distribution, where - is an average row vector, - symmetric covariation matrix */ CV_EXPORTS void randMVNormal( InputArray mean, InputArray cov, int nsamples, OutputArray samples); /* Generates sample from gaussian mixture distribution */ CV_EXPORTS void randGaussMixture( InputArray means, InputArray covs, InputArray weights, int nsamples, OutputArray samples, OutputArray sampClasses ); /* creates test set */ CV_EXPORTS void createConcentricSpheresTestSet( int nsamples, int nfeatures, int nclasses, OutputArray samples, OutputArray responses); } } #endif // __cplusplus #endif // __OPENCV_ML_HPP__ /* End of file. */