diff --git a/bob/learn/misc/include/bob.learn.misc/BICMachine.h b/bob/learn/misc/include/bob.learn.misc/BICMachine.h deleted file mode 100644 index 827537bfbadfe3ae385d4615a79d10b2ba3bc354..0000000000000000000000000000000000000000 --- a/bob/learn/misc/include/bob.learn.misc/BICMachine.h +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @date Tue Jun 5 16:54:27 CEST 2012 - * @author Manuel Guenther <Manuel.Guenther@idiap.ch> - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - - -#ifndef BOB_LEARN_MISC_BICMACHINE_H -#define BOB_LEARN_MISC_BICMACHINE_H - -#include <blitz/array.h> -#include <bob.io.base/HDF5File.h> -#include <bob.learn.misc/Machine.h> - -namespace bob { namespace learn { namespace misc { - /** - * This class computes the Bayesian Intrapersonal/Extrapersonal Classifier (BIC), - * (see "Beyond Eigenfaces: Probabilistic Matching for Face Recognition" from Moghaddam, Wahid and Pentland) - * which estimates the posterior probability that the given <b>image difference vector</b> - * is of the intrapersonal class, i.e., both images stem from the same person. - * - * There are two possible implementations of the BIC: - * <ul> - * <li> "The Bayesian Intrapersonal/Extrapersonal Classifier" from Teixeira.<br> - * A full projection of the data is performed. No prior for the classes has to be selected.</li> - * - * <li> "Face Detection and Recognition using Maximum Likelihood Classifiers on Gabor Graphs" from Günther and Würtz.<br> - * Only mean and variance of the difference vectors are calculated. There is no subspace truncation and no priors.</li> - * </ul> - * In any of the two implementations, the resulting score (using the forward() method) is a log-likelihood estimate, - * using Mahalanobis(-like) distance measures. - * - */ - class BICMachine: public Machine<blitz::Array<double,1>, double> - { - public: - //! generates an empty BIC machine - BICMachine(bool use_DFFS = false); - - //! Copy constructor - BICMachine(const BICMachine& other); - - //! Assignment Operator - BICMachine& operator =(const BICMachine &other); - - //! Equality operator - bool operator ==(const BICMachine& other) const; - - //! Inequality operator - bool operator !=(const BICMachine& other) const; - - //! Similarity operator - bool is_similar_to(const BICMachine& other, const double r_epsilon=1e-5, const double a_epsilon=1e-8) const; - - //! computes the BIC probability score for the given input difference vector - void forward_(const blitz::Array<double,1>& input, double& output) const; - - //! performs some checks before calling the forward_ method - void forward (const blitz::Array<double,1>& input, double& output) const; - - //! sets the IEC vectors of the given class - void setIEC(bool clazz, const blitz::Array<double,1>& mean, const blitz::Array<double,1>& variances, bool copy_data = false); - - //! sets the BIC projection details of the given class - void setBIC(bool clazz, const blitz::Array<double,1>& mean, const blitz::Array<double,1>& variances, const blitz::Array<double,2>& projection, const double rho, bool copy_data = false); - - //! loads this machine from the given hdf5 file. - void load (bob::io::base::HDF5File& config); - - //! saves this machine to the given hdf5 file. - void save (bob::io::base::HDF5File& config) const; - - //! Use the Distance From Feature Space - void use_DFFS(bool use_DFFS = true); - - //! Use the Distance From Feature Space - bool use_DFFS() const {return m_use_DFFS;} - - private: - - //! initializes internal data storages for the given class - void initialize(bool clazz, int input_length, int projected_length); - - //! project data? - bool m_project_data; - - //! mean vectors - blitz::Array<double, 1> m_mu_I, m_mu_E; - //! variances (eigenvalues) - blitz::Array<double, 1> m_lambda_I, m_lambda_E; - - /// - // only required when projection is enabled - //! add the distance from feature space? - bool m_use_DFFS; - //! projection matrices (PCA) - blitz::Array<double, 2> m_Phi_I, m_Phi_E; - //! averaged eigenvalues to calculate DFFS - double m_rho_I, m_rho_E; - //! temporary storage - mutable blitz::Array<double, 1> m_diff_I, m_diff_E; - mutable blitz::Array<double, 1> m_proj_I, m_proj_E; - - }; - -} } } // namespaces - -#endif // BOB_LEARN_MISC_BICMACHINE_H diff --git a/bob/learn/misc/include/bob.learn.misc/BICTrainer.h b/bob/learn/misc/include/bob.learn.misc/BICTrainer.h deleted file mode 100644 index 3f8dabf3701a8d0e9f5b3bbb69af140ba7fb3497..0000000000000000000000000000000000000000 --- a/bob/learn/misc/include/bob.learn.misc/BICTrainer.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @date Wed Jun 6 10:29:09 CEST 2012 - * @author Manuel Guenther <Manuel.Guenther@idiap.ch> - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_LEARN_MISC_BICTRAINER_H -#define BOB_LEARN_MISC_BICTRAINER_H - -#include <bob.learn.misc/BICMachine.h> - -namespace bob { namespace learn { namespace misc { - - class BICTrainer { - public: - //! initializes a BICTrainer to train IEC (without subspace estimation) - BICTrainer() : m_M_I(0), m_M_E(0) {} - //! initializes a BICTrainer to train BIC (including subspace truncation) - BICTrainer(int intra_dim, int extra_dim) : m_M_I(intra_dim), m_M_E(extra_dim) {} - - //! trains the intrapersonal and extrapersonal classes of the given BICMachine - void train(bob::learn::misc::BICMachine& machine, const blitz::Array<double,2>& intra_differences, const blitz::Array<double,2>& extra_differences) const { - train_single(false, machine, intra_differences); - train_single(true, machine, extra_differences); - } - - //! trains the intrapersonal or the extrapersonal class of the given BICMachine - void train_single(bool clazz, bob::learn::misc::BICMachine& machine, const blitz::Array<double,2>& differences) const; - - private: - - //! dimensions of the intrapersonal and extrapersonal subspace; - //! zero if training IEC. - int m_M_I, m_M_E; - }; - -} } } // namespaces - - -#endif // BOB_LEARN_MISC_BICTRAINER_H diff --git a/bob/learn/misc/old/bic.cc b/bob/learn/misc/old/bic.cc deleted file mode 100644 index 52a1e991c1e36ce66776028e91c602e8ffebd54c..0000000000000000000000000000000000000000 --- a/bob/learn/misc/old/bic.cc +++ /dev/null @@ -1,139 +0,0 @@ -/** - * @author Manuel Guenther <Manuel.Guenther@idiap.ch> - * @date Wed Jun 6 10:29:09 CEST 2012 - * - * Copyright (C) 2011-2014 Idiap Research Institute, Martigny, Switzerland - */ - -#include <bob.blitz/capi.h> -#include <bob.blitz/cleanup.h> -#include <bob.io.base/api.h> - -#include "ndarray.h" -#include <bob.learn.misc/BICMachine.h> - -static double bic_call_(const bob::learn::misc::BICMachine& machine, bob::python::const_ndarray input){ - double o; - machine.forward_(input.bz<double,1>(), o); - return o; -} - -static double bic_call(const bob::learn::misc::BICMachine& machine, bob::python::const_ndarray input){ - double o; - machine.forward(input.bz<double,1>(), o); - return o; -} - -static void bic_load(bob::learn::misc::BICMachine& machine, boost::python::object file){ - if (!PyBobIoHDF5File_Check(file.ptr())) PYTHON_ERROR(TypeError, "Would have expected a bob.io.base.HDF5File"); - PyBobIoHDF5FileObject* hdf5 = (PyBobIoHDF5FileObject*) file.ptr(); - machine.load(*hdf5->f); -} - -static void bic_save(const bob::learn::misc::BICMachine& machine, boost::python::object file){ - if (!PyBobIoHDF5File_Check(file.ptr())) PYTHON_ERROR(TypeError, "Would have expected a bob.io.base.HDF5File"); - PyBobIoHDF5FileObject* hdf5 = (PyBobIoHDF5FileObject*) file.ptr(); - machine.save(*hdf5->f); -} - - -void bind_machine_bic(){ - - // bind BICMachine - boost::python::class_<bob::learn::misc::BICMachine, boost::shared_ptr<bob::learn::misc::BICMachine> > ( - "BICMachine", - "This machine is designed to classify image differences to be either intrapersonal or extrapersonal. " - "There are two possible implementations of the BIC:\n" - "\n" - "* 'The Bayesian Intrapersonal/Extrapersonal Classifier' from Teixeira [1]_. " - " A full projection of the data is performed. No prior for the classes has to be selected.\n" - "* 'Face Detection and Recognition using Maximum Likelihood Classifiers on Gabor Graphs' from Guenther and Wuertz [2]_." - " Only mean and variance of the difference vectors are calculated. There is no subspace truncation and no priors.\n" - "\n" - "What kind of machine is used is dependent on the way, this class is trained via the BICTrainer.\n" - "\n" - ".. [1] Marcio Luis Teixeira. The Bayesian intrapersonal/extrapersonal classifier. Colorado State University, 2003.\n" - ".. [2] Manuel Guenther and Rolf P. Wuertz. Face detection and recognition using maximum likelihood classifiers on Gabor graphs. International Journal of Pattern Recognition and Artificial Intelligence, 23(3):433-461, 2009.", - boost::python::init<bool>( - (boost::python::arg("self"), boost::python::arg("use_dffs") = false), - "Initializes an empty BICMachine. The optional boolean parameter specifies whether to use the DFFS in the BIC implementation. \n\n.. warning :: Use this flag with care, the default value 'False' is usually the best choice!" - ) - ) - - .def( - boost::python::init<const bob::learn::misc::BICMachine&>( - (boost::python::arg("self"), boost::python::arg("other")), - "Constructs one BICMachine from another one by doing a deep copy." - ) - ) - - .def( - boost::python::self == boost::python::self - ) - - .def( - "is_similar_to", - &bob::learn::misc::BICMachine::is_similar_to, - (boost::python::arg("self"), boost::python::arg("other"), boost::python::arg("r_epsilon") = 1e-5, boost::python::arg("a_epsilon") = 1e-8), - "Compares this BICMachine with the 'other' one to be approximately the same." - ) - - .def( - "load", - &bic_load, - (boost::python::arg("self"), boost::python::arg("file")), - "Loads the configuration parameters from an hdf5 file." - ) - - .def( - "save", - &bic_save, - (boost::python::arg("self"), boost::python::arg("file")), - "Saves the configuration parameters to an hdf5 file." - ) - - .def( - "__call__", - &bic_call, - ( - boost::python::arg("self"), - boost::python::arg("input") - ), - "Computes the BIC or IEC score for the given input vector, which results of a comparison of two (facial) images. " - "The resulting value is returned as a single float value. " - "The score itself is the log-likelihood score of the given input vector belonging to the intrapersonal class. " - "No sanity checks of input and output are performed." - ) - - .def( - "forward_", - &bic_call_, - ( - boost::python::arg("self"), - boost::python::arg("input") - ), - "Computes the BIC or IEC score for the given input vector, which results of a comparison of two (facial) images. " - "The score itself is the log-likelihood score of the given input vector belonging to the intrapersonal class. " - "No sanity checks of input are performed." - ) - - .def( - "forward", - &bic_call, - ( - boost::python::arg("self"), - boost::python::arg("input") - ), - "Computes the BIC or IEC score for the given input vector, which results of a comparison of two (facial) images. " - "The score itself is the log-likelihood score of the given input vector belonging to the intrapersonal class. " - "Sanity checks of input shape are performed." - ) - - .add_property( - "use_dffs", - // cast overloaded function with the same name to its type... - static_cast<bool (bob::learn::misc::BICMachine::*)() const>(&bob::learn::misc::BICMachine::use_DFFS), - static_cast<void (bob::learn::misc::BICMachine::*)(bool)>(&bob::learn::misc::BICMachine::use_DFFS), - "Should the Distance From Feature Space (DFFS) measure be added during scoring? \n\n.. warning :: Only set this flag to True if the number of intrapersonal and extrapersonal training pairs is approximately equal. Otherwise, weird thing may happen!" - ); -} diff --git a/bob/learn/misc/old/bic_trainer.cc b/bob/learn/misc/old/bic_trainer.cc deleted file mode 100644 index 7de6156ae7c367d09028375acbfba5e4d0a36ba3..0000000000000000000000000000000000000000 --- a/bob/learn/misc/old/bic_trainer.cc +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @file trainer/python/bic.cc - * @date Wed Jun 6 10:29:09 CEST 2012 - * @author Manuel Guenther <Manuel.Guenther@idiap.ch> - * - * Copyright (C) 2011-2013 Idiap Research Institute, Martigny, Switzerland - */ - -#include "ndarray.h" -#include <bob.learn.misc/BICTrainer.h> - -void py_train(const bob::learn::misc::BICTrainer& t, - bob::learn::misc::BICMachine& m, bob::python::const_ndarray intra_differences, - bob::python::const_ndarray extra_differences) -{ - t.train(m, intra_differences.bz<double,2>(), - extra_differences.bz<double,2>()); -} - - - -void bind_trainer_bic(){ - - boost::python::class_<bob::learn::misc::BICTrainer, boost::shared_ptr<bob::learn::misc::BICTrainer> > ( - "BICTrainer", - "A Trainer for a BICMachine. It trains either a BIC model (including projection matrix and eigenvalues), " - "or an IEC model (containing mean and variance only). See :py:class:`bob.machine.BICMachine` for more details.", - boost::python::init<int,int>( - ( - boost::python::arg("self"), - boost::python::arg("intra_dim"), - boost::python::arg("extra_dim") - ), - "Initializes the BICTrainer to train a BIC model with the given resulting dimensions of the intraperonal and extrapersonal subspaces." - ) - ) - - .def( - boost::python::init<>( - (boost::python::arg("self")), - "Initializes the BICTrainer to train a IEC model." - ) - ) - - .def( - "train", - &py_train, - ( - boost::python::arg("self"), - boost::python::arg("machine"), - boost::python::arg("intra_differences"), - boost::python::arg("extra_differences") - ), - "Trains the given machine (should be of type :py:class:`bob.machine.BICMachine`) to classify intrapersonal image differences vs. extrapersonal ones. " - "The given difference vectors might be the result of any image comparison function, e.g., the pixel difference of the images." - ); -} diff --git a/bob/learn/misc/old/main.cc b/bob/learn/misc/old/main.cc index 16f7f9ba565063a449f54451489bb4ba88282e53..f09c85a9925e7dfed70ff397e3e9d06d2eb669e9 100644 --- a/bob/learn/misc/old/main.cc +++ b/bob/learn/misc/old/main.cc @@ -25,7 +25,6 @@ void bind_core_bz_numpy(); /** machine bindings **/ void bind_machine_base(); -void bind_machine_bic(); void bind_machine_gaussian(); void bind_machine_gmm(); void bind_machine_kmeans(); @@ -44,7 +43,6 @@ void bind_trainer_ivector(); void bind_trainer_plda(); void bind_trainer_wiener(); void bind_trainer_empca(); -void bind_trainer_bic(); BOOST_PYTHON_MODULE(_old_library) { @@ -77,7 +75,6 @@ BOOST_PYTHON_MODULE(_old_library) { /** machine bindings **/ bind_machine_base(); - bind_machine_bic(); bind_machine_gaussian(); bind_machine_gmm(); bind_machine_kmeans(); @@ -96,6 +93,5 @@ BOOST_PYTHON_MODULE(_old_library) { bind_trainer_plda(); bind_trainer_wiener(); bind_trainer_empca(); - bind_trainer_bic(); } diff --git a/bob/learn/misc/test_bic.py b/bob/learn/misc/test_bic.py deleted file mode 100644 index d0cdff3dc98bacd94d5be07604a4158841dc0f85..0000000000000000000000000000000000000000 --- a/bob/learn/misc/test_bic.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python -# vim: set fileencoding=utf-8 : -# Manuel Guenther <Manuel.Guenther@idiap.ch> -# Thu Jun 14 14:45:06 CEST 2012 -# -# Copyright (C) 2011-2014 Idiap Research Institute, Martigny, Switzerland - -"""Test BIC trainer and machine -""" - -import numpy -import nose.tools -from . import BICMachine, BICTrainer - -eps = 1e-5 - -def equals(x, y, epsilon): - return (abs(x - y) < epsilon).all() - -def training_data(): - data = numpy.array([ - (10., 4., 6., 8., 2.), - (8., 2., 4., 6., 0.), - (12., 6., 8., 10., 4.), - (11., 3., 7., 7., 3.), - (9., 5., 5., 9., 1.)], dtype='float64') - - return data, -1. * data - -def eval_data(which): - eval_data = numpy.ndarray((5,), dtype=numpy.float64) - if which == 0: - eval_data.fill(0.) - elif which == 1: - eval_data.fill(10.) - - return eval_data - -def test_IEC(): - # Tests the IEC training of the BICTrainer - intra_data, extra_data = training_data() - - # train BIC machine - machine = BICMachine() - trainer = BICTrainer() - - # train machine with intrapersonal data only - trainer.train(machine, intra_data, intra_data) - # => every result should be zero - assert abs(machine(eval_data(0))) < eps - assert abs(machine(eval_data(1))) < eps - - # re-train the machine with intra- and extrapersonal data - trainer.train(machine, intra_data, extra_data) - # now, only the input vector 0 should give log-likelihood 0 - assert abs(machine(eval_data(0))) < eps - # while a positive vector should give a positive result - assert machine(eval_data(1)) > 0. - -@nose.tools.raises(RuntimeError) -def test_raises(): - - # Tests the BIC training of the BICTrainer - intra_data, extra_data = training_data() - - # train BIC machine - trainer = BICTrainer(2,2) - - # The data are chosen such that the third eigenvalue is zero. - # Hence, calculating rho (i.e., using the Distance From Feature Space) is impossible - machine = BICMachine(True) - trainer.train(machine, intra_data, intra_data) - -def test_BIC(): - # Tests the BIC training of the BICTrainer - intra_data, extra_data = training_data() - - # train BIC machine - trainer = BICTrainer(2,2) - - # So, now without rho... - machine = BICMachine(False) - - # First, train the machine with intrapersonal data only - trainer.train(machine, intra_data, intra_data) - - # => every result should be zero - assert abs(machine(eval_data(0))) < eps - assert abs(machine(eval_data(1))) < eps - - # re-train the machine with intra- and extrapersonal data - trainer.train(machine, intra_data, extra_data) - # now, only the input vector 0 should give log-likelihood 0 - assert abs(machine(eval_data(0))) < eps - # while a positive vector should give a positive result - assert machine(eval_data(1)) > 0. diff --git a/setup.py b/setup.py index e58f32365c6ff1865ec26df02e028c641652d6d8..d3426aad12b22368b7a22159726f51294cd3da38 100644 --- a/setup.py +++ b/setup.py @@ -54,7 +54,6 @@ setup( Library("bob.learn.misc.bob_learn_misc", [ - "bob/learn/misc/cpp/BICMachine.cpp", "bob/learn/misc/cpp/Gaussian.cpp", "bob/learn/misc/cpp/GMMMachine.cpp", "bob/learn/misc/cpp/GMMStats.cpp", @@ -66,7 +65,6 @@ setup( "bob/learn/misc/cpp/WienerMachine.cpp", "bob/learn/misc/cpp/ZTNorm.cpp", - "bob/learn/misc/cpp/BICTrainer.cpp", "bob/learn/misc/cpp/EMPCATrainer.cpp", "bob/learn/misc/cpp/GMMTrainer.cpp", "bob/learn/misc/cpp/IVectorTrainer.cpp", @@ -104,8 +102,6 @@ setup( Extension("bob.learn.misc._old_library", [ - "bob/learn/misc/old/bic.cc", - "bob/learn/misc/old/bic_trainer.cc", "bob/learn/misc/old/empca_trainer.cc", "bob/learn/misc/old/gaussian.cc", "bob/learn/misc/old/gmm.cc",