source: foam/trunk/python/faces.py @ 113

Revision 113, 2.2 KB checked in by dave, 11 years ago (diff)

first pass expression recgn

Line 
1# faces.py
2# bunch of scripts for doing things with faces
3
4import glob,string
5from vision import *
6
7#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8
9def filename_from_path(path):
10        return path[string.rfind(path,"/")+1:]
11
12#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13# returns a vector with the extra parameter appended
14
15def add_parameter(v,p):
16        vp = FloatVector(v.Size()+1)
17        for i in range(0,v.Size()):
18                vp[i]=v[i]
19        vp[v.Size()]=p
20        return vp
21
22#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23# builds a eigenmatrix from all the images and saves the pca file
24
25def build_pca(imagepath,w,h,filename):
26        images = glob.glob(imagepath)
27        pca = PCA(w*h)
28       
29        for image in images:
30                im = Image(image)
31                v = im.Scale(w,h).RGB2GRAY().ToFloatVector()
32                pca.AddFeature(v)
33       
34        pca.Calculate()
35       
36        f = OpenFile(filename, "wb")
37        pca.Save(f)
38        CloseFile(f)
39
40#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
41# do facefinding on all the images and save the cropped faces
42
43def get_faces(imagepath,outpath):
44        images = glob.glob(imagepath)
45        finder = FaceFinder()
46        for image in images:
47                i = Image(image)
48                rects = finder.Find(i,False)
49                for rect in rects:
50                        face = i.SubImage(rect)                 
51                        face.Save(outpath+filename_from_path(image))
52
53#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54# attempts to build an expression eigenspace with emotion
55# parameter tacked on (based on the image filename)
56
57def build_expression_pca(imagepath,w,h,filename):
58        images = glob.glob(imagepath)
59       
60        pca = PCA(w*h+1)
61       
62        for imagename in images:
63                emotion=0
64                if "happy" in imagename:
65                        emotion=1
66                if "sad" in imagename:
67                        emotion=-1
68                print(imagename+" is "+str(emotion))
69       
70                im = Image(imagename)
71                v = im.Scale(w,h).RGB2GRAY().ToFloatVector()
72                pca.AddFeature(add_parameter(v,emotion))
73       
74        pca.Calculate()
75       
76        f = OpenFile(filename, "wb")
77        pca.Save(f)
78        CloseFile(f)
79
80#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81# takes an image and attempts to calculate it's extra parameter
82
83def emotion_from_expression(filename,w,h,pca):
84        i = Image(filename)
85        v = i.Scale(w,h).RGB2GRAY().ToFloatVector()
86        p = pca.Project(add_parameter(v,0))
87        s = pca.Synth(p)
88        return s[w*h]>0;
Note: See TracBrowser for help on using the repository browser.