# fernsClfTrain

## PURPOSE

Train random fern classifier.

## SYNOPSIS

function [ferns,hsPr] = fernsClfTrain( data, hs, varargin )

## DESCRIPTION

     Train random fern classifier.

     See "Fast Keypoint Recognition in Ten Lines of Code" by Mustafa Ozuysal,
     Pascal Fua and Vincent Lepetit, CVPR07.

     Dimensions:
      M - number ferns
      S - fern depth
      F - number features
      N - number input vectors
      H - number classes

     USAGE
      [ferns,hsPr] = fernsClfTrain( data, hs, [varargin] )

     INPUTS
      data     - [NxF] N length F feature vectors
      hs       - [Nx1] target output labels in [1,H]
      varargin - additional params (struct or name/value pairs)
       .S        - [10] fern depth (ferns are exponential in S)
       .M        - [50] number of ferns to train
       .thrr     - [0 1] range for randomly generated thresholds
       .bayes    - [1] if true combine probs using bayes assumption
       .ferns    - [] if given reuse previous ferns (recompute pFern)

     OUTPUTS
      ferns    - learned fern model w the following fields
       .fids     - [MxS] feature ids for each fern for each depth
       .thrs     - [MxS] threshold corresponding to each fid
       .pFern    - [2^SxHxM] learned log probs at fern leaves
       .bayes    - if true combine probs using bayes assumption
       .inds     - [NxM] cached indices for original training data
       .H        - number classes
      hsPr     - [Nx1] predicted output labels

     EXAMPLE
      N=5000; H=5; d=2; [xs0,hs0,xs1,hs1]=demoGenData(N,N,H,d,1,1);
      fernPrm=struct('S',4,'M',50,'thrr',[-1 1],'bayes',1);
      tic, [ferns,hsPr0]=fernsClfTrain(xs0,hs0,fernPrm); toc
      tic, hsPr1 = fernsClfApply( xs1, ferns ); toc
      e0=mean(hsPr0~=hs0); e1=mean(hsPr1~=hs1);
      fprintf('errors trn=%f tst=%f\n',e0,e1); figure(1);
      subplot(2,2,1); visualizeData(xs0,2,hs0);
      subplot(2,2,2); visualizeData(xs0,2,hsPr0);
      subplot(2,2,3); visualizeData(xs1,2,hs1);
      subplot(2,2,4); visualizeData(xs1,2,hsPr1);

     See also fernsClfApply, fernsInds

     Piotr's Image&Video Toolbox      Version 2.50
     Copyright 2010 Piotr Dollar.  [pdollar-at-caltech.edu]
     Please email me if you find bugs, or have suggestions or questions!
     Licensed under the Lesser GPL [see external/lgpl.txt]

## CROSS-REFERENCE INFORMATION

This function calls:

- fernsClfApply Apply learned fern classifier.
- fernsInds Compute indices for each input by each fern.
- getPrmDflt Helper to set default values (if not already set) of parameter struct.

This function is called by: