java开发人脸识别系统,全demo讲解

人脸识别,是不是很高深的样子,理解了其实也算很简单的

人脸识别需要用到jar包 faceppsdk.jar包,文章下面提供下载

本文模拟上传照片,然后识别是否是同一个人


人脸识别,首先我们需要知道一些的概念

人脸(face),由照片中获得人脸

人脸的集合(faceset)。人脸集合,

人(person),创建一个人,这个人有多张脸,很好理解,环境因素不一样,脸的信息也可能不一样,

人群(group),人的集合


本例分2个方法:

一个是注册方法:register(String url,String facename),一个是验证方法:verify(String urlverify)

方法说明:url表示需要注册的照片地址,facename为空为注册,非空就是验证,urlverify表示待验证的url,facename为非空,是因为运行了验证方法,验证发放里提供了facename这个值。下面我会详细说明:


下面我们开始注册一个人吧,大概一共分为4步,方法名register(String url,String facename):

1,那么我们现在开始从照片中获取一个人脸,并创建他(Face)


static HttpRequests httpRequests = new HttpRequests("API Key","API Secret",true,true);
	static JSONObject result = null;
上面的代码意思是


初始化HttpRequests 参数依次是 API_Key,API_Secret,是否使用CN服务器,是否使用HTTP模式连接。


//创建这个人脸信息
result = httpRequests.detectionDetect(new PostParameters().setUrl(url));
我们假定这张照片中只有一张人脸,当然您可以自定判断result的大小,以验证是否只有一张人脸


2,创建一个人脸集合,并且将这个人脸信息加入到其中吧(FaceSet)

httpRequests.facesetCreate(new PostParameters().setFacesetName("公众人脸"));
httpRequests.facesetAddFace(new PostParameters().setFacesetName("公众人脸").setFaceId(result.getJSONArray("face").getJSONObject(0).getString("face_id")));

以上代码第一行,我们创建了一个人脸集合“工资人脸”,第二行,我们我们刚刚创建的人脸ID加入进去了。

需要注意的是这里我们使用了中文字符,所以在程序运行的开始我们需要设置字体为UTF-8

System.out.println(Charset.forName("UTF-8").name());


3,创建一个人,并且将这个人脸信息加入到其中吧(Person)

httpRequests.personCreate(new PostParameters().setPersonName(personName).setFaceId(result.getJSONArray("face").getJSONObject(0).getString("face_id")));


注意上面代码,personName 是我自定义的名字,这个名字就是这个人的名字,名字是唯一的哦,如果名字相同了就会报错的

我们先前已经说过,一个人可以加入多个脸,如果是这里多个脸,可以把face_id保存在一个arrayList中,上面的参数就是这个数组

我们还可以设置他的tags信息


httpRequests.personSetInfo(new PostParameters().setPersonName(personName).setTag("刘亦菲"));
我们设置的tags信息是刘亦菲



4,创建一个人群,并且将这个人脸信息加入到其中吧(group)


httpRequests.groupCreate(new PostParameters().setGroupName("gzgroup_lyf"));
httpRequests.groupAddPerson(new PostParameters().setGroupName("gzgroup_lyf").setPersonName(personName));
同样的,您可以将一组人的集合加入到这个人群中,方法和上面一样


同样的,您还可以为这个人群设置tags信息,方法和上面也是一样的


自此,我们就简单的创建了一个人群,人群里有一个人,这个人有一个faice_id


下面我们开始如何来验证一个人吧,大概一共分为4步:

1,仍然是需要获得一个HttpRequests对象


static HttpRequests httpRequests = new HttpRequests("API Key","API Secret",true,true);
	static JSONObject result = null;

2,我们注册一个需要检测的人脸全部的信息,运行方法即可


//首先临时注册这个人脸
String facename = "persontemp"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
register(urlverify,facename);


注意上面代码中的facename的获取,其中名称有temp,有这个标识的名称就是临时的,而注册人脸就没有这个标识

3,获得刘亦菲组的所有信息,并取得其长度,注意,这个长度包括了临时注册的人,所以长度应该是注册的人数加上临时需要验证的人(一个)


//获得刘亦菲组的所有信息 保存临时注册的这个人脸
result = httpRequests.groupGetInfo(new PostParameters().setGroupName("gzgroup_lyf"));
int lenght = result.getJSONArray("person").length();
4,创建人脸标识模型




//保存的人脸信息  person_name  person_id
String[][] facearray = new String[lenght][2];
//待验证的人脸信息  person_name  person_id
String[][] facearraytemp = new String[1][2];
			
System.out.println("创建人脸标识模型");
JSONObject syncRet = httpRequests.trainIdentify(new PostParameters().setGroupName("gzgroup_lyf"));
		
int j = 0;
for(int i = 0;i < lenght;i++){
	if(result.getJSONArray("person").getJSONObject(i).getString("person_name").split("temp").length >= 2 ){
		facearraytemp[0][0] = result.getJSONArray("person").getJSONObject(i).getString("person_name");
		facearraytemp[0][1] = result.getJSONArray("person").getJSONObject(i).getString("person_id");
		httpRequests.trainVerify(new PostParameters().setPersonName(facearraytemp[0][0]));
	}else{
		facearray[j][0] = result.getJSONArray("person").getJSONObject(i).getString("person_name");
		facearray[j][1] = result.getJSONArray("person").getJSONObject(i).getString("person_id");
		httpRequests.trainVerify(new PostParameters().setPersonName(facearray[j][0]));
		j++;
	}
}
上面的代码,我们将注册的人和临时注册人都创建了人脸标识符


5,我们再通过person_id获得face_id,因为我们在验证人脸的时候是需要face_id的


System.out.println("获得face_id");
String[] faceidarray = new String[lenght];
//已注册的
for(int k = 0;k < j;k++){
	faceidarray[k] = httpRequests.personGetInfo(new PostParameters().setPersonName(facearray[k][0])).getJSONArray("face").getJSONObject(0).getString("face_id");
}
//临时的人脸id
faceidarray[lenght-1] = httpRequests.personGetInfo(new PostParameters().setPersonName(facearraytemp[0][0])).getJSONArray("face").getJSONObject(0).getString("face_id");
6,最后一步就是验证了


这里我介绍两张验证方式:

第一种,验证这张和这个人的匹配程度,待检测的脸和数据库中的人


System.out.println(httpRequests.recognitionVerify(new PostParameters().setPersonName(facearray[1][0]).setFaceId(faceidarray[lenght-1])));
以上代码,我们验证这个人脸id和这个人的匹配程度


返回的结果是这样的


{"session_id":"06fc3736d6084ade834378b0a67056f3","response_code":200,"confidence":92.08548,"is_same_person":false}
这条语句告诉我们,他们的匹配程度是92.08548,confidence的值是0到100之间的实数,不是同一个人,当然我们可自定决定,匹配程度达到98%就表示是一个人。


第二种,验证两张的脸的相似度(待检测的脸和数据库中的脸)


System.out.println(httpRequests.recognitionCompare(new PostParameters().setFaceId1(faceidarray[lenght-1]).setFaceId2(faceidarray[2])));
返回结果如下:



{"session_id":"5656761e32a2456789461967d5b40ac8","response_code":200,"similarity":70.228783,"component_similarity":{"eyebrow":94.221344,"mouth":85.137741,"nose":62.083374,"eye":78.818558}}
这条返回语句告诉我们,相似度是70.228783,其中眉毛是94.221344,嘴巴是85.137741,鼻子是62.083374,眼睛是78.818558


数值范围均是0到100之间的实数。


当然咯,最后请不要忘记删除人和人脸


System.out.println("清除临时的人脸信息");
//删除临时的人脸
System.out.println(httpRequests.facesetRemoveFace(new PostParameters().setFacesetName("公众人脸").setFaceId(faceidarray[lenght-1])));
//删除临时的人
System.out.println(httpRequests.personDelete(new PostParameters().setPersonName(facearraytemp[0][0])));



main主方法如下:

public class demoFace1 {
	static HttpRequests httpRequests = new HttpRequests("api_key","api_secret",true,true);
	static JSONObject result = null;
	public static void main(String[] args) {
		System.out.println(Charset.forName("UTF-8").name());	
		String url = "http://h.hiphotos.baidu.com/zhidao/pic/item/f603918fa0ec08faae11168d58ee3d6d55fbda83.jpg";
		String urlverify = "http://img.hexun.com/2011-05-15/129617848.jpg";
		String facename = "";
		
		//注册一个人
		//register(url,facename);
		
		//验证这个人是否注册
		System.out.println(verify(urlverify));
	}
。。。。。。。。。。。。。
注册方法略(上面已写)
验证方法略(上面已写)

自此我们就完成了java开发人脸系统的全部代码以及注释,如果您需要全部的代码,可留言,我再分享


ps:请到这里 http://www.faceplusplus.com.cn 获取 API_Key,API_Secret

ps:请到这里下载  faceppsdk.jar



爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img