70⾏代码⼩样本⼈脸识别实践
关于
本博客内容在python环境下实现了⼈脸识别的基本功能。(7.26⽇更新:在添加了可交互的UI界⾯)
实现⽅法总体上与相同,该博主的⼯程是在终端下运⾏,考虑到这种⽅法的不便,本博客对该⽅法进⾏了改进,可以直接在python IDE环境下编译运⾏。
前提环境
python 3.6.5
opencv 3.3.1
numpy 1.14.3
dlib 19.7.0 (配置⽅法可见)
⼈脸识别
⼈脸识别总体上分为⼈脸检测、特征点定位、⼈脸对齐、特征向量提取、相似度衡量这⼏个步骤(不区分先后顺序,因为构建⼈脸特征向量数据库和进⾏单张⼈脸识别这两⼤部分的步骤有所不同)
⼯程⽬录结构
E:\
candidate_face
liuyifei.jpg
tangyan.jpg
yangmi.jpg
yangzi.jpg
zhoudongyu.jpg
pyprojectpython怎么读取dat文件
shape_predictor_68_face_landmarks.dat
dlib_face_recognition_resnet_model_v1.dat
FaceRecognition.py
test.jpg
其中candidate_face⽂件夹中存放的是5个⼈(每⼈⼀张)的照⽚,届时⽤来提取她们各⾃的特征向量⽤来对⽐,pyproject⽂件夹中的shape_predictor_68_face_landmarks.dat是⽤来进⾏⼈脸关键点检测的参数模型,dlib_face_recognition_resnet_model_v1.dat是经过深度学习得到的参数模型,可以在下载获得。test.jpg是测试时的单张⼈脸图像,我这⾥是杨幂的图,如下图所⽰:
具体流程
读取候选⼈⽂件夹下每个⼈的⼈脸数据,然后对其中每个⼈脸进⾏⼈脸检测,提取⼈脸特征向量
对测试⼈员的⼈脸图像进⾏相同的操作
求得测试⼈员特征向量和每个候选⼈的⼈脸向量的欧⽒距离,取距离最⼩的即为⼈脸识别结果
代码
import os,dlib,numpy,cv2
predictor_path = 'shape_predictor_68_face_landmarks.dat'
face_rc_model_path = 'dlib_face_recognition_resnet_model_v1.dat'
face_folder_path = 'E:\candidate_face'
test_img_path = 'E:\\test.jpg'
# 读取⼈脸集、⼈脸标签
def read_data(path):
try:
pic_name_list = os.listdir(path)
pic_list = []
for i in pic_name_list:
whole_path = os.path.join(path, i)
img = cv2.imread(whole_path)
pic_list.append(img)
except IOError:
print('read error')
return False
else:
print('read successfully')
return pic_name_list, pic_list
# ⼈脸检测器
detector = _frontal_face_detector()
# 关键点检测器
feature_point = dlib.shape_predictor(predictor_path)
# ⼈脸参数模型
feature_model = dlib.face_recognition_model_v1(face_rc_model_path)
# 候选⼈特征向量列表
descriptors = []
if __name__ == '__main__':
name_list, pic_list = read_data(face_folder_path)
for i in pic_list:
# ⼈脸检测
dets = detector(i, 1)
for k, d in enumerate(dets):
# 关键点检测
shape = feature_point(i, d)
# 提取特征,128维
face_feature = feature_modelpute_face_descriptor(i, shape)
v = numpy.array(face_feature)
descriptors.append(v)
'''
对单张⼈脸进⾏识别
'''
test_img = cv2.imread(test_img_path)
dets = detector(test_img, 1)
for k, d in enumerate(dets):
shape = feature_point(test_img, d)
test_feature = feature_modelpute_face_descriptor(test_img, shape)
test_feature = numpy.array(test_feature)
dist = []
count = 0
for i in descriptors:
dist_ = (i-test_feature)
print('%s : %f' % (name_list[count], dist_))
dist.append(dist_)
count += 1
# 返回距离最⼩的下标
min_dist = numpy.argmin(dist)
# 截取姓名字符串,去掉末尾的.jpg
result = name_list[min_dist][:-4]
print(result)
闲话
这个项⽬只是⼀个简单的⼈脸识别demo,使⽤的都是别⼈做好的轮⼦,所以实现起来看似简单,但深究起来⾥⾯其实还有很多值得学习的地⽅,⽐如⽤到的两个最重要的模型,它们是怎么通过深度残差⽹络训练得到的、以及单张测试图⽚经过这个模型的前向传播的具体过程、以及这个项⽬还未实现的
⼈脸对齐算法、以及⼈脸识别的精度问题等等都是值得深⼊探索的,任重⽽道远~
能⼒有限,写作⽔平拙劣,还望各位看官不吝赐教
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论