前言
文章演示如何调用face++实现人脸对比。使用工具python。这里只演示一个对比的接口,接口的应用场景有登录验证,证件对比等。除此之外face++还提供了许多接口,和离线sdk。具体接口文档face++官方都非常详细,没必要每个接口都进行说明。
接口调用
# coding=utf-8
# face++ 人脸识别对比
import requests
import base64
def file_base64(file_name):
with open(file_name, 'rb') as fin:
file_data = fin.read()
base64_data = base64.b64encode(file_data)
return base64_data
def post_pic():
url = 'https://api-cn.faceplusplus.com/facepp/v3/compare'
image_1 = file_base64('1.png')
image_2 = file_base64('3.png')
postData = {
'api_key': 'ZSj******4kE',
'api_secret': 'Ve9******JcJ',
'image_base64_1': image_1,
'image_base64_2': image_2,
}
back = requests.post(url, data = postData)
print back.text
if __name__=="__main__":
post_pic()
接口调用通过post方式传参。只要注册了face++,基本上每个接口都能免费调用。
接口支持四种图片上传的方式。
- face_token1 人脸标识 face_token。face_token是face++提供的唯一标识照片的token。在图片上传之后,会返回这个参数。
- image_url1 这是一个url图片地址。
- image_file1 二进制文件,需要用 post multipart/form-data 的方式上传。
- base64 编码的二进制图片数据
如果同时传入了 image_url1、image_file1 和 image_base64_1 参数,API 使用顺序为image_file1 优先,image_url1 最低。这四个参数里面face_token优先使用。
接口返回
接口请求成功后会返回许多参数,包括图片信息,图片的face_token。
这些参数没有什么好说明的。一般的api都会返回类似的参数。但是有两个参数需要说明一下。
- confidence 比对结果置信度,范围 [0,100],小数点后3位有效数字,数字越大表示两个人脸越可能是同一个人。
- thresholds 一组用于参考的置信度阈值,包含以下三个字段。每个字段的值为一个 [0,100] 的浮点数,小数点后 3 位有效数字。
(1).1e-3:误识率为千分之一的置信度阈值;
(2).1e-4:误识率为万分之一的置信度阈值;
(3).1e-5:误识率为十万分之一的置信度阈值;
如果置信值低于“千分之一”阈值则不建议认为是同一个人;如果置信值超过“十万分之一”阈值,则是同一个人的几率非常高。
请注意:阈值不是静态的,每次比对返回的阈值不保证相同,所以没有持久化保存阈值的必要,更不要将当前调用返回的 confidence 与之前调用返回的阈值比较。
简单的说。接口调用成功后,返回的参数并不会告诉你这两张图片中是否是同一个人。而是通过两个参数,让你自己做判断。当然,其中一个参数(thresholds—-置信度阀值)会给以你个参考标准。
实际调用结果
这里样本太少,不具备参考依据。
实验过程中,使用同一个人的照片返回的置信值88。比“十万分之一”阈值高。而使用两个人的照片进行对比。返回的置信值只有22左右。比“千分之一”阈值要低。从官方的判断方法上来说,结果是准确的。但是又一个地方不太明白。两次的结果中,“十万分之一”阈值要比“万分之一”阈值低很多。
图片的对比,没有使用跨年龄较大的图片,后面有兴趣可以试一下,看一下结果是否准确。