/identity/compare_faces_in_two_images
优质
小牛编辑
140浏览
2023-12-01
1.接口描述
该API的功能是将两张有多个人脸图片进行比对,来判断是否有人同时出现在两张图片中。 要求每张图片的人脸不超过4个!(如果图片中超过4个人脸,请调用1:N接口)
常见的使用场景:一张个人照片,一张合影照片, 调用本接口可以判断个人照中的人是否出现在合影照片中。
图片要求
- 格式为 JPG(JPEG),BMP,PNG,GIF,TIFF
- 宽和高大于 8px,小于等于4000px
- 小于等于 5 MB
支持自动识别人脸方向
- 上传的图片中包含有 exif 方向信息,先按此信息旋转、翻转后再做识别人脸方向并调整
- 如果照片方向混乱且 exif 方向信息不存在或不正确,自动识别人脸方向并调整
请求方式:
POST
请求URL:
https://cloudapi.linkface.cn/identity/compare_faces_in_two_images
2.请求参数
字段 | 类型 | 必需 | 描述 |
---|---|---|---|
api_id | string | 是 | API 账户 |
api_secret | string | 是 | API 密钥 |
image_one_file | file | 见下方注释 | 第一张图片的image_one_file,本地上传选取此参数 |
image_one_url | string | 见下方注释 | 第一张图片的url,从网络获取时选取此参数 |
image_one_id | file | 见下方注释 | 第一张图片的云端id,在云端上传过可选取此参数 |
image_two_file | file | 见下方注释 | 第二张图片的image_one_file,本地上传选取此参数 |
image_two_url | string | 见下方注释 | 第二张图片的url,从网络获取时需选取此参数 |
image_two_id | string | 见下方注释 | 第二张图片的云端id,在云端上传过可选取此参数 |
image_one_auto_rotate | boolean | 否 | 开启第一张图片自动旋转功能。开通:true,不开通:false。默认false |
image_two_auto_rotate | boolean | 否 | 开启第二张图片自动旋转功能。开通:true,不开通:false。默认false |
注释:
请求参数
image_one_file
,image_one_url
与image_one_id
三选一。请求参数
image_two_file
,image_two_url
与image_two_id
三选一。参数
image_one_file
与image_two_file
需把图片文件以 multipart/form-data 的形式放到 POST 消息体中。打开自动旋转功能会增加运算时间,请酌情考虑是否开通
3.输出参数
正常响应 (200
)
字段 | 类型 | 描述 |
---|---|---|
request_id | string | 本次请求的 id |
status | string | 状态。正常为 OK ,其他值表示失败。详见错误码。 |
confidences | array | 置信度矩阵。值为 [0,1],值越大表示两张照片有同一个人的可能性越大 |
max_confidence | float | 最相似的人脸比对结果值 |
image_two | object | 第二张图片的云端id,若使用file、url方式上传第二张图片返回此参数 |
image_one | object | 第一张图片的云端id,若使用file、url方式上传第一张图片返回此参数 |
置信度阈值与错误率对应关系:
阈值 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 |
---|---|---|---|---|---|---|
错误率 | 十分之一 | 百分之一 | 千分之一 | 万分之一 | 十万分之一 | 百万分之一 |
输出示例:
{
"request_id": "TID8bf47ab6eda64476973cc5f5b6ebf57e",
"status": "OK",
"confidences": [
[
0.9410581588745117,
0.37318912148475647
],
[
0.34146273136138916,
0.3264574706554413
]
],
"max_confidence": 0.9410581588745117,
"image_one": {
"image_one_id": "6d1ac07746624c1abe9c219446b72c32"
},
"image_two": {
"image_two_id": "44b0a59de4e045e0b61c9c08dc8f0a9d"
}
}
这是一个第一张图片有两个人脸,第二张图片中有两个人脸的返回例子。confidences
第一个数组表示第一张图片中的第一个人脸和第二张图片的每个脸分别比较的置信度;第二个数组表示第一张图片中的第二个人脸和第二张图片的每个脸分别比较的置信度;
因为confidences
第一个数组的第一个值大于0.9
,说明第一张图片的第一个人脸非常非常可能在第二张图片中!
4.错误码
状态码 | status 字段 | 说明 |
---|---|---|
400 | ENCODING_ERROR | 参数非UTF-8编码 |
400 | DOWNLOAD_TIMEOUT | 从网络获取图片超时。对应图片见字段 image 所反馈的值 |
400 | DOWNLOAD_ERROR | 网络地址图片获取失败。对应图片见字段 image 所反馈的值 |
400 | IMAGE_FILE_SIZE_TOO_BIG | 图片体积过大。对应图片见字段 image 所反馈的值 |
400 | IMAGE_ID_NOT_EXIST | 图片不存在。对应图片见字段 image 所反馈的值。 |
400 | NO_FACE_DETECTED | 图片未检测出人脸 。对应图片见字段 image 所反馈的值 |
400 | TOO_MANY_FACES | 图片检测出多于4个人脸数 。对应图片见字段 image 所反馈的值 |
400 | CORRUPT_IMAGE | 不是图片文件或已经损坏。对应图片见字段 image 所反馈的值 |
400 | INVALID_IMAGE_FORMAT_OR_SIZE | 图片大小或格式不符合要求。对应图片见字段 image 所反馈的值 |
400 | INVALID_ARGUMENT | 请求参数错误,具体原因见 reason 字段内容 |
401 | UNAUTHORIZED | 账号或密钥错误 |
401 | KEY_EXPIRED | 账号过期,具体情况见 reason 字段内容 |
403 | RATE_LIMIT_EXCEEDED | 调用频率超出限额 |
403 | NO_PERMISSION | 无调用权限 |
403 | OUT_OF_QUOTA | 调用次数超出限额 |
404 | NOT_FOUND | 请求路径错误 |
500 | INTERNAL_ERROR | 服务器内部错误 |
输出示例:
{
"status": "DOWNLOAD_TIMEOUT",
"image": "selfie",
"request_id": "TID8bf47ab6eda64476973cc5f5b6ebf57e"
}
5.输入示例
cURL 样例
curl -X POST "https://cloudapi.linkface.cn/identity/compare_faces_in_two_images?api_id=ID&api_secret=SECRET" \
-F image_one_file=@/PATH/TO/IMAGE1 -F image_two_file=@/PATH/TO/IMAGE2
HTTPie 样例
http -f POST "https://cloudapi.linkface.cn/identity/compare_faces_in_two_images?api_id=ID&api_secret=SECRET" \
image_one_file@/PATH/TO/IMAGE1 image_two_file@/PATH/TO/IMAGE2
C++ 样例
#include <iostream>
#include <cstring>
#include <exception>
#include <curl/curl.h>
#include <json/json.h>
using namespace std;
size_t callback(char *ptr, size_t size, size_t nmemb, string &stream){
size_t sizes = size*nmemb;
string temp(ptr,sizes);
stream += temp;
return sizes;
}
int main( int argv, char * argc[] ){
CURL *curl;
CURLM *multi_handle;
CURLcode res;
long code;
string stream;
struct curl_httppost *formpost = NULL;
struct curl_httppost *lastptr = NULL;
struct curl_slist *headerlist = NULL;
try{
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if( curl ){
curl_formadd(&formpost,&lastptr,CURLFORM_COPYNAME,"api_id",
CURLFORM_COPYCONTENTS, "ID",CURLFORM_END);
curl_formadd(&formpost,&lastptr,CURLFORM_COPYNAME,"api_secret",
CURLFORM_COPYCONTENTS, "SECRET",CURLFORM_END);
curl_formadd(&formpost,&lastptr,CURLFORM_COPYNAME,"image_one_file",
CURLFORM_FILE, argc[1], CURLFORM_END);
curl_formadd(&formpost,&lastptr,CURLFORM_COPYNAME,"image_two_file",
CURLFORM_FILE, argc[2], CURLFORM_END);
curl_easy_setopt(curl, CURLOPT_URL, "https://cloudapi.linkface.cn/identity/compare_faces_in_two_images");
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &stream);
#ifdef SKIP_PEER_VERIFICATION
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
#endif
#ifdef SKIP_HOSTNAME_VERIFICATION
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
#endif
res = curl_easy_perform(curl);
if( res != CURLE_OK ){
cout<<"curl_easy_perform() failed:"<<curl_easy_strerror(res)<<endl;
return -1;
}
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
Json::Value res_data;
Json::Reader *reader = new Json::Reader(Json::Features::strictMode());
if(!reader->parse(stream, res_data)){
cout<<"parse error";
return -1;
}
cout<<"HTTP Status Code:"<<code<<endl;
cout<<res_data<<endl;
curl_easy_cleanup(curl);
}
curl_global_cleanup();
}catch(exception &ex){
cout<<"curl exception:"<<ex.what()<<endl;
}
}
Java 样例
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
public class httpClientPost {
public static final String api_id = "ID";
public static final String api_secret = "SECRET";
public static final String filepath1="C:/Users/face1.jpg";//图片1路径
public static final String filepath2="C:/Users/face2.jpg";//图片2路径
public static final String POST_URL = "https://cloudapi.linkface.cn/identity/compare_faces_in_two_images";
public static void HttpClientPost() throws ClientProtocolException, IOException {
HttpClient httpclient = new DefaultHttpClient();
HttpPost post = new HttpPost(POST_URL);
StringBody id = new StringBody(api_id);
StringBody secret = new StringBody(api_secret);
FileBody fileBody1 = new FileBody(new File(filepath1));
FileBody fileBody2 = new FileBody(new File(filepath2));
MultipartEntity entity = new MultipartEntity();
entity.addPart("image_one_file", fileBody1);
entity.addPart("image_two_file", fileBody2);
entity.addPart("api_id", id);
entity.addPart("api_secret", secret);
post.setEntity(entity);
HttpResponse response = httpclient.execute(post);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entitys = response.getEntity();
BufferedReader reader = new BufferedReader(
new InputStreamReader(entitys.getContent()));
String line = reader.readLine();
System.out.println(line);
}else{
HttpEntity r_entity = response.getEntity();
String responseString = EntityUtils.toString(r_entity);
System.out.println("错误码是:"+response.getStatusLine().getStatusCode()+" "+response.getStatusLine().getReasonPhrase());
System.out.println("出错原因是:"+responseString);
//你需要根据出错的原因判断错误信息,并修改
}
httpclient.getConnectionManager().shutdown();
}
public static void main(String[] args) throws ClientProtocolException, IOException {
HttpClientPost();
}
}
Ruby 样例
require 'net/http/post/multipart'
require 'json'
begin
uri = URI.parse('https://cloudapi.linkface.cn/identity/compare_faces_in_two_images')
req = Net::HTTP::Post::Multipart.new uri.path,
"image_one_file" => UploadIO.new(File.new("./px.jpg"), "image/jpeg", "px.jpg"),
"image_two_file" => UploadIO.new(File.new("./px_test"), "image/jpeg", "px_test"),
"api_id" => "ID",
"api_secret" => "SECRET"
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
http.request(req)
end
result = JSON.parse(res.body)
puts result
rescue Exception => e
puts e.message
end
Python 样例
我们提供的样例支持 Python 2.7 & 3.4–3.7 和 PyPy,其他版本暂不提供,需要您查阅相关资料。
import requests
try:
host = 'https://cloudapi.linkface.cn'
url = host + '/identity/compare_faces_in_two_images'
files = {'image_one_file': open('/image/one/file/path', 'rb'), 'image_two_file': open('/image/two/file/path', 'rb')}
data = {'api_id': 'ID','api_secret': 'SECRET'}
response = requests.post(url, files = files, data = data)
result = response.json()
print result
except Exception as e:
print("type error: " + str(e))
PHP 样例
我们提供的样例是基于 PHP 5.5 与 PHP 5.6 两个版本,其他版本暂不提供,需要您查阅相关资料。
以下样例是基于 PHP 5.5 版本的。
<?php
$testurl = 'https://cloudapi.linkface.cn/identity/compare_faces_in_two_images'; // url
$selfiePath = 'C:/Users/face1.jpg';//图片1路径
$historicalPath = 'C:/Users/face2.jpg';//图片2路径
$selfieContent = '@' . realpath($selfiePath);
$historicalContent = '@' . realpath($historicalPath);
$post_data = array ('api_id' => 'ID','api_secret' => 'SECRET',
'image_one_file' => $selfieContent,'image_two_file' =>$historicalContent);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $testurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//您可以根据需要,决定是否打开SSL验证
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
var_dump($output);
curl_close($ch);
?>
以下样例是基于 PHP 5.6 版本的。
<?php
$testurl = 'https://cloudapi.linkface.cn/identity/compare_faces_in_two_images'; // url
$selfiePath = 'C:/Users/face1.jpg';//图片1路径
$historicalPath = 'C:/Users/face2.jpg';//图片2路径
$selfieContent = new \CURLFile($selfiePath);
$historicalContent = new \CURLFile($historicalPath);
$post_data = array ('api_id' => 'ID','api_secret' => 'SECRET',
'image_one_url' => $selfieContent,'image_two_id' => $historicalContent);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $testurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//您可以根据需要,决定是否打开SSL验证
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
var_dump($output);
curl_close($ch);
?>