在两年前,我分享了一篇使用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需要同时编写前后端代码,下面是官方文档提供的架构和序列图,对于整个流程来说非常清晰了。

Amazon Rekognition Face Liveness 架构图 Amazon Rekognition Face Liveness 序列图

我用更简化的方式来概括一下前后端的流程:

客户端:客户端通过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 权限。 操作流程如下:

  1. AWS控制台>IAM>用户>创建用户,这里假设用户名为 rekognition-dev
  2. 勾选策略 AmazonRekognitionFullAccess 并完成创建
  3. 进入到刚刚创建的IAM用户界面 AWS控制台>IAM>用户>rekognition-dev
  4. 选择“安全凭证”选项卡,点击创建访问秘钥,进入到创建访问秘钥界面
  5. 选择“其他”选项,然后点击下一步即可获得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

  1. 创建客户端临时凭证需要集成 AWS STS SDK,使用简单的 getSessionToken API即可。(官方示例是 AssumeRole 方案,比较麻烦)
  2. 活体检测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

References