LDPP: Learning Discriminative Projections and Prototypes


LDPP is an algorithm that simultaneously learns a linear projection base and a reduced set of prototypes for Nearest-Neighbor classification. This approach uses a process in which given an initial projection base and prototypes it iteratively adjusts the parameters by minimizing the classification error probability. The algorithm is intended for problems in which the original dimensionality is very high compared to the amount of training samples, although it can be used for other classification tasks.

Reference

Demonstration

You can checkout the online face analysis demo which uses for recognition models trained with LDPP. Also, if you have a mobile phone with a camera which supports java midlets with MMAPI, you can try out the gender recognition midlet demo. This midlet captures an image, detects the face (using a model trained with LDPP) and then classifies the face as male or female (using another model trained with LDPP). The gender recognition error rate should be around 10%.

Implementation

I am making available my implementation of the LDPP algorithm for matlab/octave under the GNU General Public License. You can download the file from here. If you have any comments or suggestions, feel free to contact me.

Usage example:

This example trains a 16-dimensional projection base and 4 prototypes per class using the gender recognition data set from the CVPR2008 paper. The initialization is PCA for the projection base and class means for the prototypes. The data set can be downloaded from here and a script of the experiment is found here. You must also download the LDPP implementation and the PCA implementation.

  >> % read the training data
  >> load('gender.data');
  >> X=gender(:,1:size(gender,2)-1)';
  >> Xlabels=gender(:,size(gender,2));

  >> % create an initial projection base (using PCA)
  >> B0 = pca(X);
  >> B0 = B0(:,1:16);

  >> % create initial prototypes (class means)
  >> P0 = [];
  >> Plabels = [];
  >> for c = unique(Xlabels)',
  >>   P0 = [ P0, repmat(mean(X(:,Xlabels==c),2),1,4) ];
  >>   Plabels = [ Plabels; c*ones(4,1) ];
  >> end;

  >> % learn with LDPP
  >> [B,P] = ldpp(X, Xlabels, B0, P0, Plabels);

  ldpp: output: iteration | J | delta(J) | error
  0 0.306913 -0.693087 0.243129
  1 0.300842 -0.006071 0.236258
  2 0.293210 -0.007633 0.232030
  ...
  998 0.011006 -0.000012 0.004228
  999 0.010990 -0.000016 0.004228
  1000 0.010975 -0.000015 0.004228
  ldpp: reached maximum number of iterations
  ldpp: best iteration 1000, J=0.010975, error=0.004228