Direct Graphical Models  v.1.7.0
TrainEdgeConcat.h
1 // Concatenated training model for pairwise potentials
2 // Written by Sergey G. Kosov in 2015 - 2016 for Project X
3 #pragma once
4 
5 #include "TrainEdge.h"
6 #include "PriorNode.h"
7 #include "TrainNode.h"
8 #include "FeaturesConcatenator.h"
9 #include "macroses.h"
10 
11 namespace DirectGraphicalModels
12 {
13 
14  // ============================= Concatenated Edge Train Class =============================
25  template<class Trainer, class Concatenator> class CTrainEdgeConcat : public CTrainEdge
26  {
27  public:
34  CTrainEdgeConcat(byte nStates, word nFeatures)
35  : CBaseRandomModel(nStates)
36  , CTrainEdge(nStates, nFeatures)
37  {
38  DGM_ASSERT(nStates < 16);
39  m_pPrior = std::make_unique<CPriorNode>(nStates * nStates);
40  m_pTrainer = std::make_unique<Trainer>(nStates * nStates, nFeatures);
41  m_pConcatenator = std::make_unique<Concatenator>(nFeatures);
42  m_featureVector = Mat(m_pConcatenator->getNumFeatures(), 1, CV_8UC1);
43  }
52  template<class TrainerParams> CTrainEdgeConcat(byte nStates, word nFeatures, TrainerParams params)
53  : CTrainEdge(nStates, nFeatures)
54  , CBaseRandomModel(nStates)
55  {
56  DGM_ASSERT(nStates < 16);
57  m_pPrior = std::make_unique<CPriorNode>(nStates * nStates);
58  m_pTrainer = std::make_unique<Trainer>(nStates * nStates, nFeatures, params);
59  m_pConcatenator = std::make_unique<Concatenator>(nFeatures);
60  m_featureVector = Mat(m_pConcatenator->getNumFeatures(), 1, CV_8UC1);
61  }
62  virtual ~CTrainEdgeConcat(void) = default;
63 
64 
65  virtual void reset(void) { m_pPrior->reset(); m_pTrainer->reset(); }
66  void save(const std::string &path, const std::string &name = std::string(), short idx = -1) const { m_pTrainer->save(path, name.empty() ? "CTrainEdgeConcat" : name, idx); }
67  void load(const std::string &path, const std::string &name = std::string(), short idx = -1) { m_pTrainer->load(path, name.empty() ? "CTrainEdgeConcat" : name, idx); }
68 
69  virtual void addFeatureVecs(const Mat &featureVector1, byte gt1, const Mat &featureVector2, byte gt2)
70  {
71  byte gt = gt2 * m_nStates + gt1;
72  m_pPrior->addNodeGroundTruth(gt);
73  m_pConcatenator->concatenate(featureVector1, featureVector2, m_featureVector);
74  m_pTrainer->addFeatureVec(m_featureVector, gt);
75  }
76  virtual void train(bool doClean = false) { m_pTrainer->train(doClean); }
77 
78 
79  protected:
80  DllExport virtual void saveFile(FILE *pFile) const {}
81  DllExport virtual void loadFile(FILE *pFile) {}
94  DllExport virtual Mat calculateEdgePotentials(const Mat &featureVector1, const Mat &featureVector2, const vec_float_t &vParams) const
95  {
96  const float nodePotWeight = 1.0f;
97  m_pConcatenator->concatenate(featureVector1, featureVector2, const_cast<Mat &>(m_featureVector));
98  Mat pot = m_pTrainer->getNodePotentials(m_featureVector, nodePotWeight);
99  Mat prior = m_pPrior->getPrior(100);
100 
101  Mat res(m_nStates, m_nStates, CV_32FC1);
102 
103  for (byte gt1 = 0; gt1 < m_nStates; gt1++) {
104  float * pRes = res.ptr<float>(gt1);
105  for (byte gt2 = 0; gt2 < m_nStates; gt2++) {
106  byte gt = gt2 * m_nStates + gt1;
107 
108  float epsilon = prior.at<float>(gt) > 0 ? FLT_EPSILON : 0.0f;
109  pRes[gt2] = MAX(pot.at<float>(gt), epsilon);
110  }
111  }
112 
113  return res;
114  }
115 
116 
117  private:
118  std::unique_ptr<CPriorNode> m_pPrior;
119  std::unique_ptr<CTrainNode> m_pTrainer;
120  std::unique_ptr<CFeaturesConcatenator> m_pConcatenator;
122  };
123 }
virtual ~CTrainEdgeConcat(void)=default
virtual void train(bool doClean=false)
Random model training.
void save(const std::string &path, const std::string &name=std::string(), short idx=-1) const
Saves the training data.
virtual Mat calculateEdgePotentials(const Mat &featureVector1, const Mat &featureVector2, const vec_float_t &vParams) const
Returns the data-dependent edge potentials.
void load(const std::string &path, const std::string &name=std::string(), short idx=-1)
Loads the training data.
CTrainEdgeConcat(byte nStates, word nFeatures)
Constructor.
Base abstract class for edge potentials training.
Definition: TrainEdge.h:24
Base abstract class for random model training.
virtual void reset(void)
Resets class variables.
Concatenated edge training class.
virtual void saveFile(FILE *pFile) const
Saves the random model into the file.
CTrainEdgeConcat(byte nStates, word nFeatures, TrainerParams params)
Constructor.
virtual void loadFile(FILE *pFile)
Loads the random model from the file.
virtual void addFeatureVecs(const Mat &featureVector1, byte gt1, const Mat &featureVector2, byte gt2)
Adds a pair of feature vectors.
std::unique_ptr< CFeaturesConcatenator > m_pConcatenator
Feature concatenator.
std::unique_ptr< CTrainNode > m_pTrainer
Node trainer
byte m_nStates
The number of states (classes)
std::unique_ptr< CPriorNode > m_pPrior
Node prior poobability