【人脸考勤项目】人脸检测的5种方式

文章内容:

1)人脸检测的5种方法

        1. Haar cascade + opencv

        2. HOG + Dlib

        3. CNN + Dlib

        4. SSD

        5. MTCNN

一。人脸检测的5种方法实现

 1. Haar cascade + opencv

        Haar是专门用来检测边缘特征的。基本流程如下:

第1步,读取图片

img = cv2.imread('./images/faces1.jpg')

第2步,将图片转化为灰度图片,因为Haar检测器识别的是灰度图片

img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

第3步,构造Haar检测器

face_detector = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')

第4步,检测器开始检测人脸

detections = face_detector.detectMultiScale(img_gray)

第5步,迭代器解析

for(x,y,w,h)in detections:
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),5)

第6步,显示

plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

第7步,参数调节

-- scaleFactor

        scaleFactor是用来调节检测人脸大小的范围的,举个例子scaleFactor = 1表示人脸检测范围从1开始检测,人脸离相机远,脸小,离相机近脸大,因此scaleFactor的取值能一定程度上影响识别的精度。

        但有时候不论怎么调节scaleFactor都会出现下述情况 ,此时需要minNeighbor调节人脸框的候选数量

 --minNeighbors

        minNeighbors指每个人脸框最小的候选数量,算法为了检测人脸,可能会在一个人物照片的多个地方去检测人脸,最后会识别出多个地方可能都是人脸,这时minNeighbors会对这些识别结果进行排序取出最可能是人脸的地方,试想一下,如果所有的方框都集中在某一个区域,那么是不是代表这个区域内是人脸的可能性更高,当然是这样,这个方框集中在某一个区域的数量就叫做人脸框的候选数量用minNeighbors表示,显然minNeighbors较大比较好,太大了会出现漏检。

 --minSize

        minSize表示最小人脸尺寸,maxSize表示最大人脸尺寸,这两个参数都是用来控制人脸大小的,如

detections = face_detector.detectMultiScale(img_gray,scaleFactor = 1.2,minNeighbors =7,minSize=(1,1))

2. HOG + Dlib

第1步,读取图片

img = cv2.imread('./images/faces2.jpg')
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

第2步,构造HOG检测器,需要安装Dlib包(conda install -c conda-forge dlib)

import dlib
hog_face_detector = dlib.get_frontal_face_detector()

第3步,检测人脸

detections= hog_face_detector(img,1)#指的是scaleFactor=1

第4步,解析

for face in detections:
    x = face.left()
    y = face.top()
    r = face.right()
    b = face.bottom()
    cv2.rectangle(img,(x,y),(r,b),(0,255,0),5)

第5步,显示

plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

3. CNN + Dlib

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.dpi'] = 200
img = cv2.imread('./images/faces2.jpg')
import dlib
cnn_face_detector = dlib.cnn_face_detection_model_v1('./weights/mmod_human_face_detector.dat')
detections = cnn_face_detector(img,1)
for face in detections:
    x = face.rect.left()
    y = face.rect.top()
    r = face.rect.right()
    b = face.rect.bottom()
    c = face.confidence
    cv2.rectangle(img,(x,y),(r,b),(0,255,0),5)
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

 4. SSD

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.dpi']=200
img = cv2.imread('./images/faces2.jpg')
face_detector = cv2.dnn.readNetFromCaffe('./weights/deploy.prototxt.txt','./weights/res10_300x300_ssd_iter_140000.caffemodel')
img_height = img.shape[0]
img_width = img.shape[1]
img_resize = cv2.resize(img,(500,300))
img_blob = cv2.dnn.blobFromImage(img_resize,1.0,(500,300),(104.0, 177.0, 123.0))
face_detector.setInput(img_blob)
detections = face_detector.forward()
num_of_detections = detections.shape[2]
img_copy = img.copy()
for index in range(num_of_detections):
    detection_confidence = detections[0,0,index,2]
    if detection_confidence>0.15:
        locations = detections[0,0,index,3:7] * np.array([img_width,img_height,img_width,img_height])
        lx,ly,rx,ry  = locations.astype('int')
        cv2.rectangle(img_copy,(lx,ly),(rx,ry),(0,255,0),5)
plt.imshow(cv2.cvtColor(img_copy,cv2.COLOR_BGR2RGB))   

5. MTCNN

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.dpi']=200

img = cv2.imread('./images/faces2.jpg')
img_cvt = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
from mtcnn.mtcnn import MTCNN
face_detetor = MTCNN()
detections = face_detetor.detect_faces(img_cvt)
for face in detections:
    (x, y, w, h) = face['box']
    cv2.rectangle(img_cvt, (x, y), (x + w, y + h), (0,255,0), 5)
plt.imshow(img_cvt)

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.dpi']=200
img = cv2.imread('./images/test.jpg')
img_cvt = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
from mtcnn.mtcnn import MTCNN
face_detetor = MTCNN()
detections = face_detetor.detect_faces(img_cvt)
for face in detections:
    (x, y, w, h) = face['box']
    cv2.rectangle(img_cvt, (x, y), (x + w, y + h), (0,255,0), 5)
plt.imshow(img_cvt)

 5种人脸检测方式对比

视频流人脸检测 :

        1.构造haar人脸检测器

        2.获取视频流

        3.检测每一帧画面

        4.画人脸框并显示

import cv2
import numpy as np
cap = cv2.VideoCapture(0)
haar_face_detector = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
while True:
    ret,frame = cap.read()
    fram = cv2.flip(frame,1)
    frame_gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    detection = haar_face_detector.detectMultiScale(frame_gray,minNeighbors=5)
    for(x,y,w,h) in detection:
        cv2.rectangle(fram,(x,y),(x+w,y+h),(0,255,0),5)
    cv2.imshow('Demo',fram)
    if cv2.waitKey(10) & 0xff == ord('q'):
        break
cap.release()
cv2.destoryAllWindows()

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于树莓派的人脸识别考勤项目是利用树莓派和Python语言开发的一考勤系统。该系统可以通过摄像头捕捉到员工的面部图像,并通过人脸识别算法进行人脸识别。通过与已经注册的员工面部信息进行对比,可以判断员工是否是合法员工,从而实现考勤功能。 首先,我们需要在树莓派上安装摄像头,并使用Python编程语言进行图像采集和处理。通过调用树莓派摄像头模块拍摄照片,并对照片进行预处理,例如灰度化、裁剪、归一化等操作,以提高识别精度。 接下来,我们需要使用适当的人脸识别算法。常见的人脸识别算法有基于特征的算法(如LBP、Haar特征等)和基于深度学习的算法(如卷积神经网络)。我们可以选择合适的算法,并使用Python进行实现和调用。 然后,我们需要建立员工人脸数据库。可以让每位员工在初始注册时拍摄照片,并将其存储在数据库中。在日常考勤时,系统会将摄取到的人脸图像与数据库中的员工面部信息进行比对,判断是否为合法员工。 最后,我们可以根据比对结果进行考勤统计。系统可以记录员工的到岗时间、离岗时间等信息,并生成考勤报表。此外,还可以增加其他功能,如远程查看考勤记录、异常考勤的报警等。 综上所述,基于树莓派的人脸识别考勤项目是一利用树莓派和Python开发的考勤系统,具有较高的准确性和便捷性。通过这系统可以提高考勤的自动化水平,减少人力成本,提升办公效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值