// This file is part of OpenCV project. // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. /* This file was part of GSoC Project: Facemark API for OpenCV Final report: https://gist.github.com/kurnianggoro/74de9121e122ad0bd825176751d47ecc Student: Laksono Kurnianggoro Mentor: Delia Passalacqua */ #ifndef __OPENCV_FACELANDMARKTRAIN_HPP__ #define __OPENCV_FACELANDMARKTRAIN_HPP__ /** @defgroup face Face Analysis - @ref tutorial_table_of_content_facemark - The Facemark API */ #include "opencv2/face/facemark.hpp" #include "opencv2/objdetect.hpp" #include #include namespace cv { namespace face { //! @addtogroup face //! @{ typedef bool(*FN_FaceDetector)(InputArray, OutputArray, void* userData); struct CParams{ String cascade; //!< the face detector double scaleFactor; //!< Parameter specifying how much the image size is reduced at each image scale. int minNeighbors; //!< Parameter specifying how many neighbors each candidate rectangle should have to retain it. Size minSize; //!< Minimum possible object size. Size maxSize; //!< Maximum possible object size. CV_EXPORTS CParams( String cascade_model, double sf = 1.1, int minN = 3, Size minSz = Size(30, 30), Size maxSz = Size() ); CascadeClassifier face_cascade; }; /** @brief Default face detector This function is mainly utilized by the implementation of a Facemark Algorithm. End users are advised to use function Facemark::getFaces which can be manually defined and circumvented to the algorithm by Facemark::setFaceDetector. @param image The input image to be processed. @param faces Output of the function which represent region of interest of the detected faces. Each face is stored in cv::Rect container. @param params detector parameters Example of usage @code std::vector faces; CParams params("haarcascade_frontalface_alt.xml"); cv::face::getFaces(frame, faces, ¶ms); for(int j=0;j images_train; std::vector landmarks_train; loadDatasetList(imageFiles,ptsFiles,images_train,landmarks_train); @endcode */ CV_EXPORTS_W bool loadDatasetList(String imageList, String annotationList, std::vector & images, std::vector & annotations); /** @brief A utility to load facial landmark dataset from a single file. @param filename The filename of a file that contains the dataset information. Each line contains the filename of an image followed by pairs of x and y values of facial landmarks points separated by a space. Example @code /home/user/ibug/image_003_1.jpg 336.820955 240.864510 334.238298 260.922709 335.266918 ... /home/user/ibug/image_005_1.jpg 376.158428 230.845712 376.736984 254.924635 383.265403 ... @endcode @param images A vector where each element represent the filename of image in the dataset. Images are not loaded by default to save the memory. @param facePoints The loaded landmark points for all training data. @param delim Delimiter between each element, the default value is a whitespace. @param offset An offset value to adjust the loaded points. Example of usage @code cv::String imageFiles = "../data/images_train.txt"; cv::String ptsFiles = "../data/points_train.txt"; std::vector images; std::vector > facePoints; loadTrainingData(imageFiles, ptsFiles, images, facePoints, 0.0f); @endcode */ CV_EXPORTS_W bool loadTrainingData( String filename , std::vector & images, OutputArray facePoints, char delim = ' ', float offset = 0.0f); /** @brief A utility to load facial landmark information from the dataset. @param imageList A file contains the list of image filenames in the training dataset. @param groundTruth A file contains the list of filenames where the landmarks points information are stored. The content in each file should follow the standard format (see face::loadFacePoints). @param images A vector where each element represent the filename of image in the dataset. Images are not loaded by default to save the memory. @param facePoints The loaded landmark points for all training data. @param offset An offset value to adjust the loaded points. Example of usage @code cv::String imageFiles = "../data/images_train.txt"; cv::String ptsFiles = "../data/points_train.txt"; std::vector images; std::vector > facePoints; loadTrainingData(imageFiles, ptsFiles, images, facePoints, 0.0f); @endcode example of content in the images_train.txt @code /home/user/ibug/image_003_1.jpg /home/user/ibug/image_004_1.jpg /home/user/ibug/image_005_1.jpg /home/user/ibug/image_006.jpg @endcode example of content in the points_train.txt @code /home/user/ibug/image_003_1.pts /home/user/ibug/image_004_1.pts /home/user/ibug/image_005_1.pts /home/user/ibug/image_006.pts @endcode */ CV_EXPORTS_W bool loadTrainingData( String imageList, String groundTruth, std::vector & images, OutputArray facePoints, float offset = 0.0f); /** @brief This function extracts the data for training from .txt files which contains the corresponding image name and landmarks. *The first file in each file should give the path of the image whose *landmarks are being described in the file. Then in the subsequent *lines there should be coordinates of the landmarks in the image *i.e each line should be of the form x,y *where x represents the x coordinate of the landmark and y represents *the y coordinate of the landmark. * *For reference you can see the files as provided in the *HELEN dataset * * @param filename A vector of type cv::String containing name of the .txt files. * @param trainlandmarks A vector of type cv::Point2f that would store shape or landmarks of all images. * @param trainimages A vector of type cv::String which stores the name of images whose landmarks are tracked * @returns A boolean value. It returns true when it reads the data successfully and false otherwise */ CV_EXPORTS_W bool loadTrainingData(std::vector filename,std::vector< std::vector > &trainlandmarks,std::vector & trainimages); /** @brief A utility to load facial landmark information from a given file. @param filename The filename of file contains the facial landmarks data. @param points The loaded facial landmark points. @param offset An offset value to adjust the loaded points. Example of usage @code std::vector points; face::loadFacePoints("filename.txt", points, 0.0f); @endcode The annotation file should follow the default format which is @code version: 1 n_points: 68 { 212.716603 499.771793 230.232816 566.290071 ... } @endcode where n_points is the number of points considered and each point is represented as its position in x and y. */ CV_EXPORTS_W bool loadFacePoints( String filename, OutputArray points, float offset = 0.0f); /** @brief Utility to draw the detected facial landmark points @param image The input image to be processed. @param points Contains the data of points which will be drawn. @param color The color of points in BGR format represented by cv::Scalar. Example of usage @code std::vector faces; std::vector > landmarks; facemark->getFaces(img, faces); facemark->fit(img, faces, landmarks); for(int j=0;j facemark = FacemarkLBF::create(); @endcode The typical pipeline for facemark detection is listed as follows: - (Non-mandatory) Set a user defined face detection using FacemarkTrain::setFaceDetector. The facemark algorithms are designed to fit the facial points into a face. Therefore, the face information should be provided to the facemark algorithm. Some algorithms might provides a default face recognition function. However, the users might prefer to use their own face detector to obtains the best possible detection result. - (Non-mandatory) Training the model for a specific algorithm using FacemarkTrain::training. In this case, the model should be automatically saved by the algorithm. If the user already have a trained model, then this part can be omitted. - Load the trained model using Facemark::loadModel. - Perform the fitting via the Facemark::fit. */ class CV_EXPORTS_W FacemarkTrain : public Facemark { public: /** @brief Add one training sample to the trainer. @param image Input image. @param landmarks The ground-truth of facial landmarks points corresponds to the image. Example of usage @code String imageFiles = "../data/images_train.txt"; String ptsFiles = "../data/points_train.txt"; std::vector images_train; std::vector landmarks_train; // load the list of dataset: image paths and landmark file paths loadDatasetList(imageFiles,ptsFiles,images_train,landmarks_train); Mat image; std::vector facial_points; for(size_t i=0;iaddTrainingSample(image, facial_points); } @endcode The contents in the training files should follows the standard format. Here are examples for the contents in these files. example of content in the images_train.txt @code /home/user/ibug/image_003_1.jpg /home/user/ibug/image_004_1.jpg /home/user/ibug/image_005_1.jpg /home/user/ibug/image_006.jpg @endcode example of content in the points_train.txt @code /home/user/ibug/image_003_1.pts /home/user/ibug/image_004_1.pts /home/user/ibug/image_005_1.pts /home/user/ibug/image_006.pts @endcode */ virtual bool addTrainingSample(InputArray image, InputArray landmarks)=0; /** @brief Trains a Facemark algorithm using the given dataset. Before the training process, training samples should be added to the trainer using face::addTrainingSample function. @param parameters Optional extra parameters (algorithm dependent). Example of usage @code FacemarkLBF::Params params; params.model_filename = "ibug68.model"; // filename to save the trained model Ptr facemark = FacemarkLBF::create(params); // add training samples (see Facemark::addTrainingSample) facemark->training(); @endcode */ virtual void training(void* parameters=0)=0; /** @brief Set a user defined face detector for the Facemark algorithm. @param detector The user defined face detector function @param userData Detector parameters Example of usage @code MyDetectorParameters detectorParameters(...); facemark->setFaceDetector(myDetector, &detectorParameters); @endcode Example of a user defined face detector @code bool myDetector( InputArray image, OutputArray faces, void* userData) { MyDetectorParameters* params = (MyDetectorParameters*)userData; // -------- do something -------- } @endcode TODO Lifetime of detector parameters is uncontrolled. Rework interface design to "Ptr". */ virtual bool setFaceDetector(FN_FaceDetector detector, void* userData = 0)=0; /** @brief Detect faces from a given image using default or user defined face detector. Some Algorithm might not provide a default face detector. @param image Input image. @param faces Output of the function which represent region of interest of the detected faces. Each face is stored in cv::Rect container. Example of usage @code std::vector faces; facemark->getFaces(img, faces); for(int j=0;jExample of usage @code Ptr facemark = FacemarkAAM::create(); facemark->loadModel("AAM.yml"); FacemarkAAM::Data data; facemark->getData(&data); std::vector s0 = data.s0; cout<