Direct Graphical Models  v.1.7.0
TrainNodeCvSVM.cpp
1 #include "TrainNodeCvSVM.h"
2 #include "SamplesAccumulator.h"
3 
4 namespace DirectGraphicalModels
5 {
6  // Constructor
7  CTrainNodeCvSVM::CTrainNodeCvSVM(byte nStates, word nFeatures, TrainNodeCvSVMParams params) : CBaseRandomModel(nStates), CTrainNode(nStates, nFeatures)
8  {
9  init(params);
10  }
11 
12  // Constructor
13  CTrainNodeCvSVM::CTrainNodeCvSVM(byte nStates, word nFeatures, size_t maxSamples) : CBaseRandomModel(nStates), CTrainNode(nStates, nFeatures)
14  {
16  params.maxSamples = maxSamples;
17  init(params);
18  }
19 
21  {
23  m_pSVM = ml::SVM::create();
24  m_pSVM->setType(ml::SVM::C_SVC);
25  m_pSVM->setC(params.C);
26  m_pSVM->setKernel(ml::SVM::INTER);
27  m_pSVM->setTermCriteria(TermCriteria(params.term_criteria_type, params.maxCount, params.epsilon));
28  }
29 
30  // Destructor
32  {
33  delete m_pSamplesAcc;
34  }
35 
37  {
39  m_pSVM->clear();
40  }
41 
42  void CTrainNodeCvSVM::save(const std::string &path, const std::string &name, short idx) const
43  {
44  std::string fileName = generateFileName(path, name.empty() ? "TrainNodeCvSVM" : name, idx);
45  m_pSVM->save(fileName.c_str());
46  }
47 
48  void CTrainNodeCvSVM::load(const std::string &path, const std::string &name, short idx)
49  {
50  std::string fileName = generateFileName(path, name.empty() ? "TrainNodeCvSVM" : name, idx);
51  m_pSVM = Algorithm::load<ml::SVM>(fileName.c_str());
52  }
53 
54  void CTrainNodeCvSVM::addFeatureVec(const Mat &featureVector, byte gt)
55  {
56  m_pSamplesAcc->addSample(featureVector, gt);
57  }
58 
59  void CTrainNodeCvSVM::train(bool doClean)
60  {
61 #ifdef DEBUG_PRINT_INFO
62  printf("\n");
63 #endif
64  // Filling the <samples> and <classes>
65  Mat samples, classes;
66  for (byte s = 0; s < m_nStates; s++) { // states
67  int nSamples = m_pSamplesAcc->getNumSamples(s);
68 #ifdef DEBUG_PRINT_INFO
69  printf("State[%d] - %d of %d samples\n", s, nSamples, m_pSamplesAcc->getNumInputSamples(s));
70 #endif
71  samples.push_back(m_pSamplesAcc->getSamplesContainer(s));
72  classes.push_back(Mat(nSamples, 1, CV_32SC1, Scalar(s)));
73  if (doClean) m_pSamplesAcc->release(s); // free memory
74  } // s
75  samples.convertTo(samples, CV_32FC1);
76 
77  m_pSVM->train(samples, ml::ROW_SAMPLE, classes);
78  }
79 
80  void CTrainNodeCvSVM::calculateNodePotentials(const Mat &featureVector, Mat &potential, Mat &mask) const
81  {
82  Mat fv;
83  featureVector.convertTo(fv, CV_32FC1);
84  float res = m_pSVM->predict(fv.t());
85  byte s = static_cast<byte>(res);
86  potential.at<float>(s, 0) = 1.0f;
87  potential += 0.1f;
88  }
89 }
void calculateNodePotentials(const Mat &featureVector, Mat &potential, Mat &mask) const
Calculates the node potential, based on the feature vector.
CSamplesAccumulator * m_pSamplesAcc
Samples Accumulator.
void reset(void)
Resets class variables.
std::string generateFileName(const std::string &path, const std::string &name, short idx) const
Generates name of the data file for storing random model parameters.
double epsilon
The desired accuracy or change in parameters at which the iterative algorithm stops.
int getNumSamples(byte state) const
Returns the number of stored samples in container for the state (class) state.
const TrainNodeCvSVMParams TRAIN_NODE_CV_SVM_PARAMS_DEFAULT
Base abstract class for random model training.
Ptr< ml::SVM > m_pSVM
Support Vector Machine.
void release(byte state)
Releases memory of container for the state (class) state.
void load(const std::string &path, const std::string &name=std::string(), short idx=-1)
Loads the training data.
void save(const std::string &path, const std::string &name=std::string(), short idx=-1) const
Saves the training data.
OpenCV Support Vector machine parameters.
void addSample(const Mat &featureVector, byte state)
Adds new sample to the accumulator.
void reset(void)
Resets the accumulator.
int maxCount
The maximum number of iterations (time / accuracy)
int term_criteria_type
Termination cirteria type (according the the two previous parameters)
double C
Parameter C of a SVM optimization problem.
Samples accumulator abstract class.
void init(TrainNodeCvSVMParams params)
void train(bool doClean=false)
Random model training.
Base abstract class for node potentials training.
Definition: TrainNode.h:47
Mat getSamplesContainer(byte state) const
Returns samples container for the state (class) state.
int getNumInputSamples(byte state) const
Returns the number of input samples in container for the state (class) state.
CTrainNodeCvSVM(byte nStates, word nFeatures, TrainNodeCvSVMParams params=TRAIN_NODE_CV_SVM_PARAMS_DEFAULT)
Constructor.
void addFeatureVec(const Mat &featureVector, byte gt)
Adds new feature vector.
size_t maxSamples
Maximum number of samples to be used in training. 0 means using all the samples.
byte m_nStates
The number of states (classes)