人脸识别实践

前言

 

很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了。这些人里包括曾经的我自己。其实如果如果你不是非要深究其中的原理,只是要实现这一工作的话,人脸识别也没那么难。今天我们就来看看如何在40行代码以内简单地实现人脸识别。

一点区分

对于大部分人来说,区分人脸检测人脸识别完全不是问题。但是网上有很多教程有意无意地把人脸检测说成是人脸识别,误导群众,造成一些人认为二者是相同的。其实,人脸检测解决的问题是确定一张图上有木有人脸,而人脸识别解决的问题是这个脸是谁的。可以说人脸检测是是人识别的前期工作。

今天我们要做的是人脸识别。

所用工具

  • Anaconda 2 —— Python 2
  • Dlib
  • scikit-image

Dlib

对于今天要用到的主要工具,还是有必要多说几句的。Dlib是基于现代C++的一个跨平台通用的框架,作者非常勤奋,一直在保持更新。Dlib内容涵盖机器学习、图像处理、数值算法、数据压缩等等,涉猎甚广。更重要的是,Dlib的文档非常完善,例子非常丰富。就像很多库一样,Dlib也提供了Python的接口,安装非常简单,用pip只需要一句即可:

pip install dlib

上面需要用到的scikit-image同样只是需要这么一句:

pip install scikit-image
  • 注:如果用 pip install dlib 安装失败的话,那安装起来就比较麻烦了。错误提示很详细,按照错误提示一步步走就行了。

人脸识别

之所以用 Dlib 来实现人脸识别,是因为它已经替我们做好了绝大部分的工作,我们只需要去调用就行了。Dlib里面有人脸检测器,有训练好的人脸关键点检测器,也有训练好的人脸识别模型。今天我们主要目的是实现,而不是深究原理。感兴趣的同学可以到官网查看源码以及实现的参考文献。

今天的例子既然代码不超过40行,其实是没啥难度的。有难度的东西都在源码和论文里。

首先先通过文件树看一下今天需要用到的东西:

准备了六个候选人的图片放在 candidate-faces 文件夹中,然后需要识别的人脸图片 test.jpg 。我们的工作就是要检测到 test.jpg 中的人脸,然后判断她到底是候选人中的谁。

另外的 girl-face-rec.py 是我们的python脚本。shape_predictor_68_face_landmarks.dat是已经训练好的人脸关键点检测器。dlib_face_recognition_resnet_model_v1.dat 是训练好的ResNet人脸识别模型。ResNet是何凯明在微软的时候提出的深度残差网络,获得了 ImageNet 2015 冠军,通过让网络对残差进行学习,在深度和精度上做到了比 CNN 更加强大。

1. 前期准备

shape_predictor_68_face_landmarks.datdlib_face_recognition_resnet_model_v1.dat都可以在这里找到。不能点击超链接的可以直接输入以下网址:http://dlib.net/files/。

然后准备几个人的人脸图片作为候选人脸,最好是正脸。放到 candidate-faces 文件夹中。

本文这里准备的是六张图片,如下:

她们分别是

然后准备四张需要识别的人脸图像,其实一张就够了,这里只是要看看不同的情况:

可以看到前两张和候选文件中的本人看起来还是差别不小的,第三张是候选人中的原图,第四张图片微微侧脸,而且右侧有阴影。

2.识别流程

数据准备完毕,接下来就是代码了。识别的大致流程是这样的:

  • 先对候选人进行人脸检测、关键点提取、描述子生成后,把候选人描述子保存起来。
  • 然后对测试人脸进行人脸检测、关键点提取、描述子生成。
  • 最后求测试图像人脸描述子和候选人脸描述子之间的欧氏距离,距离最小者判定为同一个人。

3.代码

代码不做过多解释,因为已经注释的非常完善了。以下是 girl-face-rec.py

 # -*- coding: UTF-8 -*-
import sys,os,dlib,glob,numpy
from skimage import io

 if len(sys.argv) != 5:
     print "请检查参数是否正确"
     exit()

# 1.人脸关键点检测器
predictor_path = sys.argv[1]
# 2.人脸识别模型
face_rec_model_path = sys.argv[2]
# 3.候选人脸文件夹
faces_folder_path = sys.argv[3]
# 4.需识别的人脸
img_path = sys.argv[4]

# 1.加载正脸检测器
detector = dlib.get_frontal_face_detector()
# 2.加载人脸关键点检测器
sp = dlib.shape_predictor(predictor_path)
# 3. 加载人脸识别模型
facerec = dlib.face_recognition_model_v1(face_rec_model_path)

# win = dlib.image_window()

# 候选人脸描述子list
descriptors = []

# 对文件夹下的每一个人脸进行:
# 1.人脸检测
# 2.关键点检测
# 3.描述子提取
for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")):
    print("Processing file: {}".format(f))
    img = io.imread(f)
    #win.clear_overlay()
    #win.set_image(img)

    # 1.人脸检测
    dets = detector(img, 1)
    print("Number of faces detected: {}".format(len(dets)))

    for k, d in enumerate(dets):
    # 2.关键点检测
    shape = sp(img, d)
    # 画出人脸区域和和关键点
    # win.clear_overlay()
    # win.add_overlay(d)
    # win.add_overlay(shape)

    # 3.描述子提取,128D向量
    face_descriptor = facerec.compute_face_descriptor(img, shape)

    # 转换为numpy array
    v = numpy.array(face_descriptor)
    descriptors.append(v)

# 对需识别人脸进行同样处理
# 提取描述子,不再注释
img = io.imread(img_path)
 dets = detector(img, 1)

 dist = []
for k, d in enumerate(dets):
    shape = sp(img, d)
    face_descriptor = facerec.compute_face_descriptor(img, shape)
    d_test = numpy.array(face_descriptor) 

    # 计算欧式距离

    for i in descriptors:
    dist_ = numpy.linalg.norm(i-d_test)
    dist.append(dist_)

# 候选人名单
candidate = ['Unknown1','Unknown2','Shishi','Unknown4','Bingbing','Feifei']

 # 候选人和距离组成一个dict
c_d = dict(zip(candidate,dist))

cd_sorted = sorted(c_d.iteritems(), key=lambda d:d[1])
print "\n The person is: ",cd_sorted[0][0]
dlib.hit_enter_to_continue()

4.运行结果

我们在.py所在的文件夹下打开命令行,运行如下命令

python girl-face-rec.py 1.dat 2.dat ./candidate-faecs test1.jpg

由于 shape_predictor_68_face_landmarks.dat 和 dlib_face_recognition_resnet_model_v1.dat 名字实在太长,所以我把它们重命名为 1.dat 和 2.dat 。

运行结果如下:

The person is Bingbing。

记忆力不好的同学可以翻上去看看 test1.jpg 是谁的图片。有兴趣的话可以把四张测试图片都运行下试试。

这里需要说明的是,前三张图输出结果都是非常理想的。但是第四张测试图片的输出结果是候选人4。对比一下两张图片可以很容易发现混淆的原因。

机器毕竟不是人,机器的智能还需要人来提升。

有兴趣的同学可以继续深入研究如何提升识别的准确率。比如每个人的候选图片用多张,然后对比和每个人距离的平均值之类的。全凭自己了。

 

时间: 2024-07-28 14:07:02

人脸识别实践的相关文章

【首次超越人类】旷视行人再识别(ReID)突破,人脸识别后创新纪录

近年来,人脸识别技术的成熟使得机器在辨别人脸的能力上大举超过人类,在构建"智慧城市"."平安城市"等方面也得到了广泛应用.然而在实际应用的场景中,摄像头并非在任何情况下都可以拍摄到清晰人脸.不仅如此,在实际的场景中,一个摄像头往往无法覆盖所有区域,而多摄像头之间一般也没有重叠. 因此,用全身信息来对人员进行锁定和查找就变得十分必要--通过将整体行人特征作为人脸之外的重要补充,实现对行人的跨摄像头跟踪.于是,计算机视觉领域开始逐渐展开针对"行人再识别&quo

【干货合集】你所不知道的蚂蚁技术系列之(三):咻红包、人脸识别、人工智能、金融技术

8月30-31日20:00-21:30,一场别开生面的技术大会-- "蚂蚁金服&阿里云在线金融技术峰会"将在线举办.本次将聚焦数据库.应用架构.移动开发.机器学习等热门领域,帮助金融业技术开发者深入解析互联网应用的前沿应用与技术实践. 蚂蚁金服&阿里云在线金融技术峰会专题:https://yq.aliyun.com/activity/109 峰会统一报名链接:http://yq.aliyun.com/webinar/join/38 2015双11,蚂蚁金服旗下支付宝共完

雄安新区将实现以智能公共交通为主的出行方式;莫斯科将在17万个监控摄像头中引入人脸识别

上海市北医院联手Airdoc建立眼科应用示范基地 雷锋网消息,10月15日,上海静安区市北医院宣布和医疗领域人工智能领军企业Airdoc合作建立人工智能眼科应用示范基地,为下一步在静安区利用人工智能技术进行慢性疾病普查打下坚实的基础. 人工智能在实验室阶段已经取得了和人类顶级医生相当的影像识别结果,比如2017年1月底<自然>杂志的封面是一篇人工智能识别皮肤癌的论文,通过2,000个不同皮肤癌病例的12.9万张图像,建立了专门的深度神经网络,完成三项诊断任务:鉴别角化细胞癌.鉴别黑色素瘤以及使

纯前端实现人脸识别-提取-合成

最近火爆朋友圈的军装照H5大家一定还记忆犹新,其原理是先提取出照片中的面部,然后与模板进行合成,官方的合成处理据说由天天P图提供技术支持,后端合成后返回给前端展示,形式很新颖效果也非常好,整个流程涉及的人脸识别和图像合成两项核心技术在前端都有对应的解决方案,因此理论上前端也可以完成人脸识别-提取-合成整个流程,实现纯前端的军装照H5效果. 前端人脸识别 首先需要的是人脸识别,这个一听就觉得高大上的东西原理并不深奥,无非是用人的面部特征规则对图像进行匹配和识别,这项工作前端虽然可以实现,但前端实现

3行Python代码完成人脸识别

Face Recognition软件包 这是世界上最简单的人脸识别库了.你可以通过Python引用或者命令行的形式使用它,来管理和识别人脸. 该软件包使用dlib中最先进的人脸识别深度学习算法,使得识别准确率在<Labled Faces in the world>测试基准下达到了99.38%. 它同时提供了一个叫face_recognition的命令行工具,以便你可以用命令行对一个文件夹中的图片进行识别操作. 特性 在图片中识别人脸 找到图片中所有的人脸 找到并操作图片中的脸部特征 获得图片中

OpenCV+python 人脸识别

首先给大家推荐一本书:机器学习算法原理与编程实践 本文内容全部转载于书中,相当于一个读书笔记了吧 绪论 1992年麻省理工学院通过实验对比了基于结构特征的方法与基于模版匹配的方法,发现模版匹配的方法要优于基于特征的方法. 以支持向量机为代表的统计学习理论在随后被应用到了人脸识别与确认中去.但是由于算法运行效率问题,很快被一种新的算法替代了.这就是2001年康柏研究院提出的基于简单矩形特征和AdaBoost的实时人脸检测系统.该方法的主要贡献包括: 1.可以快速计算简单矩形特征作为人脸图像特征 2

搜狗明医独家首推“湿疹痱子识别”功能;青岛将人脸识别应用于啤酒节安保,抓获逃犯25名

8月29日,中南大学湘雅二医院与腾讯公司在长沙签署框架合作协议,双方将本着深化"互联网+应用创新"的原则,在代谢.精神心理等疾病领域.智慧医疗及人工智能研发等方面进行深度合作,共同打造"智慧医院"新标杆. 中南大学湘雅二医院党委书记周智广教授与腾讯移动互联网事业群副总裁.互联网+合作事业部总经理陈广域代表双方签约. 始建于1958年的中南大学湘雅二医院,拥有两个国家临床医学研究中心,综合实力居全国前列,年门急诊量.出院病人等服务量居湖南之首.而腾讯公司在互联网技术应

【祖母论与还原论之争】为什么计算机人脸识别注定超越人类?

灵长类动物脸部识别算法被破译  6月3日,新智元报道,发表在 Cell 的一项研究揭示了人脸识别的具体神经元活动过程.对猕猴的实验表明,对脸部的识别是由大脑中 200 多个不同神经元共同编码完成的,每个神经元会对一张脸不同特征的参数组合进行相应.这一发现推翻了此前人脸由特定细胞识别的假说. 论文的摘要部分介绍说:灵长类动物以惊人的速度和可靠性识别复杂的物体,比如动物的脸.本文中,我们揭示了大脑进行面部识别的代码.猕猴实验表明,在面部结构中,面部和细胞反应之间存在着非常简单的转变.通过将动物的脸格

深度学习在人脸识别中的应用——优图祖母模型的“进化”

雷锋网按:本文转自腾讯优图,着重介绍了深度学习在人脸识别中的应用,首先回顾了人脸识别的历史,接着介绍优图在人脸识别中的优势,及其"进化过程". 说到人工智能(Artificial Intelligence, AI)人们总是很容易和全知.全能这样的词联系起来.大量关于AI的科幻电影更给人工智能蒙上一层神秘的色彩.强如<黑客帝国>.<机械公敌>中的AI要翻身做主人统治全人类.稍弱点的<机械姬>里EVA懂得利用美貌欺骗中二程序员,杀死主人逃出升天.最不济也