Video Intelligence 및 Cloud Vision API를 사용한 사용자 제작 콘텐츠 처리(가이드)

이 가이드에서는 Cloud Vision APICloud Video Intelligence API를 사용하여 이미지 및 동영상을 처리하도록 일련의 Cloud Functions 집합을 배포하는 방법을 설명합니다. 이 기능은 Cloud Video Intelligence 및 Cloud Vision API를 사용하여 사용자 제작 콘텐츠 처리에 설명되어 있습니다.

이 가이드에 따라 솔루션에 필요한 Cloud Functions와 기타 Google Cloud Platform(GCP) 구성요소를 배포하세요.

목표

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Cloud Platform 구성요소를 사용합니다.

  • Cloud Functions
  • Cloud Pub/Sub
  • Cloud Storage
  • BigQuery
  • Vision API
  • Video Intelligence API

이 가이드를 실행하는 비용은 무료 등급 가격으로 완료할 수 있습니다. 무료 등급이 없을 경우 비용은 이미지 10개와 동영상 10개를 테스트하는 데 약 $5가 듭니다. 가격 계산기를 사용하면 예상 사용량을 토대로 예상 비용을 산출할 수 있습니다. Cloud Platform 신규 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud Platform(GCP) 프로젝트를 만들거나 기존 프로젝트를 사용합니다.

    프로젝트 페이지로 이동

  2. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  3. Cloud Functions, Cloud Storage, BigQuery, Vision, and Video Intelligence API를 사용 설정합니다.

    API 사용 설정

  4. Google Cloud SDK를 설치하고 초기화합니다.

  5. gcloud 구성요소를 업데이트 및 설치합니다.

    gcloud components update && gcloud components install beta
  6. Node.js 개발 환경을 준비합니다.

    설정 가이드로 이동

아키텍처

다음 다이어그램은 대략적인 아키텍처를 보여줍니다.

대략적 아키텍처

github 저장소 복제

이 가이드의 모든 Cloud Functions는 GitHub에서 확인할 수 있습니다. 원하는 도구를 사용하여 GitHub에서 코드를 다운로드하거나 다음 명령어를 사용하세요.

git clone https://github.com/GoogleCloudPlatform/cloud-functions-intelligentcontent-nodejs

클론된 저장소 디렉터리로 이동합니다.

cd cloud-functions-intelligentcontent-nodejs

Cloud Storage 버킷 만들기

Cloud Storage 버킷은 이미지와 동영상을 업로드할 수 있는 저장소 위치를 제공합니다. 네 가지 Cloud Storage 버킷을 만들려면 다음 단계를 따르세요.

  1. 이미지 및 동영상 파일을 저장할 버킷을 만듭니다. [IV_BUCKET_NAME]유효한 Cloud Storage 버킷 이름으로 바꿉니다.

    gsutil mb gs://[IV_BUCKET_NAME]
  2. 필터링된 이미지 및 동영상 파일을 저장할 버킷을 만듭니다. [FILTERED_BUCKET_NAME]을 유효한 Cloud Storage 버킷 이름으로 바꿉니다.

    gsutil mb gs://[FILTERED_BUCKET_NAME]
  3. 플래그가 지정된 이미지 및 동영상 파일을 저장할 버킷을 만듭니다. [FLAGGED_BUCKET_NAME]을 유효한 Cloud Storage 버킷 이름으로 바꿉니다.

    gsutil mb gs://[FLAGGED_BUCKET_NAME]
  4. Cloud Functions가 스테이징 위치로 사용할 버킷을 만듭니다. [STAGING_BUCKET_NAME]을 유효한 Cloud Storage 버킷 이름으로 바꿉니다.

    gsutil mb gs://[STAGING_BUCKET_NAME]

Cloud Pub/Sub 주제 만들기

Cloud Storage 알림 메시지 및 Cloud Functions 간의 메시지에 Cloud Pub/Sub 주제를 사용합니다.

  1. 파일 중 하나가 Cloud Storage에 업로드될 때마다 Cloud Storage 알림을 수신할 주제를 만듭니다. [UPLOAD_NOTIFICATION_TOPIC]유효한 Cloud Pub/Sub 주제 이름으로 바꿉니다.

    gcloud pubsub topics create [UPLOAD_NOTIFICATION_TOPIC]
  2. Vision API에서 메시지를 수신할 주제를 만듭니다. [VISION_TOPIC_NAME]을 유효한 주제 이름으로 바꿉니다. config.json 파일의 기본값은 visionapiservice입니다.

    gcloud pubsub topics create [VISION_TOPIC_NAME]
  3. Video Intelligence API에서 메시지를 수신할 주제를 만듭니다. [VIDEOIQ_TOPIC_NAME]을 유효한 주제 이름으로 바꿉니다. config.json 파일의 기본값은 videointelligenceservice입니다.

    gcloud pubsub topics create [VIDEOIQ_TOPIC_NAME]
  4. BigQuery에 저장할 메시지를 수신할 주제를 만듭니다. [BIGQUERY_TOPIC_NAME]을 유효한 주제 이름으로 바꿉니다. config.json 파일의 기본값은 bqinsert입니다.

    gcloud pubsub topics create [BIGQUERY_TOPIC_NAME]

Cloud Storage 알림 만들기

  1. 새 객체 중 하나가 Cloud Storage 파일 업로드 버킷에 배치될 때에만 실행되는 알림을 만듭니다. [UPLOAD_NOTIFICATION_TOPIC]을 주제로 [IV_BUCKET]을 파일 업로드 버킷 이름으로 바꿉니다.

    gsutil notification create -t [UPLOAD_NOTIFICATION_TOPIC] -f json -e OBJECT_FINALIZE gs://[IV_BUCKET_NAME]
  2. 버킷에 대한 알림이 만들어졌는지 확인합니다.

    gsutil notification list gs://[IV_BUCKET_NAME]

    함수가 성공했을 경우 출력 결과는 다음과 같습니다.

    Filters: Event Types: OBJECT_FINALIZE

BigQuery 데이터세트 및 테이블 만들기

Vision 및 Video Intelligence API의 결과는 BigQuery에 저장됩니다.

  1. BigQuery 데이터 세트를 만듭니다. [PROJECT_ID]를 프로젝트 ID로 바꾸고 [DATASET_ID]를 데이터 세트 이름으로 바꿉니다. config.json 파일의 [DATASET_ID] 기본값은 intelligentcontentfilter입니다.

    bq --project_id [PROJECT_ID] mk [DATASET_ID]
  2. 스키마 파일에서 BigQuery 테이블을 만듭니다. [PROJECT_ID]를 프로젝트 ID로 바꾸고 [DATASET_ID].[TABLE_NAME]을 데이터 세트 ID와 테이블 이름으로 바꿉니다. config.json 파일의 [DATASET_ID] 기본값은 intelligentcontentfilter이고 [TABLE_NAME]의 기본값은 filtered_content입니다.

    bq --project_id [PROJECT_ID] mk --schema intelligent_content_bq_schema.json -t [DATASET_ID].[TABLE_NAME]
  3. BigQuery 테이블이 만들어졌는지 확인합니다. [PROJECT_ID]를 프로젝트 ID로 바꾸고 [DATASET_ID].[TABLE_NAME]을 데이터 세트 ID와 테이블 이름으로 바꿉니다.

    bq --project_id [PROJECT_ID] show [DATASET_ID].[TABLE_NAME]

    출력 결과는 다음과 같습니다.

    BigQuery 테이블

Cloud Functions 배포

다음 단계는 Cloud Functions를 배포하는 것입니다.

JSON 구성 파일 수정

코드를 다운로드한 후 특정 Cloud Storage 버킷, Cloud Pub/Sub 주제 이름, BigQuery 데이터 세트 ID 및 테이블 이름을 사용하도록 config.json 파일을 수정합니다.

{
  "VISION_TOPIC": "projects/[PROJECT-ID]/topics/visionapiservice",
  "VIDEOINTELLIGENCE_TOPIC": "projects/[PROJECT-ID]/topics/videointelligenceservice",
  "BIGQUERY_TOPIC": "projects/[PROJECT-ID]/topics/bqinsert",
  "REJECTED_BUCKET": "[FLAGGED_BUCKET_NAME]",
  "RESULT_BUCKET": "[FILTERED_BUCKET_NAME]",
  "DATASET_ID": "[DATASET_ID]",
  "TABLE_NAME": "[TABLE_NAME]",
  "GCS_AUTH_BROWSER_URL_BASE": "https://storage.cloud.google.com/" ,
  "API_Constants": {
  	"ADULT" : "adult",
  	"VIOLENCE" : "violence",
  	"SPOOF" : "spoof",
  	"MEDICAL" : "medical"
  }
}

GCStoPubsub 함수 배포

Cloud Pub/Sub에서 Cloud Storage 알림 메시지를 수신하고 이 메시지를 다른 Cloud Pub/Sub 메시지와 함께 적절한 함수로 전달하는 로직이 포함된 GCStoPubsub Cloud 함수를 배포합니다.

  • [STAGING_BUCKET_NAME]을 Cloud Storage 스테이징 버킷 이름으로 바꾸고 [UPLOAD_NOTIIFICATION_TOPIC]을 파일 업로드 알림 주제 이름으로 바꿉니다.

    gcloud functions deploy GCStoPubsub \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [UPLOAD_NOTIIFICATION_TOPIC] \
      --entry-point GCStoPubsub \
      --runtime=nodejs10

각 Cloud Functions에 대한 명령줄 출력은 다음과 비슷합니다.

Copying file:///var/folders/69/wsyfjkld5fq1w_wf7d5pxbv80030br/T/tmphzfCsc/fun.zip [Content-Type=application/zip]...
/ [1 files][138.4 KiB/138.4 KiB]
Operation completed over 1 objects/138.4 KiB.
Deploying function (may take a while - up to 2 minutes)...
...............................................................done.
availableMemoryMb: 256
entryPoint: GCStoPubsub
eventTrigger:
  eventType: providers/cloud.pubsub/eventTypes/topic.publish
  failurePolicy: {}
  resource: projects/[PROJECT-ID]/topics/intelligentcontentfileupload
latestOperation: operations/c2VjcmV0LXplcGh5ci0xMTIxL3VzLWNlbnRyYWwxL0dDU3RvUHVic3ViL0tRaGxHeVFhZHdR
name: projects/[PROJECT-ID]/locations/us-central1/functions/GCStoPubsub
serviceAccount: [PROJECT-ID]@appspot.gserviceaccount.com
sourceArchiveUrl: gs://[STAGING_BUCKET_NAME]/us-central1-GCStoPubsub-bnnmzdzqtjoo.zip
status: READY
timeout: 60s
updateTime: '2017-09-01T14:59:03Z'
versionId: '01'

visionAPI 함수 배포

  • Cloud Pub/Sub로 메시지를 수신하고, Vision API를 호출하고, 수신한 메시지를 다른 Cloud Pub/Sub 메시지와 함께 insertIntoBigQuery Cloud 함수로 전달하는 로직이 포함된 visionAPI Cloud 함수를 배포합니다. [STAGING_BUCKET_NAME]을 Cloud Storage 스테이징 버킷 이름으로 바꾸고 [VISION_TOPIC_NAME]을 Vision API 주제 이름으로 바꿉니다.

    gcloud functions deploy visionAPI \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [VISION_TOPIC_NAME] \
      --entry-point visionAPI \
      --runtime=nodejs10

videoIntelligenceAPI 함수 배포

  • Cloud Pub/Sub로 메시지를 수신하고, Video Intelligence API를 호출하고, 수신한 메시지를 다른 Cloud Pub/Sub 메시지와 함께 insertIntoBigQuery Cloud 함수로 전달하는 로직이 포함된 videoIntelligenceAPI Cloud 함수를 배포합니다. [STAGING_BUCKET_NAME]을 Cloud Storage 스테이징 버킷 이름으로 바꾸고 [VIDEOIQ_TOPIC_NAME]을 Video Intelligence API 주제 이름으로 바꿉니다.

    gcloud functions deploy videoIntelligenceAPI \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [VIDEOIQ_TOPIC_NAME] \
      --entry-point videoIntelligenceAPI \
      --timeout 540 \
      --runtime=nodejs10

insertIntoBigQuery 함수 배포

  • Cloud Pub/Sub로 메시지를 수신하고, BigQuery API를 호출하여 데이터를 BigQuery 테이블에 삽입하는 로직이 포함된 insertIntoBigQuery Cloud 함수를 배포합니다. [STAGING_BUCKET_NAME]을 Cloud Storage 스테이징 버킷 이름으로 바꾸고 [BIGQUERY_TOPIC_NAME]을 BigQuery 주제 이름으로 바꿉니다.

    gcloud functions deploy insertIntoBigQuery \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [BIGQUERY_TOPIC_NAME] \
      --entry-point insertIntoBigQuery \
      --runtime=nodejs10

흐름 테스트

다음 다이어그램은 처리 흐름을 대략적으로 보여줍니다.

processing-flow

Cloud Storage에 파일을 업로드하고, 로그를 확인하고, 결과를 BigQuery에서 확인하여 처리 과정을 테스트합니다.

  1. [IV_BUCKET_NAME]에 이미지 및 동영상 파일을 업로드합니다. 여기에서 [LOCAL_FILE_NAME]은 파일 이름입니다.

    gsutil cp [LOCAL_FILE_NAME] gs://[IV_BUCKET_NAME]
  2. Cloud Logging에 캡처된 Cloud Functions 로그를 확인하여 Cloud Functions가 시작되고 성공적으로 실행되었는지 확인합니다.

    1. GCStoPubsub를 테스트합니다.

      gcloud functions logs read --filter "finished with status" "GCStoPubsub" --limit 100

      출력 결과는 다음과 같습니다.

      GCStoPubsub 로그

    2. insertIntoBigQuery를 테스트합니다.

      gcloud functions logs read --filter "finished with status" "insertIntoBigQuery" --limit 100

      출력 결과는 다음과 같습니다.

      insertIntoBigQuery 로그

  3. BigQuery를 쿼리하는 SQL 명령어를 만듭니다. [PROJECT_ID], [DATASET_ID], [TABLE_NAME]을 프로젝트 ID, 데이터세트 ID, BigQuery 테이블 이름으로 바꿉니다.

    echo "
    #standardSql
    SELECT insertTimestamp,
    contentUrl,
    flattenedSafeSearch.flaggedType,
    flattenedSafeSearch.likelihood
    FROM \`${PROJECT_ID}.${DATASET_ID}.${TABLE_NAME}\`
    CROSS JOIN UNNEST(safeSearch) AS flattenedSafeSearch
    ORDER BY insertTimestamp DESC,
    contentUrl,
    flattenedSafeSearch.flaggedType
    LIMIT 1000
    " > sql.txt
    
  4. 다음 명령어를 사용하여 BigQuery 결과를 확인합니다.

    bq --project_id [PROJECT_ID] query < sql.txt

    출력 결과는 다음과 같습니다.

    BigQuery 결과

    또는 BigQuery 웹 UI에 로그인하여 쿼리를 실행할 수 있습니다.

    1. 브라우저에서 https://bigquery.cloud.google.com을 엽니다.
    2. 쿼리 작성을 클릭하여 아래와 같이 쿼리를 시작합니다.

      쿼리 작성

    3. 텍스트 상자에 다음 SQL을 입력합니다. [PROJECT_ID], [DATASET_ID], [TABLE_NAME]을 프로젝트 ID, 데이터세트 ID, BigQuery 테이블 이름으로 바꿉니다.

      #standardSql
      SELECT insertTimestamp,
      contentUrl,
      flattenedSafeSearch.flaggedType,
      flattenedSafeSearch.likelihood
      FROM `[PROJECT_ID].[DATASET_ID].[TABLE_NAME]`
      CROSS JOIN UNNEST(safeSearch) AS flattenedSafeSearch
      ORDER BY insertTimestamp DESC,
      contentUrl,
      flattenedSafeSearch.flaggedType
      LIMIT 1000
      

      다음과 같이 UI에 SQL이 표시됩니다.

      SQL 쿼리

      출력 결과는 다음과 같습니다.

      SQL 쿼리 결과

삭제

이 가이드에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

가이드를 완료한 후에는 할당량을 차지하지 않고 이후에 요금이 청구되지 않도록 Google Cloud에서 만든 리소스를 삭제할 수 있습니다. 다음 섹션에서는 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.

프로젝트 삭제

청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하려면 다음 안내를 따르세요.

  1. Cloud Console에서 프로젝트 페이지로 이동합니다.
  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 프로젝트 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력하고 종료를 클릭합니다.

모든 구성요소 삭제

  1. Cloud Functions를 삭제합니다.

    gcloud functions delete GCStoPubsub
    gcloud functions delete visionAPI
    gcloud functions delete videoIntelligenceAPI
    gcloud functions delete insertIntoBigQuery
  2. 변수를 값으로 대체하여 BigQuery 테이블 및 데이터세트를 삭제합니다.

    bq --project_id [PROJECT_ID] rm -r -f [DATASET_ID]
  3. 변수를 값으로 대체하여 Cloud Storage 버킷을 삭제합니다.

    gsutil -m rm -r gs://[IV_BUCKET_NAME]
    gsutil -m rm -r gs://[FLAGGED_BUCKET_NAME]
    gsutil -m rm -r gs://[FILTERED_BUCKET_NAME]
    gsutil -m rm -r gs://[STAGING_BUCKET_NAME]
  4. 변수를 값으로 대체하여 Cloud Pub/Sub 주제를 삭제합니다.

    gcloud pubsub topics delete [UPLOAD_NOTIFICATION_TOPIC]
    gcloud pubsub topics delete [VISION_TOPIC_NAME]
    gcloud pubsub topics delete [VIDEOIQ_TOPIC_NAME]
    gcloud pubsub topics delete [BIGQUERY_TOPIC_NAME]

다음 단계