Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members

gmm.h

00001 // Copyright (C) 1999 Jean-Marc Valin
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    //vector<Gaussian *>  gaussians;
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       //: gaussians(std::vector<Gaussian *>(nb_gauss,(Gaussian *)NULL))
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    //: gaussians(std::vector<Gaussian *>(1,(Gaussian *)NULL))
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       //gaussians[0] = new Gaussian (1, NewDiagonalCovariance);
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    //friend std::ostream &operator << (std::ostream &out, const GMM &gmm);
00165    friend std::istream &operator >> (std::istream &in, GMM &gmm);
00166 }
00167 ;
00168 
00169 //ostream &operator << (ostream &out, const GMM &gmm);
00170 std::istream &operator >> (std::istream &in, GMM &gmm);
00171 
00172 }//namespace FD
00173 
00174 #endif

Generated on Wed Oct 5 14:28:55 2005 for FlowDesigner by  doxygen 1.4.4