前言
人脸解锁功能、人脸识别功能在当前软件开发中十分常见,阿里云也提供了一整套的人脸检测、活体检测、人脸识别等服务,本人在工作中也遇到了需要人脸识别的开发需求,但是秉着开发效率最大化的原则,我们没有选择自主研发一套人脸识别系统,而是选择了阿里云的功能服务。当然,在选择前,我们团队也做足了调研工作,相对而言,阿里的服务性价比更高一些,价格方面如下图所示:
业务需求
本次的功能需求是后台系统考勤模式添加人脸识别打卡选项,APP端打卡时需要调用手机摄像头完成人脸识别,若符合本人人脸则打卡通过,否则打卡失败!
通过分析需求,本次后端在实现功能时需要提供的功能有:
1、PC端需要后端提供修改打卡方式的接口;
2、PC端需要后端提供显示打卡方式的接口;
3、APP端进入打卡页面时,返回打卡方式的接口;
4、APP端获取是否打卡接口,并返回人脸图片URL;
5、人脸识别接口;
以上1、2、3点都是数据库的增删改查业务,本次功能不多做介绍,大家只需要知道有这样的步骤即可。
具体的步骤流程图如下,仅供参考:
代码参考
需要引用的阿里云接口,一共有两个,一个是人脸活体检测,一个是人脸识别1:1。
活体检测代码实现
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
facebody20191230 "github.com/alibabacloud-go/facebody-20191230/v4/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
"os"
)
func main() {
// 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
// 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html。
// 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行示例前必须先配置环境变量。
accessKeyId := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
accessKeySecret := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
// 初始化配置对象 &openapi.Config。Config对象存放AccessKeyId、AccessKeySecret、Endpoint等配置。
config := &openapi.Config{
AccessKeyId: tea.String(accessKeyId),
AccessKeySecret: tea.String(accessKeySecret),
}
// 访问的域名
config.Endpoint = tea.String("facebody.cn-shanghai.aliyuncs.com")
client, err := facebody20191230.NewClient(config)
if err != nil {
panic(err)
}
// 场景一,使用本地文件
file, err := os.Open("D:\\Users\\Administrator\\Desktop\\xhj1.png")
if err != nil {
fmt.Println("can not open file", err)
panic(err)
}
tasks0 := &facebody20191230.DetectLivingFaceAdvanceRequestTasks{
ImageURLObject: file,
}
detectLivingFaceAdvanceRequest := &facebody20191230.DetectLivingFaceAdvanceRequest{
Tasks: []*facebody20191230.DetectLivingFaceAdvanceRequestTasks{tasks0},
}
runtime := &util.RuntimeOptions{}
detectLivingFaceResponse, err := client.DetectLivingFaceAdvance(detectLivingFaceAdvanceRequest, runtime)
if err != nil {
// 获取整体报错信息
fmt.Println(err.Error())
} else {
// 获取整体结果
fmt.Println(detectLivingFaceResponse)
}
}
活体检测时会根据图片上的光照纹理来区分是否是真人拍照,当我们用手机拍照片时图片的光照与现实中拍摄的光照有着明显的区别,活体检测正是用了这一原理来区分,拍照的是真人还是照片。
这里结果显示的是pass,意思就是系统认为活体检测是通过的。
根据返回的结果显示“图片中的活体对象可能来自翻拍,系统建议确认后再进行操作”,可见该功能是可以区分出来是否是来自于翻拍的。
使用上图时,给出的结果是系统认为该图片极有可能是翻拍,所以可见阿里的人脸活体检测功能还是非常完善的。
人脸识别1:1代码实现
/**
最低SDK版本要求:facebody-20191230的SDK版本需大于等于4.0.7。
可以在此仓库地址中引用最新版本SDK:https://pkg.go.dev/github.com/alibabacloud-go/facebody-20191230/v4
依赖github.com/alibabacloud-go/facebody-20191230
建议使用go mod tidy安装依赖
*/
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
facebody20191230 "github.com/alibabacloud-go/facebody-20191230/v4/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
"os"
)
func main() {
// 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
// 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html。
// 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行示例前必须先配置环境变量。
accessKeyId := "ALIBABA_CLOUD_ACCESS_KEY_ID"
accessKeySecret := "ALIBABA_CLOUD_ACCESS_KEY_SECRET"
// 初始化配置对象 &openapi.Config。Config对象存放AccessKeyId、AccessKeySecret、Endpoint等配置。
config := &openapi.Config{
AccessKeyId: tea.String(accessKeyId),
AccessKeySecret: tea.String(accessKeySecret),
}
// 访问的域名
config.Endpoint = tea.String("facebody.cn-shanghai.aliyuncs.com")
client, err := facebody20191230.NewClient(config)
if err != nil {
panic(err)
}
// 场景一,使用本地文件
file1, err := os.Open("D:\\Users\\Administrator\\Desktop\\xhj1.png")
if err != nil {
fmt.Println("can not open file", err)
panic(err)
}
file2, err := os.Open("D:\\Users\\Administrator\\Desktop\\xhj3.png")
if err != nil {
fmt.Println("can not open file", err)
panic(err)
}
compareFaceRequest := &facebody20191230.CompareFaceAdvanceRequest{
ImageURLAObject: file1,
ImageURLBObject: file2,
}
runtime := &util.RuntimeOptions{}
response, err := client.CompareFaceAdvance(compareFaceRequest, runtime)
if err != nil {
// 获取整体报错信息
fmt.Println(err.Error())
} else {
// 获取整体结果
fmt.Println(response)
}
}
人脸对比1:1,该功能就是我们所认知的判断是否是同一个人,下面是对应的测试及结果。
使用以上两张图片,可以很清楚的发现是同一个人,系统会给出人脸对比通过的提示。
使用以上两张图片,可以很清楚的发现不是同一个人,系统会给出人脸对比不通过的提示。
(!!!实在不好意思拿自己的脸做样例,以上人脸图片均来自于阿里云官方示例文档的样例图片,若有侵权请及时联系,本人会尽快删除)
需要注意
在开发过程中,打卡时既需要使用到活体检测也需要人脸对比1:1功能,所以本人在开发时,用os.open方法打开一张本地上传的图片生成一个file对象后,分别在调用活体检测和人脸对比1:1功能时都使用了该file对象,结果返回的结果报错:
虽然提示文件格式错误,但是明明在调用人脸活体检测接口已经成功,在接下来调用人脸对比1:1时才报的错误,所以无奈只能用os.open方法再次生成一次file对象,才能成功调用人脸对比1:1的接口。
总结
以上就是开发人脸识别功能时的理解和心得,相信很多的小伙伴在开发时经常会使用到第三方的接口,而本人在多方验证中发现,阿里的官方文档做得还是相对较好的,条理清晰,案例充分,十分适合新手使用。本次使用到的人脸识别功能就是这些,若是想要了解更多可以访问阿里云的官方文档