本示例介绍如何使用Alibaba Cloud SDK for Java进行自定义人脸检索。

前提条件

在使用本教程之前,请确保已完成以下操作:
  • 使用Alibaba Cloud SDK for Java,您需要一个阿里云账号和访问密钥(AccessKey)。 请在阿里云控制台中的AccessKey管理页面上创建和查看您的AccessKey。
  • 确保您已经安装了Alibaba Cloud SDK for Java,准确的SDK版本号,请参见 阿里云开发工具包(SDK)
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.4.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-green -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-green</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-oss -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.61</version>
        </dependency>
    </dependencies>
  • 如果使用本地文件或者二进制文件检测,请下载并在项目工程中引入Extension.Uploader工具类

代码示例

  • 人脸图片检索(URL)代码示例:
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.aliyuncs.CommonRequest;
    import com.aliyuncs.CommonResponse;
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.exceptions.ServerException;
    import com.aliyuncs.http.FormatType;
    import com.aliyuncs.http.MethodType;
    import com.aliyuncs.http.ProtocolType;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.profile.IClientProfile;
    
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    
    public class FaceScanRequestSample {
        public static void main(String[] args) {
            IClientProfile profile = DefaultProfile.getProfile(
                    "<your-region-id>", // 您的可用区ID
                    "<your-access-key-id>", // 您的AccessKey ID
                    "<your-access-key-secret>"); // 您的AccessKey Secret
            IAcsClient client = new DefaultAcsClient(profile);
    
            CommonRequest request = new CommonRequest();
            // 指定请求方式
            request.setSysMethod(MethodType.POST);
            // 指定请求地址
            request.setSysDomain("green.cn-hangzhou.aliyuncs.com");
            // 指定请求方法
            request.setSysUriPattern("/green/image/scan");
            // 指定请求版本
            request.setSysVersion("2018-05-09");
            // 支持HTTP和HTTPS
            request.setSysProtocol(ProtocolType.HTTPS);
    
            // 组装请求参数
            JSONObject httpBody = new JSONObject();
            // 图片检测场景,自定义人脸检索业务下,该参数取值为:sface-n
            httpBody.put("scenes", "sface-n");
            JSONObject task = new JSONObject();
            // 数据Id
            task.put("dataId", UUID.randomUUID().toString());
            // 待检测图像的URL
            task.put("url", "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1826888913,1580553017&fm=26&gp=0.jpg");
            Map<String, Object> extras = new HashMap<>();
            extras.put("groupId", "group1");
            // 附加信息,需要传入groupId
            task.put("extras", extras);
            // 待识别人脸相关信息
            httpBody.put("tasks", Arrays.asList(task));
            request.setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()),
                    "UTF-8", FormatType.JSON);
    
            // 请设置超时时间, 服务端全链路处理超时时间为10秒,请做相应设置
            // 如果您设置的ReadTimeout小于服务端处理的时间,程序中会获得一个read timeout异常
            request.setSysConnectTimeout(3000);
            request.setSysReadTimeout(10000);
            try {
                CommonResponse response = client.getCommonResponse(request);
                JSONObject dataJson = JSON.parseObject(response.getData());
                System.out.println(JSON.toJSONString(dataJson, true));
            } 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());
            }
    
        }
    }
    					
  • 人脸图片检索(本地文件)代码示例:
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.aliyuncs.CommonRequest;
    import com.aliyuncs.CommonResponse;
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.exceptions.ServerException;
    import com.aliyuncs.green.extension.uploader.ClientUploader;
    import com.aliyuncs.http.FormatType;
    import com.aliyuncs.http.MethodType;
    import com.aliyuncs.http.ProtocolType;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.profile.IClientProfile;
    
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    
    public class FaceScanRequestSample {
        public static void main(String[] args) {
            IClientProfile profile = DefaultProfile.getProfile(
                    "<your-region-id>",             // 您的可用区ID
                    "<your-access-key-id>",         // 您的AccessKey ID
                    "<your-access-key-secret>");    // 您的AccessKey Secret
            IAcsClient client = new DefaultAcsClient(profile);
    
            CommonRequest request = new CommonRequest();
            // 指定请求方式
            request.setSysMethod(MethodType.POST);
            // 指定请求地址
            request.setSysDomain("green.cn-hangzhou.aliyuncs.com");
            // 指定请求方法
            request.setSysUriPattern("/green/image/scan");
            // 指定请求版本
            request.setSysVersion("2018-05-09");
            // 支持HTTP和HTTPS
            request.setSysProtocol(ProtocolType.HTTPS);
    
            // 组装请求参数
            JSONObject httpBody = new JSONObject();
            httpBody.put("scenes", "sface-n");
            JSONObject task = new JSONObject();
            task.put("dataId", UUID.randomUUID().toString());
            ClientUploader clientUploader = ClientUploader.getImageClientUploader(profile, false);
            String url = null;
            try{
                url = clientUploader.uploadFile("C:/Users/admin/Desktop/person1.png");
            }catch (Exception e){
                e.printStackTrace();
            }
            task.put("url", url);
            Map<String, Object> extras = new HashMap<>();
            extras.put("groupId", "group1");
            task.put("extras", extras);
            httpBody.put("tasks", Arrays.asList(task));
            request.setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()),
                    "UTF-8", FormatType.JSON);
    
            // 请设置超时时间, 服务端全链路处理超时时间为10秒,请做相应设置
            // 如果您设置的ReadTimeout小于服务端处理的时间,程序中会获得一个read timeout异常
            request.setSysConnectTimeout(3000);
            request.setSysReadTimeout(10000);
            try {
                CommonResponse response = client.getCommonResponse(request);
                JSONObject dataJson = JSON.parseObject(response.getData());
                System.out.println(JSON.toJSONString(dataJson, true));
            } 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());
            }
    
        }
    }

执行结果

正确的执行结果类似如下:
{
    "msg":"OK",
    "code":200,
    "data":[
        {
            "msg":"OK",
            "code":200,
            "dataId":"66a45e5b-d666-4236-9809-ae944c37e285",
            "extras":{},
            "results":[
                {
                    "rate":99.9,
                    "topPersonData":[
                        {
                            "faceItem":{
                                "width":116,
                                "x":123,
                                "y":40,
                                "height":116
                            }
                        }
                    ],
                    "suggestion":"pass",
                    "label":"normal",
                    "scene":"sface-n"
                }
            ],
            "taskId":"img3fL2N6Vi48i6QR1@0M****-1rGKyC",
            "url":"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1826888913,1580553017&fm=26&gp=0.jpg"
        }
    ],
    "requestId":"1686C103-2D2D-4837-A55B-2ADB818B1312"
}