人脸识别,是不是很高深的样子,理解了其实也算很简单的
人脸识别需要用到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/天,具体规则查看活动详情