来源:蝈蝈大数据工作坊【http://www.ggbigdata.cn】
Face Recognition 是一个基于 Python 的人脸识别库,该库使用 dlib 顶尖的深度学习人脸识别技术构建,对成年人在脸部检测数据库基准(Labeled Faces in the Wild benchmark)上的准确率高达 99.38%,但是对小孩或者未成年人识别率有待商榷。
工作思路:
对已知的人脸图片进行读取编码,再对拟检测的未知图片进行读取编码,再对已知和未知的两张图片的编码进行比对,给出判断结果。
所以我们在进行人脸对比检测时,需要先对多张已知的人脸分别进行读取并编码,再对未知的人脸读取并编码进行比对。
【应用实例】
查找最相似的人脸。给出已知的标注好的多张人脸照片,再给出一张未知照片看它属于已标注中的哪一张。
第一步:导入相关的库,并设置好工作环境。
import os
import cv2
import face_recognition as fr
os.chdir(r”C:\Users\yubg\desktop”) #改变到指定的路径下
os.getcwd() #获取当前的工作环境
第二步:读取已知人脸图片。
#读取3张已知图像
img_a = fr.load_image_file(“1.png”)
img_b = fr.load_image_file(‘ybg.png’)
img_c = fr.load_image_file(‘cd.jpg’)
第三步:对已知人脸图片进行编码。
#对已知图像进行特征编码
encoding_a = fr.face_encodings(img_a)[0]
encoding_b = fr.face_encodings(img_b)[0]
encoding_c = fr.face_encodings(img_c)[0]
第四步:对未知人脸图片进行编码。
#读取被检测(未知)图像并进行特征编码
img_x = fr.load_image_file(‘x.png’) #读取未知图片
encoding_x = fr.face_encodings(img_x)[0]#进行编码
第五步:对已知和未知图片进行对比。
#将未知的与已知的逐一对比,返回 list, 包含True/False, 表示是否匹配
fr.compare_faces([encoding_a, encoding_b,encoding_c], encoding_x)#将已知图片的编码做成列表放入作为参数
#返回 [True, True, True]
看看结果,很可能全是True或者全是False。其原因如下,有一个阈值需要调节一下,也就是说,你认为两张图片的相似度是多少才算是同一个人!相似度60%算么?这个就全靠你来决定了!如果宁错杀一百不可放过一个,那就相似度放低一点,让大更多的人能够相似。这里用的不是相似度,而是两张照片的差异,默认为0.5,所以值越小对比越严格,值越大对比就放得比较松!
#差值tolerance默认为0.5,值越小对比越严格
fr.compare_faces([encoding_a, encoding_b,encoding_c], encoding_x, tolerance=0.4)
#返回值[True, False, False, False],得知被检测的与已知的1.png相似。
【API说明】
1.图像载入函数——load_image_file
load_image_file(file, mode=’RGB’)
加载一个图像文件到一个numpy array类型的对象上。
参数:
file:待加载的图像文件名字
mode:转换图像的格式。只支持“RGB”(8位RGB, 3通道)和“L”(黑白)
返回值:一个包含图像数据的numpy array类型的对象
2.人脸编码函数——face_encodings
face_encodings(face_image, known_face_locations=None, num_jitters=1)
给定一个图像,返回图像中每个人脸的128脸部编码(特征向量)。
参数:
face_image:输入的人脸图像
known_face_locations:可选参数,如果你知道每个人脸所在的边界框
num_jitters=1:在计算编码时要重新采样的次数。越高越准确,但速度越慢(100就会慢100倍)
返回值:一个128维的脸部编码列表
3.人脸匹配函数——compare_faces
compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6)
比较脸部编码列表和候选编码,看看它们是否匹配,设置一个阈值,若两张人脸特征向量的距离,在阈值范围之内,则认为其 是同一个人
参数:
known_face_encodings:已知的人脸编码列表
face_encoding_to_check:待进行对比的单张人脸编码数据
tolerance=0.6:两张脸之间有多少距离才算匹配。该值越小对比越严格,0.6是典型的最佳值
返回值:一个 True或者False值的列表,该表指示了known_face_encodings列表的每个成员的匹配结果。
【注意安装库事项】
关于安装的问题
机器环境:win10/64位;Anaconda2020.2(自带python3.7)安装这个库,算是废了九牛二虎之力,网上有无数人跟我一样,各种方法之后,还是会出现以下错误:
RuntimeError:
CMake must be installed to build the following extensions: dlib
查阅资料显示,主要是安装dlib失败,再查阅dlib的安装方法,网上各种版本都有,但无外乎都需要安装vs2017,我为了提前迈出一步,便选择了安装vs2019,但这个vs2019让我安装了三小时。这个坑请大家注意避让,一定要选择“下载完毕再安装”,否则你也得三小时。安装完vs2019后,接下来直接在Anaconda prompt下安装opencv,命令如下:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
继续安装cmake,文件较大,尽可能使用清华镜像,执行如下命令:
pip install cmake -i https://pypi.tuna.tsinghua.edu.cn/simple
后续的安装都遇到了各种问题,总之安装不上dlib,最后找到一个dlib库(pip install dlib-19.17.99-cp37-cp37m-win_amd64.whl)下载,放在当前的路径下,再直接pip安装,命令如下:
pip install dlib-19.17.99-cp37-cp37m-win_amd64.whl
接着继续安装face_recognition模块。使用如下命令:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple face_recognition
竟然成功弄了。进入测试:
import dlib
detector = dlib.get_frontal_face_detector()
大功告成。