Fixed bugs in facerec documentation
authorAndrey Kamaev <no@email>
Mon, 2 Jul 2012 11:46:17 +0000 (11:46 +0000)
committerAndrey Kamaev <no@email>
Mon, 2 Jul 2012 11:46:17 +0000 (11:46 +0000)
modules/contrib/doc/facerec/facerec_api.rst
modules/contrib/doc/facerec/tutorial/facerec_save_load.rst
modules/contrib/doc/facerec/tutorial/facerec_video_recognition.rst

index f801a46..4e657bc 100644 (file)
@@ -8,7 +8,7 @@ FaceRecognizer
 
 .. ocv:class:: FaceRecognizer
 
-All face recognition models in OpenCV are derived from the abstract base class :ocv:class:`FaceRecognizer`, which provides 
+All face recognition models in OpenCV are derived from the abstract base class :ocv:class:`FaceRecognizer`, which provides
 a unified access to all face recongition algorithms in OpenCV. ::
 
   class FaceRecognizer : public Algorithm
@@ -40,17 +40,17 @@ a unified access to all face recongition algorithms in OpenCV. ::
   };
 
 
-I'll go a bit more into detail explaining :ocv:class:`FaceRecognizer`, because it doesn't look like a powerful interface at first sight. But: Every :ocv:class:`FaceRecognizer` is an :ocv:class:`Algorithm`, so you can easily get/set all model internals (if allowed by the implementation). :ocv:class:`Algorithm` is a relatively new OpenCV concept, which is available since the 2.4 release. I suggest you take a look at its description. 
+I'll go a bit more into detail explaining :ocv:class:`FaceRecognizer`, because it doesn't look like a powerful interface at first sight. But: Every :ocv:class:`FaceRecognizer` is an :ocv:class:`Algorithm`, so you can easily get/set all model internals (if allowed by the implementation). :ocv:class:`Algorithm` is a relatively new OpenCV concept, which is available since the 2.4 release. I suggest you take a look at its description.
 
 :ocv:class:`Algorithm` provides the following features for all derived classes:
 
     * So called “virtual constructor”. That is, each Algorithm derivative is registered at program start and you can get the list of registered algorithms and create instance of a particular algorithm by its name (see :ocv:func:`Algorithm::create`). If you plan to add your own algorithms, it is good practice to add a unique prefix to your algorithms to distinguish them from other algorithms.
 
-    * Setting/Retrieving algorithm parameters by name. If you used video capturing functionality from OpenCV highgui module, you are probably familar with :ocv:cfunc:`cvSetCaptureProperty`, :ocv:cfunc:`cvGetCaptureProperty`, :ocv:func:`VideoCapture::set` and :ocv:func:`VideoCapture::get`. :ocv:class:`Algorithm` provides similar method where instead of integer id's you specify the parameter names as text strings. See :ocv:func:`Algorithm::set` and :ocv:func:`Algorithm::get for details.
+    * Setting/Retrieving algorithm parameters by name. If you used video capturing functionality from OpenCV highgui module, you are probably familar with :ocv:cfunc:`cvSetCaptureProperty`, :ocv:cfunc:`cvGetCaptureProperty`, :ocv:func:`VideoCapture::set` and :ocv:func:`VideoCapture::get`. :ocv:class:`Algorithm` provides similar method where instead of integer id's you specify the parameter names as text strings. See :ocv:func:`Algorithm::set` and :ocv:func:`Algorithm::get` for details.
 
     * Reading and writing parameters from/to XML or YAML files. Every Algorithm derivative can store all its parameters and then read them back. There is no need to re-implement it each time.
 
-Moreover every :ocv:class:`FaceRecognizer` supports the: 
+Moreover every :ocv:class:`FaceRecognizer` supports the:
 
     * **Training** of a :ocv:class:`FaceRecognizer` with :ocv:func:`FaceRecognizer::train` on a given set of images (your face database!).
 
@@ -63,11 +63,11 @@ Sometimes you run into the situation, when you want to apply a threshold on the
 Here is an example of setting a threshold for the Eigenfaces method, when creating the model:
 
 .. code-block:: cpp
-    
+
     // Let's say we want to keep 10 Eigenfaces and have a threshold value of 10.0
     int num_components = 10;
     double threshold = 10.0;
-    // Then if you want to have a cv::FaceRecognizer with a confidence threshold, 
+    // Then if you want to have a cv::FaceRecognizer with a confidence threshold,
     // create the concrete implementation with the appropiate parameters:
     Ptr<FaceRecognizer> model = createEigenFaceRecognizer(num_components, threshold);
 
@@ -83,13 +83,13 @@ Sometimes it's impossible to train the model, just to experiment with threshold
 If you've set the threshold to ``0.0`` as we did above, then:
 
 .. code-block:: cpp
-    
-    // 
+
+    //
     Mat img = imread("person1/3.jpg", CV_LOAD_IMAGE_GRAYSCALE);
     // Get a prediction from the model. Note: We've set a threshold of 0.0 above,
-    // since the distance is almost always larger than 0.0, you'll get -1 as 
+    // since the distance is almost always larger than 0.0, you'll get -1 as
     // label, which indicates, this face is unknown
-    int predicted_label = model->predict(img); 
+    int predicted_label = model->predict(img);
     // ...
 
 is going to yield ``-1`` as predicted label, which states this face is unknown.
@@ -100,9 +100,9 @@ FaceRecognizer::train
 Trains a FaceRecognizer with given data and associated labels.
 
 .. ocv:function:: void FaceRecognizer::train(InputArray src, InputArray labels)
-    
+
     :param src: The training images, that means the faces you want to learn. The data has to be given as a ``vector<Mat>``.
-    
+
     :param labels: The labels corresponding to the images have to be given either as a ``vector<int>`` or a
 
 The following source code snippet shows you how to learn a Fisherfaces model on a given set of images. The images are read with ocv:func:`imread` and pushed into a `std::vector<Mat>`. The labels of each image are stored within a ``std::vector<int>`` (you could also use a :ocv:class:`Mat` of type `CV_32SC1`). Think of the label as the subject (the person) this image belongs to, so same subjects (persons) should have the same label. For the available :ocv:class:`FaceRecognizer` you don't have to pay any attention to the order of the labels, just make sure same persons have the same label:
@@ -130,7 +130,7 @@ Now that you have read some images, we can create a new :ocv:class:`FaceRecogniz
     // this is the most common usage of this specific FaceRecognizer:
     //
     Ptr<FaceRecognizer> model =  createFisherFaceRecognizer();
-  
+
 And finally train it on the given dataset (the face images and labels):
 
 .. code-block:: cpp
@@ -148,7 +148,7 @@ FaceRecognizer::predict
     Predicts a label for a given input image.
 
     :param src: Sample image to get a prediction from.
-    
+
 
 .. ocv:function:: void predict(InputArray src, int &label, double &confidence) const
 
@@ -160,7 +160,7 @@ FaceRecognizer::predict
 
 
 
-The suffix ``const`` means that prediction does not affect the internal model 
+The suffix ``const`` means that prediction does not affect the internal model
 state, so the method can be safely called from within different threads.
 
 The following example shows how to get a prediction from a trained model:
@@ -174,7 +174,7 @@ The following example shows how to get a prediction from a trained model:
     Mat img = imread("person1/3.jpg", CV_LOAD_IMAGE_GRAYSCALE);
     // And get a prediction from the cv::FaceRecognizer:
     int predicted = model->predict(img);
-  
+
 Or to get a prediction and the associated confidence (e.g. distance):
 
 .. code-block:: cpp
@@ -199,19 +199,19 @@ Saves a :ocv:class:`FaceRecognizer` and its model state.
     Saves this model to a given filename, either as XML or YAML.
 
     :param filename: The filename to store this :ocv:class:`FaceRecognizer` to (either XML/YAML).
-  
+
 .. ocv:function:: void FaceRecognizer::save(FileStorage& fs) const
 
     Saves this model to a given :ocv:class:`FileStorage`.
 
     :param fs: The :ocv:class:`FileStorage` to store this :ocv:class:`FaceRecognizer` to.
-  
+
 
 Every :ocv:class:`FaceRecognizer` overwrites ``FaceRecognizer::save(FileStorage& fs)``
-to save the internal model state. ``FaceRecognizer::save(const string& filename)`` saves 
- the state of a model to the given filename.
+to save the internal model state. ``FaceRecognizer::save(const string& filename)`` saves
+the state of a model to the given filename.
 
-The suffix ``const`` means that prediction does not affect the internal model 
+The suffix ``const`` means that prediction does not affect the internal model
 state, so the method can be safely called from within different threads.
 
 FaceRecognizer::load
@@ -222,10 +222,10 @@ Loads a :ocv:class:`FaceRecognizer` and its model state.
 .. ocv:function:: void FaceRecognizer::load(const string& filename)
 .. ocv:function:: void FaceRecognizer::load(FileStorage& fs)
 
-Loads a persisted model and state from a given XML or YAML file . Every 
-:ocv:class:`FaceRecognizer` has to overwrite ``FaceRecognizer::load(FileStorage& fs)`` 
-to enable loading the model state. ``FaceRecognizer::load(FileStorage& fs)`` in 
-turn gets called by ``FaceRecognizer::load(const string& filename)``, to ease 
+Loads a persisted model and state from a given XML or YAML file . Every
+:ocv:class:`FaceRecognizer` has to overwrite ``FaceRecognizer::load(FileStorage& fs)``
+to enable loading the model state. ``FaceRecognizer::load(FileStorage& fs)`` in
+turn gets called by ``FaceRecognizer::load(const string& filename)``, to ease
 saving a model.
 
 createEigenFaceRecognizer
@@ -235,8 +235,8 @@ createEigenFaceRecognizer
 
     :param num_components: The number of components (read: Eigenfaces) kept for this Prinicpal Component Analysis. As a hint: There's no rule how many components (read: Eigenfaces) should be kept for good reconstruction capabilities. It is based on your input data, so experiment with the number. Keeping 80 components should almost always be sufficient.
 
-    :param threshold: The threshold applied in the prediciton. 
-    
+    :param threshold: The threshold applied in the prediciton.
+
 Notes:
 ++++++
 
@@ -255,10 +255,10 @@ Model internal data:
     * ``labels`` The threshold applied in the prediction. If the distance to the nearest neighbor is larger than the threshold, this method returns -1.
 
 createFisherFaceRecognizer
--------------------------
+--------------------------
 
 .. ocv:function:: Ptr<FaceRecognizer> createFisherFaceRecognizer(int num_components = 0, double threshold = DBL_MAX)
-    
+
     :param num_components: The number of components (read: Fisherfaces) kept for this Linear Discriminant Analysis with the Fisherfaces criterion. It's useful to keep all components, that means the number of your classes ``c`` (read: subjects, persons you want to recognize). If you leave this at the default (``0``) or set it to a value  less-equal ``0`` or greater ``(c-1)``, it will be set to the correct number ``(c-1)`` automatically.
 
     :param threshold: The threshold applied in the prediction. If the distance to the nearest neighbor is larger than the threshold, this method returns -1.
@@ -268,7 +268,7 @@ Notes:
 
     * Training and prediction must be done on grayscale images, use :ocv:func:`cvtColor` to convert between the color spaces.
     * **THE FISHERFACES METHOD MAKES THE ASSUMPTION, THAT THE TRAINING AND TEST IMAGES ARE OF EQUAL SIZE.** (caps-lock, because I got so many mails asking for this). You have to make sure your input data has the correct shape, else a meaningful exception is thrown. Use :ocv:func:`resize` to resize the images.
-    
+
 Model internal data:
 ++++++++++++++++++++
 
@@ -284,10 +284,10 @@ Model internal data:
 createLBPHFaceRecognizer
 -------------------------
 
-.. ocv:function:: Ptr<FaceRecognizer> createLBPHFaceRecognizer(int radius=1, int neighbors=8, int grid_x=8, int grid_y=8, double threshold = DBL_MAX);
+.. ocv:function:: Ptr<FaceRecognizer> createLBPHFaceRecognizer(int radius=1, int neighbors=8, int grid_x=8, int grid_y=8, double threshold = DBL_MAX)
 
-    :param radius: The radius used for building the Circular Local Binary Pattern. The greater the radius, the 
-    :param neighbors: The number of sample points to build a Circular Local Binary Pattern from. An appropriate value is to use `` 8`` sample points. Keep in mind: the more sample points you include, the higher the computational cost. 
+    :param radius: The radius used for building the Circular Local Binary Pattern. The greater the radius, the
+    :param neighbors: The number of sample points to build a Circular Local Binary Pattern from. An appropriate value is to use `` 8`` sample points. Keep in mind: the more sample points you include, the higher the computational cost.
     :param grid_x: The number of cells in the horizontal direction, ``8`` is a common value used in publications. The more cells, the finer the grid, the higher the dimensionality of the resulting feature vector.
     :param grid_y: The number of cells in the vertical direction, ``8`` is a common value used in publications. The more cells, the finer the grid, the higher the dimensionality of the resulting feature vector.
     :param threshold: The threshold applied in the prediction. If the distance to the nearest neighbor is larger than the threshold, this method returns -1.
@@ -296,7 +296,7 @@ Notes:
 ++++++
 
     * The Circular Local Binary Patterns (used in training and prediction) expect the data given as grayscale images, use :ocv:func:`cvtColor` to convert between the color spaces.
-    
+
 Model internal data:
 ++++++++++++++++++++
 
index 2a6d4c4..a602162 100644 (file)
@@ -4,30 +4,30 @@ Saving and Loading a FaceRecognizer
 Introduction
 ------------
 
-Saving and loading a :ocv:class:`FaceRecognizer` is very important. Training a FaceRecognizer can be a very 
-time-intense task, plus it's often impossible to ship the whole face database to the user of your product. 
+Saving and loading a :ocv:class:`FaceRecognizer` is very important. Training a FaceRecognizer can be a very
+time-intense task, plus it's often impossible to ship the whole face database to the user of your product.
 
-The task of saving and loading a FaceRecognizer is easy with :ocv:class:`FaceRecognizer`. You only have to 
-call :ocv:func:`FaceRecognizer::load` for loading and :ocv:func:`FaceRecognizer::save` for saving a 
+The task of saving and loading a FaceRecognizer is easy with :ocv:class:`FaceRecognizer`. You only have to
+call :ocv:func:`FaceRecognizer::load` for loading and :ocv:func:`FaceRecognizer::save` for saving a
 :ocv:class:`FaceRecognizer`.
 
-I'll adapt the Eigenfaces example from the :doc:`/facerec_tutorial`: Imagine we want to learn the Eigenfaces
- of the `AT&T Facedatabase <http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html>`_ store the 
+I'll adapt the Eigenfaces example from the :doc:`../facerec_tutorial`: Imagine we want to learn the Eigenfaces
+ of the `AT&T Facedatabase <http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html>`_ store the
  model to a YAML file and then load it again.
+
 From the loaded model, we'll get a prediction, show the mean, eigenfaces and the image reconstruction.
-  
+
 Using FaceRecognizer::save and FaceRecognizer::load
 -----------------------------------------------------
 
 .. literalinclude:: ../src/facerec_save_load.cpp
    :language: cpp
    :linenos:
-  
+
 Results
 -------
 
-``eigenfaces_at.yml`` then contains the model state, we'll simply look at the first 10 lines with ``head eigenfaces_at.yml``: 
+``eigenfaces_at.yml`` then contains the model state, we'll simply look at the first 10 lines with ``head eigenfaces_at.yml``:
 
 .. code-block:: none
 
index f4e3910..ba8b06c 100644 (file)
@@ -9,14 +9,14 @@ Introduction
 
 Whenever you hear the term *face recognition*, you instantly think of surveillance in videos. So performing face recognition in videos (e.g. webcam) is one of the most requested features I got. I have heard your cries, so here it is. For face detection we'll use the awesome :ocv:class:`CascadeClassifier`, and we'll use :ocv:class:`FaceRecognizer` for face recognition. This example uses the Fisherfaces method for face recognition, because it is robust against large changes in illumination.
 
-Here is what the final application looks like, as you can see I am only writing the id of the recognized person (by the way this id is Arnold Schwarzenegger for my data set) above the detected face. 
+Here is what the final application looks like, as you can see I am only writing the id of the recognized person (by the way this id is Arnold Schwarzenegger for my data set) above the detected face.
 
 .. image:: ../img/tutorial/facerec_video/facerec_video.png
     :align: center
     :scale: 70%
 
 This demo is a basis for your research, and it shows you how to implement face recognition in videos. You probably want to extend the application and make it more sophisticated: You could combine the id with the name, show the confidence of the prediction, recognize the emotion... and and and. But before you send mails, asking what these Haar-Cascade thing is or what a CSV is... Make sure you have read the entire tutorial. It's all explained in here. If you just want to scroll down to the code, please note:
-  
+
 * The available Haar-Cascades are located in the ``data`` folder of your OpenCV installation! One of the available Haar-Cascades for face detection is for example ``data/haarcascades/haarcascade_frontalface_default.xml``.
 
 I encourage you to experiment with the application. Play around with the available :ocv:class:`FaceRecognizer`, try the available cascades in OpenCV and see if you can improve your results!
@@ -24,7 +24,7 @@ I encourage you to experiment with the application. Play around with the availab
 Prerequisites
 --------------
 
-You want to do face recognition, so you need some face images to learn a :ocv:class:`FaceRecognizer` on. I have decided to reuse the images from the gender classification example: :doc:`../facerec_gender_classification`.
+You want to do face recognition, so you need some face images to learn a :ocv:class:`FaceRecognizer` on. I have decided to reuse the images from the gender classification example: :doc:`facerec_gender_classification`.
 
 I have the following celebrities in my training data set:
 
@@ -39,12 +39,12 @@ I have the following celebrities in my training data set:
 * Patrick Stewart
 * Tom Cruise
 
-In the demo I have decided to read the images from a very simple CSV file. Why? Because it's the simplest platform-independent approach I can think of. However, if you know a simpler solution please ping me about it. Basically all the CSV file needs to contain are lines composed of a ``filename`` followed by a ``;`` followed by the ``label`` (as *integer number*), making up a line like this: 
+In the demo I have decided to read the images from a very simple CSV file. Why? Because it's the simplest platform-independent approach I can think of. However, if you know a simpler solution please ping me about it. Basically all the CSV file needs to contain are lines composed of a ``filename`` followed by a ``;`` followed by the ``label`` (as *integer number*), making up a line like this:
 
 .. code-block:: none
 
     /path/to/image.ext;0
-    
+
 Let's dissect the line. ``/path/to/image.ext`` is the path to an image, probably something like this if you are in Windows: ``C:/faces/person0/image0.jpg``. Then there is the separator ``;`` and finally we assign a label ``0`` to the image. Think of the label as the subject (the person, the gender or whatever comes to your mind). In the face recognition scenario, the label is the person this image belongs to. In the gender classification scenario, the label is the gender the person has. So my CSV file looks like this:
 
 .. code-block:: none
@@ -65,7 +65,7 @@ Let's dissect the line. ``/path/to/image.ext`` is the path to an image, probably
     /home/philipp/facerec/data/c1/crop_arnold_schwarzenegger/crop_05.jpg;6
     /home/philipp/facerec/data/c1/crop_arnold_schwarzenegger/crop_02.jpg;6
     /home/philipp/facerec/data/c1/crop_arnold_schwarzenegger/crop_03.jpg;6
-    
+
 All images for this example were chosen to have a frontal face perspective. They have been cropped, scaled and rotated to be aligned at the eyes, just like this set of George Clooney images:
 
 .. image:: ../img/tutorial/gender_classification/clooney_set.png
@@ -85,7 +85,7 @@ Running the Demo
 
 You'll need:
 
-* The path to a valid Haar-Cascade for detecting a face with a :ocv:class:`CascadeClassifier`.    
+* The path to a valid Haar-Cascade for detecting a face with a :ocv:class:`CascadeClassifier`.
 * The path to a valid CSV File for learning a :ocv:class:`FaceRecognizer`.
 * A webcam and its device id (you don't know the device id? Simply start from 0 on and see what happens).
 
@@ -94,7 +94,7 @@ If you are in Windows, then simply start the demo by running (from command line)
 .. code-block:: none
 
     facerec_video.exe <C:/path/to/your/haar_cascade.xml> <C:/path/to/your/csv.ext> <video device>
-    
+
 If you are in Linux, then simply start the demo by running:
 
 .. code-block:: none
@@ -137,8 +137,8 @@ You don't really want to create the CSV file by hand. I have prepared you a litt
     |   |-- 1.pgm
     |   |-- ...
     |   |-- 10.pgm
-    
-    
+
+
 Then simply call ``create_csv.py`` with the path to the folder, just like this and you could save the output:
 
 .. code-block:: none
@@ -167,7 +167,7 @@ Here is the script, if you can't find it:
 .. literalinclude:: ../src/create_csv.py
    :language: python
    :linenos:
-   
+
 Aligning Face Images
 ++++++++++++++++++++
 
@@ -184,9 +184,9 @@ If you are using the same *offset_pct* and *dest_sz* for your images, they are a
    :language: python
    :linenos:
 
-Imagine we are given `this photo of Arnold Schwarzenegger <http://en.wikipedia.org/wiki/File:Arnold_Schwarzenegger_edit%28ws%29.jpg>`_, which is under a Public Domain license. The (x,y)-position of the eyes is approximately *(252,364)* for the left and *(420,366)* for the right eye. Now you only need to define the horizontal offset, vertical offset and the size your scaled, rotated & cropped face should have. 
+Imagine we are given `this photo of Arnold Schwarzenegger <http://en.wikipedia.org/wiki/File:Arnold_Schwarzenegger_edit%28ws%29.jpg>`_, which is under a Public Domain license. The (x,y)-position of the eyes is approximately *(252,364)* for the left and *(420,366)* for the right eye. Now you only need to define the horizontal offset, vertical offset and the size your scaled, rotated & cropped face should have.
 
-Here are some examples: 
+Here are some examples:
 
 +---------------------------------+----------------------------------------------------------------------------+
 | Configuration                   | Cropped, Scaled, Rotated Face                                              |
@@ -200,4 +200,4 @@ Here are some examples:
 | 0.2 (20%), 0.2 (20%), (70,70)   | .. image:: ../img/tutorial/gender_classification/arnie_20_20_70_70.jpg     |
 +---------------------------------+----------------------------------------------------------------------------+
 
+