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人脸检测,无论从效率、准确度等方面都是很不错的,拥有实际环境使用的价值,并且使用简单。到这里人脸识别这块咱们就先告一段落。

相关文章
相关标签/搜索