Google Vision Java客户端批量请求响应标识

时间:2016-09-13 20:21:49

标签: java google-cloud-platform bulk google-cloud-vision

我正在尝试向Google Vision Text Detection API发出批量请求。到目前为止,我将图像的路径放入列表中,进行批量请求并获得响应。但是,我无法确定哪个结果属于哪个图像。为此,我尝试将ID放入请求中,当我得到结果时,我会比较ID。但是,我无法在请求中添加任何自定义字段。我的方法有问题吗?我怎么知道哪个响应属于哪个图像?

以下是我用于这些请求的代码:

private Vision vision;
private static final String APPLICATION_NAME = "ProjectName";

public static Vision getVisionService() throws IOException, GeneralSecurityException {

    GoogleCredential credential = GoogleCredential.fromStream
            (new FileInputStream("/project-key.json"))
            .createScoped(VisionScopes.all());
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
    return new Vision.Builder(GoogleNetHttpTransport.newTrustedTransport(), jsonFactory, credential)
            .setApplicationName(APPLICATION_NAME)
            .build();
}
/**
 * Gets up to {@code maxResults} text annotations for images stored at {@code paths}.
 */
public List<String> detectText(List<Path> paths) {
    ImmutableList.Builder<AnnotateImageRequest> requests = ImmutableList.builder();

    try {
        for (Path path : paths) {
            byte[] data;
            data = Files.readAllBytes(path);
            requests.add(
                    new AnnotateImageRequest()
                    .setImage(new Image().encodeContent(data))
                    .setFeatures(ImmutableList.of(
                            new Feature()
                            .setType("TEXT_DETECTION")
                            .setMaxResults(10))));
        }

        Vision.Images.Annotate annotate =
                vision.images()
                .annotate(new BatchAnnotateImagesRequest().setRequests(requests.build()));
        // Due to a bug: requests to Vision API containing large images fail when GZipped.
        annotate.setDisableGZipContent(true);
        BatchAnnotateImagesResponse batchResponse = annotate.execute();
        assert batchResponse.getResponses().size() == paths.size();

        List<String> output = new ArrayList();

        for (int i = 0; i < paths.size(); i++) {
            AnnotateImageResponse response = batchResponse.getResponses().get(i);
            if(response != null && response.getTextAnnotations() != null){
                System.out.println(response.toString());
                String result = getDescriptionFromJson(response.getTextAnnotations().toString());
                System.out.println(response.get("customField"));
                output.add(result);
            }
        }
        return output;
    } catch (IOException ex) {
        System.out.println("Exception occured: " + ex);
        return null;
    }
}

public String getDescriptionFromJson(String json){
    JSONArray results = new JSONArray(json);
    JSONObject result = (JSONObject) results.get(0);
    return result.getString("description");
}

public static void main(String[] args) {
    GoogleVisionQueryHelper g = new GoogleVisionQueryHelper();

    try {
        g.vision = getVisionService();
        List<Path> paths = new ArrayList<>();

        String directory = "/images";

        File[] files = new File(directory).listFiles();
        for(File file : files){
          if(file.isFile() && !file.getName().contains("DS_Store") && !file.getName().startsWith(".")){
            System.out.println(file.getAbsolutePath());
            paths.add(Paths.get(file.getAbsolutePath()));
          }
        }           
        System.out.println("Starting...");

        for(String s: g.detectText(paths)){
            System.out.println(s);
        }
    } catch (IOException | GeneralSecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:1)

BatchAnnotateImageResponse以与BatchAnnotateImageRequest中的请求List相同的顺序保存响应List。