zoukankan      html  css  js  c++  java
  • 借助百度云API进行人脸识别

    前言:本篇博客是笔者第一次使用百度云api进行人脸检测,主要内容包括两部分,一是获取接口,二是借助接口进行人脸检测。笔者也是初步了解这方面的内容,也是参考了杂七杂八的博文,内容可能存在错误及其他毛病,欢迎指出。

    1:在百度AI里面创建应用

    在百度AI开放平台使用百度的人脸识别能力,只需要三个核心步骤即可操作完成:

    • 获取接口权限
    • 准备接口调用工具
    • 进行接口调用。

    获取接口权限

    获取接口权限是调用接口的前提,主要分为以下几步:

    1、进入百度云的人脸识别控制台

    地址:

    https://console.bce.baidu.com/ai/?_=1528192333418&fromai=1#/ai/face/overview/index

    若没有百度账号,可以用手机号快速注册一个。

    2、创建人脸识别应用

    账号登录成功,您需要创建应用才可正式调用AI能力。应用是您调用API服务的基本操作单元,您可以基于应用创建成功后获取的API Key及Secret Key,进行接口调用操作,及相关配置。

    创建应用,填写【应用名称】和【应用描述】,即可创建应用(其他选项可以不做操作,使用默认值即可)

    创建完成后,点击“返回应用列表”进行下一步操作。

    3、获取秘钥

    在您创建完毕应用后,平台将会分配给您此应用的相关凭证:API Key、Secret Key。使用秘钥将可以在下一步中获取调用接口所需的Access Token。

    获取调用接口所需的Access Token

    人脸识别在线接口主要针对HTTP API调用者,,调用API时必须在URL中带上accesss_token参数,获取Access Token的流程如下:

    A、如果您使用的是mac电脑可以将此示例代码复制到“终端”上直接获取token。示例代码如下:

    #!/bin/bash curl -i -k'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【API Key】&client_secret=【Seceret Key】

    B、非Mac电脑操作流程如下,参考文档:http://ai.baidu.com/docs#/Auth/top

    获取Access Token

    请求URL数据格式

    向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:

    • grant_type: 必须参数,固定为client_credentials;
    • client_id: 必须参数,应用的API Key;
    • client_secret: 必须参数,应用的Secret Key;

    例如:

    https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&

    服务器返回的JSON文本参数如下:

    • access_token: 要获取的Access Token;
    • expires_in: Access Token的有效期(秒为单位,一般为1个月);
    • 其他参数忽略,暂时不用;

    例如:

    {
        "refresh_token": "25.b55fe1d287227ca97aab219bb249b8ab.315360000.1798284651.282335-8574074",
        "expires_in": 2592000,
        "scope": "public wise_adapt",
        "session_key": "9mzdDZXu3dENdFZQurfg0Vz8slgSgvvOAUebNFzyzcpQ5EnbxbF+hfG9DQkpUVQdh4p6HbQcAiz5RmuBAja1JJGgIdJI",
        "access_token": "24.6c5e1ff107f0e8bcef8c46d3424a0e78.2592000.1485516651.282335-8574074",
        "session_secret": "dfac94a3489fe9fca7c3221cbf7525ff"
    }

    若请求错误,服务器将返回的JSON文本包含以下参数:

    • error: 错误码;关于错误码的详细信息请参考下方鉴权认证错误码。
    • error_description: 错误描述信息,帮助理解和解决发生的错误。



    例如认证失败返回:

    {
        "error": "invalid_client",
        "error_description": "unknown client id"
    }

    保存获取到的Access Token,在调用接口时会用到。

    2、  准备接口调用工具

    Postman是一个比较给力的Http请求模拟工具,可以快速进行接口调用。

    没有安装的小伙伴可以?下方 嘿 顺便把它还学了一遍

    程序员必备工具:PostMan

    安装结束后进入主界面

    如下图,这就是Postman的主界面。

    4、  进行调用接口

    在postman上可以快速进行接口请求,调用人脸识别接口需要输入正确的接口地址,提前准备人脸图片,具体如下:

    输入请求地址

    可直接复制的请求地址:“https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=【在第一步中获取的access-token】”

    注:需要将请求格式切换为“Post”

    修改请求头(header)

    Key栏输入:Content-Type

    Value栏输入:application/x-www-form-urlencoded

    输入请求参数(body)

    先选择“x-www-form-urlencoded”,然后参考下图输入参数:

    • image_type=BASE64
    • image=图片的base64转码后的结果(此处要使用即将注册到人脸库的人脸图片),转码工具:https://tool.css-js.com/base64.html(注意:在base64转码工具中,要取消默认选项“包含头”)
    • group_id=gropu001(可自定义:由数字、字母、下划线组成)
    • user_id=0001(可自定义:由数字、字母、下划线组成)

    注意:在base64转码工具中,要取消默认选项“包含头”

    开始请求

    点击右上角的“send”,即可请求成功。

    验证调用结果

    进入百度云后台的人脸库可视化管理界面,点击人脸库名称并逐级进入到人脸维度,即可看到注册成功的人脸图片(注:调用在线API接口添加用户后,会延迟几分钟再展示到此页面,如果没更新,请勿着急)

    2调用api进行人脸对比。

     1 package Test1;
     2 
     3 import com.baidu.aip.face.AipFace;
     4 import com.baidu.aip.face.MatchRequest;
     5 import com.baidu.aip.util.Base64Util;
     6 import com.google.common.collect.Lists;
     7 import org.apache.commons.io.FileUtils;
     8 import org.json.JSONObject;
     9 
    10 import java.io.File;
    11 import java.io.IOException;
    12 import java.util.List;
    13 
    14 /**
    15  * 人脸对比
    16  */
    17 public class BaiduFaceTest {
    18 
    19 // 这里填写你自己应用的三项
    20     public static final String APP_ID = "16090420";
    21     public static final String API_KEY = "iinpWTE1pvOnH3YNmk4tG5Z6";
    22     public static final String SECRET_KEY = "LMl3pgidH2AzGcTnOM3qh1x3GFnh6jt5";
    23 
    24 
    25 
    26     public static void main(String[] args) throws IOException {
    27         AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
    28 
    29         String image1 = "C:\Users\19575\Pictures\Saved Pictures\紫霞仙子\a.jpg";
    30         String image2 = "C:\Users\19575\Pictures\Saved Pictures\紫霞仙子\b.jpg";
    31 
    32 
    33         byte[] b1 = FileUtils.readFileToByteArray(new File(image1));
    34         byte[] b2 = FileUtils.readFileToByteArray(new File(image2));
    35 
    36 
    37         String s1 = Base64Util.encode(b1);
    38         String s2 = Base64Util.encode(b2);
    39 
    40 
    41 
    42         MatchRequest req1 = new MatchRequest(s1, "BASE64");
    43         MatchRequest req2 = new MatchRequest(s2, "BASE64");
    44 
    45         List<MatchRequest> list = Lists.newArrayList();
    46         list.add(req1);
    47         list.add(req2);
    48 
    49         JSONObject rs = client.match(list);
    50         System.out.println(rs.toString(2));
    51 
    52     }
    53 
    54 }
    View Code

    该代码要导入百度云的sdk,这是我用的sdk链接:https://files.cnblogs.com/files/henuliulei/aip-java-sdk-4.11.1.zip

    以及用到的另外两个jar包

    用到的两张图片如下,都是紫霞仙子
     

     

    程序运行结果如下:

    {
      "result": {
        "score": 94.56459045,
        "face_list": [
          {"face_token": "7e88487df6dba99d358a14e503ae54c4"},
          {"face_token": "ec1a03aba650adc1a7a9fcaca62a0414"}
        ]
      },
      "log_id": 305486860102237231,
      "error_msg": "SUCCESS",
      "cached": 0,
      "error_code": 0,
      "timestamp": 1556010223
    }

    得分为94点多,所以基本可以判定两张图片是同一个人脸(一般得分大于80就可以认为是同一个人)

    3:调用api进行人脸匹配(就是在一堆图片中看有没有要被匹配的图片)

    代码:

     1 package Test1;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.IOException;
     5 import java.io.InputStream;
     6 import java.util.HashMap;
     7 
     8 import org.json.JSONObject;
     9 
    10 import com.baidu.aip.face.AipFace;
    11 
    12 import sun.misc.BASE64Encoder;
    13 
    14 /**
    15  * 人脸对比
    16  */
    17 public class BaiduFaceTest {
    18 
    19 // 这里填写你自己应用的三项
    20     public static final String APP_ID = "16090420";
    21     public static final String API_KEY = "iinpWTE1pvOnH3YNmk4tG5Z6";
    22     public static final String SECRET_KEY = "LMl3pgidH2AzGcTnOM3qh1x3GFnh6jt5";
    23 
    24 
    25 
    26     public static void main(String[] args) throws IOException {
    27         AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
    28 
    29         String image1 = "C:\Users\19575\Pictures\Saved Pictures\紫霞仙子\c.jpg";
    30         System.out.println(image1);
    31         String image2 = "C:\Users\19575\Pictures\Saved Pictures\紫霞仙子\b.jpg";
    32        
    33         String msg=GetImageStr(image1);
    34           JSONObject rs = client.search(msg, "BASE64", "group002", new HashMap<>());
    35        // JSONObject rs=client.detect(image1, "URL", new HashMap<>());
    36         System.out.println(rs.toString(2));
    37 
    38     }
    39     public static String GetImageStr(String imgFile)  
    40     {//将图片文件转化为字节数组字符串,并对其进行Base64编码处理  
    41         InputStream in = null;  
    42         byte[] data = null;  
    43         //读取图片字节数组  
    44         try   
    45         {  
    46             in = new FileInputStream(imgFile);          
    47             data = new byte[in.available()];  
    48             in.read(data);  
    49             in.close();  
    50         }   
    51         catch (IOException e)   
    52         {  
    53             e.printStackTrace();  
    54         }  
    55         //对字节数组Base64编码  
    56         BASE64Encoder encoder = new BASE64Encoder();  
    57         return encoder.encode(data);//返回Base64编码过的字节数组字符串  
    58     }  
    59 
    60 
    61 }
    View Code
     1 {
     2   "result": {
     3     "face_token": "93299a14e0a246dcc5b4cc5484341ea4",
     4     "user_list": [{
     5       "score": 100,
     6       "group_id": "group002",
     7       "user_id": "user1",
     8       "user_info": ""
     9     }]
    10   },
    11   "log_id": 305486860288576101,
    12   "error_msg": "SUCCESS",
    13   "cached": 0,
    14   "error_code": 0,
    15   "timestamp": 1556028857
    16 }

    结果满分,说明存在,同时"group_id": "group002","user_id": "user1",指明了具体的位置。

    个人表示在实现上个代码花了很长时间,遇到了各种错误,其中最主要的还是下面两种。

    1:使用identifyUser()报错

    解决办法已经在我这篇博客讲明:https://www.cnblogs.com/henuliulei/p/10759473.html

    2:即使用和库里面相同的图片,检测结果也是0,

    解决办法已经在我这篇博客讲明:https://www.cnblogs.com/henuliulei/p/10759567.html

     4:调用api进行人脸检测

     1 package Test1;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.IOException;
     5 import java.io.InputStream;
     6 import java.util.HashMap;
     7 
     8 import org.json.JSONObject;
     9 
    10 import com.baidu.aip.face.AipFace;
    11 
    12 import sun.misc.BASE64Encoder;
    13 
    14 /**
    15  * 人脸对比
    16  */
    17 public class BaiduFaceTest {
    18 
    19 // 这里填写你自己应用的三项
    20     public static final String APP_ID = "16090420";
    21     public static final String API_KEY = "iinpWTE1pvOnH3YNmk4tG5Z6";
    22     public static final String SECRET_KEY = "LMl3pgidH2AzGcTnOM3qh1x3GFnh6jt5";
    23 
    24 
    25 
    26     public static void main(String[] args) throws IOException {
    27         AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
    28 
    29         String image1 = "C:\Users\19575\Pictures\Saved Pictures\紫霞仙子\b.jpg";
    30        
    31         String msg=GetImageStr(image1);
    32          sample(client,msg);
    33 
    34     }
    35     public static String GetImageStr(String imgFile)  
    36     {//将图片文件转化为字节数组字符串,并对其进行Base64编码处理  
    37         InputStream in = null;  
    38         byte[] data = null;  
    39         //读取图片字节数组  
    40         try   
    41         {  
    42             in = new FileInputStream(imgFile);          
    43             data = new byte[in.available()];  
    44             in.read(data);  
    45             in.close();  
    46         }   
    47         catch (IOException e)   
    48         {  
    49             e.printStackTrace();  
    50         }  
    51         //对字节数组Base64编码  
    52         BASE64Encoder encoder = new BASE64Encoder();  
    53         return encoder.encode(data);//返回Base64编码过的字节数组字符串  
    54     }  
    55     public static void sample(AipFace client,String msg) {
    56         // 传入可选参数调用接口
    57         HashMap<String, String> options = new HashMap<String, String>();
    58         options.put("face_field", "age");
    59         options.put("max_face_num", "2");
    60         options.put("face_type", "LIVE");
    61 
    62         String image = msg;
    63         String imageType = "BASE64";
    64 
    65         // 人脸检测
    66         JSONObject res = client.detect(image, imageType, null);
    67         System.out.println(res.toString(2));
    68 
    69     }
    70 
    71 
    72 }
    View Code

    运行结果如下,可以得到人脸的各种信息。

     1 {
     2   "result": {
     3     "face_num": 1,
     4     "face_list": [{
     5       "angle": {
     6         "roll": 15.52,
     7         "pitch": 5.23,
     8         "yaw": -19.37
     9       },
    10       "face_token": "456e1e3b70e535d5e2cce32317018510",
    11       "location": {
    12         "top": 54.95,
    13         "left": 174.35,
    14         "rotation": 16,
    15         "width": 139,
    16         "height": 139
    17       },
    18       "face_probability": 1
    19     }]
    20   },
    21   "log_id": 304569260325958791,
    22   "error_msg": "SUCCESS",
    23   "cached": 0,
    24   "error_code": 0,
    25   "timestamp": 1556032595
    26 }

    这是百度云的接口说明:https://cloud.baidu.com/doc/FACE/Face-Java-SDK.html#.E4.BA.BA.E8.84.B8.E6.A3.80.E6.B5.8B

    其他接口的使用请自行参考,这里不再细述。

    reference

    https://cloud.tencent.com/developer/article/1169345

  • 相关阅读:
    sql 常见错误
    jdbc 回顾
    oracle return code 2112
    cobol COMP-3最后1位
    oracle Lower Upper length substr
    UTF-8 与 BIG-5 转码
    用UltraEdit转换大小写
    oracle substr
    oracle中 char,varchar,varchar2的区别
    oracle 查看16进制
  • 原文地址:https://www.cnblogs.com/henuliulei/p/10757666.html
Copyright © 2011-2022 走看看