感謝做者分享-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
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
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人臉檢測器。
非正面人臉檢測效果對比:
經過以上對比,咱們能夠推薦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
訪問目錄:opencv/samples/dnn/face_detector
這裏有咱們須要的deploy.prototxt和opencv_face_detector.pbtxt文件,而後繼續GitHub搜索opencv_3rdparty,打開以下:
庫是空的,你可能比較懵逼一點,看一下分支
看到以下兩個分支,固然還有不少其餘的分支是用來作其餘檢測的,之後用的的能夠在裏面找,點進去後就能看到咱們要下載的模型文件了
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未檢測出來的圖片
DNN檢測結果
以上圖片使用Haar沒法識別人臉,使用DNN徹底能夠識別。若是咱們使用OpenCV提供的訓練模型進行人臉識別,基本上函數調用及參數就是以上的值,並且識別率99%以上。
總結
OpenCV爲咱們提供的DNN人臉檢測,無論從效率、準確度等方面都是很不錯的,擁有實際環境使用的價值,並且使用簡單。到這裏人臉識別這塊咱們就先告一段落。