一、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的结果: