Changeset 96


Ignore:
Timestamp:
07/29/2009 03:49:34 PM (10 years ago)
Author:
dave
Message:

Benchmark testing added for the eigen face recognition

Location:
foam/trunk
Files:
10 edited

Legend:

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

    r94 r96  
     1// Copyright (C) 2009 foam 
     2// 
     3// This program is free software; you can redistribute it and/or modify 
     4// it under the terms of the GNU General Public License as published by 
     5// the Free Software Foundation; either version 2 of the License, or 
     6// (at your option) any later version. 
     7// 
     8// This program is distributed in the hope that it will be useful, 
     9// but WITHOUT ANY WARRANTY; without even the implied warranty of 
     10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
     11// GNU General Public License for more details. 
     12// 
     13// You should have received a copy of the GNU General Public License 
     14// along with this program; if not, write to the Free Software 
     15// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
     16 
    117#define CV_NO_BACKWARD_COMPATIBILITY 
    218 
     
    3349double scale = 1; 
    3450 
    35 int w=50; 
    36 int h=80; 
    37 //int w=20; 
    38 //int h=30; 
     51//int w=50; 
     52//int h=80; 
     53int w=20; 
     54int h=30; 
    3955 
    4056PCA pca(w*h); 
     
    4662        glob_t g; 
    4763         
    48         glob("../data/images/faces/spacek-large/*.png",GLOB_PERIOD,NULL,&g); 
     64        glob("../data/images/faces/dave/*.png",GLOB_PERIOD,NULL,&g); 
    4965        for (unsigned int n=0; n<g.gl_pathc; n++) 
    5066        { 
     
    6278} 
    6379 
    64 void TestPCA() 
    65 { 
    66         //Recalc(); 
    67         //FILE *f=fopen("spacek-50x80.pca", "wb"); 
    68         //pca.Save(f); 
    69          
    70         FILE *f=fopen("../data/eigenspaces/spacek-50x80.pca", "rb"); 
     80PCA LoadPCA(string filename) 
     81{ 
     82        PCA pca(1); 
     83        FILE *f=fopen(filename.c_str(), "rb"); 
    7184        pca.Load(f); 
    7285        fclose(f); 
     86        return pca; 
     87} 
     88 
     89void TestPCA() 
     90{ 
     91        //Recalc(); 
     92        //FILE *f=fopen("davelight-20x30.pca", "wb"); 
     93        //pca.Save(f); 
     94        pca = LoadPCA("../data/eigenspaces/spacek-20x30.pca"); 
     95         
     96        PCA davelight = LoadPCA("davelight-20x30.pca"); 
     97        //pca.Mult(davelight); 
     98        pca = davelight; 
    7399         
    74100        pca.Compress(0,100); 
     
    79105 
    80106} 
     107 
    81108 
    82109 
     
    298325         
    299326        static float t=0; 
    300          
    301         for (unsigned int i=0; i<30; i++) 
    302         { 
    303                 camera.Blit(Image(w,h,1,(pca.GetEigenTransform().GetRowVector(i)*50)/((i+1) * 1)+pca.GetMean() 
    304                         ),(i%10)*(w+2),0+(i/10)*(h+2)); 
     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() 
     331                        ),(i%30)*(w+2),0+(i/30)*(h+2)); 
    305332        } 
    306333         
  • foam/trunk/faceclassifier/src/App.cpp

    r95 r96  
    1818#include "App.h" 
    1919#include "PCAClassifier.h" 
     20#include "FileTools.h" 
    2021 
    2122//#define SAVE_FRAMES 
    2223 
    2324using namespace std; 
     25 
     26//int w=50; 
     27//int h=80; 
    2428 
    2529int w=20; 
     
    5963        pca.Load(f); 
    6064        fclose(f); 
    61         pca.Compress(3,30); 
     65        pca.Compress(20,300); 
    6266         
    6367        m_Classifier = new PCAClassifier(pca); 
    64         m_FaceBank = new FaceBank(w,h,0.2,0.1,m_Classifier); 
     68        m_FaceBank = new FaceBank(w,h,0.4,0.1,m_Classifier); 
    6569        cvInitFont( &m_Font, CV_FONT_HERSHEY_PLAIN, 0.5, 0.5, 0, 1, CV_AA ); 
    6670     
    6771        cvNamedWindow( "face classifier", 1 ); 
     72         
     73        Benchmark(); 
    6874} 
    6975 
     
    7581    { 
    7682        {{255,255,255}}, 
     83        {{0,0,0}}, 
    7784        {{0,128,255}}, 
    7885        {{0,255,255}}, 
     
    8491    }; 
    8592 
    86 void App::Update() 
    87 {        
     93void App::Run() 
     94{ 
    8895        frame = cvQueryFrame( m_Capture ); 
    8996    if( !frame )  
     
    93100        } 
    94101         
    95     if( !frame_copy ) 
     102        if( !frame_copy ) 
    96103        frame_copy = cvCreateImage( cvSize(frame->width,frame->height), 
    97104                                    IPL_DEPTH_8U, frame->nChannels ); 
     
    101108        cvFlip( frame, frame_copy, 0 ); 
    102109         
    103         ///////////////////////// 
    104          
    105110        Image camera(frame_copy); 
    106          
     111        Update(camera); 
     112         
     113        m_FrameNum++; 
     114#ifdef SAVE_FRAMES 
     115        char name[256]; 
     116        sprintf(name,"out-%0.4d.jpg",m_FrameNum); 
     117        cerr<<"saving "<<name<<endl; 
     118        cvSaveImage(name,camera.m_Image); 
     119#endif 
     120 
     121        cvShowImage("face classifier", camera.m_Image); 
     122} 
     123 
     124void App::Update(Image &camera) 
     125{        
    107126        cvClearMemStorage(m_Storage); 
    108127 
     128        int flags=0; 
     129        if (m_Learn) flags|=CV_HAAR_FIND_BIGGEST_OBJECT; 
     130 
    109131        CvSeq* faces = cvHaarDetectObjects( camera.m_Image, m_Cascade, m_Storage, 
    110                         1.1, 2, 0 
     132                        1.1, 2, flags 
    111133                        //|CV_HAAR_FIND_BIGGEST_OBJECT 
    112134                        //|CV_HAAR_DO_ROUGH_SEARCH 
     
    166188                { 
    167189                        char s[32]; 
    168                         sprintf(s,"%d %0.2f",ID,confidence); 
     190                        map<int,string>::iterator d = m_DebugNames.find(ID); 
     191                        if (d!=m_DebugNames.end()) 
     192                        { 
     193                                sprintf(s,"%s %0.2f",d->second.c_str(),confidence); 
     194                        } 
     195                        else 
     196                        { 
     197                                sprintf(s,"%d %0.2f",ID,confidence); 
     198                        } 
     199                         
    169200                        cvPutText(camera.m_Image, s, cvPoint(r->x,r->y+r->height-5), &m_Font, colors[0]); 
    170201 
     
    200231 
    201232        m_SceneState.Update(); 
    202          
    203     m_FrameNum++; 
    204 #ifdef SAVE_FRAMES 
    205         char name[256]; 
    206         sprintf(name,"out-%0.4d.jpg",m_FrameNum); 
    207         cerr<<"saving "<<name<<endl; 
    208         cvSaveImage(name,camera.m_Image); 
    209 #endif 
    210  
    211         cvShowImage("face classifier", camera.m_Image); 
    212  
    213 } 
    214  
     233 
     234} 
     235 
     236void App::Benchmark() 
     237{ 
     238        cerr<<"Running benchmark test"<<endl; 
     239        vector<string> people=Glob("../data/benchmark/trek/training/*"); 
     240        int ID=0; 
     241        m_Learn=true; 
     242         
     243        for(vector<string>::iterator pi=people.begin(); pi!=people.end(); ++pi) 
     244        { 
     245                m_DebugNames[ID]=pi->substr(pi->find_last_of("/")+1,pi->length()); 
     246                vector<string> images=Glob(*pi+"/*.jpg"); 
     247                for(vector<string>::iterator ii=images.begin(); ii!=images.end(); ++ii) 
     248                { 
     249                        cerr<<ID<<" "<<*ii<<endl; 
     250                        m_FaceNum=ID; 
     251                        Image image(*ii); 
     252                        Update(image); 
     253                        string fn=*ii+"-out.png"; 
     254                        cvSaveImage(fn.c_str(),image.m_Image); 
     255                } 
     256                ID++; 
     257        } 
     258         
     259        m_Learn=false; 
     260         
     261        vector<string> images=Glob("../data/benchmark/trek/control/*.jpg"); 
     262        for(vector<string>::iterator ti=images.begin(); ti!=images.end(); ++ti) 
     263        {        
     264                cerr<<*ti<<endl; 
     265                Image test(*ti);         
     266                Update(test); 
     267                string fn=*ti+"-out.png"; 
     268                cvSaveImage(fn.c_str(),test.m_Image); 
     269        } 
     270 
     271        images=Glob("../data/benchmark/trek/test/*.jpg"); 
     272        for(vector<string>::iterator ti=images.begin(); ti!=images.end(); ++ti) 
     273        {        
     274                cerr<<*ti<<endl; 
     275                Image test(*ti);         
     276                Update(test); 
     277                string fn=*ti+"-out.png"; 
     278                cvSaveImage(fn.c_str(),test.m_Image); 
     279        } 
     280} 
  • foam/trunk/faceclassifier/src/App.h

    r95 r96  
    3232        ~App(); 
    3333         
    34         void Update(); 
     34        void Run(); 
     35        void Update(Image &camera); 
    3536         
    3637private: 
     38        void Benchmark(); 
    3739         
    3840        CvCapture* m_Capture; 
     
    5254        IplImage *frame_copy; 
    5355         
     56        map<int,string> m_DebugNames; 
     57         
    5458        int m_FrameNum; 
    5559}; 
  • foam/trunk/faceclassifier/src/FaceBank.cpp

    r95 r96  
    5151{ 
    5252        // Subtract the mean as an attempt to deal with global lighting changes 
    53         //face.SubMean(); 
     53        face.SubMean(); 
    5454         
    5555        m_Classifier->AddFeature(ID,face.Scale(m_FaceWidth,m_FaceHeight).RGB2GRAY().ToFloatVector()); 
     
    6262{ 
    6363        // Subtract the mean as an attempt to deal with global lighting changes 
    64         //face.SubMean(); 
     64        face.SubMean(); 
    6565         
    6666        float error; 
    6767        ID = m_Classifier->Classify(face.Scale(m_FaceWidth,m_FaceHeight).RGB2GRAY().ToFloatVector(),error); 
    68  
     68         
     69        if (error!=0) error=1/error; 
     70        else return 1; 
     71         
    6972        // if the error is less than the threshold, return the id 
    70         //if (error<m_ErrorThresh) 
     73        //if (error>m_ErrorThresh) 
    7174        { 
    72                 return 1-error; 
     75                return error; 
    7376        } 
    7477         
  • foam/trunk/faceclassifier/src/main.cpp

    r94 r96  
    4040        while (1)  
    4141        { 
    42                 app.Update(); 
     42                app.Run(); 
    4343        } 
    4444} 
  • foam/trunk/vision/Makefile

    r91 r96  
    66        src/PCAClassifier.cpp\ 
    77        src/LDAClassifier.cpp\ 
     8        src/Matrix.cpp\ 
    89        src/PCA.cpp\ 
    910        src/SVD.cpp\ 
     11        src/FileTools.cpp\ 
    1012        src/tinyxml.cpp\ 
    1113        src/tinyxmlerror.cpp\ 
  • foam/trunk/vision/src/Image.cpp

    r95 r96  
    268268                v.val[c]/=s; 
    269269        } 
     270                 
     271        CvScalar o; 
    270272         
    271273        // now subtract it from each pixel 
     
    273275        { 
    274276        for(int x=0; x<m_Image->width; x++) 
    275                 { 
     277                {                        
    276278                        for (int c=0; c<m_Image->nChannels; c++) 
    277279                        { 
    278280                                // force the average to be 127 
    279                                 v.val[c]=127+(cvGet2D(m_Image,y,x).val[c] - v.val[c]*256.0f); 
    280                         } 
    281                  
    282             cvSet2D(m_Image,y,x,v); 
     281                                o.val[c]=127+(cvGet2D(m_Image,y,x).val[c] - v.val[c]*256.0f); 
     282                        } 
     283                                 
     284            cvSet2D(m_Image,y,x,o); 
    283285                } 
    284286        } 
  • foam/trunk/vision/src/Matrix.h

    r90 r96  
    100100        bool IsInf(); 
    101101        Matrix Transposed() const; 
     102        Matrix Inverted() const; 
    102103 
    103104        Matrix &operator=(const Matrix &other); 
     
    110111        Matrix &operator-=(const Matrix &other); 
    111112        Matrix &operator*=(const Matrix &other); 
     113        bool operator==(const Matrix &other) const; 
    112114 
    113115        void SortRows(Vector<T> &v); 
     
    239241} 
    240242 
     243void matrix_inverse(const float *Min, float *Mout, int actualsize); 
     244 
     245template<class T> 
     246Matrix<T> Matrix<T>::Inverted() const 
     247{ 
     248        assert(m_Rows==m_Cols); // only works for square matrices 
     249        Matrix<T> ret(m_Rows,m_Cols); 
     250        matrix_inverse(GetRawDataConst(),ret.GetRawData(),m_Rows); 
     251        return ret; 
     252} 
    241253 
    242254template<class T> 
     
    358370} 
    359371 
     372template<class T> 
     373bool Matrix<T>::operator==(const Matrix &other) const 
     374{ 
     375        if (m_Rows != other.m_Rows ||  
     376                m_Cols != other.m_Cols) 
     377        { 
     378                return false; 
     379        } 
     380         
     381        for (unsigned int i=0; i<m_Cols; i++) 
     382        { 
     383                for (unsigned int j=0; j<m_Rows; j++) 
     384                { 
     385                        if (!feq((*this)[i][j],other[i][j])) return false; 
     386                } 
     387        } 
     388 
     389        return true; 
     390} 
    360391 
    361392//todo: use memcpy for these 4 functions 
     
    553584        Matrix<T> g=a.CropRows(0,1); 
    554585        assert(g.GetRows()==1 && g.GetCols()==3 && g[0][0]==1); 
    555  
     586         
     587        // test matrix invert 
     588        Matrix<T> h(3,3); 
     589        h.Zero(); 
     590        h[0][0]=1; 
     591        h[1][1]=1; 
     592        h[2][2]=1; 
     593        Matrix<T> i=h.Inverted(); 
     594        i==h; 
     595         
     596        // some transforms from fluxus 
     597        Matrix<T> j(4,4);        
     598        j[0][0]=1.0;                     
     599        j[0][1]=0.0 ;                            
     600        j[0][2]=0.0;                             
     601        j[0][3]=0.0;                             
     602         
     603        j[1][0]=0.0                     ;        
     604        j[1][1]=0.7071067690849304 ;  
     605        j[1][2]=0.7071067690849304 ;  
     606        j[1][3]=0.0                             ; 
     607         
     608        j[2][0]=0.0                             ; 
     609        j[2][1]=-0.7071067690849304 ; 
     610        j[2][2]=0.7071067690849304  ; 
     611        j[2][3]=0.0                             ; 
     612         
     613        j[3][0]=1.0                             ; 
     614        j[3][1]=2.0                             ; 
     615        j[3][2]=3.0                             ; 
     616        j[3][3]=1.0                             ; 
     617 
     618        Matrix<T> k(4,4); 
     619        k[0][0]=1.0                              ; 
     620        k[0][1]=0.0                              ; 
     621        k[0][2]=0.0                              ; 
     622        k[0][3]=0.0                              ; 
     623 
     624        k[1][0]=0.0                              ; 
     625        k[1][1]=0.7071068286895752   ; 
     626        k[1][2]=-0.7071068286895752  ; 
     627        k[1][3]=0.0                              ; 
     628 
     629        k[2][0]=0.0                              ; 
     630        k[2][1]=0.7071068286895752   ; 
     631        k[2][2]=0.7071068286895752   ; 
     632        k[2][3]=0.0                              ; 
     633 
     634        k[3][0]=-0.9999999403953552  ; 
     635        k[3][1]=-3.535533905029297   ; 
     636        k[3][2]=-0.7071067690849304  ; 
     637        k[3][3]=0.9999999403953552       ; 
     638         
     639        assert(j.Inverted()==k); 
    556640} 
    557641 
  • foam/trunk/vision/src/PCA.cpp

    r94 r96  
    8686        return m_Mean+m_EigenTransform.VecMulTransposed(v); 
    8787} 
     88         
     89void PCA::Mult(const PCA &other) 
     90{ 
     91        m_EigenTransform *= other.GetEigenTransform().Inverted(); 
     92} 
    8893 
    8994void PCA::Save(FILE *f) 
  • foam/trunk/vision/src/PCA.h

    r95 r96  
    4040        // remove eigenvectors from the transform 
    4141        void Compress(unsigned int s, unsigned int e); 
     42 
     43        void Mult(const PCA &other); 
    4244         
    4345        Vector<float> Project(Vector<float> v) const; 
Note: See TracChangeset for help on using the changeset viewer.