1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#!/usr/bin/env python
# Train a model from sample data
# Author: Vasil Zlatanov, Nunzio Pucci
# EE4 Pattern Recognition coursework
import argparse
import numpy as np
from numpy import genfromtxt
from numpy import linalg as LA
# subtract the normal face from each row of the face matrix
def normalise_faces(average_face, raw_faces):
return np.subtract(raw_faces, np.tile(average_face, (raw_faces.shape[1],1)).T)
# usage: train.py [-h] -i DATA -o MODEL [-m M]
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--data", help="Input CSV file", required=True)
parser.add_argument("-o", "--model", help="Output model file", required=True)
parser.add_argument("-m", "--eigen", help="Number of eigenvalues in model", required=True, type=int)
args = parser.parse_args()
assert args.data, "No input CSV data (-i, --input-data)"
assert args.model, "No model specified (-o, --model)"
M = args.eigen
raw_faces = genfromtxt(args.data, delimiter=',').T
average_face = np.average(raw_faces, axis=1)
normal_faces = normalise_faces(average_face, raw_faces)
e_vals, e_vecs = LA.eig(np.cov(normal_faces))
np.savez(args.model,
average_face=average_face,
e_vals=e_vals[:M],
e_vecs=e_vecs[:M],
projections=np.dot(e_vecs[:M], raw_faces)
)
|