博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CV-人脸识别02-关键点检测
阅读量:4298 次
发布时间:2019-05-27

本文共 3438 字,大约阅读时间需要 11 分钟。

关键点提取

【实现方法, 疲劳检测, 人脸校准】

1实现方法-face_recognition

face_recognition,

可以通过python引用或者命令行的形式使用,管理和识别人脸
安装命令 pip install face_recognition

  • 实现方法:
    创建两个目录,一个放已知图片,另一个放要识别的图片
    输入命令face_recognition /known_people/ / unknown_pictures/
    如果想指定想并行处理图像,则可以指定cpu核数,例如指定4个cpu则可认为是并行处理4倍的图像
    face_recognition --cpus 4 /known_people/ /unknown_pictures/

1.1 图像载入函数

load_image_file(file, mode=‘RGB’)

加载一个图像文件到一个numpy array类型的对象上。
参数:

file:待加载的图像文件名字mode:转换图像的格式只支持“RGB”(8位RGB, 3通道)和“L”(黑白)

返回值:

一个包含图像数据的numpy array类型的对象

1.2 人脸特征提取函数

face_landmarks(face_image,face_locations=None,model=“large”)

给定一个图像,提取图像中每个人脸的脸部特征位置
参数:

face_image:			输入的人脸图片face_locations=None:	可选参数,默认值为None,代表默认解码图片中的每一个人脸。						若输入face_locations()[i]可指定人脸进行解码model="large":			输出的特征模型,默认为“large”,可选“small”。						当选择为"small"时,只提取左眼、右眼、鼻尖这三种脸部特征。

1.3 人脸编码函数

face_encodings(face_image, known_face_locations=None, num_jitters=1)

给定一个图像,返回图像中每个人脸的128脸部编码(特征向量)。
参数:

face_image: 			输入的人脸图像known_face_locations:  可选参数,如果你知道每个人脸所在的边界框num_jitters=1: 		在计算编码时要重新采样的次数。越高越准确,但速度越慢(100就会慢100倍)

返回值:

一个128维的脸部编码列表返回值类型为:List[Dict[str,List[Tuple[Any,Any]]]],是由各个脸部特征关键点位置组成的字典记录列表,一个Dict对象对应图片中的一个人脸,其key为某个脸部特征:如输出中的nose_bridge、left_eye等,value是由该脸部特征各个关键点位置组成的List,关键点位置是一个Tuple(如上输出中,nose_bridge对应的关键点位置组成的列表为[(881L, 128L), (880L, 141L),(880L, 154L), (879L, 167L)]

1.4 绘图,画线填充

载入图片,构建一个ImageDraw对象:

polygon() 方法用于绘制多边形:

第一个参数是多边形的几个顶点位置组成的list,第二个参数fill是填充该	多边形的颜色。

line()

方法是用来画多个点之间构成的线段,第一个参数是点位置组成的list,第二个参数fill是线段的颜色,第三个参数width是线段的宽度

1.5 脸部特征距离计算

face_distance(face_encodings, face_to_compare)

给定一组面部编码,将它们与已知的面部编码进行比较,得到欧氏距离。对于每一个比较的脸,欧氏距离代表了这些脸有多相似。

参数:

faces:				要比较的人脸编码列表face_to_compare:   待进行对比的单张人脸编码数据tolerance:			两张脸之间有多少距离才算匹配。该值越小对比越严格,0.6是典型的最佳值

返回值:

一个numpy ndarray,数组中的欧式距离与faces数组的顺序一一对应

1.6 人脸特征检测定位2

batch_face_locations(images, number_of_times_to_upsample=1, batch_size=128)

使用cnn人脸检测器返回一个包含人脸特征的二维数组,如果使用了GPU,这个函数能够更快速的返回结果;如果不使用GPU的话,该函数就没必要使用。
参数:

images : 一个包含图像数据的list,每个成员都是一个 numpy array类型number_of_times_to_upsample: 从images的样本中查找多少次人脸,该参数的值越高的话越能发现更小的人脸batch_size: 每个GPU一次批处理多少个image

返回值:

一个元组列表,列表中的每个元组包含人脸的位置(top, right, bottom, left)

1.7 比较两张图片的脸部特征

compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6)

比较脸部编码列表和候选编码,看看它们是否匹配。
参数:

known_face_encodings:已知的人脸编码列表face_encoding_to_check:待进行对比的单张人脸编码数据tolerance:两张脸之间有多少距离才算匹配。该值越小对比越严格,0.6是典型的最佳值。

返回值:

一个 True或者False值的列表,该表指示了known_face_encodings列表的每个成员的匹配结果

1.8 人脸特征检测定位1

face_locations(img, number_of_times_to_upsample=1, model=‘hog’)

给定一个图像,返回图像中每个人脸的面部特征位置(眼睛、鼻子等)
参数:

img:一个image(numpy array类型)number_of_times_to_upsample:从images的样本中查找多少次人脸,该参数值越高的话越能发现更小的人脸。model:使用哪种人脸检测模型。“hog” 准确率不高,但是在CPUs上运行更快,“cnn” 更准确更深度(且GPU/CUDA加速,如果有GPU支持的话),默认是“hog”

返回值:

一个元组列表,列表中的每个元组包含人脸的位置(top, right, bottom, left)

1.9 汇总

face_recognition API总结:

load_image_file(file, mode='RGB')face_landmarks(face_image,face_locations=None,model="large")face_encodings(face_image, known_face_locations=None, num_jitters=1)batch_face_locations(images, number_of_times_to_upsample=1, batch_size=128)compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6)face_distance(face_encodings, face_to_compare)

2. 应用

2.1 人脸相似度比较

dlib库的“shape_predictor_68_face_landmarks.dat”提取的只是人脸的68个特征点(例如眼、嘴等位置),“dlib_face_recognition_resnet_model_v1.dat”是人脸特征提取的分类网络,提取的128维信息即是人脸的特征信息,即人脸特征向量。不同人脸特征向量之间,余弦距离或欧式距离越大,则两个特征值相似度越低,属于同一个人的可能性越小,此时判断两人为不同的人。

在这里插入图片描述

2.1 疲劳检测

在这里插入图片描述

疲劳驾驶监控主要包括以下几方面的内容:
(1)双眼位置的精确定位
(2)双眼位置的追踪
(3)双眼状态信息的分析

疲劳检测流程图

在这里插入图片描述
在这里插入图片描述

转载地址:http://xvnws.baihongyu.com/

你可能感兴趣的文章
<a4j:keeyAlive>的英文介绍
查看>>
关于list对象的转化问题
查看>>
VOPO对象介绍
查看>>
suse创建的虚拟机,修改ip地址
查看>>
linux的挂载的问题,重启后就挂载就没有了
查看>>
docker原始镜像启动容器并创建Apache服务器实现反向代理
查看>>
docker容器秒死的解决办法
查看>>
管理网&业务网的一些笔记
查看>>
openstack报错解决一
查看>>
openstack报错解决二
查看>>
linux source命令
查看>>
openstack报错解决三
查看>>
乙未年年终总结
查看>>
子网掩码
查看>>
第一天上班没精神
查看>>
启动eclipse报错:Failed to load the JNI shared library
查看>>
eclipse安装插件的两种方式在线和离线
查看>>
linux下源的相关笔记(suse)
查看>>
linux系统分区文件系统划分札记
查看>>
Linux(SUSE 12)安装Tomcat
查看>>