小白写程序之利用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的结果:
标签:人脸识别,image,cv2,face,OpenCV,plt,import,Face,recognition 来源: https://blog.csdn.net/weixin_55930569/article/details/120428067