视频活体检测
如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:
一、视频活体检测
能力介绍
业务能力
视频活体检测产品,是由两个接口(视频活体检测+随机校验码)组合而成,可实现动作视频活体、数字视频活体两种活体检测方式。主要应用在H5场景下,通过用户新录制并上传一个视频,来进行活体检测的判断,同时比单张图片活体检测方式更加安全。其主要功能如下所示:
- 质量检测(可选):判断图片中是否包含人脸,以及人脸在姿态、遮挡、模糊、光照等方面是否符合识别条件。
- 视频多帧活体检测:录制并上传的视频,会在云端进行随机抽帧分析,并得出最终的活体检测分数。
-
随机校验码:(用于在语音/动作活体检测中生成随机数字/动作)
- 为防止用户提交非当前操作的视频,选择随机验证码后,即可在录制视频时,随机生成数字/动作,用户需要读出数字/做出相应动作,在后续识别时校验,以判断视频是否为现场录制。
- 随机校验码作为辅助性质的验证条件,是一个可选项,可根据业务具体应用场景来选择是否使用,以及根据业务场景决定选择语音/动作活体检测方式。如业务场景比较嘈杂或方言口音比较重,可不使用语音活体检测方式,选择动作活体检测方式进行校验。
-
唇语识别Beta版:
- 对用户上传的视频进行唇语识别,返回唇语识别是否通过,返回结果为单独字段,与视频活体与语音/动作校验不冲突。
- 若需要使用唇语识别,需要先使用随机校验码和视频活体检测接口,且活体检测方式应配置为语音活体检测。
- 唇语识别能力当前为Beta版本,识别准确率较低,仅用于辅助 语音活体检测方式 进行验证,您可以通过接口的入参来设置是否使用该能力
-
合成图识别Beta版:
- 对用户上传的视频抽帧进行合成图像识别,能识别出AI变脸、AI换脸等合成图,让业务更加安全。
- 合成图识别能力当前为Beta版本,仅用于辅助验证,您可以通过接口的入参来设置是否使用该能力
以上四项能力,分为两个接口,使用顺序为
随机校验码接口
->视频活体检测接口
,具体调用逻辑可以参考文档 接口文档
主要适用场景
- 微信服务号:用于对操作用户真实性要求严格的场景,用于依托于微信服务号的金融开户、实名认证、账户信息变更二次验证等服务。
- APP内Webview:对于如Cordova架构开发的APP,或者APP内变更频繁的身份信息页等情况,可以采用此方案完成活体检测。
- 浏览器:如果仅是一个H5宣传页,或者Wap版本网页等,可以通过此方法快速集成更加安全的活体检测功能。
此方案的优劣势
- 优势:相对于APP有动作校验、单张图片静默判断,此方法在没有APP情况下,可以更快速、轻量级地实现活体检测,同时保障一定安全性。
- 劣势:由于视频较大,上传时间可能较长,另由于不同手机的浏览器内核差异较大,容易出现兼容性问题。
调用方式
请求URL数据格式
向API服务地址使用POST发送请求,必须在URL中带上参数access_token
,可通过后台的API Key和Secret Key生成,具体方式请参考“Access Token获取”。
示例代码
1#!/bin/bash
2curl -i -k 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【百度云应用的AK】&client_secret=【百度云应用的SK】'
1<?php
2function request_post($url = '', $param = '') {
3 if (empty($url) || empty($param)) {
4 return false;
5 }
6
7 $postUrl = $url;
8 $curlPost = $param;
9 $curl = curl_init();//初始化curl
10 curl_setopt($curl, CURLOPT_URL,$postUrl);//抓取指定网页
11 curl_setopt($curl, CURLOPT_HEADER, 0);//设置header
12 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
13 curl_setopt($curl, CURLOPT_POST, 1);//post提交方式
14 curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
15 $data = curl_exec($curl);//运行curl
16 curl_close($curl);
17
18 return $data;
19 }
20
21 $url = 'https://aip.baidubce.com/oauth/2.0/token';
22 $post_data['grant_type'] = 'client_credentials';
23 $post_data['client_id'] = '你的 Api Key';
24 $post_data['client_secret'] = '你的 Secret Key';
25 $o = "";
26 foreach ( $post_data as $k => $v )
27 {
28 $o.= "$k=" . urlencode( $v ). "&" ;
29 }
30 $post_data = substr($o,0,-1);
31
32 $res = request_post($url, $post_data);
33
34 var_dump($res);
35
36?>
1package com.baidu.ai.aip.auth;
2
3import org.json.JSONObject;
4
5import java.io.BufferedReader;
6import java.io.InputStreamReader;
7import java.net.HttpURLConnection;
8import java.net.URL;
9import java.util.List;
10import java.util.Map;
11
12/**
13 * 获取token类
14 */
15public class AuthService {
16
17 /**
18 * 获取权限token
19 * @return 返回示例:
20 * {
21 * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
22 * "expires_in": 2592000
23 * }
24 */
25 public static String getAuth() {
26 // 官网获取的 API Key 更新为你注册的
27 String clientId = "百度云应用的AK";
28 // 官网获取的 Secret Key 更新为你注册的
29 String clientSecret = "百度云应用的SK";
30 return getAuth(clientId, clientSecret);
31 }
32
33 /**
34 * 获取API访问token
35 * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
36 * @param ak - 百度云官网获取的 API Key
37 * @param sk - 百度云官网获取的 Securet Key
38 * @return assess_token 示例:
39 * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
40 */
41 public static String getAuth(String ak, String sk) {
42 // 获取token地址
43 String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
44 String getAccessTokenUrl = authHost
45 // 1. grant_type为固定参数
46 + "grant_type=client_credentials"
47 // 2. 官网获取的 API Key
48 + "&client_id=" + ak
49 // 3. 官网获取的 Secret Key
50 + "&client_secret=" + sk;
51 try {
52 URL realUrl = new URL(getAccessTokenUrl);
53 // 打开和URL之间的连接
54 HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
55 connection.setRequestMethod("GET");
56 connection.connect();
57 // 获取所有响应头字段
58 Map<String, List<String>> map = connection.getHeaderFields();
59 // 遍历所有的响应头字段
60 for (String key : map.keySet()) {
61 System.err.println(key + "--->" + map.get(key));
62 }
63 // 定义 BufferedReader输入流来读取URL的响应
64 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
65 String result = "";
66 String line;
67 while ((line = in.readLine()) != null) {
68 result += line;
69 }
70 /**
71 * 返回结果示例
72 */
73 System.err.println("result:" + result);
74 JSONObject jsonObject = new JSONObject(result);
75 String access_token = jsonObject.getString("access_token");
76 return access_token;
77 } catch (Exception e) {
78 System.err.printf("获取token失败!");
79 e.printStackTrace(System.err);
80 }
81 return null;
82 }
83
84}
1# encoding:utf-8
2import requests
3
4# client_id 为官网获取的AK, client_secret 为官网获取的SK
5host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
6response = requests.get(host)
7if response:
8 print(response.json())
1#include <iostream>
2#include <curl/curl.h>
3#include <json/json.h>
4#include "access_token.h"
5// libcurl库下载链接:https://curl.haxx.se/download.html
6// jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
7// 获取access_token所需要的url
8const std::string access_token_url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials";
9// 回调函数获取到的access_token存放变量
10// static std::string access_token_result;
11/**
12 * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在result中
13 * @param 参数定义见libcurl库文档
14 * @return 返回值定义见libcurl库文档
15 */
16static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
17 // 获取到的body存放在ptr中,先将其转换为string格式
18 std::string s((char *) ptr, size * nmemb);
19 // 开始获取json中的access token项目
20 Json::Reader reader;
21 Json::Value root;
22 // 使用boost库解析json
23 reader.parse(s,root);
24 std::string* access_token_result = static_cast<std::string*>(stream);
25 *access_token_result = root["access_token"].asString();
26 return size * nmemb;
27}
28
29/**
30 * 用以获取access_token的函数,使用时需要先在百度云控制台申请相应功能的应用,获得对应的API Key和Secret Key
31 * @param access_token 获取得到的access token,调用函数时需传入该参数
32 * @param AK 应用的API key
33 * @param SK 应用的Secret key
34 * @return 返回0代表获取access token成功,其他返回值代表获取失败
35 */
36int get_access_token(std::string &access_token, const std::string &AK, const std::string &SK) {
37 CURL *curl;
38 CURLcode result_code;
39 int error_code = 0;
40 curl = curl_easy_init();
41 if (curl) {
42 std::string url = access_token_url + "&client_id=" + AK + "&client_secret=" + SK;
43 curl_easy_setopt(curl, CURLOPT_URL, url.data());
44 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
45 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
46 std::string access_token_result;
47 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &access_token_result);
48 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
49 result_code = curl_easy_perform(curl);
50 if (result_code != CURLE_OK) {
51 fprintf(stderr, "curl_easy_perform() failed: %s\n",
52 curl_easy_strerror(result_code));
53 return 1;
54 }
55 access_token = access_token_result;
56 curl_easy_cleanup(curl);
57 error_code = 0;
58 } else {
59 fprintf(stderr, "curl_easy_init() failed.");
60 error_code = 1;
61 }
62 return error_code;
63}
1using System;
2using System.Collections.Generic;
3using System.Net.Http;
4
5namespace com.baidu.ai
6{
7 public static class AccessToken
8
9 {
10 // 调用getAccessToken()获取的 access_token建议根据expires_in 时间 设置缓存
11 // 返回token示例
12 public static String TOKEN = "24.adda70c11b9786206253ddb70affdc46.2592000.1493524354.282335-1234567";
13
14 // 百度云中开通对应服务应用的 API Key 建议开通应用的时候多选服务
15 private static String clientId = "百度云应用的AK";
16 // 百度云中开通对应服务应用的 Secret Key
17 private static String clientSecret = "百度云应用的SK";
18
19 public static String getAccessToken() {
20 String authHost = "https://aip.baidubce.com/oauth/2.0/token";
21 HttpClient client = new HttpClient();
22 List<KeyValuePair<String, String>> paraList = new List<KeyValuePair<string, string>>();
23 paraList.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
24 paraList.Add(new KeyValuePair<string, string>("client_id", clientId));
25 paraList.Add(new KeyValuePair<string, string>("client_secret", clientSecret));
26
27 HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
28 String result = response.Content.ReadAsStringAsync().Result;
29 Console.WriteLine(result);
30 return result;
31 }
32 }
33}
1var https = require('https');
2var qs = require('querystring');
3
4const param = qs.stringify({
5 'grant_type': 'client_credentials',
6 'client_id': '您的 Api Key',
7 'client_secret': '您的 Secret Key'
8});
9
10https.get(
11 {
12 hostname: 'aip.baidubce.com',
13 path: '/oauth/2.0/token?' + param,
14 agent: false
15 },
16 function (res) {
17 // 在标准输出中查看运行结果
18 res.pipe(process.stdout);
19 }
20);
注意:
access_token
的有效期为30天,切记需要每30天进行定期更换,或者每次请求都拉取新token;
例如此接口,使用HTTPS POST发送:
1https://aip.baidubce.com/rest/2.0/face/v1/merge?access_token=24.f9ba9c5341b67688ab4added8bc91dec.2592000.1485570332.282335-8574074
POST中Body的参数,按照下方请求参数说明选择即可。
提示:如果您为百度云老用户,正在使用其他非AI的服务,可以参考百度云AKSK鉴权方式发送请求,虽然请求方式和鉴权方法和本文所介绍的不同,但请求参数和返回结果一致。
1.1 随机校验码接口(原语音验证码接口)
接口描述
此接口主要用于生成随机码,用于视频的语音/动作识别校验使用,以判断视频的即时性,而非事先录制的,提升作弊的难度。
在线调试
您可以在 示例代码中心 中调试该接口,可进行签名验证、查看在线调用的请求内容和返回结果、示例代码的自动生成。
请求说明
请求示例
HTTP方法:POST
请求URL: https://aip.baidubce.com/rest/2.0/face/v1/faceliveness/sessioncode
URL参数:
参数 | 值 |
---|---|
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
Header:
参数 | 值 |
---|---|
Content-Type | application/x-www-form-urlencoded |
Body中放置请求参数,参数详情如下:
- 请求参数
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
type | 否 | int | 0:下发语音验证码和唇语验证码,默认类型 1:下发视频动作活体验证码 |
min_code_length | 否 | int | 当type=0时,生成语音和唇语验证码的最小长度:最小3,最大6,默认3 当type=1时,视生成视频动作活体验证码的最小长度,最小1,最大3,默认3 |
max_code_length | 否 | int | 当type=0时,生成语音和唇语验证码的最大长度,最小3,最大6,默认3 当type=1时,生成视频动作活体验证码的最大长度:最小1,最大3,默认3 |
说明:
- 当传参为1-1-3时,代表随机生成1-3个动作进行核验;
- 当传参为1-1-1时,代表随机生成1个动作进行核验;
- 当传参为1-2-2时,代表随机生成2个动作进行核验;
- 当传参为1-3-3时,代表随机生成3个动作进行核验。
返回说明
返回参数
字段 | 必选 | 类型 | 说明 |
---|---|---|---|
session_id | 是 | string | 随机校验码会话id,有效期5分钟,请提示用户在五分钟内完成全部操作 验证码使用过即失效,每次使用视频活体前请重新拉取验证码 |
code | 是 | string | 随机验证码,数字形式,1~6位数字; 若为动作活体时,返回数字表示的动作对应关系为:0:眨眼 4:抬头 5:低头 7:左右转头(不区分先后顺序,分别向左和向右转头),注:『7:左右转头』为2022年4月底上线的新动作,此后接入的新客户默认开放该动作,老客户默认不触发该动作,可提交工单要求配置触发 |
返回示例
1{
2 "err_no": 0,
3 "err_msg": "SUCCESS",
4 "result": {
5 "session_id": "S59faeeebb9111890355690", //会话ID
6 "code": "045" //当为视频动作活体时,返回值的代表所需动作和动作顺序。 0:眨眼 4:抬头 5:低头
7 },
8 "timestamp": 1509617387,
9 "cached": 0,
10 "serverlogid": "0587756642",
11 "error_code": 0,
12 "error_message": "SUCCESS"
13}
error_code为0即代表成功, 其他情况则为失败
1.2 视频活体检测接口
接口描述
此接口一方面通过随机验证码接口获取语音/动作校验码,通过session code来判断视频是否作弊。另一方面进行视频抽帧,判断是否为活体。
在线调试
您可以在 示例代码中心 中调试该接口,可进行签名验证、查看在线调用的请求内容和返回结果、示例代码的自动生成。
请求说明
请求示例
HTTP方法:POST
请求URL: https://aip.baidubce.com/rest/2.0/face/v1/faceliveness/verify
URL参数:
参数 | 值 |
---|---|
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
Header:
参数 | 值 |
---|---|
Content-Type | application/x-www-form-urlencoded |
Body中放置请求参数,参数详情如下:
请求参数
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
type_identify | 否 | string | voice为语音验证,action为视频动作活体验证,默认为voice (若您需要静默视频活体验证,此参数无需传入) |
session_id | 否 | string | 会话ID (当此字段为空时,为静默视频活体检测) 当使用语音验证及视频动作活体验证时,此字段必须传入,且获取验证码时要填入对应的验证类型 。session_id获取方式参考随机校验码文档。 注:session_id与type_identify参数的核验方式需保持一致,如:当type_identify参数传入action时,session_id也需为动作校验码 |
video_base64 | 是 | string | base64 编码的视频数据(编码前建议先将视频进行转码,h.264编码,mp4封装)需要注意的是,视频的base64编码是不包含视频头的,如 data:video/mp4;base64,; 建议视频长度控制在01s-10s之间,视频大小建议在2M以内(视频大小强制要求在20M以内,推荐使用等分辨率压缩,压缩分辨率建议不小于640*480) 视频大小分辨率建议限制在16~2032之间 |
lip_identify | 否 | string | 辅助语音验证进行,用于判断验证码是否为当事人读出 取值COMMON/STRICT/OFF, COMMON代表使用唇语识别,STRICT代表使用唇语识别并使用更加严格的策略判断是否通过 OFF代表关闭唇语识别,默认OFF |
face_field | 否 | string | 需要使用合成图功能时, 此项传入spoofing 需要使用图片质量信息时,则传入quality 字段之间使用,号分隔,eg:spoofing,quality |
唇语识别中,使用STRICT策略会比使用COMMON策略通过率降低,但攻击拒绝率会提升 建议视频大小控制在10M/1min以内
请求示例
1{
2 "session_id": "S62b193a44a46c363371046",
3 "video_base64": "video_base64_value",
4 "type_identify": "voice",
5 "lip_identify": "STRICT",
6 "face_field": "spoofing,quality"
7}
返回说明
返回参数
参数名 | 类型 | 说明 |
---|---|---|
score | float | 活体检测的总体打分 范围[0,1],分数越高则活体的概率越大 |
maxspoofing | float | 返回的1-8张图片中合成图检测得分的最大值 范围[0,1],分数越高则概率越大 |
spoofing_score | float | 返回的1-8张图片中合成图检测得分的中位数 范围[0,1],分数越高则概率越大 |
thresholds | array | 阈值 按活体检测分数>阈值来判定活体检测是否通过(阈值视产品需求选择其中一个) |
code | array | 验证码信息 |
+create | string | 生成的验证码 |
+identify | string | 验证码的语音识别结果 |
+similarity | float | 验证码相似度 取值0~1 1代表完全一致 0代表完全不一致 推荐阈值0.75 |
lip_language | string | 唇语识别结果 pass代表唇语验证通过,fail代表唇语验证未通过,当存在请求字段lip_identify字段值为 COMMON 或 STRICT时返回 |
action_verify | string | 动作识别结果 pass代表动作验证通过,fail代表动作验证未通过,当存在请求字段type_identify字段值为action时返回 |
best_image | array | 质量最佳图片 |
+face_token | string | 人脸图片的唯一标识 |
+pic | string | base64编码后的图片信息 |
+liveness_score | float | 此图片的活体分数,范围[0,1] |
pic_list | array | 返回1-8张抽取出来的图片信息 |
+face_token | string | 人脸图片的唯一标识 |
+spoofing | float | 此图片的合成图分数,范围[0,1] |
返回示例
1{
2 "err_no": 0,
3 "err_msg": "SUCCESS",
4 "result": {
5 "score": 0.18,
6 "maxspoofing": 0.0002082588035,
7 "spoofing_score": 0.00018671568975,
8 "code": {
9 "create": "853",
10 "identify": "23456789",
11 "similarity": 0.13
12 },
13 "lip_language": "fail", //lip_identify 为 COMMON 或 STRICT 时返回该字段值,值为pass 或 false
14 "action_verify": "fail", //type_identify 为 action 时返回该字段值,值为pass 或 false【注意:action_verify与lip_language是互斥的】
15 "thresholds": {
16 "frr_1e-4": 0.05, //万分之一误拒率的阈值
17 "frr_1e-3": 0.3, //千分之一误拒率的阈值
18 "frr_1e-2": 0.9, //百分之一误拒率的阈值
19 },
20 "best_image": {
21 "pic": "图片base64值",
22 "face_token": "0839b921224816fb558b0a74ee6284fb",
23 "face_id": "0839b921224816fb558b0a74ee6284fb",
24 "liveness_score": 0.9634260269,
25 "spoofing": 0.0001962436945,
26 "quality": {
27 "occlusion": {
28 "left_eye": 0,
29 "right_eye": 0,
30 "nose": 0,
31 "mouth": 0,
32 "left_cheek": 0,
33 "right_cheek": 0,
34 "chin_contour": 0
35 },
36 "blur": 0,
37 "illumination": 114,
38 "completeness": 1
39 },
40 "angle": {
41 "yaw": 1.59,
42 "pitch": 0.26,
43 "roll": -5.46
44 }
45 },
46 "pic_list": [ //默认返回8张图片
47 {
48 "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
49 "face_token": "f043b6c7d202cb25e8dfc24fccf37553",
50 "face_id": "f043b6c7d202cb25e8dfc24fccf37553",
51 "liveness_score": 0.18,
52 "spoofing": 0.000179775554,
53 "quality": {
54 "occlusion": {
55 "left_eye": 0,
56 "right_eye": 0,
57 "nose": 0,
58 "mouth": 0,
59 "left_cheek": 0,
60 "right_cheek": 0,
61 "chin_contour": 0
62 },
63 "blur": 0,
64 "illumination": 114,
65 "completeness": 1
66 },
67 "angle": {
68 "yaw": 1.59,
69 "pitch": 0.26,
70 "roll": -5.46
71 }
72 },
73 {
74 "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
75 "face_token": "d12b7e32069d337dc5d57cd3d15e2935",
76 "face_id": "d12b7e32069d337dc5d57cd3d15e2935",
77 "liveness_score": 0.06,
78 "spoofing": 0.0002082588035,
79 "quality": {
80 "occlusion": {
81 "left_eye": 0,
82 "right_eye": 0,
83 "nose": 0,
84 "mouth": 0,
85 "left_cheek": 0,
86 "right_cheek": 0,
87 "chin_contour": 0
88 },
89 "blur": 0,
90 "illumination": 114,
91 "completeness": 1
92 },
93 "angle": {
94 "yaw": 1.59,
95 "pitch": 0.26,
96 "roll": -5.46
97 }
98 },
99 {
100 "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
101 "face_token": "6411f95f491fb665c389de03a33f12a4",
102 "face_id": "6411f95f491fb665c389de03a33f12a4",
103 "liveness_score": 0.06,
104 "spoofing": 0.0001938246714,
105 "quality": {
106 "occlusion": {
107 "left_eye": 0,
108 "right_eye": 0,
109 "nose": 0,
110 "mouth": 0,
111 "left_cheek": 0,
112 "right_cheek": 0,
113 "chin_contour": 0
114 },
115 "blur": 0,
116 "illumination": 114,
117 "completeness": 1
118 },
119 "angle": {
120 "yaw": 1.59,
121 "pitch": 0.26,
122 "roll": -5.46
123 }
124 },
125 {
126 "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
127 "face_token": "d7fb09b7942555bf1e4b8d47a63c2e4b",
128 "face_id": "d7fb09b7942555bf1e4b8d47a63c2e4b",
129 "liveness_score": 0.05,
130 "spoofing": 0.0001579090458
131 },
132 {
133 "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
134 "face_token": "b14f94951a1d1b0fb8770bb1ef2bf2e7",
135 "face_id": "b14f94951a1d1b0fb8770bb1ef2bf2e7",
136 "liveness_score": 0.05,
137 "spoofing": 0.0001889262057,
138 "quality": {
139 "occlusion": {
140 "left_eye": 0,
141 "right_eye": 0,
142 "nose": 0,
143 "mouth": 0,
144 "left_cheek": 0,
145 "right_cheek": 0,
146 "chin_contour": 0
147 },
148 "blur": 0,
149 "illumination": 114,
150 "completeness": 1
151 },
152 "angle": {
153 "yaw": 1.59,
154 "pitch": 0.26,
155 "roll": -5.46
156 }
157 },
158 {
159 "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
160 "face_token": "f7f363d0e71e91906dbdcfec0573de70",
161 "face_id": "f7f363d0e71e91906dbdcfec0573de70",
162 "liveness_score": 0.05,
163 "spoofing": 0.0001999060332,
164 "quality": {
165 "occlusion": {
166 "left_eye": 0,
167 "right_eye": 0,
168 "nose": 0,
169 "mouth": 0,
170 "left_cheek": 0,
171 "right_cheek": 0,
172 "chin_contour": 0
173 },
174 "blur": 0,
175 "illumination": 114,
176 "completeness": 1
177 },
178 "angle": {
179 "yaw": 1.59,
180 "pitch": 0.26,
181 "roll": -5.46
182 }
183 },
184 {
185 "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
186 "face_token": "388bdccbd70200f62c5f46a84b012691",
187 "face_id": "388bdccbd70200f62c5f46a84b012691",
188 "liveness_score": 0.04,
189 "spoofing": 0.0001798788871,
190 "quality": {
191 "occlusion": {
192 "left_eye": 0,
193 "right_eye": 0,
194 "nose": 0,
195 "mouth": 0,
196 "left_cheek": 0,
197 "right_cheek": 0,
198 "chin_contour": 0
199 },
200 "blur": 0,
201 "illumination": 114,
202 "completeness": 1
203 },
204 "angle": {
205 "yaw": 1.59,
206 "pitch": 0.26,
207 "roll": -5.46
208 }
209 },
210 {
211 "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
212 "face_token": "5fa4e1116f00912f66dba9b42a6a739e",
213 "face_id": "5fa4e1116f00912f66dba9b42a6a739e",
214 "liveness_score": 0.04,
215 "spoofing": 0.0001976373605,
216 "quality": {
217 "occlusion": {
218 "left_eye": 0,
219 "right_eye": 0,
220 "nose": 0,
221 "mouth": 0,
222 "left_cheek": 0,
223 "right_cheek": 0,
224 "chin_contour": 0
225 },
226 "blur": 0,
227 "illumination": 114,
228 "completeness": 1
229 },
230 "angle": {
231 "yaw": 1.59,
232 "pitch": 0.26,
233 "roll": -5.46
234 }
235 }
236 ]
237 },
238 "timestamp": 1597148814,
239 "cached": 0,
240 "serverlogid": 1614796453,
241 "error_code": 0,
242 "error_msg": "SUCCESS"
243}
活体阈值参考
请务必在产品侧做好以下条件限制
- 检测的图片为二次采集,即通过相机当场拍摄,确保时间及操作条件的约束
关于活体检测faceliveness的判断阈值选择,可参考以下数值信息:
阈值(Threshold) | 误拒率(FRR) | 通过率(TAR) | 攻击拒绝率(TRR)) |
---|---|---|---|
0.05 | 0.01% | 99.99% | 97.75% |
0.1 | 0.05% | 99.95% | 98.33% |
0.3 (推荐) | 0.1% | 99.9% | 98.82% |
0.5 | 0.5% | 99.5% | 99.67% |
0.9 | 1% | 99% | 99.77% |
关于以上数值的概念介绍:
- 拒绝率(TRR):如99%,代表100次作弊假体攻击,会有99次被拒绝。
- 误拒率(FRR):如0.5%,指1000次真人请求,会有5次因为活体分数低于阈值被错误拒绝。
- 通过率(TAR):如99%,指100次真人请求,会有99次因为活体分数高于阈值而通过。
- 阈值(Threshold):高于此数值,则可判断为活体。
合成图阈值参考
新推出合成图检测能力,在入参字段中增加spoofing参数,进行判断,若spoofing分值高于合成图推荐阈值,则可判断为合成图攻击
关于合成图检测spoofing的判断阈值选择,可参考以下数值信息:
阈值 | 误拒率(FRR) | 通过率(TAR) | 攻击拒绝率(TRR)) |
---|---|---|---|
0.00023 | 5% | 95% | 94.93% |
0.00048(推荐) | 1% | 99% | 89.71% |
0.00066 | 0.5% | 99.5% | 88.02% |
0.00109 | 0.1% | 99.9% | 84.57% |
0.00171 | 0.05% | 99.95% | 81.52% |
0.00547 | 0.01% | 99.99% | 65.52% |
- 阈值(Threshold):高于此数值,则可判断为是合成图攻击。
错误码列表
错误码 | error_msg | 错误信息 | 描述 |
---|---|---|---|
216430 | rtse/face service error | rtse/face 服务异常 | 请重新尝试 |
216431 | voice service error | 语音识别服务异常 | 请重新尝试 |
216432 | video service call fail | 视频解析服务调用失败 | 请重新尝试 |
216433 | video service error | 视频解析服务发生错误 | 请重新尝试 |
216434 | liveness check fail | 活体检测失败 | 请重新尝试 |
216500 | code digit error | 验证码位数错误 | 验证码错误, 请增加一层验证环节 |
216501 | not found face | 没有找到人脸 | 请查看上传视频是否包含人脸,可能因为人脸过大导致,建议用户调整距离重新录制视频 |
216502 | session lapse | 当前会话已失效 | 请重新获取语音验证码 |
216505 | redis connect error | redis连接失败 | 请重新尝试 |
216506 | redis operation error | redis操作失败 | 请重新尝试 |
216507 | found many faces | 视频中有多张人脸 | 请重新录制视频 |
216508 | not found video info | 没有找到视频信息 | 请参考文档修改视频格式 |
216509 | voice can not identify | 视频中的声音无法识别 (声音过低或者有杂 音导致无法识别) |
请重新录制视频 |
216908 | 视频中人脸质量较差 (返回信息中包含具体原因) |
视频中人脸质量过低 (返回的错误信息会包含 具体的错误信息包含 illumiantion(光照不足) angle(角度不好) blur (人脸模糊) occlusion(有遮挡) too large(人脸过大, 占屏幕2/3以上) 等原因 |
请重新录制视频 |
222027 | code length param error | 验证码长度错误 (最小值大于最大值) |
参考API说明文档,修改参数 |
222028 | param[min_code_length] format error | 参数格式错误 | 参考API说明文档,修改参数 |
222029 | param[max_code_length] format error | 参数格式错误 | 参考API说明文档,修改参数 |
222030 | param[match_threshold] format error | 参数格式错误 | 参考API说明文档,修改参数 |
二、实时活体检测方案
如您需要使用实时的活体检测方式,即无需用户录制并上传视频,直接在前端实时完成活体检测流程,以提升整体核验流程的流畅度及用户体验。可通过H5实名认证方案进行接入。您可根据您的业务环境选择APP方案接入或H5方案接入。
注: 此实时检测能力暂不支持纯服务端接入的方式。如您需要使用此能力,需通过H5实名认证方案进行接入。
如果您对文档内容有任何疑问,可以通过以下几种方式联系我们: