라벨 감지 가이드

대상

이 가이드를 사용하면 빠르게 탐색할 수 있으며 Cloud Video Intelligence API로 애플리케이션을 개발할 수 있습니다. 기본적인 프로그래밍에 익숙한 이들에 맞춰 설계되었지만 프로그래밍 지식이 많지 않아도 이해할 수 있습니다. 이 가이드를 마치면 참조 문서를 사용하여 기본적인 애플리케이션을 만들 수 있습니다.

이 가이드에서는 Python 코드를 사용하여 Video Intelligence API 애플리케이션을 설명합니다. 이 가이드의 목적은 Python 클라이언트 라이브러리를 설명하는 것이 아니라 Video Intelligence API를 호출하는 방법을 설명하는 것입니다. 자바 및 Node.js로 만든 애플리케이션은 근본적으로 유사합니다.

코드만 있는 예제 또는 다른 언어의 예제를 찾으려면 보조 자료인 방법 가이드를 확인해 보세요.

기본 요건

이 가이드에는 몇 가지 기본 요건이 있습니다.

라벨 감지를 사용하여 동영상에 주석 추가

이 가이드에서는 LABEL_DETECTION 요청을 사용하는 기본적인 Vision API 애플리케이션에 대해 설명합니다. LABEL_DETECTION 요청은 이미지 콘텐츠에 따라 선택된 라벨(또는 '태그)를 사용하여 동영상에 주석을 추가합니다. 예를 들어 건널목에 있는 열차의 동영상은 '열차', '운송', '철도 건널목'과 같은 라벨을 생성할 수 있습니다.

우선 코드 전체를 보겠습니다. 코드의 간략함을 보여드리기 메모를 대부분 제거했으며, 코드를 살펴보면서 메모가 더 많이 제공됩니다.

import argparse

from google.cloud import videointelligence

def analyze_labels(path):
    """ Detects labels given a GCS path. """
    video_client = videointelligence.VideoIntelligenceServiceClient()
    features = [videointelligence.enums.Feature.LABEL_DETECTION]
    operation = video_client.annotate_video(path, features=features)
    print('\nProcessing video for label annotations:')

    result = operation.result(timeout=90)
    print('\nFinished processing.')

    segment_labels = result.annotation_results[0].segment_label_annotations
    for i, segment_label in enumerate(segment_labels):
        print('Video label description: {}'.format(
            segment_label.entity.description))
        for category_entity in segment_label.category_entities:
            print('\tLabel category description: {}'.format(
                category_entity.description))

        for i, segment in enumerate(segment_label.segments):
            start_time = (segment.segment.start_time_offset.seconds +
                          segment.segment.start_time_offset.nanos / 1e9)
            end_time = (segment.segment.end_time_offset.seconds +
                        segment.segment.end_time_offset.nanos / 1e9)
            positions = '{}s to {}s'.format(start_time, end_time)
            confidence = segment.confidence
            print('\tSegment {}: {}'.format(i, positions))
            print('\tConfidence: {}'.format(confidence))
        print('\n')

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('path', help='GCS file path for label detection.')
    args = parser.parse_args()

    analyze_labels(args.path)

이 간단한 애플리케이션은 다음과 같은 작업을 수행합니다.

  • 애플리케이션을 실행하는 데 필요한 라이브러리 가져오기
  • Google Cloud Storage URI에 저장된 동영상 파일을 인수로 사용하여 main() 함수에 전달
  • Video Intelligence API 서비스를 실행하는 데 필요한 사용자 인증 정보 가져오기
  • 동영상 서비스로 전송할 동영상 주석 요청 만들기
  • 요청을 보내고 장기 실행 작업 반환
  • 동영상이 처리되어 반환 값을 볼 수 있을 때까지 장기 실행 작업 반복
  • 서비스의 응답을 파싱하여 사용자에게 표시하기

이 단계는 아래에서 자세히 살펴보겠습니다.

라이브러리 가져오기

import argparse

from google.cloud import videointelligence

표준 라이브러리인 argparse를 가져와 애플리케이션이 입력 파일 이름을 인수로 받아들일 수 있도록 하고, sys를 가져와 API 응답을 기다리는 동안 출력의 형식을 지정합니다. 또한 간단한 대기 루프를 실행하기 위해 time을 가져옵니다.

Cloud Video Intelligence API를 사용하기 위해 API 호출 디렉토리가 보관되는 google.cloud.videointelligence_v1 및 그 열거 클래스도 가져옵니다.

애플리케이션 실행

parser = argparse.ArgumentParser(
    description=__doc__,
    formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('path', help='GCS file path for label detection.')
args = parser.parse_args()

analyze_labels(args.path)

이제 전달된 인수를 동영상 파일 이름의 Google Cloud Storage URI에 파싱하고 main() 함수로 전달합니다.

API에 인증

Video Intelligence API 서비스와 통신하려면 우선 이전에 획득한 사용자 인증 정보를 사용하여 서비스를 인증해야 합니다. 애플리케이션 내에서 사용자 인증 정보를 얻는 가장 간단한 방법은 애플리케이션 기본 사용자 인증 정보(ADC)를 사용하는 것입니다. 기본적으로 ADC는 GOOGLE_APPLICATION_CREDENTIALS 환경 파일에서 사용자 인증 정보를 얻으려고 시도합니다. 환경 파일은 서비스 계정의 JSON 키 파일을 가리키도록 설정해야 합니다. 빠른 시작에서 ADC를 사용하려면 서비스 계정 및 환경을 설정한 상태여야 합니다.

요청 생성

video_client = videointelligence.VideoIntelligenceServiceClient()
features = [videointelligence.enums.Feature.LABEL_DETECTION]
operation = video_client.annotate_video(path, features=features)

이제 Video Intelligence API 서비스가 준비되었으므로 서비스에 대한 요청을 생성할 수 있습니다. Cloud Video Intelligence API에 대한 요청은 JSON 객체로 제공됩니다. 이러한 요청의 자세한 구조 정보는 Video Intelligence API 참조를 참조하세요.

이 코드 스니펫은 다음 작업을 수행합니다.

  1. annotate_video() 메소드에 대한 POST 요청을 위한 JSON을 작성합니다.
  2. 전달된 동영상 파일 이름의 Google Cloud Storage 위치를 요청에 삽입합니다.
  3. annotate 메소드가 LABEL_DETECTION을 수행해야 함을 나타냅니다.

작업 확인

result = operation.result(timeout=90)
print('\nFinished processing.')

기존 작업에 대한 기존 작업 요청을 사용하여 주기적으로 해당 작업의 상태를 확인하는 while 루프를 만듭니다. 작업 상태가 done으로 표시되면 루프를 해제하고 응답을 파싱할 수 있습니다.

응답 파싱

segment_labels = result.annotation_results[0].segment_label_annotations
for i, segment_label in enumerate(segment_labels):
    print('Video label description: {}'.format(
        segment_label.entity.description))
    for category_entity in segment_label.category_entities:
        print('\tLabel category description: {}'.format(
            category_entity.description))

    for i, segment in enumerate(segment_label.segments):
        start_time = (segment.segment.start_time_offset.seconds +
                      segment.segment.start_time_offset.nanos / 1e9)
        end_time = (segment.segment.end_time_offset.seconds +
                    segment.segment.end_time_offset.nanos / 1e9)
        positions = '{}s to {}s'.format(start_time, end_time)
        confidence = segment.confidence
        print('\tSegment {}: {}'.format(i, positions))
        print('\tConfidence: {}'.format(confidence))
    print('\n')

작업이 완료되면 요청에 전송된 각 동영상별 annotationResults의 목록을 구성하는 AnnotateVideoResponse 내에 응답 결과가 포함됩니다. 여기서는 요청에 동영상을 하나만 전송했으므로 결과의 첫 번째 segmentLabelAnnotations를 사용합니다. 그런 다음 segmentLabelAnnotations의 모든 라벨을 반복합니다. 이 가이드에서는 동영상에 해당하는 주석만 표시합니다. 동영상 수준의 주석을 식별하기 위해 결과에서 segment_label_annotations 데이터를 가져옵니다. 각 세그먼트 라벨 주석에는 관련 설명(segment_label.description), 개체 카테고리의 목록(category_entity.description), 세그먼트 내 등장 위치(동영상 시작 부분을 기준으로 시작 및 종료 시간 오프셋으로 표시)가 포함됩니다.

{
   "name":"us-west1.12089999971048628582",
   "metadata":{
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoProgress",
      "annotationProgress":[
         {
            "inputUri":"/cloud-ml-sandbox/video/chicago.mp4",
            "updateTime":"2017-01-31T01:49:52.498015Z",
            "startTime":"2017-01-31T01:49:43.056481Z"
         }
      ]
   },
   "done": true,
   "response":{
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoResponse",
      "annotationResults":[
         {
            "inputUri":"/cloud-ml-sandbox/video/chicago.mp4",
            "segmentLabelAnnotations": [
              {
                "entity": {
                  "entityId": "/m/01yrx",
                  "languageCode": "en-US"
                },
                "segments": [
                  {
                    "segment": {
                      "startTimeOffset": "0s",
                      "endTimeOffset": "14.833664s"
                    },
                    "confidence": 0.98509187
                  }
                ]
              },
               ...
            ]
         }
      ]
   }
}

여기서는 요청에 동영상을 하나만 전송했으므로 첫 번째 결과의 첫 번째 description을 사용하고 description을 출력하겠습니다.

애플리케이션 실행

애플리케이션을 실행하려면 동영상의 Google Cloud Storage URI를 전달하기만 하면 됩니다.

$ python label_det.py gs://cloud-ml-sandbox/video/chicago.mp4
Operation us-west1.4757250774497581229 started: 2017-01-30T01:46:30.158989Z
Operation processing ...
The video has been successfully processed.

Video label description: urban area
        Label category description: city
        Segment 0: 0.0s to 38.752016s
        Confidence: 0.946980476379

Video label description: traffic
        Segment 0: 0.0s to 38.752016s
        Confidence: 0.94105899334

Video label description: vehicle
        Segment 0: 0.0s to 38.752016s
        Confidence: 0.919958174229
...
 

수고하셨습니다. Cloud Video Intelligence API를 사용한 주석 작업을 수행했습니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Cloud Video Intelligence API 문서