CPU实时帧率超过100+,嵌入式端首选的人脸检测库推荐

2020-03-10 21:36:10 浏览数 (1)

开源人脸库调用尝试

基于卷积神经网络的人脸检测库,实现了硬件指令加速,纯C SDK接口,不依赖第三方库与接口,可以独立使用,同时也提供了模型文件下载,之前的版本是caffe模型,最新版本支持pytorch。现已开源!支持最小检测人脸10x10大小

OpenCV DNN可以直接调用训练好的caffe模型文件,实现实时人脸检测,演示代码如下:

代码语言:javascript复制
 1#include <opencv2/opencv.hpp>
 2#include <opencv2/dnn.hpp>
 3#include <iostream>
 4
 5using namespace cv;
 6using namespace cv::dnn;
 7using namespace std;
 8
 9const size_t inWidth = 300;
10const size_t inHeight = 300;
11const double inScaleFactor = 0.007843;
12const Scalar meanVal(104.0, 117, 123.0);
13const float confidence = 0.5;
14
15int main(int argc, char** argv) {
16    string model = "D:/projects/models/yufacedetectnet-open-v2.caffemodel";
17    string config = "D:/projects/models/yufacedetectnet-open-v2.prototxt";
18    // read network
19    Net net = readNetFromCaffe(config, model);
20    VideoCapture cap(0);
21    Mat frame;
22    while (true) {
23        bool ret = cap.read(frame);
24        if (!ret) {
25            break;
26        }
27        int64 start = getTickCount();
28        Mat input_data = blobFromImage(frame, inScaleFactor, Size(320, 240), meanVal, false, false);
29        net.setInput(input_data);
30
31        // 人脸检测
32        Mat detection = net.forward();
33        Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>());
34
35        // 推断时间
36        vector<double> layersTimings;
37        double freq = getTickFrequency() / 1000;
38        double time = net.getPerfProfile(layersTimings) / freq;
39
40        ostringstream ss;
41        for (int i = 0; i < detectionMat.rows; i  )
42        {
43            // 置信度 0~1之间
44            float score = detectionMat.at<float>(i, 2);
45            if (score > confidence)
46            {
47                int xLeftBottom = static_cast<int>(detectionMat.at<float>(i, 3) * frame.cols);
48                int yLeftBottom = static_cast<int>(detectionMat.at<float>(i, 4) * frame.rows);
49                int xRightTop = static_cast<int>(detectionMat.at<float>(i, 5) * frame.cols);
50                int yRightTop = static_cast<int>(detectionMat.at<float>(i, 6) * frame.rows);
51
52                Rect object((int)xLeftBottom, (int)yLeftBottom,
53                    (int)(xRightTop - xLeftBottom),
54                    (int)(yRightTop - yLeftBottom));
55
56                rectangle(frame, object, Scalar(0, 255, 0));
57
58                ss << score;
59                String conf(ss.str());
60                String label = "Face: "   conf;
61                int baseLine = 0;
62                Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
63                rectangle(frame, Rect(Point(xLeftBottom, yLeftBottom - labelSize.height),
64                    Size(labelSize.width, labelSize.height   baseLine)),
65                    Scalar(255, 255, 255), FILLED);
66                putText(frame, label, Point(xLeftBottom, yLeftBottom),
67                    FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));
68            }
69        }
70        float fps = getTickFrequency() / (getTickCount() - start);
71        ss.str("");
72        ss << "FPS: " << fps << " ; inference time: " << time << " ms";
73        putText(frame, ss.str(), Point(20, 20), 0, 0.75, Scalar(0, 0, 255), 2, 8);
74        imshow("dnn_face_detection", frame);
75        if (waitKey(1) >= 0) break;
76    }
77    waitKey(0);
78    return 0;
79}

运行效果如下:

Github地址

代码语言:javascript复制
https://github.com/ShiqiYu/libfacedetection

0 人点赞