JAVA实现人脸识别,活体检测之百度API

----------------------------------------------------------------

GitHub:https://github.com/reamZMX/led-

-----------------------8/16更新---------------------------

有人问源码:

链接:https://pan.baidu.com/s/1WP37IBacu6VZwtNOUDbSYg 密码:vdzm

在这

--------------------------------------------------

吃水不忘挖井人,挖井人博客在此:挖井人一,挖井人二;

然后是官方的使用说明文档:地址;

以上,感谢。

首先引入jar:

maven:

    
        com.baidu.aip
        java-sdk
        4.3.2
    

然后获取所需的AppID、APIKey、SecretKey:

进入百度云,创建应用:

JAVA实现人脸识别,活体检测之百度API_第1张图片

创建完成之后可看见如下:

获取AppID、APIKey、SecretKey后,导入一下代码:

public class FaceSpot {
	private static final String AppID = "";
	private static final String APIKey = "";
	private static final String SecretKey = "";

	static AipFace client = null;
	static {
		client = new AipFace(AppID, APIKey, SecretKey);
		// 可选:设置网络连接参数
		client.setConnectionTimeoutInMillis(2000);
		client.setSocketTimeoutInMillis(60000);
	}

	public static void main(String[] args) throws IOException {
		 String filePath = "F:/3.jpg";
		 byte[] imgData = FileToByte(new File(filePath));
		 
		 System.out.println(detectFace(imgData,"1"));
//		String filePath1 = "F:/3.jpg";
//		String filePath2 = "F:/7.jpg";
//		byte[] imgData1 = FileUtil.readFileByBytes(filePath1);
//		byte[] imgData2 = FileUtil.readFileByBytes(filePath2);
//		System.out.println(faceverify(imgData1));
	}

	/**
	 * 人脸检测
	 * 
	 * @return
	 * @throws IOException
	 */
	public static String detectFace(File file, String max_face_num) {
		try {
			return detectFace(FileToByte(file), max_face_num);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 人脸检测
	 * 
	 * @return
	 * @throws IOException
	 */
	public static String detectFace(byte[] arg0, String max_face_num) {
		try {

			HashMap options = new HashMap();
			options.put("face_field", "age,beauty,expression,faceshape,gender,glasses,race,qualities");
			options.put("max_face_num", "2");
			options.put("face_type", "LIVE");

			// 图片数据
			String imgStr = Base64Util.encode(arg0);
			String imageType = "BASE64";
			JSONObject res = client.detect(imgStr, imageType, options);
			System.out.println(res.toString(2));
			return res.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
    /**
     * 人脸比对
     * @param file1
     * @param file2
     * @return
     */
	public static String matchFace(File file1, File file2) {
		try {
			return matchFace(FileToByte(file1), FileToByte(file2));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 人脸比对
	 * 
	 * @param arg0
	 *            人脸1
	 * @param arg1
	 *            人脸2
	 * @return
	 */
	public static String matchFace(byte[] arg0, byte[] arg1) {
		String imgStr1 = Base64Util.encode(arg0);
		String imgStr2 = Base64Util.encode(arg1);
		MatchRequest req1 = new MatchRequest(imgStr1, "BASE64");
		MatchRequest req2 = new MatchRequest(imgStr2, "BASE64");
		ArrayList requests = new ArrayList();
		requests.add(req1);
		requests.add(req2);
		JSONObject res = client.match(requests);
		return res.toString();
	}
    
	/**
	 * 人脸搜索
	 * @param file
	 * @param groupIdList
	 * @param userId
	 * @return
	 */
	public static String searchFace(File file, String groupIdList, String userId) {
		try {
			return searchFace(FileToByte(file), groupIdList, userId);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 人脸搜索
	 * 
	 * @param arg0
	 * @param groupIdList
	 * @return
	 */
	public static String searchFace(byte[] arg0, String groupIdList, String userId) {
		String imgStr = Base64Util.encode(arg0);
		String imageType = "BASE64";
		HashMap options = new HashMap();
		options.put("quality_control", "NORMAL");
		options.put("liveness_control", "LOW");
		if (userId != null) {
			options.put("user_id", userId);
		}
		options.put("max_user_num", "1");
		JSONObject res = client.search(imgStr, imageType, groupIdList, options);
		return res.toString(2);
	}
    /**
     * 增加用户
     * @param file
     * @param userInfo
     * @param userId
     * @param groupId
     * @return
     */
	public static String addUser(File file, String userInfo, String userId, String groupId) {
		try {
			return addUser(FileToByte(file), userInfo, userId, groupId);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 增加用户
	 * 
	 * @param arg0
	 * @param userInfo
	 * @param userId
	 * @param groupId
	 * @return
	 */
	public static String addUser(byte[] arg0, String userInfo, String userId, String groupId) {
		String imgStr = Base64Util.encode(arg0);
		String imageType = "BASE64";
		HashMap options = new HashMap();
		options.put("user_info", userInfo);
		options.put("quality_control", "NORMAL");
		options.put("liveness_control", "LOW");

		JSONObject res = client.addUser(imgStr, imageType, groupId, userId, options);
		return res.toString(2);
	}

	public static String updateUser(File file, String userInfo, String userId, String groupId) {
		try {
			return updateUser(FileToByte(file), userInfo, userId, groupId);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 更新用户
	 * 
	 * @param arg0
	 * @param userInfo
	 * @param userId
	 * @param groupId
	 * @return
	 */
	public static String updateUser(byte[] arg0, String userInfo, String userId, String groupId) {
		String imgStr = Base64Util.encode(arg0);
		String imageType = "BASE64";
		HashMap options = new HashMap();
		if (userInfo != null) {
			options.put("user_info", userInfo);
		}
		options.put("quality_control", "NORMAL");
		options.put("liveness_control", "LOW");

		JSONObject res = client.updateUser(imgStr, imageType, groupId, userId, options);
		return res.toString(2);
	}
    /**
     * 删除用户人脸信息
     * @param userId
     * @param groupId
     * @param faceToken
     * @return
     */
	public static String deleteUserFace(String userId, String groupId, String faceToken) {
		HashMap options = new HashMap();
		// 人脸删除
		JSONObject res = client.faceDelete(userId, groupId, faceToken, options);
		return res.toString();
	}
    /**
     * 查询用户信息
     * @param userId
     * @param groupId
     * @return
     */
	public static String searchUserInfo(String userId, String groupId) {
		HashMap options = new HashMap();
		// 用户信息查询
		JSONObject res = client.getUser(userId, groupId, options);
		return res.toString(2);
	}
    /**
     * 获取用户人脸列表
     * @param userId
     * @param groupId
     * @return
     */
	public static String getUserFaceList(String userId, String groupId) {
		HashMap options = new HashMap();
		// 获取用户人脸列表
		JSONObject res = client.faceGetlist(userId, groupId, options);
		return res.toString(2);
	}
    /**
     * 获取一组用户
     * @param groupId
     * @param returnNum
     * @return
     */
	public static String getGroupUsers(String groupId, String returnNum) {
		HashMap options = new HashMap();
		options.put("start", "0");
		if (returnNum != null) {
			options.put("length", returnNum);
		}
		// 获取用户列表
		JSONObject res = client.getGroupUsers(groupId, options);
		return res.toString(2);
	}
    /**
     * 组用户复制
     * @param userId
     * @param srcGroupId
     * @param dstGroupId
     * @return
     */
	public static String userCopy(String userId, String srcGroupId, String dstGroupId) {
		HashMap options = new HashMap();
		options.put("src_group_id", srcGroupId);
		options.put("dst_group_id", dstGroupId);
		// 复制用户
		JSONObject res = client.userCopy(userId, options);
		return res.toString(2);
	}
    /**
     * 删除用户
     * @param userId
     * @param groupId
     * @return
     */
	public static String deleteUser(String userId, String groupId) {
		HashMap options = new HashMap();
		// 人脸删除
		JSONObject res = client.deleteUser(groupId, userId, options);
		return res.toString();
	}
    /**
     * 增加组信息
     * @param groupId
     * @return
     */
	public static String addGroup(String groupId) {
		HashMap options = new HashMap();
		// 创建用户组
		JSONObject res = client.groupAdd(groupId, options);
		return res.toString();
	}
    /**
     * 删除
     * @param groupId
     * @return
     */
	public static String deleteGroup(String groupId) {
		HashMap options = new HashMap();
		// 创建用户组
		JSONObject res = client.groupDelete(groupId, options);
		return res.toString();
	}
    /**
     * 获取组列表
     * @param length
     * @return
     */
	public static String getGroupList(String length) {
		HashMap options = new HashMap();
		options.put("start", "0");
		options.put("length", length);
		// 组列表查询
		JSONObject res = client.getGroupList(options);
		return res.toString();
	}
	/**
	 * 活体检测
	 * @param arg0
	 * @return
	 */
	public static String faceverify(byte[] arg0){
		String imgStr = Base64Util.encode(arg0);
        String imageType = "BASE64";
        FaceVerifyRequest req = new FaceVerifyRequest(imgStr, imageType);
        ArrayList list = new ArrayList();
        list.add(req);
        JSONObject res = client.faceverify(list);
        return res.toString();
	}

	private static byte[] FileToByte(File file) throws IOException {
		// 将数据转为流
		InputStream content = new FileInputStream(file);
		ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
		byte[] buff = new byte[100];
		int rc = 0;
		while ((rc = content.read(buff, 0, 100)) > 0) {
			swapStream.write(buff, 0, rc);
		}
		// 获得二进制数组
		return swapStream.toByteArray();
	}

}

填入自己的AppID, APIKey, SecretKey;

函数的参数可自行根据官方文档自己改一改,文件读取那边提供一下小帅的FileUtil并且处理好了异常:

public class FileUtil {

    /**
     * 根据文件路径读取byte[] 数组
     */
    public static byte[] readFileByBytes(String filePath) throws IOException {
        File file = new File(filePath);
        if (!file.exists()) {
            throw new FileNotFoundException(filePath);
        } else {
            ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
            BufferedInputStream in = null;

            try {
                in = new BufferedInputStream(new FileInputStream(file));
                short bufSize = 1024;
                byte[] buffer = new byte[bufSize];
                int len1;
                while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
                    bos.write(buffer, 0, len1);
                }

                byte[] var7 = bos.toByteArray();
                return var7;
            } finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException var14) {
                    var14.printStackTrace();
                }

                bos.close();
            }
        }
    }
}

然后就是测试啦,测试的话,随便百度了一张美女的照片,然后看返回:

{
  "timestamp": 1528422299,
  "result": {
    "face_list": [{
      "expression": {
        "probability": 0.9997190833,
        "type": "smile"
      },
      "face_probability": 1,
      "glasses": {
        "probability": 0.9999995232,
        "type": "none"
      },
      "location": {
        "height": 102,
        "rotation": -2,
        "width": 109,
        "left": 102.9398575,
        "top": 56.39219284
      },
      "age": 19,
      "gender": {
        "probability": 0.9999992847,
        "type": "female"
      },
      "face_shape": {
        "probability": 0.7517765164,
        "type": "heart"
      },
      "face_token": "706eaee3240ef0cc679ab209b1b71e0d",
      "beauty": 69.47167206,
      "race": {
        "probability": 0.9999864101,
        "type": "yellow"
      },
      "angle": {
        "yaw": -2.858289719,
        "roll": -2.302281618,
        "pitch": 9.867022514
      }
    }],
    "face_num": 1
  },
  "cached": 0,
  "error_code": 0,
  "log_id": 3671200838,
  "error_msg": "SUCCESS"
}

嗯,确实是美女,

"beauty": 69.47167206

好,然后通过浏览器开启摄像头来实时的试下,先上效果图:

JAVA实现人脸识别,活体检测之百度API_第2张图片

好,大家不用在意这些细节,比如颜值啥的。。

我觉得颜值这项可能是假的,因为我做搞怪的表情时分数反而高一些??????????

上代码吧。。

首先是Controller:

@Controller
@RequestMapping(value = "/faceRecognition")
public class faceRecognitionController {

	 /**
	 * 人脸检测测试页面
	 * @return
	 * @throws Exception  
	 */
    @RequestMapping(value = "/test.do")
    public ModelAndView queryVoi() throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("/artificialIntelligence/faceRecognition/test");
        return modelAndView;
    }
	
    /**
   	 * 请求人脸检测
   	 * @return
   	 * @throws Exception  
   	 */
	@RequestMapping(value = "/save.do")
	@ResponseBody
	public Map queryService(@RequestParam("the_file") MultipartFile file) {
		Map modelMap = new HashMap();
		try {
			//将数据转为流
			InputStream content = file.getInputStream();
			ByteArrayOutputStream swapStream = new ByteArrayOutputStream();  
	        byte[] buff = new byte[100];  
	        int rc = 0;  
	        while ((rc = content.read(buff, 0, 100)) > 0) {  
	            swapStream.write(buff, 0, rc);  
	        }  
	        //获得二进制数组
	        byte[] in2b = swapStream.toByteArray(); 
	        //调用人脸检测的方法
	        String  str = FaceSpot.detectFace(in2b,""+1);
	        JSONObject job = new JSONObject(FaceSpot.faceverify(in2b));
			 System.out.println(job.toString());
			 JSONObject testData = job.getJSONObject("result");
			 //System.out.println(testData.get("face_liveness"));
	        
	        JSON json = JSON.parseObject(str);
            FaceV3DetectBean bean = JSON.toJavaObject(json, FaceV3DetectBean.class);
            JSONArray arr = new JSONArray();
            
	     	 for(int i=0;i

用的是fastjson,自行加jar包。

然后是jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>




	
人脸检测


 
 
 
	
	

人脸检测实时数据

年龄:
颜值:
性别:
是否戴眼镜:
表情:
活体分数:

这个貌似只支持火狐??我用其他浏览器摄像头并未开启,有哪位大神知道代码还请告诉在下,谢谢指教。

这边有个活体指数,我测试了下,貌似还挺准,我首先百度了一张胡歌的照片放在摄像头上,emmmm.....颜值80,但是活体指数就很低,然后本人上,活体指数一直在0.95之上浮动,还是可靠的。

好,告辞!

你可能感兴趣的:(JAVA随记)