C/C++教程

小白写程序之利用OpenCV Dlib Face_Recognition进行人脸识别操作

本文主要是介绍小白写程序之利用OpenCV Dlib Face_Recognition进行人脸识别操作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、OpenCV-python

1. 首先下载我们需要用到的第三方库,我一般不在Jupyternotebook 上下载,在cmd上下载,个人认为cmd上的文件我能够更加容易找到下载后的位置

2.在cmd上输入pip install opencv-python,下载结束后需要找到OpenCV分类器文件的位置。
找到文件位置可能是一个难点,每个电脑下载路径不同,但是最后基本上都会在Lib/site-packages/cv2/data文件里面,而且需要注意的是我们需要找的是“cv2”,而不是含有“opencv"的其他文件。

3.确定好xml文件的位置后,选择自己的图片,定义人脸识别函数并进行调用

import cv2
import os
import matplotlib.pyplot as plt


def detect(filename):
    face_cascade=cv2.CascadeClassifier('C:\\Program Files\\Python38\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')

    img=cv2.imread(filename)
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    faces = face_cascade.detectMultiScale(gray,1.3,5)
    
    for(x,y,w,h)in faces:
        img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    plt.imshow(img)
    plt.axis('off')
    plt.show()
os.chdir('C:\\Users\\读书人mn\\Desktop\\123123')   
detect ('two.jpg')

注意:

在操作过程中我出现了上述的报错情况,原因是:路径中不能有中文出现,必须全英文。

我们在调用库和图片素材路径时,需要提前用os.chdir() 将定位更改到没有含有中文字符的文件路径下【倒数第二行】;也就是说在执行函数的过程中,不存在中文字符,如有存在字符的情况程序有可能无法运行。

结果如下:

二、 Face-recognition 依赖于Dlib,Dlib依赖于OpenCV

1. Dlib的下载方式可以多种:可以直接在cmd,jupyter notebook 上输入pip install Dlib进行下载;还可以直接在Links for dlib网站上进行下载;同时,可以通过国内网站进行下载更为快速:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple dlib (标黄的部分可替换成其他的库都可进行下载)
下载过程中需要注意的是:dlib可能存在不能直接下载,出现如下报错:

ERROR: Command errored out with exit status 1: python setup.py egg_inf

因此我们需要先下载cmake(下载这三个库都需要一些时间等待),同时如果提前在网站上下载了dlib的话,可以检查将wheel文件是否防置在python的scripts文件里,可能也会影响下载face_recognition

第一:pip install cmake 
第二:pip install dlib(人脸特征点) 
第三:pip install face_recognition

 

 2.下载完成后,利用face_recognition对图像进行人脸识别

import face_recognition
import os
import cv2
import matplotlib.pyplot as plt
os.chdir("C:\\Users\\读书人mn\\Desktop\\123123")
image = face_recognition.load_image_file("three.jpg")
face_locations=face_recognition.face_locations(image)

face_num2=len(face_locations)
print(face_num2)
org=cv2.imread("three.jpg")

for i in range(0,face_num2):
    top=face_locations[i][0]
    right=face_locations[i][1]
    bottom=face_locations[i][2]
    left=face_locations[i][3]
    
    start=(left,top)
    end=(right,bottom)
    color=(0,255,255)
    thickness=2
    img=cv2.rectangle(org,start,end,color,thickness)
    plt.imshow(img)
    plt.axis('off')
    plt.show()

 结果如下:

因上述程序默认使用HOG算法,我们还可以使用另外一种算法CNN(卷积神经网络)

import face_recognition
import os
import cv2
import matplotlib.pyplot as plt
os.chdir("C:\\Users\\读书人mn\\Desktop\\123123")
image = face_recognition.load_image_file("three.jpg")
face_locations_useCNN=face_recognition.face_locations(image,model='cnn')

face_num1=len(face_locations_useCNN)
print(face_num1)
org=cv2.imread("three.jpg")

for i in range(0,face_num1):
    top=face_locations_useCNN[i][0]
    right=face_locations_useCNN[i][1]
    bottom=face_locations_useCNN[i][2]
    left=face_locations_useCNN[i][3]
    
    star = (left,top)
    end = (right,bottom)
    
    color = (0,255,255)
    thickness =2
    img=cv2.rectangle(org,start,end,color,thickness)
    plt.imshow(img)
    plt.axis('off')
    plt.show()

结果如下:

三、人脸对齐

1.我们同样需要查找到人脸检测器文件的位置,还是从sie-packages\face_recognition_models入手寻找到shape_predictor_68_face_landmarks.dat或者shape_predictor_5_face_landmarks.dat文件

import cv2
import dlib
import matplotlib.pyplot as plt
import os
os.chdir("C:\\Users\\读书人mn\\Desktop\\123123")
path = "two.jpg"
img=cv2.imread(path)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

detector=dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(r"C:\\Program Files\\Python38\\Lib\\site-packages\\face_recognition_models\\models\\shape_predictor_68_face_landmarks.dat")
#predictor = dlib.shape_predictor("C:\\Program Files\\Python38\\Lib\\site-packages\\face_recognition_models\\models\\shape_predictor_5_face_landmarks.dat")
dets=detector(gray,1)
for face in range(len(dets)):
    shape=predictor(img,dets[face])
    print("Number of faces detected: {}".format(len(dets)))
    for pt in shape.parts():
        pt_pos=(pt.x,pt.y)
        img=cv2.circle(img,pt_pos,2,(0,255,0),1)
        
plt.imshow(img)
plt.axis('off')
plt.show()

刚开始运行的时候可能会存在人脸无法对齐的情况,68个点无法准确识别到面部五官,因此我们需要

最终运行结果:

 

 四、人脸识别

在人脸识别过程中,"tolerance"的取值是决定图片结果重要的参数,0.6容差较大 0.4容差太小因此经过调整我认为0.5的数值能够较好地分辨图片中人脸的相似度。

import cv2
import face_recognition
import matplotlib.pyplot as plt
import os
os.chdir("C:\\Users\\读书人mn\\Desktop\\123123")

known_image=cv2.imread("four.jpg")
known_image = face_recognition.load_image_file("four.jpg")

unknown_image=cv2.imread("two.jpg")
unknown_image = face_recognition.load_image_file("two.jpg")

known_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
results = face_recognition.compare_faces([known_encoding],unknown_encoding,tolerance=0.5)
if results[0] == True:
    print("匹配成功,该未知图片与已有图片人脸可匹配!")
else:
    print("匹配失败!")
plt.imshow(known_image)
plt.axis('off')  #去掉坐标轴
plt.show()

plt.imshow(unknown_image)
plt.axis('off')  #去掉坐标轴
plt.show()

以下是tolerance取值0.5的结果:

这篇关于小白写程序之利用OpenCV Dlib Face_Recognition进行人脸识别操作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!