1. 程式人生 > >利用OpenCV和深度學習實現人臉檢測

利用OpenCV和深度學習實現人臉檢測

// Summary: 使用OpenCV3.3.1中的face_detector
// Author: Amusi
// Date:   2018-02-28
// Reference: http://blog.csdn.net/minstyrain/article/details/78907425

#include <iostream>  
#include <cstdlib>  
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/dnn/shape_utils.hpp>

using namespace cv;  
using namespace cv::dnn;  
using namespace std;  
const size_t inWidth = 300;  
const size_t inHeight = 300;  
const double inScaleFactor = 1.0;  
const Scalar meanVal(104.0, 177.0, 123.0);  
  
int main(int argc, char** argv)  
{  
    float min_confidence = 0.5;  
    String modelConfiguration = "face_detector/deploy.prototxt";  
    String modelBinary = "face_detector/res10_300x300_ssd_iter_140000.caffemodel";  
    //! [Initialize network]  
    dnn::Net net = readNetFromCaffe(modelConfiguration, modelBinary);  
    //! [Initialize network]  
    if (net.empty())  
    {  
        cerr << "Can't load network by using the following files: " << endl;  
        cerr << "prototxt:   " << modelConfiguration << endl;  
        cerr << "caffemodel: " << modelBinary << endl;  
        cerr << "Models are available here:" << endl;  
        cerr << "<OPENCV_SRC_DIR>/samples/dnn/face_detector" << endl;  
        cerr << "or here:" << endl;  
        cerr << "https://github.com/opencv/opencv/tree/master/samples/dnn/face_detector" << endl;  
        exit(-1);  
    }  
  
    VideoCapture cap(0);  
    if (!cap.isOpened())  
    {  
        cout << "Couldn't open camera : " << endl;  
        return -1;  
    }  
    for (;;)  
    {  
        Mat frame;  
        cap >> frame; // get a new frame from camera/video or read image  
  
        if (frame.empty())  
        {  
            waitKey();  
            break;  
        }  
  
        if (frame.channels() == 4)  
            cvtColor(frame, frame, COLOR_BGRA2BGR);  
  
        //! [Prepare blob]  
        Mat inputBlob = blobFromImage(frame, inScaleFactor,  
            Size(inWidth, inHeight), meanVal, false, false); //Convert Mat to batch of images  
                                                             //! [Prepare blob]  
  
                                                             //! [Set input blob]  
        net.setInput(inputBlob, "data"); //set the network input  
                                         //! [Set input blob]  
  
                                         //! [Make forward pass]  
        Mat detection = net.forward("detection_out"); //compute output  
                                                      //! [Make forward pass]  
  
        vector<double> layersTimings;  
        double freq = getTickFrequency() / 1000;  
        double time = net.getPerfProfile(layersTimings) / freq;  
  
        Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>());  
  
        ostringstream ss;  
        ss << "FPS: " << 1000 / time << " ; time: " << time << " ms";  
        putText(frame, ss.str(), Point(20, 20), 0, 0.5, Scalar(0, 0, 255));  
  
        float confidenceThreshold = min_confidence;  
        for (int i = 0; i < detectionMat.rows; i++)  
        {  
            float confidence = detectionMat.at<float>(i, 2);  
  
            if (confidence > confidenceThreshold)  
            {  
                int xLeftBottom = static_cast<int>(detectionMat.at<float>(i, 3) * frame.cols);  
                int yLeftBottom = static_cast<int>(detectionMat.at<float>(i, 4) * frame.rows);  
                int xRightTop = static_cast<int>(detectionMat.at<float>(i, 5) * frame.cols);  
                int yRightTop = static_cast<int>(detectionMat.at<float>(i, 6) * frame.rows);  
  
                Rect object((int)xLeftBottom, (int)yLeftBottom,  
                    (int)(xRightTop - xLeftBottom),  
                    (int)(yRightTop - yLeftBottom));  
  
                rectangle(frame, object, Scalar(0, 255, 0));  
  
                ss.str("");  
                ss << confidence;  
                String conf(ss.str());  
                String label = "Face: " + conf;  
                int baseLine = 0;  
                Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);  
                rectangle(frame, Rect(Point(xLeftBottom, yLeftBottom - labelSize.height),  
                    Size(labelSize.width, labelSize.height + baseLine)),  
                    Scalar(255, 255, 255), CV_FILLED);  
                putText(frame, label, Point(xLeftBottom, yLeftBottom),  
                    FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));  
            }  
        }  
        cv::imshow("detections", frame);  
        if (waitKey(1) >= 0) break;  
    }  
    return 0;  
}  

相關推薦

利用OpenCV深度學習實現人臉檢測

// Summary: 使用OpenCV3.3.1中的face_detector // Author: Amusi // Date: 2018-02-28 // Reference: http://blog.csdn.net/minstyrain/article/details/78907425 #in

opencv基於深度學習人臉檢測

opencv3.4 版之前自帶的人臉檢測器是基於Haar+Adaboost的,速度還可以,但是檢出率很低,誤檢也很多,臉的角度稍大就檢不出來,還經常會把一些亂七八糟的東西當做人臉,實在不敢恭維。好在隨著深度學習領域的發展,湧現了一大批效果相當不錯的人臉檢測演算法,比如MTCN

利用python-opencv環境筆記本攝像頭實現人臉檢測

1.安裝opencv 首先參考其他文章安裝pip。 之後以管理員身份執行命令提示符,輸入以下程式碼安裝opencv pip install --user opencv-python 可以使用以下程式碼測試安裝是否成功 #匯入opencv模組 import cv2 #

利用Google的Vision庫實現人臉檢測

利用的Google的vision library實現人臉檢測功能 本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 前言 之前寫了一篇人臉檢測的文章是基於OpenCV的CascadeClassifier來實現的,基於OpenCV實現人臉檢測。這

DL之Yolo系列:深度學習實現目標檢測之Yolo系列的論文簡介、概念理解、思路配圖等詳細攻略

DL之Yolo系列:深度學習實現目標檢測之Yolo系列的論文簡介、概念理解、思路配圖等詳細攻略     Yolo系列的論文簡介 1、Yolo V1簡介   2、Yolo V2簡介   3、Yolo V3簡介   &

android端使用openCV深度學習實現車牌識別

車牌識別的應用場景隨處可見:高速公路上超速抓拍、小區門口關卡、車庫入口關卡,甚至出現在車載裝置上。它的工作原理大致這樣:使用攝像頭充當“眼睛”,使用openCV與深度學習充當“大腦”。實時車牌識別工作

LBP 深度學習人臉識別

最近讀了一篇關於LBP和DBN的文章,感覺思路挺好的,如有不當之處望指正!!!!! 這是一篇在非限制條件下,基於深度學習的人臉識別演算法。,將LBP紋理特徵作為深度網路的輸入,通過逐層貪婪訓練網路,獲

opencv--基於深度學習人臉檢測器

首先, 一直以來就在考慮這麼牛逼的opencv該換一下里邊一些過時的東西了,像:檢測器、識別器等等,果不其然,openv的大佬們還是偷偷的換了。 已opencv直接載入caffe深度學習(ssd人臉檢測)模型: (還是厲害的一筆) 下面是python程式碼: 使用 圖片

Linux系統下利用OpenCV實現人臉檢測基於LBPH演算法的人臉識別

        本文主要的目的是進行人臉檢測和人臉識別。實驗環境為Ubuntu16.04 LTS虛擬機器版,技術為OpenCV,語言為c++。其中人臉檢測的主要過程是從一張圖片中檢測出人臉可以是一個或者是多個,然後用矩形或者圓形線圈標註出來。人臉識別是基於LBPH演算法實現

利用MTCNNfacenet實現人臉檢測人臉識別

利用MTCNN和facenet實現人臉檢測和人臉識別     人臉檢測和人臉識別技術算是目前人工智慧方面應用最成熟的技術了。本部落格將利用mtcnn和faceNet搭建一個實現人臉檢測和人臉識別的系統。基本思路也很簡單,先利用mtcnn的進行人臉檢測,當然也可以使用其他的

OpenCV學習筆記 019】SIFTSURF演算法實現目標檢測

一、SIFT和SURF運算元實現特徵點檢測 概述 在OpenCV的features2d中實現了SIFT和SURF演算法,可以用於影象特徵點的自動檢測。具體實現是採用SiftFeatureDetector/SurfFeatureDetector類的detect函式檢測SIFT

OpenCV - 利用SIFTRANSAC演算法實現物體的檢測與定位,並求出變換矩陣(findFundamentalMatfindHomography的比較)- 轉

本文目標是通過使用SIFT和RANSAC演算法,完成特徵點的正確匹配,並求出變換矩陣,通過變換矩陣計算出要識別物體的邊界(文章中有部分原始碼,整個工程我也上傳了,請點選這裡)。 SIFT演算法是目前公認的效果最好的特徵點檢測演算法。 整個實現過程可以複述如下:提供兩張初始圖片,一幅為模板影象

利用opencv實現人臉檢測(C++版)

小編所有的帖子都是基於unbuntu系統的,當然稍作修改同樣試用於windows的,經過小編的絞盡腦汁,把剛剛發的那篇python 實現人臉和眼睛的檢測的程式用C++ 實現了,當然,也參考了不少大神的部落格,下面我們就一起來看看: Linux系統下安裝open

Python 3 利用 Dlib 19.7 實現人臉檢測剪下

點選有驚喜 0.引言    利用python開發,藉助Dlib庫進行人臉檢測/face detection;    1. dlib_cut_faces.py :      將檢測到的人臉剪下下來,依次排序顯示在新的影象上;     實現的效果如圖1所示,將圖

android 通過原生api(不需要opencv第三方sdk)實現Camera人臉檢測

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

android opencv實現人臉檢測 以及 年齡性別識別

支援技術分享,轉載或複製,請指出文章來源此部落格作者為Jack__0023 1、背景 因為面對的場景不同,所以我上次使用 andr

基於深度學習的病毒檢測技術無需沙箱環境,直接將樣本文件轉換為二維圖片,進而應用改造後的卷積神經網絡 Inception V4 進行訓練檢測

進制 思科 開發 主題 需求 做的 病毒 無法 大於 話題 3: 基於深度學習的二進制惡意樣本檢測 分享主題:全球正在經歷一場由科技驅動的數字化轉型,傳統技術已經不能適應病毒數量飛速增長的發展態勢。而基於沙箱的檢測方案無法滿足 APT 攻擊的檢測需求,也受到多種反沙箱技術的

使用級聯分類器實現人臉檢測OpenCV自帶的數據)

== output include print code ould har his ... 1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace

第三篇:基於深度學習人臉特徵點檢測 - 資料集整理

https://yinguobing.com/facial-landmark-localization-by-deep-learning-data-collate/ 在上一篇博文中,我們已經下載到了包括300-W、LFPW、HELEN、AFW、IBUG和300-VW在內的6個數據集,初步估算有2

第五篇:基於深度學習人臉特徵點檢測 - 生成TFRecord檔案

在上一篇博文中,我們已經獲取到了所有樣本的面部區域,並且對面部區域的有效性進行了驗證。當使用TensorFlow進行神經網路訓練時,涉及到的大量IO操作會成為訓練速度的瓶頸。為了加快訓練的速度,方便後期利用與復現,需要將所有用到的資料打包成為TFRecord檔案,一種TensorFlow原生支援的資