此文记录的人脸识别方法是用pycharm实现的,图片可自选,文中所选用图片如下
将此图片命名为1.png
·face_recognition
基于dlib进行了二次封装,号称世界上最简洁的人脸识别库。
由于采用的训练数据集是Labeled Faces in the wild ,采用13000多张人脸作为训练数据集,欧美人脸居多,故若采用欧美人脸识别准确率更高。
若有能力,可自行训练得到自己的人脸识别库,准确率取决于样本的数量以及质量
·windows上安装face_recognition库:pip install -i https://pypi.douban.com/simple face_recogntion
接下来说说人脸识别所需用到的方法,在pycharm软件上编译
· load_image_file 这个方法主要用于加载要识别的人脸图像,加载返回的数据是Numpy数组。记录了图片的所有像素的特征向量。
import face_recognition image = face_recognition.load_image_file('imgs/1.png') #1.png是照片名,可自行修改 print(image)
编译结果:
· face_locations 定位图中所有的人脸的像素位置,返回值为列表形式,列表中每一行是一张人脸的位置信息,包括【top, right, bottom, left】 这是一组元组。
##face_locations.py import face_recognition from PIL import Image import cv2 #用于框出人脸 #通过load_image_file方法加载待识别图片 image = face_recognition.load_image_file('imgs/1.png') #通过face_locations方法得到图像中所有人脸的位置 face_locations =face_recognition.face_locations(image) #打印出图片中每张人脸、位置信息等、相当于抠图 for face_location in face_locations: top, right, bottom, left = face_location #解包操作,得到每张人脸的四个位置信息 #抠图,一张张人脸逐个显示,打印出像素信息 print("已识别到人脸部位,像素区域为:Top:{}, Right:{}, Bottom:{}, Left: {}".format( top,right,bottom,left)) face_image = image[top:bottom, left:right] pil_image = Image.formarray(face_image) pil_image.show()
若不抠图,要在原图的基础上在人脸位置绘制矩形图,则可以将上述代码的倒数三行改为以下代码
start = (left,top) end = (right,bottom) #在图片上绘制矩形框,从start坐标开始,end坐标结束,矩形框颜色为(0,0,255) cv2.rectangle(image, start, end, (0, 0, 255), thickness = 2) cv2.imshow('window', image) cv2.waitkey
· face_landmarks 识别人脸关键特征点
1)参数仍然是待检测的图像对象,返回值是包含面部特征字典的列表,列表长度就是图像中的人脸数,使用for循环遍历列表。
2)面部特征包括以下几个部分:nose_bridge(鼻梁)、 right_eyebrow(右眼眉)、 left_eyebrow(左眼眉)、 righe_eye()、 left_eye()、chin(下巴)、 nose_tip(下鼻部)、 bottom_lip(下嘴唇)
3) 勾勒脸部大体轮廓
##face_landmarks.py识别人脸的关键特征点,以数组形式返回 import face_recognition from PIL import Image, Image Draw image = face_recognition.load_image_file('imgs1.png') #1.png为照片名,可自行修改 face_landmarks_list = face_recognition.face_landmarks(image) #print(landmarks_list) 可要可不要 pil_image = Image_fromarray(image) d = ImageDraw.Draw(pil_image) #生成一张pil图像 for face_landmarks in face_landmarks_list: facial_feactures = [ 'chin', 'left_eyebrow', 'right_eyebrow', 'nose_bridge', 'nose_tip', 'left_eye', 'right_eye', 'bottom_lip' ] for facial_feature in facial_features: #print("{}每个人的面部特征显示在以下位置:{}".format (facial_feature, face_landmarks[facial_feature])) d.line(facial_landmarks[facial_feature], width=5) pil_image.show()
编译结果:(可视化)
· face_encodings 获取图像文件中所有面部编码信息(多维的向量数据)
1)返回值是一个编码列表,参数仍是要识别的图像对象,如果后续访问时,需要注意加上索引或遍历来进行访问。每张人脸的编码信息是一个128维向量。
import face_recognition image = face_recognition.load_image_file('imgs/girl.jpg') #不管图像有多少人脸信息,返回值都是一个列表 face_encodings = face_recognition.face_encodings(image) for face_encoding in face_encodings: print("信息编码长度为:{} 编码信息为:{}".format(len(face_encoding), face_encoding)
上述代码的图片girl.jpg采用的网上一个女生的单人图,可自行选择。
编译结果:
2)面部编码信息是进行人像对比的重要的参数那下面又要说到另一个方法
· compare_faces 由面部编码信息进行面部识别匹配
1)主要用于匹配两个面部特征编码,利用这两个特征向量的内积来衡量相似度,根据阈值确认是否是同一个人。
2)第一个参数就是一个面部编码的列表(可多可少,一般多张脸),第二个参数就是给出单个面部编码(一般一张脸)。
此方法会将第二个参数和第一个参数中的编码信息依次进行匹配,返回值是一个Bool的列表,匹配成功则返回True,失败则False。顺序与第一个参数中脸部编码顺序一致。
3)在参数里有一个tolerance=0.6(一般默认0.6),大家可以根据实际的情况进行调整,一般经验值是0.39,tolerance值越小,匹配越严格。
此次采用以下图片:
以下代码是为了检测杨幂究竟有没有出现在合照中。
-----未完待续-------