本文主要是介绍CV-人脸识别02-关键点检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
关键点提取
【实现方法, 疲劳检测, 人脸校准】
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)双眼状态信息的分析
疲劳检测流程图
这篇关于CV-人脸识别02-关键点检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!