人脸识别实践(1)-基本原理与设计思路

⼈脸识别实践(1)-基本原理与设计思路
写在前⾯
  随着时代的⾼速发展,视频监控等基础设施越来越完备,计算机视觉也在各⾏各业开始发挥出更⼤的效⽤,⽽这⼀领域中⼤家最熟知的就是刷脸⽀付,现在⼤家享受着科技带来的便利。还有我们乘坐⾼铁,进站前刷⾝份证然后脸对着摄像头,是本⼈才能够通过检票⼝,也⽤到了⼈脸识别技术。可见该技术存在着太多的应⽤场景。前段时间出现⼩区出现蜂巢的快递柜,它提供了⼈脸识别取快递的功能。最近在乘坐地铁的时候,发现现在过闸机也可以不⽤刷地铁卡直接⼈脸识别就通过了,我家这边地铁站的⼈脸识别设备是依图公司做的,这家公司在图像领域还是蛮有知名度的,还知道的⼀家⽐较出门的就是旷视,当然BAT也做,这⾥就不细说了。
  由于现在市⾯上⼈脸识别的应⽤越来越多,作为⼀名热衷于技术的IT男,我觉得有必要对⼈脸识别进⾏⼀个系统的了解学习和研究,深⼊的了解⼈脸识别的机制,是很有必要的。
  整个⼈脸识别的实现,我会⽤2-3个章节进⾏介绍,这个章节介绍思路和原理,后⾯的章节进⾏核⼼代码的讲解,后续会将代码放到github上归档,当然,这也是给⾃⼰⼀个代码整理的机会。
曼越橘石材背栓1. 整体设计思路
  ⾸先对⼈脸识别的原理进⾏了解,通过代码来实现⼈脸识别相关算法的基本功能,在确认核⼼模块代码功能正常后,再考虑整个⼈脸识别管理平台如何设计。
  在⼈脸识别管理平台的设计上,梳理了需要完成的功能,⼀共包含⼈脸注册、⼈脸更新、⼈脸删除、⼈脸识别、⼈脸库查询这5个⼤功能的管理平台,同时考虑到每次程序运⾏后,在对⼈脸库进⾏修改后,需要保存这些录⼊的数据,所以还有个功能就是⼈脸数据的保存和读取。
1.1 ⼈脸识别
  当⽤户在平台上传照⽚后,对照⽚上的⼈脸进⾏判断,如果⼈脸存在,那么使⽤⼈脸与程序中保存的⼈脸数据进⾏⼀对⼀的⽐较,每次⽐较的结果都保存起来,全部⽐较完成后,输出相似度最⾼的⼈脸库中的数据,同时将相似度也展⽰出来。
1.2 ⼈脸注册
  当⽤户在平台上上传照⽚后,先对照⽚进⾏⼈脸检测,对于没有⼈脸和多于1个的,进⾏错误提⽰,因为⼈脸注册需要保证每次输⼊的user id能够对应到⼈脸库中具体的⼈的信息,只有当有且只有⼀个⼈脸的时候,才进⾏数据录⼊。
1.3 ⼈脸更新
  ⽤户输⼊存在的user_id后,上传照⽚,同样需要照⽚中的⼈脸只有⼀个,否则会提⽰⼈脸过多,更新失败,当满⾜条件后,对⼈脸特征进⾏获取后,保存在程序的⼈脸库中。
1.4 ⼈脸删除
  ,当⽤户输⼊的user_id在我们库中存在的话,那么就删除这个⼈脸的信息的数据和照⽚,否则提⽰删除失败,数据信息不存在。1.5 ⼈脸库查询
  ⼈脸库查询,提供⼀个输⼊框,可以输⼊需要查询的最⼤⼈脸个数,如果输⼊的数字⼤于⼈脸库中的个数,那么展⽰⼈脸库中的全部数据,包括user_id和照⽚,如果输⼊的数字⼤于⼈脸库中的个数,那就展⽰输⼊数字的个数的⼈脸的信息。
1.6 ⼈脸数据的保存和读取
0663.us  考虑到这个系统不是每次打开都需要重新录⼊数据的,应该在程序关闭重新启动后,还要能读取原来保存的数据,否则每次都新增数据,不符合这个平台的功能。
  所以,在⼈脸注册、更新的时候,会讲照⽚保存在pic⽂件下,名字以user_id.jpg进⾏命名,在⼈脸删除的时候,除了删除内存中的数据之外,还要删除pic下的照⽚,这样相当于对数据进⾏了实时保存。
  程序启动的时候需要将⼈脸库的数据都读取到内存中,所以在程序启动的时候,需要去保存⼈脸照⽚的pic⽂件中,读取所有的user id.jpg图⽚,保存到⼈脸库中,这样,在程序启动的时候就能够保持和程序关闭前同样的状态了。
2. ⼈脸识别的基本原理
  ⼈脸识别管理平台的开发,最为核⼼的技术就是⼈脸识别技术,所以这个章节重点进⾏理论基础的介绍。
要完成⼈脸识别功能,需要先读取图⽚进⾏⼈脸检测,通过检测到图⽚中的⼈脸后,获取⼈脸的68个特征点,再通过深度学习训练的模型,计算出⼈脸128个纬度的特征点,每个⼈脸都有⾃⼰的128维特征,当我们进⾏两个⼈脸的⽐对时,就可以通过对2个向量进⾏距离计算,根据计算的结果来判断⼈脸是否相似。
2.1 ⼈脸检测器
  ⼈脸检测基于成熟的图像处理技术dlib,⾸先我们需要对输⼊的图像进⾏⼈脸检测,dlib的⼈脸检测器是⽤经典直⽅图梯度特征和线性分类器、图像⾦字塔相结合,它使⽤了机器学习的⽅式创建了⾯部探测器。
2.2 ⼈脸68个特征点
  通过⼈脸检测器完成⼈脸检测后,针对检测出来的每⼀张⼈脸,基于dlib使⽤英国伦敦帝国理⼯⼤学标注的300万⼈脸数据集结合计算机视觉技术训练的模型,通过模型shape_predictor_68_face_landmarks.dat 推理出⼈脸的68个特征点,这些特征点包括了眉⽑、眼睛、⿐⼦、洗肾机
嘴和⾯部轮廓,检测出来的结果如下图。
2.3 ⼈脸128维向量
  根据68个⼈脸的特征点,使⽤dlib_face_recognition_resnet_model_v1.dat 这个内置的深度学习模型,该模型在⼈脸识别标准测试集LFW 上获得了99.38%的准确率,我在⼈脸识别中使⽤了该模型,输⼊68个⼈脸的特征点就能够推理出每个⼈脸的128维向量。
2.4 ⼈脸相似度计算
  我们知道两个点之间的距离,可以使⽤以下公式进⾏计算:
  ρ 为点(x2,y2)与点(x1,y1)之间的欧式距离。
  同理,三维空间的公式:  n维空间的公式:  欧式距离就是n维空间中两个点之间的真实距离,这个可以判断向量之间的距离。对于128维的向量,属于更加⼤的⼀个空间,也可以使⽤欧式距离公式进⾏计算。
  但是我们需要对2个向量之间的距离有⼀个更加明显的认识,所以⼈脸识别中,⼀般会对欧式距离进⾏归⼀化,所以归⼀化后特征的余弦距离就是余弦相似度,我们就能使⽤相似度配置,在2个向量⽐较的时候,得到感受深刻的值,如果完全⼀样,那么值为1,如果很相似,余弦相似度为0.99等接近1的值,所以两个⼈脸越相似,那么他们的余弦相似度就越接近1。
ρ=(x −x )+(y −y )212212
ρ=(x −x )+(y −y )+(z −z )212212212
d (x ,y )=(x −y )+(x −y )+...+(x −y )112222n n 2
3. ⼈脸管理平模块规划
  管理平台是B/S架构,程序启动后,通过⽹页访问⼈脸识别管理平台,通过浏览器中的操作,实现图⽚读取、图⽚编码、服务调⽤功能,在服务端来实现配置⽂件读取、http服务、图⽚保存功能。
3.1 前端设计
  由于平台除了提供给⾃⼰使⽤,还会提供给其他开发⼈员使⽤,参考了百度开放者平台上⾯的⼈脸识别管理平台,能看出他们使⽤了接⼝封装了⼈脸识别相关功能,所以参照他们的设计,我⾃⼰也仿照这种模式进⾏开发,使⽤了流⾏的前端框架VUE来进⾏前端开发⼯作。
生物态硒
3.2 图⽚读取
  前端的图⽚读取,直接使⽤了VUE封装的功能,能够打开本地图⽚⽂件。
3.3 图⽚编码
  读取图⽚后,将图⽚转码为base64编码,这样转化也是参考了百度接⼝的设计,将base64编码的图⽚⽂本数据为了发送到服务端进⾏处理。
3.4 图⽚保存
  服务端获取到base64编码的数据后,使⽤⼤家⼴泛运⽤的机器视觉库OpenCV将该编码的数据转为cv::Mat类型,提供给dlib进⾏⼈脸处理后,再通过⼤家熟知的base64编码转成图⽚⽂件,进⾏了⽂件的保存,统⼀保存成user id.jpg⽂件。
3.5 配置⽂件读取
  由于http服务需要提供端⼝进⾏访问,所以将端⼝配置到配置⽂件中,这样在程序启动的时候,就能够初始化端⼝,提供给⼤家访问。
  ⼈脸识别也有⼀个相似度设置,所以也通过配置⽂件读取,这样如果要修改这个相似度,超过相似度才认为是同⼀个⼈,这样就不⽤改代码,只改⽂件,重启程序就可以实现了,更加的⽅便。
3.6 http服务
  为了提供公共的,⼤家熟知的接⼝,选取了和百度做的⼈脸识别⼀样的http接⼝,所以需要进⾏http服务端的开发,提供给web客户端进⾏调⽤。
3.7 写⽇志模块给皂器
  这个模块主要是为了⽅便调试,也⽅便真正使⽤过程中,如果出现了错误,还能够通过⽇志⽂件,查定位问题,同时也能看到⼈脸识别的应⽤被访问的⼈调⽤了多少次,这样才能够为以后做⼤这个平台提供准备。

本文发布于:2024-09-23 05:27:22,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/144832.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:识别   数据   平台   功能   需要   时候   相似   管理
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议