一、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 pltdef 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|小白写程序之利用OpenCV Dlib Face_Recognition进行人脸识别操作】
推荐阅读
- 树莓派+python|树莓派+python+Opencv+face_confignition实现实时人脸识别(人脸识别门禁系统)
- 基于opencv,face_recognition和dlib的人脸识别的入门学习
- 计算机视觉|【人脸检测】基于OpenCV和Face_Recognition实现人脸检测
- 机器视觉|工业检测深度学习方法综述
- 算法|使用U-Nets和深度学习进行自动缺陷检查
- linux|saas 商业模式风险_商业模式(SaaS(软件即服务))
- 资讯|一个 Python Bug 干倒了估值 1.6 亿美元的公司
- Python语言程序设计|基于Python-matplotlib 的动画绘制问题
- 机器学习|【机器学习实战】决策树——构造决策树