Face Recognition Using Face Unit Radial Basis Function
Networks
Introduction
- This page is home to my research for the CS 198 course I've
completed at Harvey Mudd College
during the spring semester of 2000. The course, entitled Advanced
Problems in Computer Science, consists of independent student
directed research into a topic of interest. Prof.
Robert Keller was gracious enough to be my faculty advisor
for my research. This research is a continuation of my final
project for CS152 - Neural Networks which I took during the
fall semester of 1999. To get an understanding of what I'm researching,
please read my neural network project
web page from fall 1999. For that project
I developed a system for human face recognition, based on a radial
basis function (RBF) neural network with Gabor wavelet image
preprocessing. This system was based on papers published by Dr.
A. J. Howell describing approaches to human face regcognition
using RBF networks. I succeeded in implementing the system in
C++, however system performance was not very good. I deceided
to continue work on this system by enrolling in CS 198, hoping
to achieive results as good as those published by Dr.
A. J. Howell.
Original Research Goals
- Before getting approval to register for the course, I wrote
down some ideas I had for improving and extending my existing
face_net system. Below is a list of things I set
out to accomplish during the semester.
- Work on improving the approximation of the neuron weight
vector. I believed that the existing method using a Singular
Value Decomposition (SVD) matrix pseudoinverse was not working
correctly. I wanted to try a non-SVD pseudoinverse methods, possibly
using Gaussian or Gauss-Jordan elimination.
- Work on improving the algorithm for determining of neuron
widths. The algorithms I has tested did not apear to be working
well with the neuron widths calculated by the SVD pseudoinverse.
- Create a network of these face unit networks, whose output
will show who the net thinks the image is of, instead of the
two yes and no outputs for each face unit.
Research Achievements
- Determined that the neuron widths being generated by the
SVD pseudoinverse caluculation were not correct. Replaced with
pseudoinverse method based on Gaussian elimination of a matrix.
- Let A be the matrix of the activation values from
the input vectors, w be the neuron weight vector,
and d be the desired output vector.
- Ideally we would like Aw = d.
- If the inverse of A, inv(A), exists (e.g. A
is non-singular), we could simply solve for our desired weight
vector: w = inv(A) d
- However, since A is singular, we must approximate
inv(A) by its pseudoinverse A*.
- Letting ' represent the transpose operator, the pseudoinverse
cen be defined as: A* = inv(A' A) A'
- Now we can approximate our desired weight vector as w
= A* d, or expanding the expression as w
= (inv(A' A) A') d.
- Gaussian elimination is used to invert (A' A),
which is guarenteed to be non-singular.
- Undertook a drastically rewrite of the
gabor2D
Gabor wavelet preprocessor
- Wrote
GaborA3 class which performs Gabor A3
preprocessing just as specified in Howell
1995.
- Significantly expanded the number of Gabor mask calculations
and their corresponding output coefficients.
- 100x100 pixel window centered around the nose is first subsampled
to 25x25 pixels.
- Data is sampled at 25x25, 13x13, 7x7, and 3x3 pixel scales,
with a non-overlapping scheme used.
- Each size mask is applied at 0, 120, and 240 degree orientations.
- Since the Gabor function is complex, both real and imaginary
(sine and cosine) components are calculated.
- A 25x25 image yielded 510 coefficients.
- Wrote
make_masks.m MATLAB program which calculates
all the Gabor mask matrices and writes them to files which are
then used by the gabor2D program.
- Generalized input format of program to take read in multiple
S-expressions like the one below, preprocessing a single image
for each.
(
(infile /home/bfeinste/cs152/faces/alexp_pos1)
(outfile /home/bfeinste/cs152/gaborfaces_A3/alexp_pos1)
(width 384)
(height 287)
(map 384)
(nose (169 189))
)
- Wrote
make_ifile.pl Perl script which generates
a master input file for the preprocessor, containing S-exps for
each input image. The script fetches the nose coordinates for
each image from a file generated by the NosePicker
Java application which I wrote for the project during fall 1999.
- Experimented with two methods for automatically calculating
widths for the pro and anti neurons. The width determination
methods were hinted at in Dr. Howell's published works. I initiated
an email exchange with Dr. Howell, during which he briefly explained
the ways he performs width determination. A variation was also
used in which the widths were normalized in a fashion described
in Howell 1995.
- Global avgerage - Calculates a global average euclidean distance
betwee all pairs of the unique neurons. The widths of the neurons
are set to this global value.
- Individual averages - To set each neuron's width, the euclidean
distance to all the other neurons is averaged.
- Default values - Just set the pro and anti neuron widths
to some default value.
Results
- Results were still problematic, with wild variations in classification
performance across different face_net's. The culprit is believed
to be the excessive sensitivity of the network to its neuron
widths. Future work could involve exploring algorithms for calculating
how wide the neurons should be in relation to one another.
- Most of the goals I set out to accomplish were met, although
the major goal of a high performance face recognition system
was not. The system as it currently stands represents a good
foundation for future work by myself or others.
gabor2D Gabor wavelet preprocessor works well,
and could be adapted to preprocess input for a variety of applications,
in particular neural networks.
- I learned a great deal about neural networks, linear algebra,
and programming during the course of my research.
References
- Chen, S. et al. (1991). "Orthogonal Least Squares Learning
Algorithm for Radial Basis Function Networks." IEEE Trans.
on Neural Networks 2(2), 302-309.
- Duahman, J. G. (1988). "Complete Discrete 2-D Gabor
Transforms by Neural Networks for Image Analysis and Compression."
IEEE Trans. on Acoustics, Speech, and Signal Processing 36(7),
1169-1179.
- Duvdevani-Bar, S., Edelman, S., Howell, A. J. & Buxton,
H. (1998). "A similarity based method for the generalization
of face recognition over pose and expression." (available
online).
- Howell, A. J. & Buxton, H.
(1995). "Invariance in Radial Basis Function Neural Networks
in Human Face Classification." (available
online).
- Howell, A. J. & Buxton, H. (1995a). "A Scaleable
Approach to Face Identification." (available
online).
- Howell, A. J. & Buxton, H.
(1995). "Receptive Field Functions for Face Recognition."
(available
online).
- Howell, A. J. & Buxton, H. (1996). "Improving Generalization
in Radial Basis Function Networks for Face Recognition."
(available
online).
- Howell, A. J. & Buxton, H. (1998). "Automatic face
recognition using radial basis function networks." (available
online).
- Howell, A. J. & Buxton, H. (1998). "Towards Visually
Mediated Interaction using Appearance-Based Models." (available
online).
- Moody, J. & Darken, C. J. (1989). "Fast Learning
in Networks of Locally-Tuned Processing Units." Neural
Computation 1, 281-294.
- Musavi, M. T. et al. (1989). "On the Training of Radial
Basis Function Classifiers." Neural Networks 5,
595-603.
Acknowledgments
- Dr.
A. J. Howell, School of Cognitive and Computing Sciences,
Univ. of Sussex, UK.
- Provided sample face images and published the original papers
this work is based on.
- Prof. Robert Keller.
- Provided the C code for Gaussian elimination on a matrix.
- Provided Polya polymorphic list library in C++.
- Provided 2d and Nd matrix allocation and deallocation functions
in the form of templated C++.
- Valuable guidance and advice regarding this project.
Code Directory
- All code Copyright © 2000 Benjamin S. Feinstein. Released
under the GNU
General Public License.
- My code directory can be found here.
- The following are the significant programs I've written in
the process of completing this project:
FaceUnit
class and face_net
application in C++, implementing a scalable face unit network.
GaborA3 class and gabor2D program in C++, performing
image sampling and Gabor wavelet preprocessing.
- Wrote make_masks
MATLAB program to generate Gabor mask matrix files for use by
gabor2D.
- Wrote make_infiles
Perl script to generate input files for the face_net program.
- Wrote test_infiles
Perl script to batch run the input files through the face_net
program.
- Wrote make_ifile
Perl script to generate input file for gabor2D preprocessor
Created on Friday, May 12th 2000 by Ben
Feinstein.
Last updated on Saturday, May 13th 2000.