| // The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt | |
| /* | |
| This example program shows how to find frontal human faces in an image and | |
| estimate their pose. The pose takes the form of 68 landmarks. These are | |
| points on the face such as the corners of the mouth, along the eyebrows, on | |
| the eyes, and so forth. | |
| The face detector we use is made using the classic Histogram of Oriented | |
| Gradients (HOG) feature combined with a linear classifier, an image pyramid, | |
| and sliding window detection scheme. The pose estimator was created by | |
| using dlib's implementation of the paper: | |
| One Millisecond Face Alignment with an Ensemble of Regression Trees by | |
| Vahid Kazemi and Josephine Sullivan, CVPR 2014 | |
| and was trained on the iBUG 300-W face landmark dataset (see | |
| https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/): | |
| C. Sagonas, E. Antonakos, G, Tzimiropoulos, S. Zafeiriou, M. Pantic. | |
| 300 faces In-the-wild challenge: Database and results. | |
| Image and Vision Computing (IMAVIS), Special Issue on Facial Landmark Localisation "In-The-Wild". 2016. | |
| You can get the trained model file from: | |
| http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2. | |
| Note that the license for the iBUG 300-W dataset excludes commercial use. | |
| So you should contact Imperial College London to find out if it's OK for | |
| you to use this model file in a commercial product. | |
| Also, note that you can train your own models using dlib's machine learning | |
| tools. See train_shape_predictor_ex.cpp to see an example. | |
| Finally, note that the face detector is fastest when compiled with at least | |
| SSE2 instructions enabled. So if you are using a PC with an Intel or AMD | |
| chip then you should enable at least SSE2 instructions. If you are using | |
| cmake to compile this program you can enable them by using one of the | |
| following commands when you create the build project: | |
| cmake path_to_dlib_root/examples -DUSE_SSE2_INSTRUCTIONS=ON | |
| cmake path_to_dlib_root/examples -DUSE_SSE4_INSTRUCTIONS=ON | |
| cmake path_to_dlib_root/examples -DUSE_AVX_INSTRUCTIONS=ON | |
| This will set the appropriate compiler options for GCC, clang, Visual | |
| Studio, or the Intel compiler. If you are using another compiler then you | |
| need to consult your compiler's manual to determine how to enable these | |
| instructions. Note that AVX is the fastest but requires a CPU from at least | |
| 2011. SSE4 is the next fastest and is supported by most current machines. | |
| */ | |
| using namespace dlib; | |
| using namespace std; | |
| // ---------------------------------------------------------------------------------------- | |
| int main(int argc, char** argv) | |
| { | |
| try | |
| { | |
| // This example takes in a shape model file and then a list of images to | |
| // process. We will take these filenames in as command line arguments. | |
| // Dlib comes with example images in the examples/faces folder so give | |
| // those as arguments to this program. | |
| if (argc == 1) | |
| { | |
| cout << "Call this program like this:" << endl; | |
| cout << "./face_landmark_detection_ex shape_predictor_68_face_landmarks.dat faces/*.jpg" << endl; | |
| cout << "\nYou can get the shape_predictor_68_face_landmarks.dat file from:\n"; | |
| cout << "http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2" << endl; | |
| return 0; | |
| } | |
| // We need a face detector. We will use this to get bounding boxes for | |
| // each face in an image. | |
| frontal_face_detector detector = get_frontal_face_detector(); | |
| // And we also need a shape_predictor. This is the tool that will predict face | |
| // landmark positions given an image and face bounding box. Here we are just | |
| // loading the model from the shape_predictor_68_face_landmarks.dat file you gave | |
| // as a command line argument. | |
| shape_predictor sp; | |
| deserialize(argv[1]) >> sp; | |
| image_window win, win_faces; | |
| // Loop over all the images provided on the command line. | |
| for (int i = 2; i < argc; ++i) | |
| { | |
| cout << "processing image " << argv[i] << endl; | |
| array2d<rgb_pixel> img; | |
| load_image(img, argv[i]); | |
| // Make the image larger so we can detect small faces. | |
| pyramid_up(img); | |
| // Now tell the face detector to give us a list of bounding boxes | |
| // around all the faces in the image. | |
| std::vector<rectangle> dets = detector(img); | |
| cout << "Number of faces detected: " << dets.size() << endl; | |
| // Now we will go ask the shape_predictor to tell us the pose of | |
| // each face we detected. | |
| std::vector<full_object_detection> shapes; | |
| for (unsigned long j = 0; j < dets.size(); ++j) | |
| { | |
| full_object_detection shape = sp(img, dets[j]); | |
| cout << "number of parts: "<< shape.num_parts() << endl; | |
| cout << "pixel position of first part: " << shape.part(0) << endl; | |
| cout << "pixel position of second part: " << shape.part(1) << endl; | |
| // You get the idea, you can get all the face part locations if | |
| // you want them. Here we just store them in shapes so we can | |
| // put them on the screen. | |
| shapes.push_back(shape); | |
| } | |
| // Now let's view our face poses on the screen. | |
| win.clear_overlay(); | |
| win.set_image(img); | |
| win.add_overlay(render_face_detections(shapes)); | |
| // We can also extract copies of each face that are cropped, rotated upright, | |
| // and scaled to a standard size as shown here: | |
| dlib::array<array2d<rgb_pixel> > face_chips; | |
| extract_image_chips(img, get_face_chip_details(shapes), face_chips); | |
| win_faces.set_image(tile_images(face_chips)); | |
| cout << "Hit enter to process the next image..." << endl; | |
| cin.get(); | |
| } | |
| } | |
| catch (exception& e) | |
| { | |
| cout << "\nexception thrown!" << endl; | |
| cout << e.what() << endl; | |
| } | |
| } | |
| // ---------------------------------------------------------------------------------------- | |