python3 Machine Learning 進行人臉識別

感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.htmlhtml

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。python

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。算法

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點網絡

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。架構

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。機器學習

非正面人臉檢測效果對比:ide

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式函數

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本學習

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本ui

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。感謝做者分享-http://bjbsair.com/2020-04-07/tech-info/30754.html

人臉識別準確率低?

上一篇咱們講了使用OpenCV進行人臉識別的最基礎操做。可是從最後的效果能夠看出,識別率、效率都很低,並且誤檢率比較高,識別過程當中,系統資源佔用至關大,實在是沒辦法在實際場合中使用。在opencv3.4 版以前自帶的人臉檢測器是基於Haar算法實現的,不只檢出率低,並且臉的角度稍大一些就檢測不出來。可是隨着深度學習領域的發展,涌現了一大批效果至關不錯的人臉檢測算法。

人臉檢測方式對比

  • OpenCV Haar人臉檢測
    優勢
    1)幾乎能夠在CPU上實時工做;
    2)簡單的架構;
    3)能夠檢測不一樣比例的人臉。

缺點1)會出現大量的把非人臉預測爲人臉的狀況;2)不適用於非正面人臉圖像;3)不抗遮擋。

  • OpenCV DNN 人臉檢測
    優勢
    1)在這四種方法中是最準確的;
    2)在CPU上可以實時運行;
    3)適用於不一樣的人臉方向:上,下,左,右,側面等。
    4)甚至在嚴重遮擋下仍能工做;
    5)能夠檢測各類尺度的人臉。

缺點基本上沒有什麼明顯的缺點

  • Dlib HoG人臉檢測
    優勢
    1)CPU上最快的方法;
    2)適用於正面和略微非正面的人臉;
    3)與其餘三個相比模型很小;
    4)在小的遮擋下仍可工做。

缺點1)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;2)邊界框一般排除前額的一部分甚至下巴的一部分;3)在嚴重遮擋下不能很好地工做;4)不適用於側面和極端非正面,如俯視或仰視。

  • Dlib CNN人臉檢測
    優勢
    1)適用於不一樣的人臉方向;
    2)對遮擋魯棒;
    3)在GPU上工做得很是快;
    4)很是簡單的訓練過程。

缺點1)CPU速度很慢;2)不能檢測小臉,由於它訓練數據的最小人臉尺寸爲80×80,可是用戶能夠用較小尺寸的人臉數據本身訓練檢測器;3)人臉包圍框甚至小於DLib HoG人臉檢測器。

非正面人臉檢測效果對比:

python機器學習進行人臉識別

經過以上對比,咱們能夠推薦OpenCV DNN人臉識別做爲首選方式

OpenCV DNN人臉檢測

OpenCV提供了兩個模型:1)原始Caffe實現的16位浮點型版本

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")

2)TensorFlow實現的8位量化版本

net =cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

OpenCV已經爲咱們提供了訓練好的人臉識別模型,固然咱們也能夠本身訓練,一樣能夠識別其餘物體,實現實物識別。

下載訓練模型

  • 在GitHub中搜索opencv

python機器學習進行人臉識別

訪問目錄:opencv/samples/dnn/face_detector

python機器學習進行人臉識別

這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:

python機器學習進行人臉識別

庫是空的,你可能比較懵逼一點,看一下分支

python機器學習進行人臉識別

看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了

python機器學習進行人臉識別

python機器學習進行人臉識別

image.png

GitHub下載文件就不介紹了,到這裏,咱們須要的模型文件都下載好了,主要的檢測函數有如下四個:

讀取訓練模型:readNetFromCaffe或者readNetFromTensorflow圖片預處理:blobFormImage設置網絡輸入值:setInput網絡預測:forward

圖片預處理:blobFormImage

函數原型:def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)這個是主要的函數,包含兩個過程:

  • 總體像素值減去平均值(mean)
  • 經過縮放係數(scalefactor)對圖片像素值進行縮放

主要參數解釋

  • image:輸入圖像對象。
  • mean:須要將圖片總體減去的平均值,在人臉識別是咱們用固定數值(104.0, 177.0, 123.0),可能你們對這個比較迷惑,由於它是在模型訓練是設定的,咱們使用的是已經訓練好的模型,直接寫死便可。這個在上面圖中我圈出的train.prototxt文件中能夠看到。
  • scalefactor:通過像素去平均值之後,進行圖片縮放,默認是1
  • size:這個參數是咱們神經網絡在訓練的時候要求輸入的圖片尺寸。
  • swapRB:OpenCV中認爲咱們的圖片通道順序是BGR,可是我平均值假設的順序是RGB,因此若是須要交換R和G,那麼就要使swapRB=true
  • crop: 是否在調整大小後對圖片進行裁剪,通常咱們能夠不進行裁剪

代碼實現

import numpy as np  
import cv2, os  
  
  
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(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)  
    net.setInput(blob)  
    detections = net.forward()  
    return show_detections(image, detections)  
  
  
def test_file(net, filepath):  
    img = cv2.imread(filepath)  
    showimg = detect_img(net, img)  
    cv2.imshow("img", showimg)  
    cv2.waitKey(0)  
  
  
def test_camera(net):  
    cap = cv2.VideoCapture('人臉識別.mp4')  
    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")  
    # file_path = 'data/380.png'  
    # test_file(net, file_path)  
    test_camera(net)

OpenCV Haar & OpenCV DNN

Haar檢測結果

由於不能上傳多個視頻,這裏只上傳幾張Haar未檢測出來的圖片

python機器學習進行人臉識別

DNN檢測結果

以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。

總結

OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。

相關文章
相關標籤/搜索