Benutzergenerierte Inhalte mit der Video Intelligence API und der Cloud Vision API verarbeiten

In dieser Anleitung erfahren Sie, wie Sie verschiedene Funktionen von Cloud Functions bereitstellen, um Bilder und Videos mit der Cloud Vision API und der Cloud Video Intelligence API zu verarbeiten. Diese Funktionalität wurde unter Benutzergenerierte Inhalte mit den Cloud Video Intelligence und Cloud Vision APIs bearbeiten beschrieben.

Befolgen Sie diese Anleitung, um Cloud Functions und andere Komponenten der Google Cloud Platform (GCP) bereitzustellen, die für die Lösung erforderlich sind.

Ziele

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten der Cloud Platform verwendet, darunter:

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

Diese Anleitung kann vollständig im Rahmen des kostenlosen Kontingents durchgearbeitet werden. Die Kosten für das Testen von 10 Bildern und 10 Videos liegen ohne das kostenlose Kontingent bei ca. 5 $. Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung erstellen. Neuen Cloud Platform-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Vorbereitung

  1. Erstellen Sie ein GCP-Projekt oder verwenden Sie ein vorhandenes Projekt.

    Zur Seite "Projekte"

  2. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  3. Cloud Functions, Cloud Storage, BigQuery, Vision, and Video Intelligence APIs aktivieren.

    Aktivieren Sie die APIs

  4. Installieren und initialisieren Sie das Google Cloud SDK.

  5. Aktualisieren und installieren Sie die gcloud-Komponenten:

    gcloud components update && gcloud components install beta
  6. Bereiten Sie Ihre Umgebung für die Node.js-Entwicklung vor.

    WEITER ZUM EINRICHTUNGSLEITFADEN

Architektur

Im folgenden Diagramm ist die allgemeine Architektur dargestellt:

Architekturübersicht

GitHub-Repository klonen

Alle Funktionen von Cloud Functions in dieser Anleitung sind auf GitHub verfügbar. Laden Sie den Code von GitHub mit den gewünschten Tools herunter oder verwenden Sie den folgenden Befehl:

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

Cloud Storage-Buckets erstellen

Cloud Storage-Buckets dienen als Speicherort zum Hochladen von Bildern und Videos. Gehen Sie wie folgt vor, um vier verschiedene Cloud Storage-Buckets zu erstellen:

  1. Erstellen Sie einen Bucket zum Speichern von Bildern und Videodateien. Ersetzen Sie [IV_BUCKET_NAME] durch einen gültigen Namen für den Cloud Storage-Bucket.

    gsutil mb [IV_BUCKET_NAME]
  2. Erstellen Sie einen Bucket zum Speichern von gefilterten Bild- und Videodateien. Ersetzen Sie [FILTERED_BUCKET_NAME] durch einen gültigen Namen für den Cloud Storage-Bucket.

    gsutil mb [FILTERED_BUCKET_NAME]
  3. Erstellen Sie einen Bucket zum Speichern von gekennzeichneten Bild- und Videodateien. Ersetzen Sie [FLAGGED_BUCKET_NAME] durch einen gültigen Namen für den Cloud Storage-Bucket.

    gsutil mb [FLAGGED_BUCKET_NAME]
  4. Erstellen Sie einen Bucket als Staging-Speicherort für Cloud Functions. Ersetzen Sie [STAGING_BUCKET_NAME] durch einen gültigen Namen für den Cloud Storage-Bucket.

    gsutil mb [STAGING_BUCKET_NAME]

Cloud Pub/Sub-Themen erstellen

Cloud Pub/Sub-Themen werden für Cloud Storage-Benachrichtigungen und für die Kommunikation zwischen den Funktionen von Cloud Functions verwendet.

  1. Erstellen Sie ein Thema, um Cloud Storage-Benachrichtigungen zu erhalten, sobald eine Ihrer Dateien in Cloud Storage hochgeladen wird. Ersetzen Sie [UPLOAD_NOTIFICATION_TOPIC] durch einen gültigen Namen für ein Cloud Pub/Sub-Thema.

    gcloud pubsub topics create [UPLOAD_NOTIFICATION_TOPIC]
  2. Erstellen Sie ein Thema, um Nachrichten von der Vision API zu erhalten. Ersetzen Sie [VISION_TOPIC_NAME] durch einen gültigen Themennamen. Der Standardwert in der Datei config.json ist visionapiservice.

    gcloud pubsub topics create [VISION_TOPIC_NAME]
  3. Erstellen Sie ein Thema, um Nachrichten von der Video Intelligence API zu erhalten. Ersetzen Sie [VIDEOIQ_TOPIC_NAME] durch einen gültigen Themennamen. Der Standardwert in der Datei config.json ist videointelligenceservice.

    gcloud pubsub topics create [VIDEOIQ_TOPIC_NAME]
  4. Erstellen Sie ein Thema, um Ihre in BigQuery zu speichernden Nachrichten zu erhalten. Ersetzen Sie [BIGQUERY_TOPIC_NAME] durch einen gültigen Themennamen. Der Standardwert in der Datei config.json ist bqinsert.

    gcloud pubsub topics create [BIGQUERY_TOPIC_NAME]

Cloud Storage-Benachrichtigungen erstellen

  1. Erstellen Sie eine Benachrichtigung, die nur ausgelöst wird, wenn eines Ihrer neuen Objekte im Cloud Storage-Bucket für den Dateiupload abgelegt wird. Ersetzen Sie [UPLOAD_NOTIFICATION_TOPIC] durch Ihr Thema und [IV_BUCKET] durch den Namen des Buckets für den Dateiupload.

    gsutil notification create -t [UPLOAD_NOTIFICATION_TOPIC] -f json -e OBJECT_FINALIZE [IV_BUCKET_NAME]
  2. Bestätigen Sie, dass Ihre Benachrichtigung für den Bucket erstellt wurde:

    gsutil notification list [IV_BUCKET_NAME]

    Wenn die Funktion erfolgreich ausgeführt wurde, lautet die Ausgabe wie folgt:

    Filters: Event Types: OBJECT_FINALIZE

BigQuery-Dataset und -Tabelle erstellen

Die Ergebnisse der Vision und Video Intelligence APIs werden in BigQuery gespeichert.

  1. Erstellen Sie das BigQuery-Dataset. Ersetzen Sie [PROJECT_ID] durch die Projekt-ID und [DATASET_ID] durch den Dataset-Namen. Der Standardwert [DATASET_ID] in der Datei config.json ist intelligentcontentfilter.

    bq --project_id [PROJECT_ID] mk [DATASET_ID]
  2. Erstellen Sie die BigQuery-Tabelle aus der Schemadatei. Ersetzen Sie [PROJECT_ID] durch die Projekt-ID und [DATASET_ID].[TABLE_NAME] durch die Dataset-ID und den Tabellennamen. Der Standardwert für [DATASET_ID] in der Datei config.json ist intelligentcontentfilter und für [TABLE_NAME] lautet der Standardwert filtered_content.

    bq --project_id [PROJECT_ID] mk --schema intelligent_content_bq_schema.json -t [DATASET_ID].[TABLE_NAME]
  3. Bestätigen Sie, ob die BigQuery-Tabelle erstellt wurde. Ersetzen Sie [PROJECT_ID] durch die Projekt-ID und [DATASET_ID].[TABLE_NAME] durch die Dataset-ID und den Tabellennamen.

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

    Ausgabe:

    BigQuery-Tabelle

Funktionen von Cloud Functions bereitstellen

Der nächste Schritt ist die Bereitstellung der Funktionen von Cloud Functions.

JSON-Konfigurationsdatei bearbeiten

Nachdem Sie den Code heruntergeladen haben, bearbeiten Sie die Datei config.json, um Ihre spezifischen Cloud Storage-Buckets und Cloud Pub/Sub-Themennamen sowie die BigQuery-Dataset-ID und den Tabellennamen zu verwenden.

{
  "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"
  }
}

Funktion GCStoPubsub bereitstellen

Stellen Sie die Cloud Functions-Funktion GCStoPubsub bereit. Sie enthält die Logik, um eine Cloud Storage-Benachrichtigung von Cloud Pub/Sub zu empfangen und diese mit einer anderen Cloud Pub/Sub-Nachricht an die entsprechende Funktion weiterzuleiten.

  • Ersetzen Sie [STAGING_BUCKET_NAME] durch den Namen des Cloud Storage-Staging-Buckets und [UPLOAD_NOTIIFICATION_TOPIC] durch den Namen des Themas für die Dateiuploadbenachrichtigung.

    gcloud functions deploy GCStoPubsub --stage-bucket [STAGING_BUCKET_NAME] --trigger-topic [UPLOAD_NOTIIFICATION_TOPIC] --entry-point GCStoPubsub

Die Befehlszeilenausgabe für die einzelnen Funktionen von Cloud Function sieht in etwa so aus:

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'

Funktion visionAPI bereitstellen

  • Stellen Sie die Cloud Functions-Funktion visionAPI bereit. Sie enthält die Logik, um eine Nachricht mit Cloud Pub/Sub zu empfangen, die Vision API aufzurufen und die Nachricht mit einer anderen Cloud Pub/Sub-Nachricht an die Cloud Functions-Funktion insertIntoBigQuery weiterzuleiten. Ersetzen Sie [STAGING_BUCKET_NAME] durch den Namen des Cloud Storage-Staging-Buckets und [VISION_TOPIC_NAME] durch den Namen des Vision API-Themas.

    gcloud functions deploy visionAPI --stage-bucket [STAGING_BUCKET_NAME] --trigger-topic [VISION_TOPIC_NAME] --entry-point visionAPI

Funktion videoIntelligenceAPI bereitstellen

  • Stellen Sie die Cloud Functions-Funktion videoIntelligenceAPI bereit. Sie enthält die Logik, um eine Nachricht mit Cloud Pub/Sub zu empfangen, die Video Intelligence API aufzurufen und die Nachricht mit einer anderen Cloud Pub/Sub-Nachricht an die Cloud Functions-Funktion insertIntoBigQuery weiterzuleiten. Ersetzen Sie [STAGING_BUCKET_NAME] durch den Namen des Cloud Storage-Staging-Buckets und [VIDEOIQ_TOPIC_NAME] durch den Namen des Video Intelligence API-Themas.

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

Funktion insertIntoBigQuery bereitstellen

  • Stellen Sie die Cloud Functions-Funktion insertIntoBigQuery bereit. Sie enthält die Logik, um eine Nachricht mit Cloud Pub/Sub zu empfangen und die BigQuery API aufzurufen, um die Daten in die BigQuery-Tabelle einzufügen. Ersetzen Sie [STAGING_BUCKET_NAME] durch den Namen Ihres Cloud Storage-Staging-Buckets und [BIGQUERY_TOPIC_NAME] durch den Namen Ihres BigQuery-Themas.

    gcloud functions deploy insertIntoBigQuery --stage-bucket [STAGING_BUCKET_NAME] --trigger-topic [BIGQUERY_TOPIC_NAME] --entry-point insertIntoBigQuery

Verarbeitungsablauf testen

Das folgende Diagramm enthält eine Übersicht des Verarbeitungsablaufs.

Verarbeitungsablauf

Sie können den Prozess testen, indem Sie Ihre Dateien in Cloud Storage hochladen, die Logs prüfen und die Ergebnisse in BigQuery anzeigen.

  1. Laden Sie eine Bild- und eine Videodatei in [IV_BUCKET_NAME] hoch. Dabei ist [LOCAL_FILE_NAME] der Dateiname.

    gsutil cp [LOCAL_FILE_NAME] [IV_BUCKET_NAME]
  2. Überprüfen Sie, ob die Funktionen von Cloud Functions ausgelöst und erfolgreich ausgeführt wurden, indem Sie die von Cloud Logging erfassten Logs für die Funktionen von Cloud Functions anzeigen lassen:

    1. Testen Sie GCStoPubsub:

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

      Ausgabe:

      GCStoPubsub-Log

    2. Testen Sie insertIntoBigQuery:

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

      Ausgabe:

      insertIntoBigQuery-Log

  3. Erstellen Sie SQL-Befehle zum Abfragen von BigQuery. Ersetzen Sie [PROJECT_ID], [DATASET_ID] und [TABLE_NAME] durch die Projekt-ID, die Dataset-ID und den BigQuery-Tabellennamen.

    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. Zeigen Sie die BigQuery-Ergebnisse mit dem folgenden Befehl an:

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

    Ausgabe:

    BigQuery-Ergebnisse

    Alternativ können Sie sich in der BigQuery-Web-UI anmelden und Ihre Abfragen ausführen:

    1. Öffnen Sie https://bigquery.cloud.google.com in Ihrem Browser.
    2. Klicken Sie auf Abfrage erstellen, um wie hier gezeigt mit einer Abfrage zu beginnen:

      Abfrage erstellen

    3. Geben Sie den folgenden SQL-Code in das Textfeld ein. Ersetzen Sie [PROJECT_ID], [DATASET_ID] und [TABLE_NAME] durch die Projekt-ID, die Dataset-ID und den BigQuery-Tabellennamen.

      #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
      

      Das folgende Beispiel zeigt, wie dieser SQL-Code in der UI aussieht:

      SQL-Abfrage

      Ausgabe:

      SQL-Abfrageergebnisse

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder behalten Sie das Projekt und löschen Sie die einzelnen Ressourcen.

Nachdem Sie die aktuelle Anleitung abgeschlossen haben, können Sie die in Google Cloud erstellten Ressourcen bereinigen, damit sie keine kostenpflichtigen Kontingente verbrauchen. In den folgenden Abschnitten erfahren Sie, wie Sie diese Ressourcen löschen oder deaktivieren.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten, indem Sie das für die Anleitung erstellte Projekt löschen.

So löschen Sie das Projekt:

  1. Wechseln Sie in der Cloud Console zur Seite Projekte.
  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Projekt löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden.

Alle Komponenten löschen

  1. Löschen Sie die Funktionen von Cloud Functions:

    gcloud functions delete GCStoPubsub
    gcloud functions delete visionAPI
    gcloud functions delete videoIntelligenceAPI
    gcloud functions delete insertIntoBigQuery
  2. Löschen Sie die BigQuery-Tabelle und das dazugehörige Dataset. Ersetzen Sie dabei die Variablen durch Ihre Werte:

    bq --project_id [PROJECT_ID] rm -r -f [DATASET_ID]
  3. Löschen Sie die Cloud Storage-Buckets. Ersetzen Sie dabei die Variablen durch Ihre Werte:

    gsutil -m rm -r [IV_BUCKET_NAME]
    gsutil -m rm -r [FLAGGED_BUCKET_NAME]
    gsutil -m rm -r [FILTERED_BUCKET_NAME]
    gsutil -m rm -r [STAGING_BUCKET_NAME]
  4. Löschen Sie die Cloud Pub/Sub-Themen. Ersetzen Sie dabei die Variablen durch Ihre Werte:

    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]

Nächste Schritte