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 に答える