Path: blob/master/FaceDetectionComparison/face_detection_dlib_mmod.cpp
3118 views
#include <iostream>1#include <string>2#include <vector>3#include <stdlib.h>4#include <opencv2/core.hpp>5#include <opencv2/imgproc.hpp>6#include <opencv2/highgui.hpp>78#include <dlib/opencv.h>9#include <dlib/image_processing.h>10#include <dlib/dnn.h>11#include <dlib/data_io.h>1213using namespace cv;14using namespace std;15using namespace dlib;1617// Network Definition18/////////////////////////////////////////////////////////////////////////////////////////////////////19template <long num_filters, typename SUBNET> using con5d = con<num_filters,5,5,2,2,SUBNET>;20template <long num_filters, typename SUBNET> using con5 = con<num_filters,5,5,1,1,SUBNET>;2122template <typename SUBNET> using downsampler = relu<affine<con5d<32, relu<affine<con5d<32, relu<affine<con5d<16,SUBNET>>>>>>>>>;23template <typename SUBNET> using rcon5 = relu<affine<con5<45,SUBNET>>>;2425using net_type = loss_mmod<con<1,9,9,1,1,rcon5<rcon5<rcon5<downsampler<input_rgb_image_pyramid<pyramid_down<6>>>>>>>>;26/////////////////////////////////////////////////////////////////////////////////////////////////////2728void detectFaceDlibMMOD(net_type mmodFaceDetector, Mat &frameDlibMmod, int inHeight=300, int inWidth=0)29{3031int frameHeight = frameDlibMmod.rows;32int frameWidth = frameDlibMmod.cols;33if (!inWidth)34inWidth = (int)((frameWidth / (float)frameHeight) * inHeight);3536float scaleHeight = frameHeight / (float)inHeight;37float scaleWidth = frameWidth / (float)inWidth;3839Mat frameDlibMmodSmall;40resize(frameDlibMmod, frameDlibMmodSmall, Size(inWidth, inHeight));4142// Convert OpenCV image format to Dlib's image format43cv_image<bgr_pixel> dlibIm(frameDlibMmodSmall);44matrix<rgb_pixel> dlibMatrix;45assign_image(dlibMatrix, dlibIm);4647// Detect faces in the image48std::vector<dlib::mmod_rect> faceRects = mmodFaceDetector(dlibMatrix);4950for ( size_t i = 0; i < faceRects.size(); i++ )51{52int x1 = (int)(faceRects[i].rect.left() * scaleWidth);53int y1 = (int)(faceRects[i].rect.top() * scaleHeight);54int x2 = (int)(faceRects[i].rect.right() * scaleWidth);55int y2 = (int)(faceRects[i].rect.bottom() * scaleHeight);56cv::rectangle(frameDlibMmod, Point(x1, y1), Point(x2, y2), Scalar(0,255,0), (int)(frameHeight/150.0), 4);57}58}5960int main( int argc, const char** argv )61{62String mmodModelPath = "models/mmod_human_face_detector.dat";63net_type mmodFaceDetector;64deserialize(mmodModelPath) >> mmodFaceDetector;6566VideoCapture source;67if (argc == 1)68source.open(0, CAP_V4L);69else70source.open(argv[1]);7172Mat frame;7374double tt_dlibMmod = 0;75double fpsDlibMmod = 0;76while (true)77{78source >> frame;79if (frame.empty())80break;8182double t = cv::getTickCount();83detectFaceDlibMMOD ( mmodFaceDetector, frame );84tt_dlibMmod = ((double)cv::getTickCount() - t)/cv::getTickFrequency();85fpsDlibMmod = 1/tt_dlibMmod;8687putText(frame, format("DLIB MMOD; FPS = %.2f",fpsDlibMmod), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.3, Scalar(0, 0, 255), 4);88imshow("DLIB - MMOD Face Detection", frame);8990int k = waitKey(5);91if(k == 27)92{93destroyAllWindows();94break;95}96}97}9899100