1

我正在尝试向 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();
    }
}
4

1 回答 1

1

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

于 2016-12-25T13:44:52.490 回答