[Android] Google Cloud Vision API를 사용한 WEBDETECTION

시작


이번에는 웹 전단·서버 측면의 사람으로서 간단한 안드로이드 앱을 개발하기 위해 막혔을 때의 지식 공유가 주를 이뤘다.
그래서 내용이 아주 간단하다고 생각했는데 처리할 때 전혀 참고할 만한 글을 찾지 못해 조금 고생한 게 기고의 배경이었다.

1. 목적


안드로이드Google Cloud Vision API를 사용하여 이미지를 웹 테스트합니다.
(API는 위의 링크를 통해 테스트할 수 있음)

2. Cloud Vision Sample


Google Cloud Vision API를 사용하는 Sample 애플리케이션은 Giithub에 공식적으로 공개됩니다.
Sample 응용 프로그램의 사용 방법에 관하여 공식 Doc도 친절하고 다른 개인 사이트에서 상세하게 설명한 부분도 간단히 설명합니다.
① 위의 github부터 clone
② Cloud Vision APIkey 가져오기
③ Android Studio에서 open Cloudvision 디렉토리
④ 가져온 APIkey를 MainActivity.java에 붙여넣기
⑤ Run
참조: Android에서 Cloudvision을 사용할 때 Google Developer Console의 등록 프로세스
기본값은 검사 이미지 태그(범주)입니다.

(이미지는 인터넷에서 주운 PS4의 상자 이미지를 분석한 결과다. 검출된 라벨은technology,electronic device 등)
이번에 주요 목적은 이곳의 검측을 라벨로 하는 것이 아니라 웹 검측으로 하는 것이다.

3. 웹 테스트


API가 감지하는 피쳐의 양을 결정하는 코드는 l.247~252 섹션입니다.
annotateImageRequest.setFeatures(new ArrayList<Feature>() {{
    Feature labelDetection = new Feature();
    labelDetection.setType("LABEL_DETECTION");
    labelDetection.setMaxResults(10);
    add(labelDetection);
}});
감지된 Feature의 Type을 LABEL_DETETION로 설정하므로 3행은labelDetection.setType("WEB_DETECTION");로 수정합니다.
이렇게 하면...

nothing.

4. Convert Response to String


이곳은 가장 붐비는 곳이다.
이전에 검출된 특징량을 바꾼 API의 응답은 l.265 중의return convertResponseToString(response);그림에서 보듯이 convertResponseToString 방법을 통해 변환하고 표시한다.
private String convertResponseToString(BatchAnnotateImagesResponse response) {
    String message = "I found these things:\n\n";

    List<EntityAnnotation> labels = response.getResponses().get(0).getLabelAnnotations();
    if (labels != null) {
       for (EntityAnnotation label : labels) {
           message += String.format(Locale.US, "%.3f: %s", label.getScore(), label.getDescription());
           message += "\n";
       }
    } else {
       message += "nothing";
    }

    return message;
}
nothing이 나오는 것은 labels == null 때문에 이곳의 getLabelAnnotations()는 매우 구리다.
보다AnnotateImageResponse의 참조 느낌으로 사용getWebDetection()하면 목적물을 얻을 수 있다.
...그러나 반환값의 유형WebDetection은import이 될 수 없습니다.

WebDetection 참조에서 정의되었지만 가져올 수 없습니다...
이유는bundle.gradle (Module: app)였다.

dependencies {
    ...

    compile 'com.google.apis:google-api-services-vision:v1-rev2-1.21.0'
}
Sample 애플리케이션이 정의한 API는v1-rev2이기 때문에 웹디텍션이 없는 것이 문제다.
v1-rev2-1.21.0를 최신 v1-rev358-1.22.0로 변경
dependencies {
    ...

    compile 'com.google.apis:google-api-services-vision:v1-rev358-1.22.0'
}
이렇게 되면 import WebDetection이 가능하기 때문에 convert ResponseToString 방법을 변경합니다.

private String convertResponseToString(BatchAnnotateImagesResponse response) {
   String message = "I found these things:\n\n";

   List<WebEntity> labels = response.getResponses().get(0).getWebDetection().getWebEntities();
   if (labels != null) {
        for (WebEntity label : labels) {
            message += String.format(Locale.US, "%.3f: %s", label.getScore(), label.getDescription());
            message += "\n";
        }
   } else {
        message += "nothing";
   }

   return message;
}
이렇게 되면

웹 테스트를 받았습니다!(왠지 최고 점수는 Call of Duty)

5.끝


이번에 웹 검출의 값을 얻었지만 웹 검출처럼 이후 개정에 추가된 특징량은 같은 방법으로 얻을 수 있을 것 같습니다.
초보자이기 때문에 내용이 아주 간단해요. 도움이 된다면 좋겠어요.

좋은 웹페이지 즐겨찾기