在两年前,我分享了一篇使用Google ML kit实现活体检测的教程,但其实我并没有依赖该方案完成活体检测,因为 ML Kit 的 Face detection 仅仅是人脸检测,不具备活体识别的功能。 在那篇文章中,我通过SDk提供的人脸参数实现了活体检测,但其实这个检测流程是很容易被绕过的。如果提高检测精度,必然会导致真实用户的流失,这其中的关系很难平衡。 所以那个活体检测仅仅是第一道关卡,我会在活体检测的每一个步骤中都拍摄照片,然后将这些照片交给第三方API进行人脸检测。 而 Google ML kit 的作用仅仅是用来拍照姿势检测……
现在再分享一个使用 AWS Rekognition 进行活体识别的方案,这个方案应该是可以直接用于生产环境的。 不过在集成该Rekognition时遇到了写麻烦,AWS的文档虽然很多,但是整理起来还是比较费劲的。
这里提供一个可以运行的Demo aws-rekognition-face-liveness-detection
关于 AWS Rekognition 和 Amplify
AWS Rekognition 和 Google ML Kit 是相同类型的东西,都是提供一套基于深度学习的图像分析服务,比如对象检测,文本检测,人脸检测等。
AWS Amplify 和 Google Firebase 也是相同的东西,为全栈开发提供一系列的支持,例如用户认证和授权,Serveless,推送,实时数据库等。
而本次要集成的 AWS 活体检测就需要同时用到这两者,其中 AWS Amplify 给客户端提供活体检测的整套UI和逻辑。而 Rekognition 则为 Amplify 提供后端支持。
所以这个Demo需要同时编写前后端代码,下面是官方文档提供的架构和序列图,对于整个流程来说非常清晰了。
我用更简化的方式来概括一下前后端的流程:
客户端:客户端通过AmplifyUI进行活体检测的整个流程需要三样东西
- 客户端认证(就是AccessKeyId, SecretKey, Token 那一套,可以向服务器申请临时token,也可以使用aws Cognito等)
- 活体检测所需的 Session,一次活体检测流程就是一次会话
- 通过Session获取检测结果(包含结果状态、百分制分数和人脸照片),获取到成功或失败结果后 Session 就过期,无法再次使用
服务端:客户端不能直接调用Amplify SDK创建Session或获取结果,所以服务端要提供相对应的三个接口。
- 创建客户端临时凭证,这个可以通过服务端的AWS STS SDK创建。(这个接口不是必须的,客户端本地可以持有静态的凭证,不过我觉得STS更方便安全)
- 创建活体检测Session
- 查询活体检测结果(除了状态和分数,根据情况可选择返回S3的资源或者base64照片,简单起见我选择base64照片,而不是再接入一个S3 SDK)
服务端实现(Rust Axum)
我们需要有一个AWS的IAM用户,给服务端提供访问Rekognition服务的凭证。
IAM账户只需要授予 AmazonRekognitionFullAccess 权限策略即可,如果想将图片保存在S3(对象存储)中,还需要再授予 AmazonS3FullAccess 权限。 操作流程如下:
- AWS控制台>IAM>用户>创建用户,这里假设用户名为 rekognition-dev
- 勾选策略 AmazonRekognitionFullAccess 并完成创建
- 进入到刚刚创建的IAM用户界面 AWS控制台>IAM>用户>rekognition-dev
- 选择“安全凭证”选项卡,点击创建访问秘钥,进入到创建访问秘钥界面
- 选择“其他”选项,然后点击下一步即可获得accessKeyId 和 secretAccessKey
后续步骤是服务器代码的编写,需要在我们的操作系统上先配置好环境变量
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_REGION
AWS_REGION 是配置 Rekognition 服务的所在区域,不配置的话默认是 us-east-1
美国东部(国内可以连接)。
具体代码实现就不粘贴了,可以看我提供的Demo源码:aws-rekognition-face-liveness-detection
或者是 AWS Rekognition SDK 在Github上的官方示例: https://docs.aws.amazon.com/zh_cn/rekognition/latest/dg/sdk-general-information-section.html
- 创建客户端临时凭证需要集成 AWS STS SDK,使用简单的 getSessionToken API即可。(官方示例是 AssumeRole 方案,比较麻烦)
- 活体检测Session相关API集成 AWS Rekognition SDK
客户端实现(Android Compose)
AWS amplify ui Android端使用Compose实现,所以项目中要集成Compose相关依赖。并且它内部使用了Java8的API,所以也必须配置脱糖。
android {
compileOptions {
// Support for Java 8 features
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
// FaceLivenessDetector dependency
implementation 'com.amplifyframework.ui:liveness:1.2.1'
// Support for Java 8 features
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
// 其它Compose依赖
...
}
其余的看Demo源码即可:aws-rekognition-face-liveness-detection