抄录、笔记,参考价值意义不是很大
人工智能(Artificial Intelligence),英文缩写为AI。它是研究、用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。
随着智能家电、穿戴设备、智能机器人等产物的出现和普及,人工智能技术已经进入到生活的各个领域,引发越来
越多的关注。
刷脸登录是基于人工智能、生物识别、3D传感、大数据风控技术,最新实现的登录形式。用户在无需输入用户名的前提下,凭借“刷脸”完成登录过程。实现刷脸登录的核心是人脸处理,在人脸处理中有两个概念:
人脸检测:检测图中的人脸,并为人脸标记出边框。检测出人脸后,可对人脸进行,获得眼、口、鼻轮廓等72个关键点定位准确识别多种人脸属性,如性别,年龄,表情等信息人脸识别(对比):通过提取人脸的特征,计算两张人脸的相似度,从而判断是否同一个人,并给出相似度评分。
作为中小型企业,可以采取世面上流行的人工智能产品快速的实现刷脸登录需求。目前比较流行人脸检测产品如下
(我们的课程中使用百度云AI来完成人脸登录功能):
Face++腾讯优图科大讯飞百度云AI
百度人脸识别基于深度学习的人脸识别方案,准确识别图片中的人脸信息,提供如下功能:
人脸检测:精准定位图中人脸,获得眼、口、鼻等72个关键点位置,性别、年龄、表情等多种人脸属性
人脸对比:对比两张人脸的相似度,并给出相似度评分,从而判断是否同一个人
人脸搜索:针对一张人脸照片,在指定人脸中搜索,找出最相似的一张脸或多张人脸,并给出相似度分值
活体检测:提供离线/在线方式的活体检测能力,判断操作用户是否为真人,有效抵御照片、视频、模具等作弊攻击
视频流人脸采集:设备端离线实时监测视频流中的人脸,同时支持处理静态图片或者视频流,输出人脸图片并进行图片质量控制
(1)注册百度云帐
打开百度云平台:https//login.bce.baidu.com/reg.html?tpl=bceplat&from=portal进行账注册
(2)激活人脸识别,并创建应用
找到产品-人工智能-人脸识别激活应用,并注册应用
创建工程并导入依赖:
用于从人脸库中新增用户,可以设定多个用户所在组,及组内用户的人脸图片
典型应用场景:构建您的人脸库,如会员人脸注册,已有用户补全人脸信息等。
人脸注册 请求参数详情
参数名称是否必选类型默认值说明image是String图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断image_type是String图片类型 BASE64图片的base64值,base64编码后的图片数据,需urlencode,编码后的图片大小不超过2M;URL图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);FACE_TOKEN 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个group_id是String用户组id(由数字、字母、下划线组成),长度限制128Buser_id是String用户id(由数字、字母、下划线组成),长度限制128Buser_info否String用户资料,长度限制256Bquality_control否StringNONE图片质量控制 NONE 不进行控制 LOW较低的质量要求NORMAL 一般的质量要求 HIGH 较高的质量要求 默认NONEliveness_control否StringNONE活体检测控制 NONE 不进行控制 LOW较低的活体要求(高通过率 低攻击拒绝率) NORMAL 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH 较高的活体要求(高攻击拒绝率 低通过率) 默认NONE
人脸注册 返回数据参数详情
字段必选类型说明log_id是uint64请求标识码,随机数,唯一face_token是string人脸图片的唯一标识location是array人脸在图片中的位置+left是double人脸区域离左边界的距离+top是double人脸区域离上边界的距离+width是double人脸区域的宽度+height是double人脸区域的高度+rotation是int64人脸框相对于竖直方向的顺时针旋转角,[-180,180]
用于对人脸库中指定用户,更新其下的人脸图像。
人脸更新 请求参数详情
参数名称是否必选类型默认值说明image是String图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断image_type是String图片类型 BASE64图片的base64值,base64编码后的图片数据,需urlencode,编码后的图片大小不超过2M;URL图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);FACE_TOKEN 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个group_id是String用户组id(由数字、字母、下划线组成),长度限制128Buser_id是String用户id(由数字、字母、下划线组成),长度限制128Buser_info否String用户资料,长度限制256Bquality_control否StringNONE图片质量控制 NONE 不进行控制 LOW较低的质量要求NORMAL 一般的质量要求 HIGH 较高的质量要求 默认NONEliveness_control否StringNONE活体检测控制 NONE 不进行控制 LOW较低的活体要求(高通过率 低攻击拒绝率) NORMAL 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH 较高的活体要求(高攻击拒绝率 低通过率) 默认NONE人脸更新 返回数据参数详情字段必选类型说明––––log_id是uint64请求标识码,随机数,唯一face_token是string人脸图片的唯一标识location是array人脸在图片中的位置+left是double人脸区域离左边界的距离+top是double人脸区域离上边界的距离+width是double人脸区域的宽度+height是double人脸区域的高度+rotation是int64人脸框相对于竖直方向的顺时针旋转角,[-180,180]
人脸检测:检测图片中的人脸并标记出位置信息;
人脸更新 请求参数详情
参数名称是否必选类型默认值说明image是String图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断image_type是String图片类型 BASE64图片的base64值,base64编码后的图片数据,需urlencode,编码后的图片大小不超过2M;URL图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);FACE_TOKEN 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个face_field否String包括 age,beauty,expression,faceshape,gender,glasses,landmark,race,quality,facetype信息 逗分隔. 默认只返回face_token、人脸框、概率和旋转角度max_face_num否String1最多处理人脸的数目,默认值为1,仅检测图片中最大的那个人脸;最大值10,检测图片中最大的几张人脸。face_type否String人脸的类型 LIVE表示生活照:通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等IDCARD表示身份证芯片照:二代身份证内置芯片中的人像照片 WATERMARK表示带水印证件照:一般为带水印的小图,如公安网小图 CERT表示证件照片:如拍摄的身份证、工卡、护照、学生证等证件图片 默认LIVE
人脸检测 返回数据参数详情
参数名称是否必选类型说明face_num是int检测到的图片中的人脸数量face_list是array人脸信息列表,具体包含的参数参考下面的列表。+face_token是string人脸图片的唯一标识+location是array人脸在图片中的位置++left是double人脸区域离左边界的距离++top是double人脸区域离上边界的距离++width是double人脸区域的宽度++height是double人脸区域的高度++rotation是int64v人脸框相对于竖直方向的顺时针旋转角,[-180,180]+face_probability是double人脸置信度,范围【0~1】,代表这是一张人脸的概率,0最小、1最大。+angel是array人脸旋转角度参数++yaw是double三维旋转之左右旋转角[-90(左), 90(右)]++pitch是double三维旋转之俯仰角度[-90(上), 90(下)]++roll是double平面内旋转角[-180(逆时针), 180(顺时针)]+age否double年龄 ,当face_field包含age时返回+beauty否int64美丑打分,范围0-100,越大表示越美。当face_fields包含beauty时返回+expression否array表情,当 face_field包含expression时返回++type否stringnone不笑;ile微笑;laugh大笑++probability否double表情置信度,范围【0~1】,0最小、1最大。+face_shape否array脸型,当face_field包含faceshape时返回++type否doublesquare 正方形 三角形 oval 椭圆 heart 心形 round++probability否double置信度,范围【0~1】,代表这是人脸形状判断正确的概率,0最小、1最大。+gender否array性别,face_field包含gender时返回++type否stringmale男性 female女性++probability否double性别置信度,范围【0~10代表概率最小1代表最大。
参数名称是否必选类型说明+glasses否array是否带眼镜,face_field包含glasses时返回++type否stringnone无眼镜,common普通眼镜,sun墨镜++probability否double眼镜置信度,范围【0~1】,0代表概率最小、1代表最大。+race否array人种 face_field包含race时返回++type否stringyellow 黄种人 white 白种人 black黑种人 arabs 人++probability否double人种置信度,范围【0~1】,0代表概率最小 1代表最大+face_type否array真实人脸/卡通人脸 face_field包含face_type时返回++type否stringhuman 真实人脸 cartoon 卡通人脸++probability否double人脸类型判断正确的置信度,范围【0~1】0代表概率最小1代表最大。+landmark否array4个关键点位置,左眼中心、右眼中心、鼻尖、嘴中心。face_field包含landmark时返回+landmark72否array72个特征点位置 face_field包含landmark时返回+quality否array人脸质量信息。face_field包含quality时返回++occlusion否array人脸各部分遮挡的概率,范围[0~1],0表示完整,1表示不完整+++left_eye否double左眼遮挡比例+++right_eye否double右眼遮挡比例+++nose否double鼻子遮挡比例+++mouth否double嘴巴遮挡比例+++left_cheek否double左脸颊遮挡比例+++right_cheek否double右脸颊遮挡比例+++chin否double下巴遮挡比例++blur否double人脸模糊程度,范围[0~1],0表示清晰,1表示模糊++illumination否double取值范围在[0~255], 表示脸部区域的光照程度 越大表示光照越好++completeness否int64人脸完整度,0或1, 0为人脸溢出图像边界,1为人脸都在图像边界内+parsing_info否string人脸分层结果 结果数据是使用gzip压缩后再base64编码 使用前需base64解码后再解压缩 原数据格式为string 形如0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,…
在指定人脸中,找到最相似的人脸
人脸搜索 请求参数详情
参数名称是否必选类型默认值说明image是String图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断image_type是String图片类型 BASE64图片的base64值,base64编码后的图片数据,需urlencode,编码后的图片大小不超过2M;URL图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);FACE_TOKEN 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个group_id_list是String从指定的group中进行查找 用逗分隔,上限20个quality_control否StringNONE图片质量控制 NONE 不进行控制 LOW较低的质量要求NORMAL 一般的质量要求 HIGH 较高的质量要求 默认NONEliveness_control否StringNONE活体检测控制 NONE 不进行控制 LOW较低的活体要求(高通过率 低攻击拒绝率) NORMAL 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH 较高的活体要求(高攻击拒绝率 低通过率) 默认NONEuser_id是String用户id(由数字、字母、下划线组成),长度限制128Bmax_user_num否String查找后返回的用户数量。返回相似度最高的几个用户,默认为1,最多返回20个。
人脸搜索 返回数据参数详情
参数名称是否必选类型说明face_token是string人脸标志user_list是array匹配的用户信息列表+group_id是string用户所属的group_id+user_id是string用户的user_id+user_info是string注册用户时携带的user_info+score是float用户的匹配得分,推荐阈值80分
为了用户登录的便捷,我们在系统中增加刷脸登录的功能,大致流程如下图:
用户在登录页面触发刷脸登录功能在该页面中弹出一个二维码,此二维码是后台即时生成,包含特殊标志(但本质上是一个URL链接),后续登录流程将会使用此标志。用户对该二维码进行扫描,并在扫描端(手机或PC,注:此处不建议使用微信扫描)浏览器打开落地页。打开落地页时,授权使用摄像头,并进行人脸识别,识别成功后,关闭落地页。识别成功后,登录页面自动检测到成功标识,并获取相关信息,进入系统主页。技术点
二维码生成
百度云AI
Redis
前端摄像头调用
(1) 引入坐标
(2)添加配置
(3)创建二维码工具类
配置二维码创建的工具类
在QRCodeUtil类头添加 @Component 注解,使用时可通过 @Autowired 来自动装配。
(4) 创建基本的工程结构
在系统微服务中构建基本的Controller代码
在系统微服务中构建基本的Service代码
在QRCodeUtil类头添加 @Component 注解,使用时可通过 @Autowired 来自动装配。
对于百度云AI SDK我们进行一些简单的封装,便于使用时,减少代码冗余。
在构造方法中,实例化client。通过client,可以调用SDK中包含的各种API。APP_ID, API_KEY, SECRET_KEY在文中第一段中所述位置获取,如没有正确配置,会直接导致API调用失败。根据官方文档所示,我们大致创建了faceRegister()、faceUpdate()、faceCheck()、faceSearch()四个方法。
人脸注册 faceRegister(groupId, userId, image)
groupId用于人脸库区分人群标识,自定义即可,人脸库会根据提交的groupId,将用户分组
userId人脸库中的用户标识,同组不可重复,自定义即可(通常为系统中用户的唯一标识)
imageBase64 用户图片
人脸更新 faceUpdate(groupId, userId, image)
参数解释同人脸注册
该方法用于发生变化时,更新人脸信息
人脸检测 faceCheck(image)
imageBase64 用户图片
该方法用于人脸注册、人脸更新和人脸登录前使用
目前采用的方案是检测出人脸数大于0即可,如需深化需求,可按需扩展
人脸登录 faceSearch(image)
imageBase64 用户图片
该方法使用的是百度云AI 人脸搜索方法,目前采用的方式是匹配度最高的结果,即要登录的用户
同样的,在BaiduAiUtil类头添加 @Component 注解,使用时可通过 @Autowired 来自动装配。在API调用后返回值处理上,进行了简单的解析,如需深化解析,可按需扩展。
完成刷脸登录一共需要我们解决如下5个问题:
人脸注册/人脸更新
在刷脸登录之前,我们首先需要对系统中的用户进行人脸注册,将相关信息提交至人脸库,才可通过人脸识
别的相关接口进行刷脸登录操作。当用户相貌变更较大时,可通过人脸更新进行人脸信息更换。二维码生成
获取验证码。通过工具生成相关信息后,如特殊标志,将特殊标志写入Redis缓存,并将标记值设为”-1“,我们认定值为”-1“,即为当前标记尚未使用。调用QRCodeUtil.crateQRCode()生成二维码。二维码检测
前端获取二维码后,对二维码进行展现,并且前台启动定时器,定时检测特殊标记状态值。当状态值为“1”时,表明登录成功。人脸检测
当用户扫码进入落地页,通过落地页打开摄像头,并且定时成像。将成像图片,通过接口提交给后端进行人脸检测。人脸登录
检测成功后,即进行人脸登录,人脸登录后,改变特殊标记状态值,成功为“1”,失败为“0”。当登录成功时,进行自动登录操作,将token和userId存入到redis中。
4.5.1 后端实现
(1)人脸注册/人脸更新:在刷脸登录之前,我们首先需要对系统中的用户进行人脸注册,将相关信息提交至人脸库,才可通过人脸识别的相关接口进行刷脸登录操作。当用户相貌变更较大时,可通过人脸更新进行人脸信息更换。
(2)二维码生成:获取验证码。通过工具生成相关信息后,如特殊标志,将特殊标志写入Redis缓存,并将标记值
设为”-1“,我们认定值为”-1“,即为当前标记尚未使用。调用QRCodeUtil.crateQRCode()生成二维码。
Controller:
Service:
(3)二维码检测:前端获取二维码后,对二维码进行展现,并且前台启动定时器,定时检测特殊标记状态值。当状态值为“1”时,表明登录成功。
Controller:
Service:
(4)人脸检测/人脸登录:当用户扫码进入落地页,通过落地页打开摄像头,并且定时成像。将成像图片,通过接口提交给后端进行人脸检测。
(5)检测成功后,即进行人脸登录,人脸登录后,改变特殊标记状态值,成功为“1”,失败为“0”。当登录成功时,进行自动登录操作,将token和userId存入到redis中。
Controller:
Service:
4.5.2 前端实现
前端主要实现的功能是,获取二维码并展示,然后后台轮询检测刷脸登录状态,并且实现落地页相关功能(摄像头调用、定时成像、发送人脸检测和发送人脸登录请求)
(1)二维码展现
(2)落地页调用摄像头
通过上述的步骤,可以实现一个刷脸登录的功能,其核心在于百度云AI的使用。通过合理的使用百度云AI SDK提供的相关API,我们可以很轻松的实现刷脸登录功能。刷脸登录的业务流程有很多种,我们只是实现了一种借助二维码的方式,作为抛砖引玉。更多的流程和实现方式,在此不进行赘述。