阿里云视觉智能开放平台提供人脸人体AI服务,该服务中的大部分API都可以单独使用,人脸搜索的API则需要多个API调用配合使用。本文档为您介绍如何调用多个API进行人脸搜索。

操作流程

  1. 开通服务。您需要开通人脸人体服务和对象存储服务。
  2. 添加POM依赖。
  3. 创建人脸数据库。关于该接口的详细说明请参见创建人脸数据库
  4. 添加人脸样本。关于该接口的详细说明请参见添加人脸样本
  5. 添加人脸数据。关于该接口的详细说明请参见添加人脸数据
  6. 搜索人脸。关于该接口的详细说明请参见搜索人脸

开通服务

调用人脸搜索相关API前,您需要开通人脸人体服务。在添加人脸数据时,需要先将图片上传至上海地域的OSS Bucket中生成URL链接,通过图片URL链接添加人脸数据。关于如何开通OSS服务请参见开通OSS服务。下面为您介绍如何开通人脸人体服务。

  1. 登录阿里云视觉智能开放平台
  2. 在顶部菜单栏的能力广场中单击人脸人体
  3. 人脸人体页面中单击免费使用
  4. 确认开通地域后单击立即购买
  5. 确认订单步骤中勾选我已阅读并同意人脸人体服务协议后单击立即开通

    页面提示服务开通成功。

    说明
    • 当前平台还在公测阶段,所有服务均可以免费使用。
    • 开通了人脸人体服务后,该服务下的所有API均可以直接调用,不需要再单独开通。

添加POM依赖

在您的Java工程中添加人体人脸能力的POM依赖。
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-facebody -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-facebody</artifactId>
    <version>1.2.2</version>
</dependency>

创建人脸数据库

调用CreateFaceDb接口创建人脸数据库,数据库名称为:compare_face_test。Java代码请求示例如下。
说明 请将如下代码示例中的<accessKeyId><accessSecret>替换为您的真实AK信息。如何获取AK请参见创建AccessKey
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.util.*;
import com.aliyuncs.facebody.model.v20191230.*;

public class CreateFaceDb {

    public static void main(String[] args) {
        DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "<accessKeyId>", "<accessSecret>");
        IAcsClient client = new DefaultAcsClient(profile);

        CreateFaceDbRequest request = new CreateFaceDbRequest();
        request.setRegionId("cn-shanghai");
        request.setName("compare_face_test");

        try {
            CreateFaceDbResponse response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

    }
}

添加人脸样本

调用AddFaceEntity接口添加人脸样本,添加的人脸样本ID为:compare_face_test_entity。Java代码请求示例如下。
说明 请将如下代码示例中的<accessKeyId><accessSecret>替换为您的真实AK信息。如何获取AK请参见创建AccessKey
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.util.*;
import com.aliyuncs.facebody.model.v20191230.*;

public class AddFaceEntity {

    public static void main(String[] args) {
        DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "<accessKeyId>", "<accessSecret>");
        IAcsClient client = new DefaultAcsClient(profile);

        AddFaceEntityRequest request = new AddFaceEntityRequest();
        request.setRegionId("cn-shanghai");
        request.setDbName("compare_face_test");
        request.setEntityId("compare_face_test_entity");
        request.setLabels("人事");

        try {
            AddFaceEntityResponse response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

    }
}
                

添加人脸数据

在添加人脸前,我们需要将人脸图片生成图片URL,然后调用AddFace接口传入图片URL添加人脸数据。

  1. 开通OSS服务。
    具体操作请参见开通OSS服务
  2. 创建存储空间,其中区域选择为华东2(上海)
    具体操作请参见创建存储空间
  3. 上传人脸图片至OSS存储空间中。
    具体操作请参见上传文件
  4. 查看人脸图片的URL。
    1. 单击已上传人脸图片后的详情
    2. 详情页面查看图片的URL
      您也可以单击URL下的复制文件 URL复制人脸图片的URL。
  5. 调用AddFace添加人脸数据。
    Java代码请求示例如下。
    说明 请将如下代码示例中的<accessKeyId><accessSecret>替换为您的真实AK信息。如何获取AK请参见创建AccessKey
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.exceptions.ServerException;
    import com.aliyuncs.profile.DefaultProfile;
    import com.google.gson.Gson;
    import java.util.*;
    import com.aliyuncs.facebody.model.v20191230.*;
    
    public class AddFace {
    
        public static void main(String[] args) {
            DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "<accessKeyId>", "<accessSecret>");
            IAcsClient client = new DefaultAcsClient(profile);
    
            AddFaceRequest request = new AddFaceRequest();
            request.setRegionId("cn-shanghai");
            request.setDbName("compare_face_test");
            request.setImageUrl("https://viapi-test.oss-cn-shanghai.aliyuncs.com/test/imgsearch/demo/1.png");
            request.setEntityId("compare_face_test_entity");
            request.setExtraData("小明");
    
            try {
                AddFaceResponse response = client.getAcsResponse(request);
                System.out.println(new Gson().toJson(response));
            } catch (ServerException e) {
                e.printStackTrace();
            } catch (ClientException e) {
                System.out.println("ErrCode:" + e.getErrCode());
                System.out.println("ErrMsg:" + e.getErrMsg());
                System.out.println("RequestId:" + e.getRequestId());
            }
    
        }
    }
                            

搜索人脸

在人脸数据库compare_face_test中,搜索已经添加的人脸数据。Java代码请求示例如下。
说明 请将如下代码示例中的<accessKeyId><accessSecret>替换为您的真实AK信息。如何获取AK请参见创建AccessKey
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.util.*;
import com.aliyuncs.facebody.model.v20191230.*;

public class SearchFace {

    public static void main(String[] args) {
        DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "<accessKeyId>", "<accessSecret>");
        IAcsClient client = new DefaultAcsClient(profile);

        SearchFaceRequest request = new SearchFaceRequest();
        request.setRegionId("cn-shanghai");
        request.setDbName("compare_face_test");
        request.setImageUrl("https://viapi-test.oss-cn-shanghai.aliyuncs.com/test-team/tiankong/9%E4%BA%BA%E8%84%B82.png");
        request.setLimit(5);

        try {
            SearchFaceResponse response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

    }
}
                
搜索人脸数据的返回结果示例如下。
{
    "RequestId": "D2995F67-5A0E-4FA4-BFF5-5692B7C4A558",
    "Data": {
        "MatchList": [
            {
                "FaceItems": [
                    {
                        "FaceId": "1589871296906000",
                        "EntityId": "compare_face_test_entity",
                        "Score": 1,
                        "ExtraData": "小明"
                    }
                ],
                "Location": {
                    "X": 191,
                    "Y": 66,
                    "Height": 324,
                    "Width": 230
                }
            }
        ]
    }
}