准备工作
从百度AI平台下载SDK包:http://ai.baidu.com/sdk
解压后有两个jar包:aip-java-sdk-3.1.0.jar、json-20160810.jar,加入工程
接入指南
1.在百度AI控制台,创建一个人脸识别应用,我们主要用AppID、API Key、Secret Key
2.要用API Key、Secret Key 生成签名,获取Access Token
/** * Http请求工具类 * @author snowfigure * @since 2014-8-24 13:30:56 * @version v1.0.1 */ public class HttpRequestUtil { /** * 向指定URL发送GET方法的请求 * * @param url * 发送请求的URL * @param param * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return URL 所代表远程资源的响应结果 */ public static String sendGet(String url, String param) { String result = ""; BufferedReader in = null; try { String urlNameString = url + "?" + param; URL realUrl = new URL(urlNameString); // 打开和URL之间的连接 URLConnection connection = realUrl.openConnection(); // 设置通用的请求属性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 建立实际的连接 connection.connect(); // 获取所有响应头字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍历所有的响应头字段 for (String key : map.keySet()) { System.out.println(key + "--->" + map.get(key)); } // 定义 BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader( connection.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("发送GET请求出现异常!" + e); e.printStackTrace(); } // 使用finally块来关闭输入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result; } public static void main(String[] args) { //demo:代理访问 String url = "https://aip.baidubce.com/oauth/2.0/token"; //grant_type=client_credentials 固定的 //client_id=API Key //client_secret=Secret Key String para = "grant_type=client_credentials&client_id=****&client_secret=*****"; String sr=HttpRequestUtil.sendGet(url,para); System.out.println(sr); } }
开始开发
直接上代码
首先要注册一个用户,因为后面的操作都要用到这个用户,每个用户创建的同时都会给他加入一个或者多个组,这个组可以是现有的,可以是不存在的,如果不存在,他会自己创建一个组,把用户放进去。
/** * 用户注册 * * 接口描述 * 作用:用于从人脸库中新增用户,可以设定多个用户所在组,及组内用户的人脸图片, * 应用场景:构建您的人脸库,如会员人脸注册,已有用户补全人脸信息等。 * 说明:关于人脸库的设置限制 * 每个开发者账号只能创建一个人脸库; * 每个人脸库下,用户组(group)数量没有限制; * 每个用户组(group)下,可添加最多300000张人脸,如每个uid注册一张人脸,则最多300000个用户uid; * 每个用户(uid)所能注册的最大人脸数量没有限制; * 说明: * 人脸注册完毕后,生效时间最长为35s,之后便可以进行识别或认证操作。 * 注册的人脸,建议为用户正面人脸。 * uid在库中已经存在时,对此uid重复注册时,新注册的图片默认会追加到该uid下,如果手动选择action_type:replace,则会用新图替换库中该uid下所有图片。 * * 举例,要注册一个新用户,用户id为uid1,加入组id为group1和group2, 注册成功后服务端会返回操作的logid * * @param client */ public static void facesetAddUser(AipFace client) { // 参数为本地图片路径 //String path = "E:\\123.png";
注意:注册用户时,从客户端传过来一个的图片流,我们去掉流头部信息,转成base64的,然后放入方法
也可以是图片路径path
String imageDate = request.getParameter("imageDate"); imageDate = imageDate.startsWith("data:image") ? imageDate.substring( imageDate.indexOf(";base64,") + 8, imageDate.length()) : imageDate; byte[] bs = Base64.decodeBase64(imageDate);
HashMap<String, String> options = new HashMap<String, String>(); JSONObject res = client.addUser("uid2", "test_user_info_2", Arrays.asList("group2"), bs, options); System.out.println(res.toString(2)); System.out.println(res.has("log_id")); }
其他的方法没有要注意的地方,代码中所有的图片都可以是base64和图片路径,转换方法和上面一样,其他接口,代码如下
package com.boya.FaceTest; import com.baidu.aip.face.AipFace; import org.json.JSONObject; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; /** * Created by Administrator on 2017/9/18. * 说明:图片接受类型支持本地图片路径字符串,图片文件二进制数组。 * 说明:图片接受类型支持本地图片路径字符串,图片文件二进制数组。 */ public class ClientAipface { public static final String APP_ID = "*****"; public static final String API_KEY = "*******"; public static final String SECRET_KEY = "********"; //图片接受类型支持本地图片路径字符串,图片文件二进制数组。 public static void main(String[] args) { // 初始化一个AipFace AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY); // 可选:设置网络连接参数 client.setConnectionTimeoutInMillis(2000); client.setSocketTimeoutInMillis(60000); // 需要设置代理的可选:设置代理服务器地址, http和socket二选一,或者均不设置 //client.setHttpProxy("proxy_host", 0); // 设置http代理 //client.setSocketProxy("proxy_host", proxy_port); // 设置socket代理 //人脸检测 //faceRecognize1(client); //人脸对比 //faceRecognize(client); //人脸识别 //identifyUser(client); //人脸认证 verifyUser(client); //人脸更新 //facesetUpdateUser(client); //删除用户 //facesetDeleteUser(client); //查询指定用户的信息 //getUser(client); //用于查询用户组的列表 //getGroupList(client); //组内用户列表查询 //getGroupUsers(client); //组间复制用户 //addGroupUser(client); //组内删除用户 //deleteGroupUser(client); } /** * 组内删除用户 * 接口描述 * 用于将用户从某个组中删除,但不会删除用户在其它组的信息。 * * 说明:当用户仅属于单个分组时,本接口将返回错误,请使用人脸删除接口 */ public static void deleteGroupUser(AipFace client) { JSONObject res = client.deleteGroupUser(Arrays.asList("group2"), "uid2"); System.out.println(res.toString(2)); } /** * 组间复制用户 * 接口描述 * 用于将已经存在于人脸库中的用户添加到一个新的组。 * 说明: * 并不是向一个指定组内添加用户,而是直接从其它组复制用户信息 */ public static void addGroupUser(AipFace client) { //把用户组group2中id为uid2的用户 复制到group1中 JSONObject res = client.addGroupUser("group2", Arrays.asList("group1"), "uid2"); System.out.println(res.toString(2)); } /** * 组内用户列表查询 * 接口描述 * 用于查询指定用户组中的用户列表 */ public static void getGroupUsers(AipFace client) { HashMap<String, Object> options = new HashMap<String, Object>(2); options.put("start", 0); options.put("num", 10); JSONObject res = client.getGroupUsers("group1", options); System.out.println(res.toString(2)); } /** * 组列表查询 * 接口描述 * 用于查询用户组的列表。 */ public static void getGroupList(AipFace client) { HashMap<String, Object> options = new HashMap<String, Object>(2); options.put("start", 0); options.put("num", 10); JSONObject res = client.getGroupList(options); System.out.println(res.toString(2)); } /** * 用户信息查询 * 接口描述 * 用于查询人脸库中某用户的详细信息。 * * 举例,要查询指定用户的信息: */ public static void getUser(AipFace client) { // 查询一个用户在所有组内的信息 JSONObject res = client.getUser("uid1"); System.out.println(res.toString(2)); // 查询一个用户在指定组内的信息 //JSONObject res = client.getUser("uid1", Arrays.asList("group1")); //System.out.println(res.toString(2)); } /** * 人脸检测 * * 接口描述 * 检测请求图片中的人脸,返回人脸位置、72个关键点坐标、及人脸相关属性信息。 * 说明 * 检测响应速度,与图片中人脸数量相关,人脸数量较多时响应时间会有些许延长。 * 五官位置会标记具体坐标;72个关键点坐标也包含具体坐标,但不包含对应位置的详细位置描述。 * 应用场景:如人脸属性分析,基于人脸关键点的加工分析,人脸营销活动等。 * * 举例,要对一张图片进行人脸识别,具体的人脸信息在返回的result字段中: */ public static void faceRecognize1(AipFace client) { // 自定义参数定义 HashMap<String, String> options = new HashMap<String, String>(); options.put("max_face_num", "1"); options.put("face_fields", "expression"); // 参数为本地图片路径 String imagePath = "E:\\123.jpg"; JSONObject response = client.detect(imagePath,options); System.out.println(response.toString()); // 参数为本地图片文件二进制数组 //byte[] file = readImageFile(imagePath); // readImageFile函数仅为示例 //JSONObject response = client.detect(file); //System.out.println(response.toString()); } /** * 人脸删除 * * 接口描述 * 用于从人脸库中删除一个用户。 * * 人脸删除注意事项: * 删除的内容:用户所有图像和身份信息; * 如果一个uid存在于多个用户组内且没有指定group_id,将会同时将从各个组中把用户删除 * 如果指定了group_id,则只删除此group下的uid相关信息 * * 举例,要删除一个用户,用户id为uid1, 删除成功后服务端会返回操作的logid: * */ public static void facesetDeleteUser(AipFace client){ // 只从指定组中删除用户 JSONObject res = client.deleteUser("uid1", Arrays.asList("group1")); System.out.println(res.toString(2)); // 从人脸库中彻底删除用户 //JSONObject res = client.deleteUser("uid1"); //System.out.println(res.toString(2)); } /** * 人脸更新 * 接口描述 * 用于对人脸库中指定用户,更新其下的人脸图像。 * 说明 * 针对一个uid执行更新操作,新上传的人脸图像将覆盖此uid原有所有图像。 * 执行更新操作,如果该uid不存在时,会返回错误。如果添加了action_type:replace,则不会报错,并自动注册该uid,操作结果等同注册新用户。 * * 举例,要更新一个用户,用户id为uid1, 更新成功后服务端会返回操作的logid: */ public static void facesetUpdateUser(AipFace client) { // 参数为本地图片路径 String path = "E:\\123.jpg"; HashMap<String, String> options = new HashMap<String, String>(); JSONObject res = client.updateUser("uid1", "user_info_memo", "group1", path, options); System.out.println(res.toString(2)); } /** * 人脸认证 * 接口描述 * 作用:用于识别上传的图片是否为指定用户,即查找前需要确定要查找的用户在人脸库中的id。 * 应用场景:如人脸登录,人脸签到等 * 说明: * 人脸认证与人脸识别的差别在于:人脸识别需要指定一个待查找的人脸库中的组;而人脸认证需要指定具体的用户id即可, * 不需要指定具体的人脸库中的组;实际应用中,人脸认证需要用户或系统先输入id,这增加了验证安全度,但也增加了复杂度, * 具体使用哪个接口需要视您的业务场景判断。 * * 举例,要认证一张图片在指定group中是否为uid1的用户: */ public static void verifyUser(AipFace client){ String path = "E:\\123.png"; HashMap<String, Object> options = new HashMap<String, Object>(1); options.put("top_num", 5); JSONObject res = client.verifyUser("uid2", Arrays.asList("group1", "group2"), path, options); //result 得分大于80为成功(推荐) System.out.println(res.toString(2)); } /** * 人脸对比 * 作用:可用于判断两张脸是否是同一人的可能性大小 * 应用场景:人证合一验证,用户认证等,可与您现有的人脸库进行比对验证。 * * 请求说明 * 接受的参数为一系列本地图片路径的数组,或图片二进制数据的数组。 * 举例,要对两张图片进行人脸比对,具体的人脸信息在返回的result字段中 */ public static void faceRecognize(AipFace client){ //两张图片 String imagePath1 = "E:\\123.jpg"; String imagePath2 = "E:\\123.jpg"; ArrayList<String> pathArray = new ArrayList<String>(); pathArray.add(imagePath1); pathArray.add(imagePath2); HashMap<String,String> option = new HashMap<String, String>(); option.put("ext_fields","qualities"); option.put("image_liveness","faceliveness,"); //new HashMap<String, String>() 参数数组 JSONObject response = client.match(pathArray,option); System.out.println(response.toString()); } /** * 人脸识别 * 接口描述 * 作用:计算指定组内用户,与上传图像中人脸的相似度。识别前提为您已经创建了一个人脸库。 * 应用场景:如人脸闸机,考勤签到,安防监控等。 * 说明:人脸识别返回值不直接判断是否是同一人,只返回用户信息及相似度分值。 * 说明:推荐可判断为同一人的相似度分值为80,您也可以根据业务需求选择更合适的阈值。 * *请求说明 * 举例,要计算一张图片与指定组group1, group2内各用户相似度: */ public static void identifyUser(AipFace client){ String path = "E:\\123.jpg"; HashMap<String, Object> options = new HashMap<String, Object>(1); //options.put("group_id","123.jpg"); //options.put("image",path); options.put("user_top_num", 1); JSONObject res = client.identifyUser(Arrays.asList("group1", "group2"), path, options); System.out.println(res.toString(2)); } }