人脸识别

    人脸搜索

    人脸识别接口分为V2和V3两个版本,本文档为V3版本接口的说明文档,请确认您在百度云后台获得的是V3版本接口权限,再来阅读本文档。

    辨别接口版本的方法是:在百度云后台进入【应用列表】,点击【应用名称】,在【API列表】中可以看到【请求地址】,若请求地址中带有【v3】标识,则您具有的是v3权限,可以阅读本文档;若请求地址中带有【v2】标识,则您具有的是v2权限,应该去阅读v2文档。 如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:

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

    人脸搜索

    能力介绍

    业务能力

    • 人脸搜索:也称为1:N识别,在指定人脸集合中,找到最相似的人脸;
    • 人脸搜索 M:N识别:也称为M:N识别,待识别图片中含有多个人脸时,在指定人脸集合中,找到这多个人脸分别最相似的人脸

    M:N识别的原理,相当于在多个人脸的图片中,先分别找出所有人脸,然后分别在待查找的人脸集合中,分别做1:N识别,最后将识别结果汇总在一起进行返回。

    提示:进行人脸查找相关操作前,建议先阅读 人脸库管理 相关内容。

    调用方式

    请求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】'
    <?php
    function request_post($url = '', $param = '') {
            if (empty($url) || empty($param)) {
                return false;
            }
            
            $postUrl = $url;
            $curlPost = $param;
            $curl = curl_init();//初始化curl
            curl_setopt($curl, CURLOPT_URL,$postUrl);//抓取指定网页
            curl_setopt($curl, CURLOPT_HEADER, 0);//设置header
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
            curl_setopt($curl, CURLOPT_POST, 1);//post提交方式
            curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
            $data = curl_exec($curl);//运行curl
            curl_close($curl);
            
            return $data;
        }
    
        $url = 'https://aip.baidubce.com/oauth/2.0/token';
        $post_data['grant_type']       = 'client_credentials';
        $post_data['client_id']      = '你的 Api Key';
        $post_data['client_secret'] = '你的 Secret Key';
        $o = "";
        foreach ( $post_data as $k => $v ) 
        {
            $o.= "$k=" . urlencode( $v ). "&" ;
        }
        $post_data = substr($o,0,-1);
        
        $res = request_post($url, $post_data);
    
        var_dump($res);
    
    ?>
    package com.baidu.ai.aip.auth;
    
    import org.json.JSONObject;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 获取token类
     */
    public class AuthService {
    
        /**
         * 获取权限token
         * @return 返回示例:
         * {
         * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
         * "expires_in": 2592000
         * }
         */
        public static String getAuth() {
            // 官网获取的 API Key 更新为你注册的
            String clientId = "百度云应用的AK";
            // 官网获取的 Secret Key 更新为你注册的
            String clientSecret = "百度云应用的SK";
            return getAuth(clientId, clientSecret);
        }
    
        /**
         * 获取API访问token
         * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
         * @param ak - 百度云官网获取的 API Key
         * @param sk - 百度云官网获取的 Securet Key
         * @return assess_token 示例:
         * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
         */
        public static String getAuth(String ak, String sk) {
            // 获取token地址
            String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
            String getAccessTokenUrl = authHost
                    // 1. grant_type为固定参数
                    + "grant_type=client_credentials"
                    // 2. 官网获取的 API Key
                    + "&client_id=" + ak
                    // 3. 官网获取的 Secret Key
                    + "&client_secret=" + sk;
            try {
                URL realUrl = new URL(getAccessTokenUrl);
                // 打开和URL之间的连接
                HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
                connection.setRequestMethod("GET");
                connection.connect();
                // 获取所有响应头字段
                Map<String, List<String>> map = connection.getHeaderFields();
                // 遍历所有的响应头字段
                for (String key : map.keySet()) {
                    System.err.println(key + "--->" + map.get(key));
                }
                // 定义 BufferedReader输入流来读取URL的响应
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String result = "";
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
                /**
                 * 返回结果示例
                 */
                System.err.println("result:" + result);
                JSONObject jsonObject = new JSONObject(result);
                String access_token = jsonObject.getString("access_token");
                return access_token;
            } catch (Exception e) {
                System.err.printf("获取token失败!");
                e.printStackTrace(System.err);
            }
            return null;
        }
    
    }
     # encoding:utf-8
    import requests 
    
    # client_id 为官网获取的AK, client_secret 为官网获取的SK
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
    response = requests.get(host)
    if response:
        print(response.json())
    #include <iostream>
    #include <curl/curl.h>
    #include <json/json.h>
    #include "access_token.h"
    // libcurl库下载链接:https://curl.haxx.se/download.html
    // jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
    // 获取access_token所需要的url
    const std::string access_token_url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials";
    // 回调函数获取到的access_token存放变量
    // static std::string access_token_result;
    /**
     * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在result中
     * @param 参数定义见libcurl库文档
     * @return 返回值定义见libcurl库文档
     */
    static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
        // 获取到的body存放在ptr中,先将其转换为string格式
        std::string s((char *) ptr, size * nmemb);
        // 开始获取json中的access token项目
        Json::Reader reader;
        Json::Value root;
        // 使用boost库解析json
        reader.parse(s,root);
        std::string* access_token_result = static_cast<std::string*>(stream);
        *access_token_result = root["access_token"].asString();
        return size * nmemb;
    }
    
    /**
     * 用以获取access_token的函数,使用时需要先在百度云控制台申请相应功能的应用,获得对应的API Key和Secret Key
     * @param access_token 获取得到的access token,调用函数时需传入该参数
     * @param AK 应用的API key
     * @param SK 应用的Secret key
     * @return 返回0代表获取access token成功,其他返回值代表获取失败
     */
    int get_access_token(std::string &access_token, const std::string &AK, const std::string &SK) {
        CURL *curl;
        CURLcode result_code;
        int error_code = 0;
        curl = curl_easy_init();
        if (curl) {
            std::string url = access_token_url + "&client_id=" + AK + "&client_secret=" + SK;
            curl_easy_setopt(curl, CURLOPT_URL, url.data());
            curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
            curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
            std::string access_token_result;
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &access_token_result);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
            result_code = curl_easy_perform(curl);
            if (result_code != CURLE_OK) {
                fprintf(stderr, "curl_easy_perform() failed: %s\n",
                        curl_easy_strerror(result_code));
                return 1;
            }
            access_token = access_token_result;
            curl_easy_cleanup(curl);
            error_code = 0;
        } else {
            fprintf(stderr, "curl_easy_init() failed.");
            error_code = 1;
        }
        return error_code;
    }
    using System;
    using System.Collections.Generic;
    using System.Net.Http;
    
    namespace com.baidu.ai
    {
        public static class AccessToken
    
        {
            // 调用getAccessToken()获取的 access_token建议根据expires_in 时间 设置缓存
            // 返回token示例
            public static String TOKEN = "24.adda70c11b9786206253ddb70affdc46.2592000.1493524354.282335-1234567";
    
            // 百度云中开通对应服务应用的 API Key 建议开通应用的时候多选服务
            private static String clientId = "百度云应用的AK";
            // 百度云中开通对应服务应用的 Secret Key
            private static String clientSecret = "百度云应用的SK";
    
            public static String getAccessToken() {
                String authHost = "https://aip.baidubce.com/oauth/2.0/token";
                HttpClient client = new HttpClient();
                List<KeyValuePair<String, String>> paraList = new List<KeyValuePair<string, string>>();
                paraList.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
                paraList.Add(new KeyValuePair<string, string>("client_id", clientId));
                paraList.Add(new KeyValuePair<string, string>("client_secret", clientSecret));
    
                HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
                String result = response.Content.ReadAsStringAsync().Result;
                Console.WriteLine(result);
                return result;
            }
        }
    }
    var https = require('https');
    var qs = require('querystring');
    
    const param = qs.stringify({
        'grant_type': 'client_credentials',
        'client_id': '您的 Api Key',
        'client_secret': '您的 Secret Key'
    });
    
    https.get(
        {
            hostname: 'aip.baidubce.com',
            path: '/oauth/2.0/token?' + param,
            agent: false
        },
        function (res) {
            // 在标准输出中查看运行结果
            res.pipe(process.stdout);
        }
    );

    注意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鉴权方式发送请求,虽然请求方式鉴权方法和本文所介绍的不同,但请求参数和返回结果一致。

    请求说明

    注意事项

    • 请求体格式化:Content-Type为application/json,通过json格式化请求体。
    • Base64编码:请求的图片需经过Base64编码,图片的base64编码指将图片数据编码成一串字符串,使用该字符串代替图像地址。您可以首先得到图片的二进制,然后用Base64格式编码即可。需要注意的是,图片的base64编码是不包含图片头的,如data:image/jpg;base64,
    • 图片格式:现支持PNG、JPG、JPEG、BMP,不支持GIF图片
    • 人脸识别接口分为V2和V3两个版本,本文档为V3版本接口的说明文档,请确认您在百度云后台获得的是V3版本接口权限,再来阅读本文档。

    辨别接口版本的方法是:在百度云后台进入【应用列表】,点击【应用名称】,在【API列表】中可以看到【请求地址】,若请求地址中带有【v3】标识,则您具有的是v3权限,可以阅读本文档;若请求地址中带有【v2】标识,则您具有的是v2权限,应该去阅读v2文档。

    请求示例

    HTTP方法:POST

    请求URL: https://aip.baidubce.com/rest/2.0/face/v3/search

    URL参数:

    参数
    access_token 通过API Key和Secret Key获取的access_token,参考“Access Token获取

    Header如下:

    参数
    Content-Type application/json

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

    请求参数

    参数 必选 类型 说明
    image string 图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断
    image_type string 图片类型
    BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
    URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
    FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。
    group_id_list string 从指定的group中进行查找 用逗号分隔,上限10个
    quality_control string 图片质量控制
    NONE: 不进行控制
    LOW:较低的质量要求
    NORMAL: 一般的质量要求
    HIGH: 较高的质量要求
    默认 NONE
    若图片质量不满足要求,则返回结果中会提示质量检测失败
    liveness_control string 活体检测控制
    NONE: 不进行控制
    LOW:较低的活体要求(高通过率 低攻击拒绝率)
    NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
    HIGH: 较高的活体要求(高攻击拒绝率 低通过率)
    默认NONE
    若活体检测结果不满足要求,则返回结果中会提示活体检测失败
    user_id string 当需要对特定用户进行比对时,指定user_id进行比对。即人脸认证功能。
    max_user_num unit32 查找后返回的用户数量。返回相似度最高的几个用户,默认为1,最多返回50个。

    说明:如果使用base 64格式的图片,两张请求的图片请分别进行base64编码。

    示例代码

    提示一:使用示例代码前,请记得替换其中的示例Token、图片地址或Base64信息。

    提示二:部分语言依赖的类或库,请在代码注释中查看下载地址。

    人脸搜索
    curl -i -k 'https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=【调用鉴权接口获取的token】' --data '{"image":"027d8308a2ec665acb1bdf63e513bcb9","image_type":"FACE_TOKEN","group_id_list":"group_repeat,group_233","quality_control":"LOW","liveness_control":"NORMAL"}' -H 'Content-Type:application/json; charset=UTF-8'
    <?php
    /**
     * 发起http post请求(REST API), 并获取REST请求的结果
     * @param string $url
     * @param string $param
     * @return - http response body if succeeds, else false.
     */
    function request_post($url = '', $param = '')
    {
        if (empty($url) || empty($param)) {
            return false;
        }
    
        $postUrl = $url;
        $curlPost = $param;
        // 初始化curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $postUrl);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        // 要求结果为字符串且输出到屏幕上
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        // post提交方式
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
        // 运行curl
        $data = curl_exec($curl);
        curl_close($curl);
    
        return $data;
    }
    
    $token = '[调用鉴权接口获取的token]';
    $url = 'https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=' . $token;
    $bodys = "{\"image\":\"027d8308a2ec665acb1bdf63e513bcb9\",\"image_type\":\"FACE_TOKEN\",\"group_id_list\":\"group_repeat,group_233\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}"
    $res = request_post($url, $bodys);
    
    var_dump($res);
    package com.baidu.ai.aip;
    
    import com.baidu.ai.aip.utils.HttpUtil;
    import com.baidu.ai.aip.utils.GsonUtils;
    
    import java.util.*;
    
    /**
    * 人脸搜索
    */
    public class FaceSearch {
    
        /**
        * 重要提示代码中所需工具类
        * FileUtil,Base64Util,HttpUtil,GsonUtils请从
        * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
        * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
        * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
        * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
        * 下载
        */
        public static String faceSearch() {
            // 请求url
            String url = "https://aip.baidubce.com/rest/2.0/face/v3/search";
            try {
                Map<String, Object> map = new HashMap<>();
                map.put("image", "027d8308a2ec665acb1bdf63e513bcb9");
                map.put("liveness_control", "NORMAL");
                map.put("group_id_list", "group_repeat,group_233");
                map.put("image_type", "FACE_TOKEN");
                map.put("quality_control", "LOW");
    
                String param = GsonUtils.toJson(map);
    
                // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
                String accessToken = "[调用鉴权接口获取的token]";
    
                String result = HttpUtil.post(url, accessToken, "application/json", param);
                System.out.println(result);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static void main(String[] args) {
            FaceSearch.faceSearch();
        }
    }
    # encoding:utf-8
    
    import requests
    
    '''
    人脸搜索
    '''
    
    request_url = "https://aip.baidubce.com/rest/2.0/face/v3/search"
    
    params = "{\"image\":\"027d8308a2ec665acb1bdf63e513bcb9\",\"image_type\":\"FACE_TOKEN\",\"group_id_list\":\"group_repeat,group_233\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}"
    access_token = '[调用鉴权接口获取的token]'
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/json'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        print (response.json())
    #include <iostream>
    #include <curl/curl.h>
    
    // libcurl库下载链接:https://curl.haxx.se/download.html
    // jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
    const static std::string request_url = "https://aip.baidubce.com/rest/2.0/face/v3/search";
    static std::string faceSearch_result;
    /**
     * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在全局的静态变量当中
     * @param 参数定义见libcurl文档
     * @return 返回值定义见libcurl文档
     */
    static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
        // 获取到的body存放在ptr中,先将其转换为string格式
        faceSearch_result = std::string((char *) ptr, size * nmemb);
        return size * nmemb;
    }
    /**
     * 人脸搜索
     * @return 调用成功返回0,发生错误返回其他错误码
     */
    int faceSearch(std::string &json_result, const std::string &access_token) {
        std::string url = request_url + "?access_token=" + access_token;
        CURL *curl = NULL;
        CURLcode result_code;
        int is_success;
        curl = curl_easy_init();
        if (curl) {
            curl_easy_setopt(curl, CURLOPT_URL, url.data());
            curl_easy_setopt(curl, CURLOPT_POST, 1);
            curl_slist *headers = NULL;
            headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");
            curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
            curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"image\":\"027d8308a2ec665acb1bdf63e513bcb9\",\"image_type\":\"FACE_TOKEN\",\"group_id_list\":\"group_repeat,group_233\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}");
            result_code = curl_easy_perform(curl);
            if (result_code != CURLE_OK) {
                fprintf(stderr, "curl_easy_perform() failed: %s\n",
                        curl_easy_strerror(result_code));
                is_success = 1;
                return is_success;
            }
            json_result = faceSearch_result;
            curl_easy_cleanup(curl);
            is_success = 0;
        } else {
            fprintf(stderr, "curl_easy_init() failed.");
            is_success = 1;
        }
        return is_success;
    }
    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Web;
    
    namespace com.baidu.ai
    {
        public class FaceSearch
        {
            // 人脸搜索
            public static string faceSearch()
            {
                string token = "[调用鉴权接口获取的token]";
                string host = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=" + token;
                Encoding encoding = Encoding.Default;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
                request.Method = "post";
                request.KeepAlive = true;
                String str = "{\"image\":\"027d8308a2ec665acb1bdf63e513bcb9\",\"image_type\":\"FACE_TOKEN\",\"group_id_list\":\"group_repeat,group_233\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}";
                byte[] buffer = encoding.GetBytes(str);
                request.ContentLength = buffer.Length;
                request.GetRequestStream().Write(buffer, 0, buffer.Length);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
                string result = reader.ReadToEnd();
                Console.WriteLine("人脸搜索:");
                Console.WriteLine(result);
                return result;
            }
        }
    }

    返回说明

    返回参数

    • 返回结果
    字段 必选 类型 说明
    face_token string 人脸标志
    user_list array 匹配的用户信息列表
    +group_id string 用户所属的group_id
    +user_id string 用户的user_id
    +user_info string 注册用户时携带的user_info
    +score float 用户的匹配得分,推荐阈值80分
    • 返回示例
      {
        "face_token": "fid",
        "user_list": [  
           {
              "group_id" : "test1",
              "user_id": "u333333",
              "user_info": "Test User",
              "score": 99.3  
          }
        ]
      }
    • 质量控制参数说明

    不同的控制度下所对应的质量控制阈值,如果检测出来的质量信息某一项不符合控制阈值的要求,则会返回错误信息。

    遮挡情况的阈值

    控制度 left_eye right_eye nose mouth left_cheek right_cheek chin_contour
    LOW 0.8 0.8 0.8 0.8 0.8 0.8 0.8
    NORMAL 0.6 0.6 0.6 0.6 0.6 0.6 0.6
    HIGH 0.2 0.2 0.2 0.2 0.2 0.2 0.2

    模糊度、完整度的阈值

    控制度 illumination blurdegree completeness
    LOW 20 0.8 0
    NORMAL 40 0.6 0
    HIGH 100 0.2 1

    活体控制参数说明

    不同的控制度下所对应的活体控制阈值,如果检测出来的活体分数小于控制阈值,则会返回错误信息。

    控制度 阈值 说明
    LOW 0.05 活体误拒率:万分之一;拒绝率:63.9%
    NORMAL 0.3 活体误拒率:千分之一;拒绝率:90.3%
    HIGH 0.9 活体误拒率:百分之一;拒绝率:97.6%

    1、误拒率: 把真人识别为假人的概率. 阈值越高,安全性越高, 要求也就越高, 对应的误识率就越高 2、通过率=1-误拒率

    关于以上数值的概念介绍:

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

    人脸搜索 M:N 识别

    待识别的图片中,存在多张人脸的情况下,支持在一个人脸库中,一次请求,同时返回图片中所有人脸的识别结果。

    人脸搜索 M:N 识别,每次请求的并发是 M,相当于进行 M 次 1:N 搜索识别

    请求说明

    注意事项

    • 请求体格式化:Content-Type为application/json,通过json格式化请求体。
    • Base64编码:请求的图片需经过Base64编码,图片的base64编码指将图片数据编码成一串字符串,使用该字符串代替图像地址。您可以首先得到图片的二进制,然后用Base64格式编码即可。需要注意的是,图片的base64编码是不包含图片头的,如data:image/jpg;base64,
    • 图片格式:现支持PNG、JPG、JPEG、BMP,不支持GIF图片
    • 人脸识别接口分为V2和V3两个版本,本文档为V3版本接口的说明文档,请确认您在百度云后台获得的是V3版本接口权限,再来阅读本文档。

    辨别接口版本的方法是:在百度云后台进入【应用列表】,点击【应用名称】,在【API列表】中可以看到【请求地址】,若请求地址中带有【v3】标识,则您具有的是v3权限,可以阅读本文档;若请求地址中带有【v2】标识,则您具有的是v2权限,应该去阅读v2文档。

    请求示例

    HTTP方法:POST

    请求URL: https://aip.baidubce.com/rest/2.0/face/v3/multi-search

    URL参数:

    参数
    access_token 通过API Key和Secret Key获取的access_token,参考“Access Token获取

    Header如下:

    参数
    Content-Type application/json

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

    请求参数

    参数 必选 类型 说明
    image string 图片信息(数据大小应小于10M 分辨率应小于1920*1080)
    image_type string 图片类型
    BASE64:图片的base64值;
    URL:图片的 URL( 下载图片时可能由于网络原因导致下载图片时间过长)
    FACE_TOKEN: face_token 人脸标识
    group_id_list string 从指定的group中进行查找 用逗号分隔,上限10个
    max_face_num int 最多处理人脸的数目
    默认值为1(仅检测图片中面积最大的那个人脸) 最大值10
    match_threshold int 匹配阈值(设置阈值后,score低于此阈值的用户信息将不会返回) 最大100 最小0 默认80
    此阈值设置得越高,检索速度将会越快,推荐使用默认阈值80
    quality_control string 质量控制(质量不符合要求的人脸不会出现在返回结果中)
    NONE: 不进行控制
    LOW:较低的质量要求
    NORMAL: 一般的质量要求
    HIGH: 较高的质量要求
    默认NONE
    liveness_control string 活体控制(活体分数不符合要求的人脸不会出现在返回结果中)
    NONE: 不进行控制
    LOW:较低的活体要求(高通过率 低攻击拒绝率)
    NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
    HIGH: 较高的活体要求(高攻击拒绝率 低通过率)
    默认NONE
    max_user_num unit32 识别返回的最大用户数,默认为1,最大20个

    请求示例

    {
        "image": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKD...",
        "image_type": "BASE64",
        "group_id_list": "group1",
        "max_face_num" : 5,
        "quality_control": "LOW",
        "liveness_control": "NORMAL"
    }

    返回说明

    返回参数

    字段 必选 类型 说明
    face_num int 图片中的人脸数量
    face_list array 人脸信息列表
    +face_token string 人脸标志
    +location array 人脸在图片中的位置
    ++left double 人脸区域离左边界的距离
    ++top double 人脸区域离上边界的距离
    ++width double 人脸区域的宽度
    ++height double 人脸区域的高度
    ++rotation int64 人脸框相对于竖直方向的顺时针旋转角,[-180,180]
    +user_list array 匹配的用户信息列表
    ++group_id string 用户所属的group_id
    ++user_id string 用户的user_id
    ++user_info string 注册用户时携带的user_info
    ++score float 用户的匹配得分
    80分以上可以判断为同一人,此分值对应万分之一误识率

    返回示例

     {
         "error_code": 0,
         "error_msg": "SUCCESS",
         "log_id": 240483475,
         "timestamp": 1535533440,
         "cached": 0,
         "result": {
             "face_num": 2,
             "face_list": [
                 {
                     "face_token": "6fe19a6ee0c4233db9b5bba4dc2b9233",
                     "location": {
                         "left": 31.95568085,
                         "top": 120.3764267,
                         "width": 87,
                         "height": 85,
                         "rotation": -5
                     },
                     "user_list": [
                         {
                             "group_id": "group1",
                             "user_id": "5abd24fd062e49bfa906b257ec40d284",
                             "user_info": "userinfo1",
                             "score": 69.85684967041
                         },
                         {
                             "group_id": "group1",
                             "user_id": "2abf89cffb31473a9948268fde9e1c3f",
                             "user_info": "userinfo2",
                             "score": 66.586112976074
                         }
                     ]
                 },
                 {
                     "face_token": "fde61e9c074f48cf2bbb319e42634f41",
                     "location": {
                         "left": 219.4467773,
                         "top": 104.7486954,
                         "width": 81,
                         "height": 77,
                         "rotation": 3
                     },
                     "user_list": [
                         {
                             "group_id": "group1",
                             "user_id": "088717532b094c3990755e91250adf7d",
                             "user_info": "userinfo",
                             "score": 65.154159545898
                         }
                     ]
                 }
             ]
         }
     }
    • 质量控制参数说明

    不同的控制度下所对应的质量控制阈值,如果检测出来的质量信息某一项不符合控制阈值的要求,则会返回错误信息。

    遮挡情况的阈值

    控制度 left_eye right_eye nose mouth left_cheek right_cheek chin_contour
    LOW 0.8 0.8 0.8 0.8 0.8 0.8 0.8
    NORMAL 0.6 0.6 0.6 0.6 0.6 0.6 0.6
    HIGH 0.2 0.2 0.2 0.2 0.2 0.2 0.2

    模糊度、完整度的阈值

    控制度 illumination blurdegree completeness
    LOW 20 0.8 0
    NORMAL 40 0.6 0
    HIGH 100 0.2 1

    活体控制参数说明

    不同的控制度下所对应的活体控制阈值,如果检测出来的活体分数小于控制阈值,则会返回错误信息。

    控制度 阈值 说明
    LOW 0.05 活体误拒率:万分之一;拒绝率:97.75%
    NORMAL 0.3 活体误拒率:千分之一;拒绝率:98.82%
    HIGH 0.9 活体误拒率:百分之一;拒绝率:99.77%

    1、误拒率: 把真人识别为假人的概率. 阈值越高,安全性越高, 要求也就越高, 对应的误识率就越高
    2、通过率=1-误拒率

    关于以上数值的概念介绍:

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

    错误码

    请参考人脸识别错误码

    上一篇
    人脸对比
    下一篇
    人脸库管理