Changeset 97


Ignore:
Timestamp:
08/03/2009 01:42:48 PM (10 years ago)
Author:
dave
Message:

added the eigen spaces and the rest of the data associated with this, faces, etc

Location:
foam/trunk
Files:
298 added
5 edited

Legend:

Unmodified
Added
Removed
  • foam/trunk/eigentools/src/main.cpp

    r96 r97  
    3939#include "Vector.h" 
    4040#include "PCA.h" 
    41 #include <glob.h> 
     41#include "FileTools.h" 
    4242 
    4343using namespace std; 
     
    5858Image src("../data/images/faces/dave/dave.png"); 
    5959 
    60 void Recalc() 
    61 { 
    62         glob_t g; 
    63          
    64         glob("../data/images/faces/dave/*.png",GLOB_PERIOD,NULL,&g); 
    65         for (unsigned int n=0; n<g.gl_pathc; n++) 
    66         { 
    67                 string path=g.gl_pathv[n]; 
    68                 cerr<<path<<endl; 
    69                 Image im(path); 
    70                 //im.SubMean(); 
     60void Generate(PCA &pca, const string &imagepath) 
     61{ 
     62        vector<string> images=Glob(imagepath); 
     63        for (vector<string>::iterator i=images.begin(); i!=images.end(); i++) 
     64        { 
     65                cerr<<*i<<endl; 
     66                Image im(*i); 
    7167                Vector<float> v(im.Scale(w,h).RGB2GRAY().ToFloatVector()); 
    7268                v-=v.Mean(); 
    7369                pca.AddFeature(v); 
    74         } 
    75         globfree (&g); 
    76          
     70        }        
    7771        pca.Calculate();  
     72} 
     73 
     74PCA MakeSubspace(const PCA &space, const string &imagepath) 
     75{ 
     76        PCA subspace(space.GetFeatureSize()); 
     77         
     78        // find the transform based on the parameters 
     79        vector<string> images=Glob(imagepath); 
     80        for (vector<string>::iterator i=images.begin(); i!=images.end(); i++) 
     81        { 
     82                cerr<<*i<<endl; 
     83                Image im(*i); 
     84                Vector<float> v(im.Scale(w,h).RGB2GRAY().ToFloatVector()); 
     85                v-=v.Mean(); 
     86                subspace.AddFeature(space.Project(v)); 
     87        } 
     88         
     89        subspace.Calculate(); 
     90 
     91        // project back each row 
     92        // think there must be a much much better way to do this... 
     93        for (int i=0; i<subspace.EigenTransform().GetRows(); i++) 
     94        { 
     95                cerr<<"row: "<<i<<endl; 
     96                Vector<float> row = subspace.EigenTransform().GetRowVector(i); 
     97                subspace.EigenTransform().SetRowVector(i, 
     98                        pca.Synth(row)); 
     99        } 
     100 
     101        return subspace;  
    78102} 
    79103 
     
    87111} 
    88112 
     113void SavePCA(const PCA &pca, string filename) 
     114{ 
     115        FILE *f=fopen(filename.c_str(), "wb"); 
     116        pca.Save(f); 
     117        fclose(f); 
     118} 
     119 
    89120void TestPCA() 
    90121{ 
     
    93124        //pca.Save(f); 
    94125        pca = LoadPCA("../data/eigenspaces/spacek-20x30.pca"); 
    95          
    96         PCA davelight = LoadPCA("davelight-20x30.pca"); 
    97         //pca.Mult(davelight); 
    98         pca = davelight; 
    99          
    100         pca.Compress(0,100); 
     126        PCA subspace = LoadPCA("dave-resynthed-sub.pca"); 
     127 
     128        //pca.Compress(0,10); 
     129        //pca.Compress(0,30); 
     130                 
     131        //pca.EigenTransform() *= subspace.EigenTransform().Transposed(); 
     132         
     133        PCA davesubspace = MakeSubspace(pca,"../data/images/faces/dave/*.png"); 
     134        SavePCA(davesubspace,"davelight-spacek-20x30.pca"); 
     135                 
    101136        src = src.Scale(w,h).RGB2GRAY(); 
    102137        Vector<float> d(src.ToFloatVector());    
     
    325360         
    326361        static float t=0; 
    327         cerr<<sin(t)<<endl; 
    328         for (unsigned int i=0; i<100; i++) 
    329         { 
    330                 camera.Blit(Image(w,h,1,(pca.GetEigenTransform().GetRowVector(i)*50*sin(t))/((i+1) * 1)+pca.GetMean() 
     362 
     363        for (unsigned int i=0; i<10; i++) 
     364        { 
     365                //camera.Blit(Image(w,h,1,(pca.GetEigenTransform().GetRowVector(i)*50*sin(t))/((i+1) * 1) //+pca.GetMean() 
     366                //      ),(i%30)*(w+2),0+(i/30)*(h+2)); 
     367                camera.Blit(Image(w,h,1,pca.GetEigenTransform().GetRowVector(i)*3 //+pca.GetMean() 
    331368                        ),(i%30)*(w+2),0+(i/30)*(h+2)); 
    332369        } 
  • foam/trunk/vision/src/Matrix.h

    r96 r97  
    9494        void SetRowVector(unsigned int r, const Vector<T> &row); 
    9595        void SetColVector(unsigned int c, const Vector<T> &col); 
    96           
     96        void NormaliseRows(); 
     97        void NormaliseCols(); 
     98 
    9799        void Print() const; 
    98100        void SetAll(T s); 
     
    119121        Matrix CropCols(unsigned int s, unsigned int e); 
    120122 
    121         void Save(FILE *f); 
     123        void Save(FILE *f) const; 
    122124        void Load(FILE *f); 
    123125 
     
    230232Matrix<T> Matrix<T>::Transposed() const 
    231233{ 
    232         Matrix<T> copy(*this); 
     234        Matrix<T> copy(m_Cols,m_Rows); 
    233235        for (unsigned int i=0; i<m_Rows; i++) 
    234236        { 
    235237                for (unsigned int j=0; j<m_Cols; j++) 
    236238                { 
    237                         copy[i][j]=(*this)[j][i]; 
     239                        copy[j][i]=(*this)[i][j]; 
    238240                } 
    239241        } 
     
    255257Matrix<T> Matrix<T>::operator+(const Matrix &other) const 
    256258{ 
    257         assert(m_Rows=other.m_Rows); 
    258         assert(m_Cols=other.m_Cols); 
     259        assert(m_Rows==other.m_Rows); 
     260        assert(m_Cols==other.m_Cols); 
    259261         
    260262        Matrix<T> ret(m_Rows,m_Cols); 
     
    272274Matrix<T> Matrix<T>::operator-(const Matrix &other) const 
    273275{ 
    274         assert(m_Rows=other.m_Rows); 
    275         assert(m_Cols=other.m_Cols); 
     276        assert(m_Rows==other.m_Rows); 
     277        assert(m_Cols==other.m_Cols); 
    276278         
    277279        Matrix<T> ret(m_Rows,m_Cols); 
     
    530532 
    531533template<class T> 
    532 void Matrix<T>::Save(FILE* f) 
     534void Matrix<T>::NormaliseRows() 
     535{ 
     536        for(unsigned int i=0; i<m_Rows; i++) 
     537        { 
     538                SetRowVector(i,GetRowVector(i).Normalised()); 
     539        } 
     540} 
     541 
     542template<class T> 
     543void Matrix<T>::NormaliseCols() 
     544{ 
     545        for(unsigned int i=0; i<m_Cols; i++) 
     546        { 
     547                SetColVector(i,GetColVector(i).Normalised()); 
     548        } 
     549} 
     550 
     551template<class T> 
     552void Matrix<T>::Save(FILE* f) const 
    533553{ 
    534554        int version = 1;         
     
    638658         
    639659        assert(j.Inverted()==k); 
     660                 
     661        Matrix<float> l(2,2); 
     662        l[0][0]=3; 
     663        l[0][1]=3; 
     664        l[1][0]=0; 
     665        l[1][1]=0; 
     666         
     667        Matrix<float> n(2,2); 
     668        n[0][0]=2; 
     669        n[0][1]=2; 
     670        n[1][0]=0; 
     671        n[1][1]=0; 
     672         
     673        n*=l; 
     674         
     675        Matrix<float> o(4,4); 
     676        o.Zero(); 
     677        o[0][0]=1; 
     678        o[1][1]=1; 
     679        o[2][2]=1; 
     680        o[3][3]=1; 
     681         
     682        j*=k; 
     683        assert(j==o); 
     684 
     685        { 
     686                Matrix<float> a(2,3); 
     687                Matrix<float> b(3,2); 
     688                 
     689                a[0][0]=1; a[0][1]=2; a[0][2]=3; 
     690                a[1][0]=4; a[1][1]=5; a[1][2]=6; 
     691 
     692                b[0][0]=2; b[0][1]=3; 
     693                b[1][0]=-1; b[1][1]=1; 
     694                b[2][0]=1; b[2][1]=2; 
     695                 
     696                Matrix<float> result(2,2); 
     697                result[0][0]=3; result[0][1]=11; 
     698                result[1][0]=9; result[1][1]=29; 
     699                 
     700                assert(a*b==result); 
     701        } 
     702         
    640703} 
    641704 
  • foam/trunk/vision/src/PCA.cpp

    r96 r97  
    5151         
    5252        // allocate the transform matrix (this is where it'll run out of memory) 
    53         cerr<<"Allocating "<<m_FeatureSize*m_FeatureSize*sizeof(float)/1024/1024.0<<" megs for covariance matrix"<<endl; 
     53        float size= m_FeatureSize*m_FeatureSize*sizeof(float)/1024/1024.0; 
     54        if (size>1) 
     55        { 
     56                cerr<<"Allocating "<<size<<" megs for covariance matrix"<<endl; 
     57        } 
    5458        m_EigenTransform = Matrix<float>(m_FeatureSize,m_FeatureSize); 
    5559        m_EigenTransform.Zero(); 
     
    9296} 
    9397 
    94 void PCA::Save(FILE *f) 
     98void PCA::Save(FILE *f) const 
    9599{ 
    96100        int version = 2; 
     
    158162         
    159163        pca.Calculate(); 
    160                  
     164         
     165         
    161166        in[0]=.69; in[1]=.49; 
    162167        Vector<float> out = pca.Project(in); 
    163168        assert(feq(out[0],-0.82797f) && feq(out[1],-0.175115f)); 
     169 
     170        PCA pcasub(2); 
     171         
     172        in[0]=-0.677; in[1]=-0.735; 
     173        pcasub.AddFeature(in); 
     174        in[0]=0; in[1]=0; 
     175        pcasub.AddFeature(in); 
     176        in[0]=0.677; in[1]=0.735; 
     177        pcasub.AddFeature(in); 
     178         
     179        pcasub.Calculate(); 
     180        pca.Mult(pca);   
     181         
    164182         
    165183} 
  • foam/trunk/vision/src/PCA.h

    r96 r97  
    5050        const Vector<float> &GetEigenValues() const { return m_EigenValues; } 
    5151        const Matrix<float> &GetEigenTransform() const { return m_EigenTransform; } 
     52        Matrix<float> &EigenTransform() { return m_EigenTransform; } 
    5253        const FeatureVec &GetFeatures() const { return m_Features; } 
    5354        const Vector<float> &GetMean() const { return m_Mean; } 
     
    5758         
    5859        void Load(FILE *f); 
    59         void Save(FILE *f); 
     60        void Save(FILE *f) const; 
    6061         
    6162private:         
  • foam/trunk/vision/src/Vector.h

    r91 r97  
    6060        T DistanceFrom(const Vector &other) const; 
    6161        T Magnitude() const; 
     62        Vector Normalised() const; 
    6263 
    6364        Vector &operator=(const Vector &other); 
     
    7576        Vector &operator/=(T v); 
    7677         
    77         void Save(FILE *f); 
     78        void Save(FILE *f) const; 
    7879        void Load(FILE *f); 
    7980         
     
    186187 
    187188template<class T> 
     189Vector<T> Vector<T>::Normalised() const 
     190{ 
     191        Vector<T> ret(*this); 
     192        ret/=ret.Magnitude(); 
     193        return ret; 
     194} 
     195 
     196template<class T> 
    188197Vector<T> Vector<T>::operator+(const Vector &other) const 
    189198{ 
     
    329338 
    330339template<class T> 
    331 void Vector<T>::Save(FILE* f) 
     340void Vector<T>::Save(FILE* f) const 
    332341{ 
    333342        int version = 1;         
Note: See TracChangeset for help on using the changeset viewer.