员工考勤打卡时,如何避免非本人代替打卡?
摘要:使用APP进行打卡时,为避免非本人及非真人现场打卡的情况出现,想结合华为云的人脸识别能力,通过调用API,达成可检测是否本人且真人现场打卡的效果。
本文分享自华为云社区《员工考勤打卡时,如何避免非本人代替打卡?》,作者: HuaweiCloudDeveloper 。
1、背景
使用APP进行打卡时,为避免非本人及非真人现场打卡的情况出现,想结合华为云的人脸识别能力,通过调用API,达成可检测是否本人且真人现场打卡的效果。
2、云服务介绍
华为云FRS:人脸识别服务(Face Recognition Service),能够在图像中快速检测人脸、分析人脸关键点信息、获取人脸属性、实现人脸的精确比对和检索。该服务可应用于身份验证、电子考勤、客流分析等场景。
华为云FunctionGraph:函数工作流(FunctionGraph)是一项基于事件驱动的函数托管计算服务。通过函数工作流,只需编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数以弹性、免运维、高可靠的方式运行。
华为云APIG:API网关(API Gateway)是为企业开发者及合作伙伴提供的高性能、高可用、高安全的API托管服务, 帮助企业轻松构建、管理和部署不同规模的API。简单、快速、低成本、低风险的实现内部系统集成、成熟业务能力开放及业务能力变现。
华为云OBS: 对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,使用时无需考虑容量限制,并且提供多种存储类型供选择,满足客户各类业务场景诉求。
华为云DNS:云解析服务(Domain Name Service)提供高可用,高扩展的权威DNS服务和DNS管理服务,把人们常用的域名或应用资源转换成用于计算机连接的IP地址,从而将最终用户路由到相应的应用资源上。此服务默认开通,免费使用。
3 、方案设计
3.1 方案简述
通过APIG调用functiongraph函数,在functiongraph上完成人脸识别-活体检测、人脸识别-人脸比对等API的调用,并将响应结果通过API返回给APP。实现APP调用一次API即可完成人脸识别的功能。
- 人脸识别服务的人脸比对功能,可实现检测是否其本人打卡。
- 人脸识别服务的活体检测功能,可实现检测是否活人打卡。
- 使用Functiongraph的函数,APP端只需考虑调用一个API,且只需考虑人脸识别的总体输入和返回结果。
- Functiongraph由APIG来调用,利用APPkey、APPsecret及HTTPS,解决了APP端调用的安全认证等问题。
- OBS桶用来存储人脸照片,通过约定的用户标识做文件存储路径,易于管理和使用。
3.2 方案架构图

0、初始化:前置准备工作,新建一个OBS桶做人脸库,将员工的人脸照片存放到人脸库,并把以user-id 或自定义字段作为路径,标识员工。
1、员工登录APP后,进行人脸识别时,将通过APIG来调用functionGraph,上传关键信息:摄像头捕获的照片或视频、员工的人脸库标识(user-id)。
2、functionGraph调用活体检测API,传入照片/视频(根据需求选择动作活体检测/静默活体检测,推荐静默活体检测)。
注:本方案采用静默活体检测方式,APP端上传的照片提前转换为base64格式
3、活体检测API返回响应:有confidence、picture(base64)。
4、在functionGraph中调用OBS接口,通过user-id从OBS人脸库获取库中的员工照片。
5、通过代码将从OBS获取的照片文件,转换为base64格式。
6、将两个base64格式的照片作为输入参数调用人脸比对API 。(备注:此处可根据需求,是否需要多次调用API,使用多个照片进行验证)
7、人脸比对API返回包含了similarity的响应。
8、functionGraph将similarity、confidence传回给APP/后端。(备注:也可直接在functionGraph完成判定,返回人脸识别结果)
3.3 Functiongraph实现代码
代码附件:(附件请见文章最后)
代码时序图:

4、方案部署
4.1 部署流程图

4.2 前置准备
- 拥有已实名认证的华为云账号,开通云服务functiongraph、人脸比对、活体检测、OBS
- 注册公网域名,完成ICP备案
4.3、创建OBS人脸库
4.3.1 创建OBS桶
参考帮助文档:https://support.huaweicloud.com/qs-obs/obs_qs_0007.html,创建私有桶
4.3.2 上传对象
参考帮助文档: https://support.huaweicloud.com/qs-obs/obs_qs_0008.html,上传对象,建立OBS人脸库。
要求:文件的路径使用用户标识(如userid)命名

4.4 Functiongraph搭建
4.4.1 创建委托
登录IAM控制台(https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/agencies)
1)创建委托

委托名称:自定义
委托类型:云服务
云服务:函数工作流functiongraph
持续时间:永久

2)选择策略
OBS:获取对象等基本操作权限
FRS:fullaccess
APIG:fullaccess

3)设置最小授权范围,此处选择所有,实际可根据项目情况分配。

4)完成委托创建

4.4.2 上传FRS依赖包
因functiongraph公共的依赖包中,FRS-SDK不是最新的(无静默活体检测API),故我们需上传最新的FRS-SDK,作为依赖包。
1)从官网获取FRS-SDK下载路径
https://sdkcenter.developer.huaweicloud.com/?language=python
2)下载整个Python-v3的SDK
https://github.com/huaweicloud/huaweicloud-sdk-python-v3
下载后解压,进入内部,找到frs后缀的SDK
进入SDK目录,在setup所在的目录,全部选择进行压缩。压缩成功后,需要确保setup文件在压缩包的根目录下

将压缩好的文件,上传到functiongraph的依赖包管理。

依赖包名称:自定义
运行时语言:2.7
描述:自定义
上传方式:上传ZIP文件

4.4.3 创建函数
1)进入functiongraph控制台创建函数。
Functiongraph版本:functiongraph v2
函数类型:事件函数
函数名称:自定义
所属应用:默认
委托名称:选择创建的委托(如无,请点击右边的 创建委托 前往创建,创建步骤参考4.4.1)
企业项目:自行选择
自定义函数:关闭
运行时语言:Python2.7
函数执行入口:Index.handler
代码上传方式:静默代码


4.4.4 编辑函数代码
将示例代码复制进来,编辑相关默认变量的值
1)粘贴3.3节的代码至index.py中

2)根据自己项目情况,设置默认Region、endpoint、buketname的值,若4.4.6节不设置环境变量的值,将默认取此处的默认值。如下默认是北京四

3)编辑完成后,点击保存

4.4.5 添加依赖包
1)在函数菜单-代码页,点击添加-依赖代码包

2)在公共依赖包,搜索obs,勾选OBS-sdk

3)在私有依赖包,勾选前面步骤上传的frs-sdk,然后确定保存

4.4.6 编辑环境变量
在函数菜单-配置页,添加环境变量:region、bucketname(OBS桶名)、endpoint
若此处不设置环境变量,则函数会使用4.4.4节代码设置的默认值。

4.4.7 调试函数
1)点击配置测试事件

2)选择apig的事件模板,添加body的内容和queryStringParameters的userid,进行保存。

3)点击测试,运行完毕可查看执行结果。

4.5 添加APIG
4.5.1 添加APIG触发器
1)在函数菜单-触发器页,点击创建触发器

触发器类型:API网关服务(APIG)
API名称:自定义
分组:选择API分组(如无点击右边 创建分组 进行创建)
发布环境:RELEASE(如无点击右边 创建发布环境 进行创建)
安全认证:测试环境可选择None(后面可编辑进行更改)
请求协议:测试环境可选择HTTP(后面可编辑进行更改)
后端超时(毫秒):5000

2)创建完成后,在触发器页面会添加一个APIG触发器,提供访问URL

4.5.2 编辑APIG
1)点击APIG触发器名称,前往APIG控制台,点击编辑

2)编辑基本信息
此处可更改安全认证,为方便调试,此处保持无认证

3)定义API请求
此处需添加API的请求参数-用户标识,用于functiongraph中,取在OBS人脸照片库中的员工照片。

4)定义后端服务
添加后端服务参数,跟前面的入参做一个映射。
因为是在functiongraph创建的APIG,故此处已自动绑定functiongraph的函数为后端服务,故基础定义保持默认即可。

5)返回结果基础定义
返回结果的响应示例,暂设置为空即可,点击完成。

4.5.3 调试API
1)API详情页,点击调试,跳转到API调试页面

2)输入相关请求参数,发起请求,进行调试。

4.5.4 发布API
编辑完成后的API,需要进行发布,公网才可访问


4.6 绑定独立域名
子域名仅供开发测试使用,每天最多访问1000次。如需开发服务,则需为API所在分组绑定独立域名。
4.6.1 添加记录集
1、登录云解析控制台(也可使用其他平台,已完成ICP备案的域名),选择域名解析》公网域名,点击需要创建记录集的域名名称。

2、添加记录集

填写以下信息
主机记录:域名前缀,如face-test
类型:选择CNAME – 将域名指向另外一个域名
别名:默认即可
线路类型:默认即可
TTL(秒):默认即可
值:填写要指向的别名(此处为APIG上的子域名)

添加成功

4.6.2 添加自定义域名
1、在API详情页-总览,点击添加增加自定义域名。

2、跳转到API所在分组的域名管理控制台,点击绑定独立域名

3、输入前面创建的记录集,点击确定。(如果是刚添加的记录集需刷新,约等5分钟)

添加完后,即可在公网通过自定义域名,访问APIG。

4.7 问题记录
1、并发测试API时,发现偶现以下错误
错误1:人脸比对传入的base64字符串无法识别

错误2:数据传输被提前终止了

问题定位:因函数中的存储到本地的文件用的是同一个路径,并发操作时出现异步的同时占用一个路径,从而导致文件有丢失或文件转码有误
解决方案:给函数中的文件路径配置上时间戳,避免并发操作时,交叉操作同一个文件。
2、APIG错误码请参考:https://support.huaweicloud.com/usermanual-apig/apig-ug-180530090.html
3、使用APIG触发functiongraph时,发现第一个api请求响应时间较长(2s多),后面的请求就较短了(约500ms)。
问题定位:超过一分钟无调用函数时,函数会销毁。再次进行函数调用时,需要重新启动实例,所以第一次调用时间会比较长。
解决方案:设置预留实例,来消除冷启动效果。预留实例是为指定函数版本单独预留的函数运行实例,不同于普通的函数实例,预留实例长期存活,可以达到消除函数冷启动的效果。
预留实例需要提交工单开通,详情请参考:https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0306.html
5、后期思考
本方案的人脸比对,只比对一次。若人脸库中,用户的库照片有多个,是否需要遍历对比,取总体对比的结果。如对比多次,需要考虑从OBS获取照片、人脸比对的API要多次调用,性能下降、费用提升等。
附件:index.zip2.62KB
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步