你的第一个人脸识别demo

1、成为开发者

百度ai官网地址:http://ai.baidu.com/

STEP1:点击百度AI开放平台导航右侧的控制台,点击需要使用的AI服务项,使用百度账号登录。如还未持有百度账户,可以点击此处注册百度账户
STEP2:首次使用,登录后将会进入开发者认证页面,请填写相关信息完成开发者认证。注:(如您之前已经是百度云用户或百度开发者中心用户,此步可略过。)
STEP3:进入具体AI服务项的控制面板(如文字识别、人脸识别),进行相关业务操作。

2. 创建应用

创建好账号后,在正式调用AI能力之前,需要您创建一下应用,这个是调用服务的基础能力单元,不可或缺哦。在百度云控制台,已默认为您免费开通百度语音、文字识别、人脸识别、自然语言处理、图像审核、知识图谱服务六项服务。您可以选择您需要的服务,进入对应服务的控制台中。进入某个服务的控制台后,您将首先见到此服务的控制台概览页(以人脸识别为例),如下图所示,点击创建应用:

 

点击上图中的「创建应用」,即可进入应用创建界面,如下图所示:

 

点击创建就会生成一个应用,包含API Key和SecretKey,这两个字段是获取accessToken的依据,是调用api接口的必备字段:

3、获取签名

获取accessToken:通过调用接口:https://aip.baidubce.com/oauth/2.0/token?
    grant_type=client_credentials&
    client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
    client_secret= 0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&获取;

4、进行开发

首先需要下载开发必须用到的jar文件,引入项目:

然后编写调用接口的编码,其中用到的文件操作,base64编码处理以及http请求相关的util文件,百度都已经封装好,可以直接使用:

package com.hengyunsoft.face.aip;

import java.net.URLEncoder;

import com.baidu.aip.util.Base64Util;
import com.hengyunsoft.face.util.AuthService;
import com.hengyunsoft.face.util.FileUtil;
import com.hengyunsoft.face.util.HttpUtil;

/**
* 人脸探测
*/
public class FaceDetect {

    /**
    * 重要提示代码中所需工具类
    * 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 detect(String filePath) {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/face/v1/detect";
        try {
            // 本地文件路径
            byte[] imgData = FileUtil.readFileByBytes(filePath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");

            String param = "max_face_num=" + 5 + "&face_fields=" + "age,beauty,expression,faceshape,gender,glasses,landmark,race,qualities" + "&image=" + imgParam;

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = AuthService.getAuth();

            String result = HttpUtil.post(url, accessToken, param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}


调用测试接口,查看输出结果,测试一张图片中的人脸检测个数:

 public static void main(String[] args) {
        //testDetect1();
        //测试人脸检测
        String path = System.getProperty("user.dir")+"\image\person3.jpg";
        FaceDetect.detect(path);

    }

 原图:

检测结果:

{"result_num":3,"result":[{"location":{"left":270,"top":48,"width":42,"height":39},"face_probability":1,"rotation_angle":-12,"yaw":-9.428524017334,"pitch":-1.9272558689117,"roll":-14.768548965454,"landmark":[{"x":288,"y":50},{"x":305,"y":46},{"x":300,"y":58},{"x":302,"y":69}],"landmark72":[{"x":272,"y":57},{"x":274,"y":63},{"x":278,"y":70},{"x":283,"y":76},{"x":290,"y":80},{"x":298,"y":81},{"x":305,"y":80},{"x":311,"y":77},{"x":314,"y":71},{"x":315,"y":65},{"x":315,"y":58},{"x":314,"y":52},{"x":313,"y":46},{"x":283,"y":52},{"x":285,"y":50},{"x":287,"y":49},{"x":290,"y":49},{"x":292,"y":51},{"x":290,"y":51},{"x":288,"y":52},{"x":286,"y":52},{"x":288,"y":50},{"x":279,"y":50},{"x":281,"y":47},{"x":285,"y":45},{"x":289,"y":45},{"x":292,"y":46},{"x":289,"y":47},{"x":285,"y":47},{"x":282,"y":48},{"x":301,"y":48},{"x":303,"y":46},{"x":305,"y":45},{"x":307,"y":45},{"x":309,"y":46},{"x":307,"y":47},{"x":305,"y":48},{"x":303,"y":48},{"x":305,"y":46},{"x":299,"y":44},{"x":301,"y":42},{"x":304,"y":41},{"x":307,"y":41},{"x":310,"y":42},{"x":307,"y":42},{"x":305,"y":43},{"x":302,"y":44},{"x":294,"y":50},{"x":295,"y":54},{"x":295,"y":57},{"x":295,"y":62},{"x":298,"y":61},{"x":303,"y":60},{"x":305,"y":60},{"x":303,"y":56},{"x":301,"y":52},{"x":299,"y":49},{"x":300,"y":58},{"x":295,"y":71},{"x":298,"y":68},{"x":302,"y":66},{"x":305,"y":66},{"x":308,"y":68},{"x":306,"y":70},{"x":303,"y":71},{"x":299,"y":71},{"x":298,"y":69},{"x":302,"y":68},{"x":305,"y":68},{"x":305,"y":68},{"x":302,"y":69},{"x":299,"y":70}],"age":38.027809143066,"beauty":24.773380279541,"expression":0,"expression_probablity":0.99999582767487,"faceshape":[{"type":"square","probability":0.53995013237},{"type":"triangle","probability":0.003084430238232},{"type":"oval","probability":0.35069698095322},{"type":"heart","probability":0.0041946368291974},{"type":"round","probability":0.10207384079695}],"gender":"male","gender_probability":0.99982494115829,"glasses":0,"glasses_probability":0.99990594387054,"race":"yellow","race_probability":0.99971705675125,"qualities":{"occlusion":{"left_eye":0,"right_eye":0,"nose":0,"mouth":0,"left_cheek":0,"right_cheek":0,"chin":0},"blur":0,"illumination":0,"completeness":0,"type":{"human":0.99693930149078,"cartoon":0.0030607103835791}}},{"location":{"left":44,"top":50,"width":40,"height":42},"face_probability":1,"rotation_angle":-4,"yaw":13.170437812805,"pitch":2.0879020690918,"roll":-2.8054466247559,"landmark":[{"x":51,"y":55},{"x":70,"y":54},{"x":58,"y":67},{"x":61,"y":78}],"landmark72":[{"x":45,"y":58},{"x":45,"y":64},{"x":47,"y":70},{"x":49,"y":76},{"x":52,"y":82},{"x":56,"y":88},{"x":62,"y":91},{"x":69,"y":89},{"x":77,"y":85},{"x":82,"y":77},{"x":85,"y":69},{"x":85,"y":62},{"x":85,"y":54},{"x":47,"y":56},{"x":49,"y":55},{"x":50,"y":54},{"x":53,"y":54},{"x":55,"y":56},{"x":53,"y":56},{"x":51,"y":57},{"x":49,"y":57},{"x":51,"y":55},{"x":45,"y":52},{"x":47,"y":50},{"x":49,"y":50},{"x":52,"y":50},{"x":55,"y":52},{"x":52,"y":52},{"x":49,"y":52},{"x":47,"y":52},{"x":65,"y":55},{"x":67,"y":53},{"x":69,"y":52},{"x":71,"y":53},{"x":74,"y":54},{"x":72,"y":55},{"x":69,"y":55},{"x":67,"y":55},{"x":70,"y":54},{"x":62,"y":51},{"x":65,"y":49},{"x":68,"y":48},{"x":72,"y":48},{"x":76,"y":50},{"x":72,"y":50},{"x":69,"y":50},{"x":65,"y":51},{"x":57,"y":56},{"x":56,"y":60},{"x":55,"y":65},{"x":54,"y":69},{"x":57,"y":70},{"x":62,"y":69},{"x":65,"y":69},{"x":64,"y":64},{"x":63,"y":60},{"x":62,"y":56},{"x":58,"y":67},{"x":55,"y":78},{"x":57,"y":76},{"x":60,"y":75},{"x":64,"y":76},{"x":68,"y":78},{"x":64,"y":80},{"x":60,"y":81},{"x":57,"y":80},{"x":57,"y":78},{"x":60,"y":77},{"x":64,"y":77},{"x":64,"y":78},{"x":60,"y":78},{"x":57,"y":78}],"age":33.576271057129,"beauty":24.980932235718,"expression":0,"expression_probablity":0.99999821186066,"faceshape":[{"type":"square","probability":0.21030895411968},{"type":"triangle","probability":0.00028864710475318},{"type":"oval","probability":0.69324284791946},{"type":"heart","probability":0.038888353854418},{"type":"round","probability":0.057271171361208}],"gender":"male","gender_probability":0.99993813037872,"glasses":0,"glasses_probability":0.99995875358582,"race":"yellow","race_probability":0.99995911121368,"qualities":{"occlusion":{"left_eye":0,"right_eye":0,"nose":0,"mouth":0,"left_cheek":0,"right_cheek":0,"chin":0},"blur":0,"illumination":0,"completeness":0,"type":{"human":0.9932644367218,"cartoon":0.0067355595529079}}},{"location":{"left":163,"top":54,"width":37,"height":42},"face_probability":1,"rotation_angle":-1,"yaw":-7.0411062240601,"pitch":-8.2431039810181,"roll":-2.4302639961243,"landmark":[{"x":176,"y":63},{"x":192,"y":62},{"x":186,"y":72},{"x":185,"y":82}],"landmark72":[{"x":163,"y":64},{"x":164,"y":71},{"x":165,"y":77},{"x":167,"y":84},{"x":172,"y":90},{"x":179,"y":94},{"x":186,"y":95},{"x":192,"y":93},{"x":196,"y":87},{"x":199,"y":81},{"x":200,"y":75},{"x":201,"y":69},{"x":200,"y":63},{"x":172,"y":63},{"x":174,"y":62},{"x":176,"y":61},{"x":178,"y":62},{"x":180,"y":63},{"x":178,"y":63},{"x":176,"y":64},{"x":174,"y":64},{"x":176,"y":63},{"x":169,"y":58},{"x":171,"y":54},{"x":174,"y":53},{"x":178,"y":53},{"x":181,"y":55},{"x":178,"y":55},{"x":175,"y":55},{"x":172,"y":56},{"x":189,"y":63},{"x":191,"y":61},{"x":193,"y":61},{"x":194,"y":61},{"x":196,"y":62},{"x":194,"y":63},{"x":193,"y":63},{"x":191,"y":63},{"x":192,"y":62},{"x":189,"y":55},{"x":192,"y":52},{"x":194,"y":52},{"x":197,"y":54},{"x":198,"y":57},{"x":196,"y":55},{"x":194,"y":55},{"x":192,"y":55},{"x":183,"y":63},{"x":182,"y":67},{"x":181,"y":70},{"x":180,"y":74},{"x":183,"y":74},{"x":189,"y":74},{"x":191,"y":73},{"x":189,"y":70},{"x":188,"y":66},{"x":187,"y":63},{"x":186,"y":72},{"x":176,"y":81},{"x":181,"y":79},{"x":186,"y":79},{"x":190,"y":79},{"x":193,"y":80},{"x":190,"y":84},{"x":186,"y":86},{"x":180,"y":84},{"x":181,"y":80},{"x":186,"y":80},{"x":190,"y":80},{"x":190,"y":83},{"x":186,"y":84},{"x":181,"y":83}],"age":48.371246337891,"beauty":20.235898971558,"expression":1,"expression_probablity":0.98125779628754,"faceshape":[{"type":"square","probability":0.043237078934908},{"type":"triangle","probability":0.0095938919112086},{"type":"oval","probability":0.30381575226784},{"type":"heart","probability":0.072911836206913},{"type":"round","probability":0.57044142484665}],"gender":"male","gender_probability":0.99851101636887,"glasses":0,"glasses_probability":0.99994230270386,"race":"yellow","race_probability":0.99906295537949,"qualities":{"occlusion":{"left_eye":0,"right_eye":0,"nose":0,"mouth":0,"left_cheek":0,"right_cheek":0,"chin":0},"blur":0,"illumination":0,"completeness":0,"type":{"human":0.96879607439041,"cartoon":0.031203903257847}}}],"log_id":3532732135}

关于人脸识别的一些接口:注册,更新,删除,检测,识别,验证等:

package com.hengyunsoft.face.aip;

import java.util.HashMap;

import org.json.JSONObject;

import com.baidu.aip.face.AipFace;

public class FaceManage {
    
    /**
     * 注册用户信息
     * @param client
     * @param imagePath
     */
    public static void addUser(AipFace client,String imagePath) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("action_type", "replace");

        String uid = "user1";
        String userInfo = "user's info";
        String groupId = "group1,group2";

        JSONObject res = client.addUser(uid, userInfo, groupId, imagePath, options);
        System.out.println(res.toString(2));

        // 参数为本地图片二进制数组
        // byte[] file = readImageFile(image);
        //res = client.addUser(file, uid, userInfo, groupId, options);
        //System.out.println(res.toString(2));
    }
    
    /**
     * 更新用户信息,包括图片
     * @param client
     * @param imagePath
     */
    public static void updateUser(AipFace client,String imagePath) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("action_type", "replace");

        String uid = "user1";
        String userInfo = "user's info";
        String groupId = "group1";

        JSONObject res = client.updateUser(uid, userInfo, groupId, imagePath, options);
        System.out.println(res.toString(2));

        // 参数为本地图片二进制数组
//        byte[] file = readImageFile(image);
//        res = client.updateUser(file, uid, userInfo, groupId, options);
//        System.out.println(res.toString(2));
    }
    
    /**
     * 删除用户信息
     * @param client
     */
    public static void deleteUser(AipFace client) {
         // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("group_id", "group1");

        String uid = "user1";

        // 人脸删除
        JSONObject res = client.deleteUser(uid, options);
        System.out.println(res.toString(2));
    }
    
    /**
     * 根据用户id和group信息获取用户详情
     * @param client
     */
    public static void getUserById(AipFace client) {
         // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("group_id", "group1");

        String uid = "user1";

        // 用户信息查询
        JSONObject res = client.getUser(uid, options);
        System.out.println(res.toString(2));
    }
    
    /**
     * 用户组查询
     * @param client
     */
    public static void getGroupList(AipFace client) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("start", "0");
        options.put("end", "50");

        // 组列表查询
        JSONObject res = client.getGroupList(options);
        System.out.println(res.toString(2));

    }
    
    /**
     * 用户组内用户列表查询
     * @param client
     */
    public static void getGroupUsers(AipFace client) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("start", "0");
        options.put("end", "50");

        String groupId = "group1";

        // 组内用户列表查询
        JSONObject res = client.getGroupUsers(groupId, options);
        System.out.println(res.toString(2));

    }
    
    /**
     * 人脸验证,用于登录,签到等
     * @param client
     */
    public static void verifyUser(AipFace client,String imagePath) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("top_num", "1");
        options.put("ext_fields", "faceliveness");

        String uid = "user1";
        String groupId = "group1,group2";

        JSONObject res = client.verifyUser(uid, groupId, imagePath, options);
        System.out.println(res.toString(2));

//        // 参数为本地图片二进制数组
//        byte[] file = readImageFile(image);
//        res = client.verifyUser(file, uid, groupId, options);
//        System.out.println(res.toString(2));
    }
    
    /**
     * 人脸识别,用于闸机,签到
     * @param client
     */
    public static void identifyUser(AipFace client,String imagePath) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("ext_fields", "faceliveness");
        options.put("user_top_num", "3");

        String groupId = "group1,group2";

        JSONObject res = client.identifyUser(groupId, imagePath, options);
        System.out.println(res.toString(2));

//        // 参数为本地图片二进制数组
//        byte[] file = readImageFile(image);
//        res = client.identifyUser(file, groupId, options);
//        System.out.println(res.toString(2));
    }
}

测试代码:

package com.hengyunsoft.face.main;

import java.util.HashMap;

import org.json.JSONObject;

import com.baidu.aip.face.AipFace;
import com.hengyunsoft.face.aip.FaceDetect;
import com.hengyunsoft.face.aip.FaceManage;

public class TestFace {
     //设置APPID/AK/SK
    public static final String APP_ID = "10580034";
    public static final String API_KEY = "你的api key";
    public static final String SECRET_KEY = "你的secret key";
    private static String basePath = System.getProperty("user.dir")+"\image\";

    public static void main(String[] args) {
        
        AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
        String path = System.getProperty("user.dir")+"\image\person3.jpg";
        String image = basePath;
        
        //测试人脸检测
        //FaceDetect.detect(path);
        
        //测试添加
        // 参数为本地图片路径
//        image = basePath + "liushishi.jpg";
//        FaceManage.addUser(client,image);
        //测试更新
        // 参数为本地图片路径
//        image = basePath + "zhoubichang.jpg";
//        FaceManage.updateUser(client,image);
        //测试删除
//        FaceManage.deleteUser(client);
        
        
//        //用户查询,根据id查询
//        FaceManage.getUserById(client);
//        
//        //用户组列表查询
//        FaceManage.getGroupList(client);
        
//        //用户组内用户列表查询
//        FaceManage.getGroupUsers(client);
        //测试人脸验证
        image = basePath + "liushishi.jpg";
        FaceManage.verifyUser(client, image);
        
//        //测试人脸识别
//        image = basePath + "liushishi.jpg";
//        FaceManage.identifyUser(client, image);
        
        

    }

    private static void testDetect1() {
        // 初始化一个AipFace
        AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);

        // 可选:设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);

        // 可选:设置代理服务器地址, http和socket二选一,或者均不设置
        //client.setHttpProxy("proxy_host", proxy_port);  // 设置http代理
        //client.setSocketProxy("proxy_host", proxy_port);  // 设置socket代理

        // 调用接口
        String path = System.getProperty("user.dir")+"\image\test.png";
        JSONObject res = client.detect(path, new HashMap<String, String>());
        System.out.println(res.toString(2));
    }

}

 

 

 

 

原文地址:https://www.cnblogs.com/guo-eric/p/8109411.html