人脸识别(二)调用face++api实现人脸对比

首先来看一看调用的人脸对比的api需要的东西: 
face++调用人脸对比api的网址:

  • https://api-cn.faceplusplus.com/facepp/v3/compare

调用方法使用POST调用,需要传的主要的参数如下:

从官方给出的传参列表可以看出,api_key和api_secret无疑是必需要传的,接下来的必传的两个参数是两张图片。上传图片一共有三种方式:你可以选择上传图片的url,或者上传图片的二进制流,还可以上传以base64编码的图片数据。或者你假如不想上传图片,可以使用以前上传的图片直接比对。这时你只要提交以前上传图片后得到的face_token就行了。在之前我讲调用人脸检测的接口时,只要你上传成功,返回值里面就会带着face_token这个参数。这里值得一提的是,我们通过调用人脸检测上传的图片只会被face++官方储存一段时间然后删除,若我们想要将我们上传的照片长期保存在face++官方的库中,则需要调用FaceSet这个api,相当于在face++建立一个我们自己的图片仓库,将我们上传的图片存到里面。 
这里先演示一个简单的例子:我先调用face++的人脸检测api(具体怎么调用的可以看我上一篇博客:调用人脸检测api地址),上传了两张图片,如下:

图片是我从网上随便找的(侵删)。上传之后得到两个face_token:72fc859abb56f7dc2c7d6e0700d251f8和90f86917d51c58dffc21c173fdfb7c7d,接着,我调用人脸对比的api,代码如下:

package com.example.demo;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;public class Compare {public static void main(String[] args) throws Exception {
//      设置网址String url = "https://api-cn.faceplusplus.com/facepp/v3/compare";
//        创建参数队列    List<BasicNameValuePair> formparams = new ArrayList<>();  formparams.add(new BasicNameValuePair("api_key", "your api key"));  formparams.add(new BasicNameValuePair("api_secret", "your api secret"));  formparams.add(new BasicNameValuePair("face_token1", "72fc859abb56f7dc2c7d6e0700d251f8"));  formparams.add(new BasicNameValuePair("face_token2", "90f86917d51c58dffc21c173fdfb7c7d"));
//      发送请求post(formparams,url);}/** * 发送 post请求访问本地应用并根据传递参数不同返回不同结果 */  public static void post(List<BasicNameValuePair> formparams,String url) {  // 创建默认的httpClient实例.    CloseableHttpClient httpclient = HttpClients.createDefault();  // 创建httppost    HttpPost httppost = new HttpPost(url);  UrlEncodedFormEntity uefEntity;  try {  uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");  httppost.setEntity(uefEntity);  System.out.println("executing request " + httppost.getURI());  CloseableHttpResponse response = httpclient.execute(httppost);  try {  HttpEntity entity = response.getEntity();  if (entity != null) {  System.out.println("--------------------------------------");  System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));  System.out.println("--------------------------------------");  }  } finally {  response.close();  }  } catch (ClientProtocolException e) {  e.printStackTrace();  } catch (UnsupportedEncodingException e1) {  e1.printStackTrace();  } catch (IOException e) {  e.printStackTrace();  } finally {  // 关闭连接,释放资源    try {  httpclient.close();  } catch (IOException e) {  e.printStackTrace();  }  }  }
}
  • 这里用java发了个http请求传入了api_key,api_secret,face_token1,face_token2四个参数。调用成功后返回结果如下:
--------------------------------------
16:14:04.347 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection [id: 0][route: {s}->https://api-cn.faceplusplus.com:443] can be kept alive indefinitely
16:14:04.347 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection released: [id: 0][route: {s}->https://api-cn.faceplusplus.com:443][total kept alive: 1; route allocated: 1 of 2; total allocated: 1 of 20]
Response content: {"confidence": 67.485, "request_id": "1514708045,f3e7b3bd-015c-4189-a47c-88b32ef3a91a", "time_used": 585, "thresholds": {"1e-3": 62.327, "1e-5": 73.975, "1e-4": 69.101}}
--------------------------------------

看看response content里面返回的参数:

  • confidence:67.485。

含义:比对结果置信度,范围 [0,100],小数点后3位有效数字,数字越大表示两个人脸越可能是同一个人。如果传入图片但图片中未检测到人脸,则无法进行比对,本字段不返回。

  • “request_id”: “1514708045,f3e7b3bd-015c-4189-a47c-88b32ef3a91a”

用于区分每一次请求的唯一的字符串。

  • “time_used”: 585

整个请求所花费的时间,单位为毫秒。

  • “thresholds”: {“1e-3”: 62.327, “1e-5”: 73.975, “1e-4”: 69.101}

一组用于参考的置信度阈值,包含以下三个字段。每个字段的值为一个 [0,100] 的浮点数,小数点后 3 位有效数字。

  • 1e-3:误识率为千分之一的置信度阈值;
  • 1e-4:误识率为万分之一的置信度阈值;
  • 1e-5:误识率为十万分之一的置信度阈值;

如果置信值低于“千分之一”阈值则不建议认为是同一个人;如果置信值超过“十万分之一”阈值,则是同一个人的几率非常高。请注意:阈值不是静态的,每次比对返回的阈值不保证相同,所以没有持久化保存阈值的必要,更不要将当前调用返回的 confidence 与之前调用返回的阈值比较。如果传入图片但图片中未检测到人脸,则无法进行比对,本字段不返回。

用置信度阈值和置信度做对比我们可以得出这样的结果:置信度(67.485)达到了千分之一(62.327),但并未达到万分之一(69.101)和十万分之一(73.975)的阈值。所以可以认为两张照片有可能是同一个人,但可能性不高。

因为之前上传的图片不能永久保存,我先建立一个FaceSet,让后将这两张照片添加到faceset中去。创建faceset代码如下:

package com.example.demo;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;public class Compare {public static void main(String[] args) throws Exception {
//      设置网址String url = "https://api-cn.faceplusplus.com/facepp/v3/faceset/create";
//        创建参数队列    List<BasicNameValuePair> formparams = new ArrayList<>();  formparams.add(new BasicNameValuePair("api_key", "your api key"));  formparams.add(new BasicNameValuePair("api_secret", "your api secret")); formparams.add(new BasicNameValuePair("outer_id", "myface_1"));
//      发送请求post(formparams,url);}/** * 发送 post请求访问本地应用并根据传递参数不同返回不同结果 */  public static void post(List<BasicNameValuePair> formparams,String url) {  // 创建默认的httpClient实例.    CloseableHttpClient httpclient = HttpClients.createDefault();  // 创建httppost    HttpPost httppost = new HttpPost(url);  UrlEncodedFormEntity uefEntity;  try {  uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");  httppost.setEntity(uefEntity);  System.out.println("executing request " + httppost.getURI());  CloseableHttpResponse response = httpclient.execute(httppost);  try {  HttpEntity entity = response.getEntity();  if (entity != null) {  System.out.println("--------------------------------------");  System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));  System.out.println("--------------------------------------");  }  } finally {  response.close();  }  } catch (ClientProtocolException e) {  e.printStackTrace();  } catch (UnsupportedEncodingException e1) {  e1.printStackTrace();  } catch (IOException e) {  e.printStackTrace();  } finally {  // 关闭连接,释放资源    try {  httpclient.close();  } catch (IOException e) {  e.printStackTrace();  }  }  }
}
  • 这里我只是将上面的代码修改了传入的参数,将url改为:https://api-cn.faceplusplus.com/facepp/v3/faceset/create。除了一直要传入的api_key和api_secret外,还传入了outer_id这个参数,用来指定我的faceset的唯一标识,因为face++允许我们创建多个faceset,随意还是加一个唯一标识好点。返回参数如下:
--------------------------------------
17:18:04.581 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection [id: 0][route: {s}->https://api-cn.faceplusplus.com:443] can be kept alive indefinitely
17:18:04.581 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection released: [id: 0][route: {s}->https://api-cn.faceplusplus.com:443][total kept alive: 1; route allocated: 1 of 2; total allocated: 1 of 20]
Response content: {"faceset_token": "9cb520b964d58b3484565f6788ac750a", "time_used": 110, "face_count": 0, "face_added": 0, "request_id": "1514711886,953de53f-9c22-4aca-904f-2ffff88761a1", "outer_id": "myface_1", "failure_detail": []}
--------------------------------------
  • 看到返回参数中faceset_token有值,就知道操作成功了。接下来我们把之前上传的图片加到faceset中,改变参数如下:
public static void main(String[] args) throws Exception {
//      设置网址String url = "https://api-cn.faceplusplus.com/facepp/v3/faceset/addface";
//        创建参数队列    List<BasicNameValuePair> formparams = new ArrayList<>();  formparams.add(new BasicNameValuePair("api_key", "your api key"));  formparams.add(new BasicNameValuePair("api_secret", "your api secret")); formparams.add(new BasicNameValuePair("outer_id", "myface_1"));  formparams.add(new BasicNameValuePair("face_tokens", "72fc859abb56f7dc2c7d6e0700d251f8"));
//      发送请求post(formparams,url);}
  • 将之前我添加的faceset的标识符myface_id传入,同时传入之前上传图片的face_token,请求完成得到一下参数:
Response content: {"faceset_token": "9cb520b964d58b3484565f6788ac750a", "time_used": 627, "face_count": 1, "face_added": 1, "request_id": "1514720178,9c0c43af-9923-461c-952e-f83f64f8f3e8", "outer_id": "myface_1", "failure_detail": []}
  • 1

看到face_count为1代表当前这个faceset的存放照片个数,face_added为1表示成功添加了一个。至此,上传的照片就已经永久储存在了face++官方服务器上。

至此,生产环境需要的主要的api我已经讲的差不多了。本来计划讲一讲具体的业务的实现的,但由于时间有限,决定留到下次博客再讲,这里先把需要实现的业务给出来:

智能门禁(7)----调用face++api实现人脸对比相关推荐

  1. Python调用百度API进行人脸对比

    目录 1. 作者介绍 2. 关于Base64知识介绍 2.1 Bsae64是什么 2.1 Bsae64编码原理 3. 实验过程 3.1 实验过程 3.2 实验代码 3.3 运行结果 3.4 问题分析 ...

  2. 人脸识别(二)调用face++api实现人脸对比

    上次博客简单讲了一下调用face++的api来检测人脸.当然,生产环境中要实现复杂的需求光靠这么简单的调用一下api肯定是不行的.这次先来讲一讲face++中实现人脸对比的api并实现一些相对较为复杂 ...

  3. 调用百度API实现人脸对比

    百度API人脸对比 1.首先注册一个百度账号 2.百度AI平台https://ai.baidu.com/,找到 开放能力>人脸与人体检测>人脸对比>立即使用>创建应用 ,点击 ...

  4. Qt+百度API实现人脸对比寻找明星脸

    一.要求 1.使用百度人脸识别库 2.识别对比图片,获取图片相似度 3.显示最相似的明星照片.显示本人照片 4.调用摄像头拍照.比对查找最相似的明星脸 5.录入明星照片.查看照片列表.修改.删除照片 ...

  5. python3调用百度API完成人脸识别,检测人种-年龄-性别-颜值-眼镜

    https://ai.baidu.com/docs#/Face-Detect/top 这个是百度人脸识别api 参考博客:https://blog.csdn.net/qq_38412868/artic ...

  6. 调用百度人脸识别API进行人脸对比 C语言

    百度人脸识别api使用是免费的,有人脸对比.人脸搜索.人脸检测与属性分析三个功能,本文写的是人脸对比.这里给出百度人脸对比api的技术文档,请点击网址https://cloud.baidu.com/d ...

  7. 通过百度人脸对比API进行人脸对比

    百度人脸对比API的使用 今天突然有兴趣想做个人脸识别的小demo,项目代码地址:https://github.com/lxixi01/Face_Recognition 效果如下: 步骤: 第一步,需 ...

  8. Python调用华为API实现人脸比对

    目录 1.作者介绍 2.背景及访问流程介绍 2.1 人脸识别服务介绍 2.2 华为人脸服务 2.3 华为API访问流程 2.4 构建HTTPS协议 2.5 人脸识别限制要求 3.关于实验代码.实验过程 ...

  9. C#调用Face++ API实现人脸融合

    文章目录 一.人脸融合原理 二.代码实现 1.注册账号 2.创建发送请求和反馈的类 3.实现融合 4.生成图片 引言: 随着AI人工智能的发展,物联网技术逐渐进入平常百姓家,而人脸融合技术更能体现AI ...

最新文章

  1. 如何使用mysql索引查询_MYSQL索引问题:索引在查询中如何使用?
  2. java mvc 实际分层_SpringMVC体系分层模式原理图解
  3. mac下登录mysql数据库_1.Mac下面按照mysql数据库的步骤:
  4. 使用Jenkins,GitHub和Docker的最先进的持续集成和部署管道
  5. 第三章 使用单元测试测试简单的首页
  6. 如何用FineReport制作一张报表(二)
  7. mysql 停从库_不停止 MySQL 服务增加从库的两种方式
  8. Nginx实现二级域名店铺
  9. 四大关键词解读“智慧乌鲁木齐”密码
  10. Litespeed如何安装phpmyadmin/pureftpd
  11. 光伏窗性能研究(3)——单层光伏窗节能性能研究
  12. 面向部件的整车E/E架构开发咨询服务
  13. QQ截图出现闪退,无法截图(亲测有效)
  14. Selenium 2自动化测试实战
  15. Structure of a Google Docs document 谷歌文档的结构
  16. 最新系统MacOs13 Ventura(M1/M2芯片) + Parallels Desktop 18(PD18史上最强虚拟机)永久使用攻略
  17. java串口读取数据设置超时时间,附详细答案
  18. 私服服务器原理,传奇私服新手gm如何假设一个属于自己的服务器
  19. 法兰克弧焊机器人,FANUC焊接机器人培训.ppt
  20. java班组长竞聘演讲稿_班组长竞聘的演讲稿

热门文章

  1. 电脑cpu风扇转一下就停无法开机_电脑无法正常开机风扇转一下就停的原因及解决方法...
  2. 径向基(Radial basis function)神经网络、核函数的一些理解
  3. html里面textfield属性,StyleableTextField的CSS属性htmlText
  4. 进程通信方法的特点以及使用场景
  5. 面试题17.04.消失的数字
  6. Mysql之慢查询日志详解
  7. oracle 命令分析2
  8. 配置win2003 server IIS的总结,为什么IIs的工作进程会在空闲时间释放的问题。同时学会了throw的真正含义,throw的真正含义就是导致程序停止,崩溃,很简单,网摘也有记录。...
  9. 第三天,编码设置,主键设置与删除,无关子查询,相关子查询,表与表之间的关系...
  10. Poi操作Excel