<button id="ssm6u"><optgroup id="ssm6u"></optgroup></button>
  • 跳轉至

    人臉檢測

    概要

    人臉檢測

    不知道從什么時候開始,學習OpenCV首先學習人臉檢測,變成了一個傳統。
    在本節課,首先介紹一下人臉檢測在日常生活中的廣泛應用,然后講解人臉檢測與人臉識別的區別, 接下來會教大家通過OpenCV內置的人臉檢測模型,實時的在畫面中繪制人臉所在的位置。

    關注微信公眾號1Z實驗室, 回復關鍵詞人臉檢測, 獲取文稿鏈接與實驗代碼。

    keywords 人臉檢測 OpenCV

    目錄

    目錄

    人臉檢測在生活中的應用

    人臉識別在我們生活中的應用越來越廣泛。

    人臉識別應用

    你可以掃臉解鎖手機,掃臉支付,可以掃臉開門,人臉變成了一個人非常重要的生物信息。

    所以在這期教程, 阿凱會帶大家用OpenCV實現人臉檢測。

    其實這個也1Z, 在OpenCV里面對這個算法封裝的足夠友好,核心代碼不過兩行而已。

    所以對初學者來講,學習人臉檢測會讓你信心滿滿。

    人臉檢測與人臉識別

    人臉檢測vs人臉識別

    在開始講解人臉檢測之前,先幫大家解析經常被搞混的兩個概念人臉檢測 vs 人臉識別
    注意??! 大家經常會搞混的概念:
    分清楚這兩個概念的不同

    簡單來講,他們的核心區別在于:

    1. 哪有臉?人臉檢測 (是在圖像中定位人臉區域的過程)

    2. 臉是誰?人臉識別 (分類檢測這個臉是誰)

    一種是把人臉檢測獲得的人臉區域,在已知人臉庫進行比對

    另外一種是針對人臉圖像特征,提取特征值。特征值數組 用來標識人臉信息。后者更實用。

    從順序來講,先進行人臉檢測,然后再進行人臉識別。

    那我們今天就先來講講如何使用OpenCV進行人臉檢測。

    關于HaarCascade

    OpenCV中人臉識別是通過Haar特征的級聯分類器實現,在本期教程里面,我們暫不涉及太多底層算法原理部分的講解。

    實際上OpenCV里面有很多預先訓練好的HaarCascade模型(XML文件) , 例如正臉檢測, 眼睛檢測, 全身檢測,下半身檢測等。

    05

    在OpenCV的兩個代碼倉庫里面都有。

    數據1: opencv/data/cascades

    opencv_cascade_1

    數據2: opencv_contrib/modules/face/data/cascades

    opencv_cascade_2

    級聯分類器的使用方法

    通過FaceCascade模型, 輸入圖片, 我們可以獲取人臉所在區域的矩形位置。

    06

    模型的使用方法比較簡單, 首先要載入對應的HaarCascade文件, 文件格式為xml。 這里為了方便大家使用, 我已經將文件下載到了haar文件夾下, 可以通過相對路徑進行引用。

    ├── FaceDetection-v1.py
    ├── FaceDetection-v2.py
    ├── face.mp4
    ├── face.png
    ├── haar
     ?? ├── haarcascade_eye.xml
     ?? └── haarcascade_frontalface_default.xml
    

    07

    我們在CascadeClassifier中傳入對應HaarCascade文件

    # 載入人臉檢測的Cascade模型
    FaceCascade = cv2.CascadeClassifier('./haar/haarcascade_frontalface_default.xml')
    

    輸入 Input

    接下來就是將圖片的灰度圖傳入到這個FaceCascade模型中, 進行人臉檢測。

    # 檢測畫面中的人臉
    faces = FaceCascade.detectMultiScale(gray)
    

    輸出 Output
    返回的faces是人臉所在區域的ROI數組, 例如:

    [(x1, y1, w1, h1), (x2, y2, w2, h2)]

    當然, 你可以設定不同的參數,例如設定縮放因子, 設置最小鄰居閾值。

    # 檢測畫面中的人臉
    faces = FaceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5
    ) 
    

    參數的具體含義與使用方法見OpenCV的官方API文檔 :

    OpenCV官方文檔: cascadeclassifier-detectmultiscale

    08

    ROI 的全稱是Region Of Interest , 用于表示在畫面的子區域。整個畫面的原點(0,0) , 在整個畫面中的左上角。 ROI 本質上是Tuple類型的數據,其中(x,y)代表人臉所在矩形區域的左上角坐標, w 代表矩形的寬度, h代表矩形的高度。

    人臉檢測的效果演示

    人臉檢測-V1

    從圖片中讀入圖片,識別人臉,并在圖片中標識人臉所在的矩形區域。

    face-detection-result

    人臉檢測-V2

    這個是阿凱放的是人臉識別v2版的效果演示, 里面用到了兩個HaarCascade模型, 一個是識別人臉的模型, 另外一個是識別眼睛的模型。

    人臉檢測效果演示

    程序流程講解

    雖然我們是基礎入門教程,但是不會在視頻里面詳細講解各個API。

    1zlab

    訪問 github.com/1zlab 查看1Z實驗室出品的OpenCV入門教程 , 這里為大家準備了自助餐式的教程, 查閱目錄,根據自己的需求自由學習OpenCV基礎。 例如如何配置OpenCV的開發環境, 如何使用HighGUI寫上位機,如何使用Draw模塊進行畫圖, 如何讀入視頻流, 這些都可以在文檔中找到。

    雖然在python -opencv里面,只需要導入cv2 模塊,但是實際上cv2 是由若干個模塊構成的, python-opencv只不過是屏蔽掉了這些細節。

    人臉識別v1的代碼里面核心三個主要模塊 HighGUI 上位機部分, Draw 繪圖模塊, CascadeClassifier 級聯分類器。的

    程序大致的流程如下:

    1. HighGUI 讀入圖片, 并轉換為灰度圖

    2. CascadeClassifier 載入 人臉檢測的級聯模型(xml)文件

    3. CascadeClassifier 使用模型檢測灰度圖中的人臉,返回faces

    4. Draw 遍歷faces,在彩圖上繪制人臉的矩形區域

    5. HighGUI創建一個窗口叫做Face

    6. HighGUI 在窗口Face中展示圖像(繪制人臉矩形區域后的)

    7. HighGUI 等待任意按鍵按下

    8. HighGUI 退出程序,關閉所有的窗口

    FaceDetection-v1.py

    # -*- coding:utf-8 -*-
    '''
    人臉識別FaceDetection
    通過HaarCascade模型,進行人臉識別與眼睛識別,在視頻流中繪制矩形,標識人臉
    '''
    import cv2
    
    # 設置圖片路徑
    img_path = 'face.png'
    # 載入帶有人臉的圖片
    img = cv2.imread(img_path)
    if img is None:
        # 判斷圖片是否讀入正確
        print("ERROR:請檢查圖片路徑")
        exit(1)
    # 將彩色圖片轉換為灰度圖
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    
    # 載入人臉檢測的Cascade模型
    FaceCascade = cv2.CascadeClassifier('./haar/haarcascade_frontalface_default.xml')
    
    # 檢測畫面中的人臉
    faces = FaceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5
    )
    
    # 遍歷返回的face數組
    for face in faces:
        # 解析tuple類型的face位置數據
        # (x, y): 左上角坐標值
        # w: 人臉矩形區域的寬度
        # h: 人臉矩形區域的高度
        (x, y, w, h) = face
        # 在原彩圖上繪制矩形
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 4)
    
    # 創建一個窗口 名字叫做Face
    cv2.namedWindow('Face',flags=cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO | cv2.WINDOW_GUI_EXPANDED)
    
    # 在窗口Face上面展示圖片img
    cv2.imshow('Face', img)
    # 等待任意按鍵按下
    cv2.waitKey(0)
    # 關閉所有的窗口
    cv2.destroyAllWindows()
    

    思考題

    看似簡單的人臉識別,在實際項目中,有很多的處理追蹤問題的算法可以講。 今天阿凱拋出的問題是:如何提高人臉識別的速度?

    人臉追蹤

    歡迎在視頻下方留言參與討論, 期待你可以動手改進算法, 留言里可以放你改進后代碼的github鏈接。

    溫馨小提示(不要局限于這兩條)

    1. 縮小檢索范圍, 在上一幀人臉所在矩形周圍尋找。

    2. 縮放,在低分辨率下檢索,然后逐步精確位置。

    人臉追蹤的項目預告

    13

    在一開始的課程導引中,我們也提到了, 結合機器人與計算機視覺是我們課程的一大特色。 既然我們學會了人臉檢測,那么為啥不用它來搞點事情: 我們要結合二自由度云臺實現人臉檢測與追蹤。

    項目的大致思路是檢測畫面中的人臉,根據人臉偏移畫面中心的位置,調整舵機的角度。

    我們下期視頻教程就帶大家完成這個項目。

    推廣

    關注微信公眾號1Z實驗室, 回復關鍵詞人臉檢測, 獲取文稿鏈接與實驗代碼。

    10


    韩国精品无码一区二区三区,精品无码一区二区三区AV,欧洲丰满美熟女乱又伦AV,亚洲午夜久久久影院伊人