209
云计算
负载均衡
产品简介
产品价格
快速入门
用户指南
实践操作
常见问题
购买指南
云服务器
产品简介
计费规则
购买指导
控制台使用指南
常见问题
云数据库
产品简介
计费规则
购买指导
快速入门
连接实例
控制台使用指南
对象存储
产品简介
控制台使用指南
程序员百科
Python
百度人脸识别使用指南-视频活体检测API文档

产品推荐:

1、安全稳定的云服务器租用,2核/2G/5M仅37元,点击抢购>>>

2、高防物理服务器20核/16G/50M/200G防御仅350元,点击抢购>>>

3、百度智能建站(五合一网站)仅880元/年,点击抢购>>> 模板建站(PC+手机站)仅480元/年,点击抢购>>>



点击这里点击这里申请百度智能云特邀VIP帐号,立即体验人脸识别>>>

百度人脸识别使用指南-视频活体检测API文档

如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:

  • 在百度云控制台内 提交工单,咨询问题类型请选择人工智能服务
  • 如有需要讨论的疑问,欢迎进入 AI社区 与其他开发者们一同交流。

一、视频活体检测

能力介绍

业务能力

视频活体检测产品,是由两个接口(视频活体检测+随机校验码)组合而成,可实现动作视频活体、数字视频活体两种活体检测方式。主要应用在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获取”。

示例代码

#!/bin/bash curl -i -k 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【百度云应用的AK】&client_secret=【百度云应用的SK】'

注意:access_token的有效期为30天,切记需要每30天进行定期更换,或者每次请求都拉取新token

例如此接口,使用HTTPS POST发送:

https://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-Typeapplication/x-www-form-urlencoded

Body中放置请求参数,参数详情如下:

  • 请求参数
参数名必选类型说明
typeint0为语音验证和唇语验证步骤, 1为视频动作活体 默认0
min_code_lengthint当type=0时,语音和唇语生成的验证码最小长度:最大6 最小3 默认3
当type=1时,视频动作活体 的验证码最小长度:最大3 最小1 默认1
max_code_lengthint当type=0时,语音和唇语生成的验证码最大长度:最大6 最小3 默认6
当type=1时,视频动作活体 的验证码最大长度:最大3 最小1 默认3

说明

  • 当传参为1-1-3时,代表随机生成1-3个动作进行核验;
  • 当传参为1-1-1时,代表随机生成1个动作进行核验;
  • 当传参为1-2-2时,代表随机生成2个动作进行核验;
  • 当传参为1-3-3时,代表随机生成3个动作进行核验。

返回说明

返回参数

字段必选类型说明
session_idstring随机校验码会话id,有效期5分钟,请提示用户在五分钟内完成全部操作
验证码使用过即失效,每次使用视频活体前请重新拉取验证码
codestring随机验证码,数字形式,1~6位数字;
若为动作活体时,返回数字表示的动作对应关系为:0:眨眼 4:抬头 5:低头 7:左右转头(不区分先后顺序,分别向左和向右转头),注:『7:左右转头』为2022年4月底上线的新动作,此后接入的新客户默认开放该动作,老客户默认不触发该动作,可提交工单要求配置触发

返回示例

{
   "err_no": 0,
   "err_msg": "SUCCESS",
   "result": {
       "session_id": "S59faeeebb9111890355690", //会话ID
       "code": "045" //当为视频动作活体时,返回值的代表所需动作和动作顺序。 0:眨眼 4:抬头  5:低头
   },
   "timestamp": 1509617387,
   "cached": 0,
   "serverlogid": "0587756642",
   "error_code": 0,
    "error_message": "SUCCESS"
}

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-Typeapplication/x-www-form-urlencoded

Body中放置请求参数,参数详情如下:

请求参数

参数名必选类型说明
type_identifystringvoice为语音验证,action为视频动作活体验证,默认为voice (若您需要静默视频活体验证,此参数无需传入)
session_idstring会话ID (当此字段为空时,为静默视频活体检测)
当使用语音验证及视频动作活体验证时,此字段必须传入,且获取验证码时要填入对应的验证类型 。session_id获取方式参考随机校验码文档。
:session_id与type_identify参数的核验方式需保持一致,如:当type_identify参数传入action时,session_id也需为动作校验码
video_base64stringbase64 编码的视频数据(编码前建议先将视频进行转码,h.264编码,mp4封装)需要注意的是,视频的base64编码是不包含视频头的,如 data:video/mp4;base64,;
建议视频长度控制在01s-10s之间,视频大小建议在2M以内(视频大小强制要求在20M以内,推荐使用等分辨率压缩,压缩分辨率建议不小于640*480) 视频大小分辨率建议限制在16~2032之间
lip_identifystring辅助语音验证进行,用于判断验证码是否为当事人读出
取值COMMON/STRICT/OFF, COMMON代表使用唇语识别,STRICT代表使用唇语识别并使用更加严格的策略判断是否通过 OFF代表关闭唇语识别,默认OFF
face_fieldstring需要使用合成图功能时, 此项传入spoofing
需要使用图片质量信息时,则传入quality
字段之间使用,号分隔,eg:spoofing,quality

唇语识别中,使用STRICT策略会比使用COMMON策略通过率降低,但攻击拒绝率会提升 建议视频大小控制在10M/1min以内

请求示例

{
    "session_id": "S62b193a44a46c363371046",
    "video_base64": "video_base64_value",
    "type_identify": "voice",
    "lip_identify": "STRICT",
    "face_field": "spoofing,quality"
}

返回说明

返回参数

参数名类型说明
scorefloat活体检测的总体打分 范围[0,1],分数越高则活体的概率越大
maxspoofingfloat返回的1-8张图片中合成图检测得分的最大值 范围[0,1],分数越高则概率越大
spoofing_scorefloat返回的1-8张图片中合成图检测得分的中位数 范围[0,1],分数越高则概率越大
thresholdsarray阈值 按活体检测分数>阈值来判定活体检测是否通过(阈值视产品需求选择其中一个)
codearray验证码信息
+createstring生成的验证码
+identifystring验证码的语音识别结果
+similarityfloat验证码相似度 取值0~1 1代表完全一致 0代表完全不一致 推荐阈值0.75
lip_languagestring唇语识别结果 pass代表唇语验证通过,fail代表唇语验证未通过,当存在请求字段lip_identify字段值为 COMMON 或 STRICT时返回
action_verifystring动作识别结果 pass代表动作验证通过,fail代表动作验证未通过,当存在请求字段type_identify字段值为action时返回
best_imagearray质量最佳图片
+face_tokenstring人脸图片的唯一标识
+picstringbase64编码后的图片信息
+liveness_scorefloat此图片的活体分数,范围[0,1]
pic_listarray返回1-8张抽取出来的图片信息
+face_tokenstring人脸图片的唯一标识
+spoofingfloat此图片的合成图分数,范围[0,1]

返回示例

{
  "err_no": 0,
  "err_msg": "SUCCESS",
  "result": {
      "score": 0.18,
      "maxspoofing": 0.0002082588035,
		"spoofing_score": 0.00018671568975,
      "code": {
          "create": "853",
          "identify": "23456789",
          "similarity": 0.13
      },
      "lip_language": "fail",     //lip_identify 为 COMMON 或 STRICT 时返回该字段值,值为pass 或 false
      "action_verify": "fail",    //type_identify 为 action 时返回该字段值,值为pass 或 false【注意:action_verify与lip_language是互斥的】
      "thresholds": {
            "frr_1e-4": 0.05,     //万分之一误拒率的阈值
            "frr_1e-3": 0.3,      //千分之一误拒率的阈值
            "frr_1e-2": 0.9,      //百分之一误拒率的阈值
      },
		"best_image": {
          "pic": "图片base64值",
          "face_token": "0839b921224816fb558b0a74ee6284fb",
          "face_id": "0839b921224816fb558b0a74ee6284fb",
          "liveness_score": 0.9634260269,
          "spoofing": 0.0001962436945,
          "quality": {
                "occlusion": {
                    "left_eye": 0,
                    "right_eye": 0,
                    "nose": 0,
                    "mouth": 0,
                    "left_cheek": 0,
                    "right_cheek": 0,
                    "chin_contour": 0
                },
                "blur": 0,
                "illumination": 114,
                "completeness": 1
            },
            "angle": {
                "yaw": 1.59,
                "pitch": 0.26,
                "roll": -5.46
            }
      },
      "pic_list": [ //默认返回8张图片
          {
              "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
              "face_token": "f043b6c7d202cb25e8dfc24fccf37553",
              "face_id": "f043b6c7d202cb25e8dfc24fccf37553",
              "liveness_score": 0.18,
              "spoofing": 0.000179775554,
              "quality": {
                "occlusion": {
                    "left_eye": 0,
                    "right_eye": 0,
                    "nose": 0,
                    "mouth": 0,
                    "left_cheek": 0,
                    "right_cheek": 0,
                    "chin_contour": 0
                },
                "blur": 0,
                "illumination": 114,
                "completeness": 1
            },
            "angle": {
                "yaw": 1.59,
                "pitch": 0.26,
                "roll": -5.46
            }
          },
          {
              "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
              "face_token": "d12b7e32069d337dc5d57cd3d15e2935",
              "face_id": "d12b7e32069d337dc5d57cd3d15e2935",
              "liveness_score": 0.06,
              "spoofing": 0.0002082588035,
              "quality": {
                "occlusion": {
                    "left_eye": 0,
                    "right_eye": 0,
                    "nose": 0,
                    "mouth": 0,
                    "left_cheek": 0,
                    "right_cheek": 0,
                    "chin_contour": 0
                },
                "blur": 0,
                "illumination": 114,
                "completeness": 1
            },
            "angle": {
                "yaw": 1.59,
                "pitch": 0.26,
                "roll": -5.46
            }
          },
          {
              "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
              "face_token": "6411f95f491fb665c389de03a33f12a4",
              "face_id": "6411f95f491fb665c389de03a33f12a4",
              "liveness_score": 0.06,
              "spoofing": 0.0001938246714,
              "quality": {
                "occlusion": {
                    "left_eye": 0,
                    "right_eye": 0,
                    "nose": 0,
                    "mouth": 0,
                    "left_cheek": 0,
                    "right_cheek": 0,
                    "chin_contour": 0
                },
                "blur": 0,
                "illumination": 114,
                "completeness": 1
            },
            "angle": {
                "yaw": 1.59,
                "pitch": 0.26,
                "roll": -5.46
            }
          },
          {
              "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
              "face_token": "d7fb09b7942555bf1e4b8d47a63c2e4b",
              "face_id": "d7fb09b7942555bf1e4b8d47a63c2e4b",
              "liveness_score": 0.05,
              "spoofing": 0.0001579090458
          },
          {
              "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
              "face_token": "b14f94951a1d1b0fb8770bb1ef2bf2e7",
              "face_id": "b14f94951a1d1b0fb8770bb1ef2bf2e7",
              "liveness_score": 0.05,
              "spoofing": 0.0001889262057,
              "quality": {
                "occlusion": {
                    "left_eye": 0,
                    "right_eye": 0,
                    "nose": 0,
                    "mouth": 0,
                    "left_cheek": 0,
                    "right_cheek": 0,
                    "chin_contour": 0
                },
                "blur": 0,
                "illumination": 114,
                "completeness": 1
            },
            "angle": {
                "yaw": 1.59,
                "pitch": 0.26,
                "roll": -5.46
            }
          },
          {
              "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
              "face_token": "f7f363d0e71e91906dbdcfec0573de70",
              "face_id": "f7f363d0e71e91906dbdcfec0573de70",
              "liveness_score": 0.05,
              "spoofing": 0.0001999060332,
              "quality": {
                "occlusion": {
                    "left_eye": 0,
                    "right_eye": 0,
                    "nose": 0,
                    "mouth": 0,
                    "left_cheek": 0,
                    "right_cheek": 0,
                    "chin_contour": 0
                },
                "blur": 0,
                "illumination": 114,
                "completeness": 1
            },
            "angle": {
                "yaw": 1.59,
                "pitch": 0.26,
                "roll": -5.46
            }
          },
          {
              "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
              "face_token": "388bdccbd70200f62c5f46a84b012691",
              "face_id": "388bdccbd70200f62c5f46a84b012691",
              "liveness_score": 0.04,
              "spoofing": 0.0001798788871,
              "quality": {
                "occlusion": {
                    "left_eye": 0,
                    "right_eye": 0,
                    "nose": 0,
                    "mouth": 0,
                    "left_cheek": 0,
                    "right_cheek": 0,
                    "chin_contour": 0
                },
                "blur": 0,
                "illumination": 114,
                "completeness": 1
            },
            "angle": {
                "yaw": 1.59,
                "pitch": 0.26,
                "roll": -5.46
            }
          },
          {
              "pic" : "gAQTGF2YzU4LjkyLjEwMAD", //图片base64编码后的值
              "face_token": "5fa4e1116f00912f66dba9b42a6a739e",
              "face_id": "5fa4e1116f00912f66dba9b42a6a739e",
              "liveness_score": 0.04,
              "spoofing": 0.0001976373605,
              "quality": {
                "occlusion": {
                    "left_eye": 0,
                    "right_eye": 0,
                    "nose": 0,
                    "mouth": 0,
                    "left_cheek": 0,
                    "right_cheek": 0,
                    "chin_contour": 0
                },
                "blur": 0,
                "illumination": 114,
                "completeness": 1
            },
            "angle": {
                "yaw": 1.59,
                "pitch": 0.26,
                "roll": -5.46
            }
          }
      ]
  },
  "timestamp": 1597148814,
  "cached": 0,
  "serverlogid": 1614796453,
  "error_code": 0,
  "error_msg": "SUCCESS"
}

活体阈值参考

请务必在产品侧做好以下条件限制

  • 检测的图片为二次采集,即通过相机当场拍摄,确保时间及操作条件的约束

关于活体检测faceliveness的判断阈值选择,可参考以下数值信息

阈值(Threshold)误拒率(FRR)通过率(TAR)攻击拒绝率(TRR))
0.050.01%99.99%97.75%
0.10.05%99.95%98.33%
0.3 (推荐0.1%99.9%98.82%
0.50.5%99.5%99.67%
0.91%99%99.77%

关于以上数值的概念介绍

  • 拒绝率(TRR):如99%,代表100次作弊假体攻击,会有99次被拒绝。
  • 误拒率(FRR):如0.5%,指1000次真人请求,会有5次因为活体分数低于阈值被错误拒绝。
  • 通过率(TAR):如99%,指100次真人请求,会有99次因为活体分数高于阈值而通过。
  • 阈值(Threshold):高于此数值,则可判断为活体。

合成图阈值参考

新推出合成图检测能力,在入参字段中增加spoofing参数,进行判断,若spoofing分值高于合成图推荐阈值,则可判断为合成图攻击

关于合成图检测spoofing的判断阈值选择,可参考以下数值信息

阈值误拒率(FRR)通过率(TAR)攻击拒绝率(TRR))
0.000235%95%94.93%
0.00048(推荐1%99%89.71%
0.000660.5%99.5%88.02%
0.001090.1%99.9%84.57%
0.001710.05%99.95%81.52%
0.005470.01%99.99%65.52%
  • 阈值(Threshold):高于此数值,则可判断为是合成图攻击。

错误码列表

错误码error_msg错误信息描述
216430rtse/face service errorrtse/face 服务异常请重新尝试
216431voice service error语音识别服务异常请重新尝试
216432video service call fail视频解析服务调用失败请重新尝试
216433video service error视频解析服务发生错误请重新尝试
216434liveness check fail活体检测失败请重新尝试
216500code digit error验证码位数错误验证码错误,
请增加一层验证环节
216501not found face没有找到人脸请查看上传视频是否包含人脸,可能因为人脸过大导致,建议用户调整距离重新录制视频
216502session lapse当前会话已失效请重新获取语音验证码
216505redis connect errorredis连接失败请重新尝试
216506redis operation errorredis操作失败请重新尝试
216507found many faces视频中有多张人脸请重新录制视频
216508not found video info没有找到视频信息请参考文档修改视频格式
216509voice can not identify视频中的声音无法识别
(声音过低或者有杂
音导致无法识别)
请重新录制视频
216908视频中人脸质量较差
(返回信息中包含具体原因)
视频中人脸质量过低
(返回的错误信息会包含
具体的错误信息包含
illumiantion(光照不足) angle(角度不好)
blur (人脸模糊) occlusion(有遮挡)
too large(人脸过大, 占屏幕2/3以上) 等原因
请重新录制视频
222027code length param error验证码长度错误
(最小值大于最大值)
参考API说明文档,修改参数
222028param[min_code_length] format error参数格式错误参考API说明文档,修改参数
222029param[max_code_length] format error参数格式错误参考API说明文档,修改参数
222030param[match_threshold] format error参数格式错误参考API说明文档,修改参数

二、实时活体检测方案

如您需要使用实时的活体检测方式,即无需用户录制并上传视频,直接在前端实时完成活体检测流程,以提升整体核验流程的流畅度及用户体验。可通过H5实名认证方案进行接入。您可根据您的业务环境选择APP方案接入或H5方案接入。

注: 此实时检测能力暂不支持纯服务端接入的方式。如您需要使用此能力,需通过H5实名认证方案进行接入。

如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:

  • 在百度云控制台内 提交工单,咨询问题类型请选择人工智能服务
  • 如有需要讨论的疑问,欢迎进入 AI社区 与其他开发者们一同交流。


这条帮助是否解决了您的问题? 已解决 未解决

提交成功!非常感谢您的反馈,我们会继续努力做到更好! 很抱歉未能解决您的疑问。我们已收到您的反馈意见,同时会及时作出反馈处理!