00001
00002 #ifndef GMM_H
00003 #define GMM_H
00004 #include "gaussian.h"
00005 #include "covariance.h"
00006 #include "Object.h"
00007 #include "ObjectParser.h"
00008 #include "gaussian_set.h"
00009 #include "DiagGMM.h"
00010
00011 namespace FD {
00012
00013 class GMM;
00014
00016 class Score {
00017 public:
00019 float score;
00020
00022 int gaussian_id;
00023
00025 float * frame;
00026
00028 const GMM *gmm;
00029 public:
00030
00032 friend class GMM;
00033 };
00034
00036 class GMM : public Object{
00037 public:
00038
00039 typedef enum {real, accum} GMM_Mode;
00040 protected:
00041
00043
00044 std::vector<RCPtr<Gaussian> > gaussians;
00045
00047 std::vector<float> apriori;
00048
00050 int nb_gaussians;
00051
00053 int mode;
00054
00056 int nb_frames_aligned;
00057
00059 int dimensions;
00060
00062 bool using_gaussianIDs;
00063
00065 std::vector<int> gaussianIDs;
00066
00067 public:
00070 GMM(int nb_gauss, int dim, Covariance *(*cov_new)(int))
00071 : gaussians(std::vector<RCPtr<Gaussian> >(nb_gauss))
00072
00073 , apriori (std::vector<float>(nb_gauss,0.0))
00074 , nb_gaussians (nb_gauss)
00075 , mode(accum)
00076 , nb_frames_aligned(0)
00077 , dimensions (dim)
00078 , using_gaussianIDs(false)
00079 {
00080 for (int i=0;i<nb_gauss;i++)
00081 gaussians[i] = RCPtr<Gaussian> (new Gaussian (dim, cov_new));
00082 }
00083
00084 GMM ()
00085
00086 : gaussians(std::vector<RCPtr<Gaussian> >())
00087 , nb_gaussians (0)
00088 , mode(accum)
00089 , nb_frames_aligned(0)
00090 , dimensions(1)
00091 , using_gaussianIDs(false)
00092 {
00093
00094 }
00095
00096 void save(std::string file);
00097
00099 int get_nb_gaussians() const {return nb_gaussians;}
00100
00102 Gaussian &gaussian (int i) const {return *(gaussians[i]);}
00103
00105 void accum_to_gaussian(int i, const float * fr)
00106 {
00107 gaussians[i]->accum_frame(fr);
00108 apriori[i]+=1.0;
00109 nb_frames_aligned++;
00110 }
00111
00113 void init(std::vector<float * > frames);
00114
00116 void kmeans1(std::vector<float * > frames, int nb_iterations = 1);
00117
00119 void split1();
00120
00122 void kmeans2(std::vector<float * > frames, GMM *gmm);
00123
00125 void adaptMAP(std::vector<float * > frame, GMM *gmm);
00126
00128 void to_real();
00129
00131 void reset_to_accum_mode();
00132
00135 Score minDistance(float * fr, Covariance *cov) const;
00136
00138 Score score(float * fr) const;
00139
00141 void binary_split();
00142
00145 std::vector<Score> minDistance(std::vector <float *> fr) const;
00146
00148 std::vector<Score> score(std::vector <float *> fr) const;
00149
00150 void toIDsUsing (GaussianSet & gauss);
00151
00152 void toPtrsUsing (const GaussianSet & gauss);
00153
00155 DiagGMM *createDiagGMM();
00156
00158 virtual void printOn(std::ostream &out=std::cout) const;
00159
00161 void readFrom (std::istream &in=std::cin);
00162
00163
00165 friend std::istream &operator >> (std::istream &in, GMM &gmm);
00166 }
00167 ;
00168
00169
00170 std::istream &operator >> (std::istream &in, GMM &gmm);
00171
00172 }
00173
00174 #endif