1. 程式人生 > >opencv基於深度學習的人臉檢測

opencv基於深度學習的人臉檢測

opencv3.4 版之前自帶的人臉檢測器是基於Haar+Adaboost的,速度還可以,但是檢出率很低,誤檢也很多,臉的角度稍大就檢不出來,還經常會把一些亂七八糟的東西當做人臉,實在不敢恭維。好在隨著深度學習領域的發展,湧現了一大批效果相當不錯的人臉檢測演算法,比如MTCNN,給了我們更多施展的空間。看看下面這圖就是基於其檢測出來的,看著是不是很震撼呢?原始碼點此

MTCNN效果著實不錯,但其是基於caffe訓練的,caffe可是以配置繁瑣著稱的,大大小小依賴庫就有10幾個,每個又有好幾個版本,版本間的不相容比比皆是,初學者沒個把星期基本是配不好的,這無形間加大了普及的進度,好在有人做了一整套MTCNN在各個平臺上的部署(見

github),大大簡化了所需的工作量。不過要是opencv能有個基於深度學習的檢測器該多好呀?

所謂千呼萬喚始出來,在2017年聖誕夜的前夕opencv釋出了3.4版本,主要增強了dnn模組,特別是添加了對faster-rcnn的支援,並且帶有openCL加速,效果還不錯。

我主要測試了下其中的resnetface示例,效果還不錯,除了速度上有些慢之外,基本上是向MTCNN看齊了。

模型位於${OPENCV_DIR}\sources\samples\dnn\face_detector,裡面有個download_weights.py,執行下就可以自動下載模型了。

python版程式碼如下:

#coding=utf-8
import numpy as np
import cv2,os,time

def show_detections(image,detections):
    h,w,c=image.shape
    for i in range(0, detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence >0.6:
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")
            text = "{:.2f}%".format(confidence * 100)
            y = startY - 10 if startY - 10 > 10 else startY + 10
            cv2.rectangle(image, (startX, startY), (endX, endY),
                (0, 255,0), 1)
            cv2.putText(image, text, (startX, y),
                cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)
    return image
 
def detect_img(net,image):
    blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 1.0,
	(300, 300), (104.0, 177.0, 123.0))
    net.setInput(blob)
    start=time.time()
    detections = net.forward()
    end=time.time()
    print(end-start)
    return show_detections(image,detections)

def test_dir(net,dir="images"):
    files=os.listdir(dir)
    for file in files:
        filepath=dir+"/"+file
        img=cv2.imread(filepath)
        showimg=detect_img(net,img)
        cv2.imshow("img",showimg)
        cv2.waitKey()

def test_camera(net):
    cap=cv2.VideoCapture(0)
    while True:
        ret,img=cap.read()
        if not ret:
            break
        showimg=detect_img(net,img)
        cv2.imshow("img",showimg)
        cv2.waitKey(1)      
    
if __name__=="__main__":
    net = cv2.dnn.readNetFromCaffe("deploy.prototxt","res10_300x300_ssd_iter_140000_fp16.caffemodel")
    #net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb","opencv_face_detector.pbtxt")
    #test_dir(net)
    test_camera(net)

其支援caffe和tensorflow兩種模型,速度在35毫秒左右(CPU:i7 [email protected],4核,佔用率60%)

C++版程式碼如下:

#include <iostream>
#include <cstdlib>
#include "mropencv.h"
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;
}

C++版需要一個mropencv.h,可以在MRHead找到。

相關推薦

opencv基於深度學習人臉檢測

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

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

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

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

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原生支援的資

第二篇:基於深度學習人臉特徵點檢測 - 資料與方法(轉載)

https://yinguobing.com/facial-landmark-localization-by-deep-learning-data-and-algorithm/ 在上一篇博文中,我們瞭解了人臉檢測與面部特徵點檢測的背景,並提到了當前技術方案存在特徵點位置不穩定的缺點,需要新的解決

第一篇:基於深度學習人臉特徵點檢測 - 背景(轉載)

轉載自:https://yinguobing.com/facial-landmark-localization-by-deep-learning-background/ 人臉檢測與識別一直是機器學習領域的一大熱點。人臉檢測是指從影象中檢測出人臉區域。人臉識別則是判斷特定的臉部影象是否與某個人對應

第二篇:基於深度學習人臉特徵點檢測

在上一篇博文中,我們瞭解了人臉檢測與面部特徵點檢測的背景,並提到了當前技術方案存在特徵點位置不穩定的缺點,需要新的解決方案。那麼,目前又有哪些方案可以用呢? Github rocks! 在程式設計師眼中,Github恐怕是比微信還要重要的存在了吧!以“face lan

基於深度學習的目標檢測技術演進:從目標檢測人臉檢測

本篇部落格主要轉載兩篇寫得好的分別介紹基於深度學習的目標檢測和人臉檢測的文章,最近在調研基於深度學習的人臉檢測相關的文章,在網上查相關資料時,有幸看到。文末附帶基於深度學習的目標檢測和人臉檢測相關經典文獻及下載地址。 object detection我

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

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

機器視覺 OpenCV—python 基於深度學習的實時目標檢測

一、目標檢測原理 運動目標在工廠,監控,自動駕駛中有著舉足輕重的地位。在做實時目標檢測之前,我做過OpenCV的目標檢測和運動軌跡及運動方向預判等,但這些都是基於OpenCV的,有一定的侷限性。為此,從這篇部落格開始將給大家帶來一系列的實時目標檢測,與大家一起

基於深度學習人臉識別系統系列(Caffe+OpenCV+Dlib)——【三】使用Caffe的MemoryData層與VGG網路模型提取Mat的特徵

原文地址:http://m.blog.csdn.net/article/details?id=52456548 前言 基於深度學習的人臉識別系統,一共用到了5個開源庫:OpenCV(計算機視覺庫)、Caffe(深度學習庫)、Dlib(機器學習庫)、libfacede

Dlib+OpenCV深度學習人臉識別

row 拷貝 too 這一 驗證 message word endif all 目錄(?)[+] DlibOpenCV深度學習人臉識別 前言 人臉數據庫導入 人臉檢測 人臉識別 異常處理 Dlib+OpenCV深度學習人臉識別 前言 人臉

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

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

基於opencv和qt的人臉檢測小系統

idt image span ttext 函數 TE 對話 nta 數量 摘要:利用opencv讀取視頻、圖片並檢測人臉,利用QT顯示窗口,功能選擇等 環境:Ubuntu18.04、OpenCV3.4.0、QT5.10.1 效果圖: 代碼如下(比較簡單沒什麽註釋): ma

基於深度學習的目標檢測演算法綜述(一)(截止20180821)

參考:https://zhuanlan.zhihu.com/p/40047760 目標檢測(Object Detection)是計算機視覺領域的基本任務之一,學術界已有將近二十年的研究歷史。近些年隨著深度學習技術的火熱發展,目標檢測演算法也從基於手工特徵的傳統演算法轉向了基於深度神經網路的檢測技

基於深度學習的目標檢測演算法綜述(三)(截止20180821)

參考:https://zhuanlan.zhihu.com/p/40102001 基於深度學習的目標檢測演算法綜述分為三部分: 1. Two/One stage演算法改進。這部分將主要總結在two/one stage經典網路上改進的系列論文,包括Faster R-CNN、YOLO、SSD等經

基於深度學習的目標檢測演算法綜述(二)(截止20180821)

參考:https://zhuanlan.zhihu.com/p/40020809 基於深度學習的目標檢測演算法綜述分為三部分: 1. Two/One stage演算法改進。這部分將主要總結在two/one stage經典網路上改進的系列論文,包括Faster R-CNN、YOLO、SSD等經

學習筆記之——基於深度學習的目標檢測演算法

        國慶假期閒來無事~又正好打算入門基於深度學習的視覺檢測領域,就利用這個時間來寫一份學習的博文~本博文主要是本人的學習筆記與調研報告(不涉及商業用途),博文的部分來自我團隊的幾位成員的調研報告(由於隱私關係,不公告他們的名字了哈~),同時結合

珍藏 | 基於深度學習的目標檢測全面梳理總結(下)

關於作者:@李家丞 同濟大學數學系本科在讀,現為格靈深瞳演算法部實習生。 作者個人主頁:李家丞 | 個人主頁 | 關於我 導言:目標檢測的任務表述   如何從影象中解析出可供計算機理解的資訊,是機器視覺的中心問題。深度學習模型由於其強大的表示能力,加之資料量的積累和

珍藏 | 基於深度學習的目標檢測全面梳理總結(上)

關於作者:@李家丞 同濟大學數學系本科在讀,現為格靈深瞳演算法部實習生。 作者個人主頁:李家丞|個人主頁|關於我 導言:目標檢測的任務表述   如何從影象中解析出可供計算機理解的資訊,是機器視覺的中心問題。深度學習模型由於其強大的表示能力,加之資料量的積累和計算力的