Anleitung zur Labelerkennung

Zielgruppe

In dieser Anleitung erfahren Sie, wie Sie Anwendungen mit der Video Intelligence API entdecken und entwickeln. Sie wurde für Personen entwickelt, die mit den Grundlagen von Python vertraut sind. Sie sollten auch in der Lage sein, begrenzte Programmierkenntnisse zu nutzen. Nachdem Sie die Anleitung durchgegangen sind, sollten Sie in der Lage sein, mithilfe der Referenzdokumentation Ihre eigenen grundlegenden Anwendungen zu erstellen.

In dieser Anleitung wird die Verwendung der Video Intelligence API mit Python-Code schrittweise erläutert. Dabei wird nicht erläutert, wie die Python-Clientbibliotheken funktionieren, sondern wie Aufrufe der Video Intelligence API mithilfe der Video-Label-Erkennungsfunktion aufgerufen werden. Anwendungen in Java und Node.js verhalten sich im Wesentlichen ähnlich.

Wenn Sie ein reines Code-Beispiel oder ein Beispiel in einer anderen Sprache benötigen, lesen Sie im Handbuch nach.

Vorbereitung

Für diese Anleitung gelten die folgenden Voraussetzungen:

Mit der Labelerkennung Annotationen in ein Video einfügen

In dieser Anleitung werden Sie mithilfe einer LABEL_DETECTION-Anfrage durch eine einfache Video API-Anwendung geleitet. In der LABEL_DETECTION-Anfrage wird ein Video mit Labels (bzw. "Tags") annotiert, die auf Grundlage des Bildinhalts ausgewählt werden. Zum Beispiel können für ein Video von einem Zug an einem Bahnübergang Labels wie "Zug", "Verkehr", "Bahnübergang" erzeugt werden.

Der folgende Code ist für diese Anleitung erforderlich. Die meisten Kommentare wurden aus diesem Code entfernt, um hervorzuheben, wie kurz der Code ist. Stattdessen werden Kommentare später bereitgestellt, während wir den Code durchgehen.

import argparse

from google.cloud import videointelligence

def analyze_labels(path):
    """ Detects labels given a GCS path. """
    video_client = videointelligence.VideoIntelligenceServiceClient()
    features = [videointelligence.Feature.LABEL_DETECTION]
    operation = video_client.annotate_video(
        request={"features": features, "input_uri": path}
    )
    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.microseconds / 1e6
            )
            end_time = (
                segment.segment.end_time_offset.seconds
                + segment.segment.end_time_offset.microseconds / 1e6
            )
            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)

Diese einfache Anwendung:

  1. Importiert die für die Ausführung der Anwendung erforderlichen Bibliotheken
  2. Nimmt eine im Cloud Storage-URI gespeicherte Videodatei als Argument an die main()-Funktion.
  3. Ruft Anmeldeinformationen zum Ausführen des Diensts der Video Intelligence API ab
  4. Erstellt eine Anfrage nach Videoanmerkungen, die an den Videodienst gesendet wird
  5. Sendet die Anfrage und gibt einen lange laufenden Vorgang zurück
  6. Stellt den lang andauernden Vorgang in eine Warteschleife, bis das Video verarbeitet wurde, und gibt verfügbare Werte zurück.
  7. Analysiert die Antwort des Diensts und zeigt dem Nutzer die Antwort an

Bibliotheken importieren

import argparse

from google.cloud import videointelligence

Einige Standardbibliotheken werden importiert: argparse, damit die Anwendung Eingabedateinamen als Argumente akzeptieren kann, und sys für die Formatierung der Ausgabe, während auf die Antworten der API gewartet wird. Das Paket time wird importiert, um einige einfache Warteschleifen auszuführen.

Wenn Sie die Video Intelligence API verwenden, müssen Sie auch google.cloud.videointelligence_v1 und die Aufzählungsklasse importieren, die das Verzeichnis unserer API-Aufrufe enthält.

Anwendung ausführen

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)

Hier wird das übergebene Argument für den Cloud Storage-URI des Namens der Videodatei geparst und an die Funktion main() übergeben.

Bei der API authentifizieren

Bevor Sie mit dem Dienst der Video Intelligence API kommunizieren, müssen Sie den Dienst mithilfe zuvor erworbener Anmeldeinformationen authentifizieren. Innerhalb einer Anwendung erhalten Sie die Anmeldedaten am einfachsten über die Verwendung der Standardanmeldedaten für Anwendungen (Application Default Credentials, ADC). Standardmäßig ruft ADC die Anmeldedaten von der GOOGLE_APPLICATION_CREDENTIALS-Umgebungsdatei ab, die so festgelegt sein muss, dass sie auf die JSON-Schlüsseldatei Ihres Dienstkontos verweist. (Sie müssen Ihr Dienstkonto und die Umgebung, wie in der Kurzanleitung beschrieben, zur Verwendung von ADC eingerichtet haben.

Erstellen Sie die Anfrage

video_client = videointelligence.VideoIntelligenceServiceClient()
features = [videointelligence.Feature.LABEL_DETECTION]
operation = video_client.annotate_video(
    request={"features": features, "input_uri": path}
)

Jetzt, da der Dienst der Video Intelligence API bereit ist, können Sie eine Anfrage für diesen Dienst erstellen. Anfragen an die Video Intelligence API werden als JSON-Objekte bereitgestellt. Vollständige Informationen zur spezifischen Struktur einer solchen Anfrage finden Sie in der Video Intelligence API-Referenz.

Dieses Code-Snippet:

  1. Konstruiert das JSON für eine POST-Anfrage an die Methode annotate_video()
  2. Fügt den Cloud Storage-Speicherort des übergebenen Videodateinamens in die Anfrage ein.
  3. Gibt an, dass die Methode annotate die Anfrage LABEL_DETECTION ausführen soll.

Prüfen Sie den Vorgang

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

Unter Verwendung der Anfrage für den vorhandenen Vorgang wird eine while-Schleife erstellt, um den Status dieses Vorgangs regelmäßig zu prüfen. Sobald der Vorgang den Status done angibt, wird die Antwort geparst.

Antwort parsen

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.microseconds / 1e6
        )
        end_time = (
            segment.segment.end_time_offset.seconds
            + segment.segment.end_time_offset.microseconds / 1e6
        )
        positions = "{}s to {}s".format(start_time, end_time)
        confidence = segment.confidence
        print("\tSegment {}: {}".format(i, positions))
        print("\tConfidence: {}".format(confidence))
    print("\n")

Nach Abschluss des Vorgangs wird in der Antwort das Ergebnis innerhalb einer AnnotateVideoResponse zurückgegeben. Diese besteht aus einer Liste von annotationResults, einer für jedes in der Anfrage gesendete Video. Da in der Anfrage nur ein Video gesendet wurde, wird das erste segmentLabelAnnotations der Ergebnisse übernommen und alle Labels in segmentLabelAnnotations werden durchlaufen. Wenn Sie nur segmentLabelAnnotations verwenden, werden in dieser Anleitung nur Annotationen auf Videoebene angezeigt. Jedes segment_label enthält eine Beschreibung (segment_label.description), eine Liste von Entitätskategorien (segment_label.category_entities) und eine Liste von Segmenten, die die Start-/Endzeit der Labelvorkommen im Video identifizieren (sollte ein Segment sein, das sich über das gesamte Video oder ein Videosegment im Fall von segment_label_annotations erstreckt).

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

Da in der Anfrage nur ein Video gesendet wurde, wird das erste description des ersten Ergebnisses ausgegeben.

Führen Sie Ihre Anwendung aus

Sie können die Anwendung starten, indem Sie einfach den Cloud Storage-URI eines Videos übergeben:

$ python labels.py gs://YOUR_BUCKET/YOUR_OBJECT
Operation us-west1.4757250774497581229 started: 2020-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
...
 

Ausgabe

Im Folgenden finden Sie ein Beispiel für eine mögliche Ausgabe.

Processing video for label annotations:

Finished processing. Video label description: crowd Label category description: people Segment 0: 0.0s to 60.24s Confidence: 0.527720749378

Video label description: official Label category description: person Segment 0: 0.0s to 60.24s Confidence: 0.372822880745

Video label description: audience Label category description: people Segment 0: 0.0s to 60.24s Confidence: 0.501719772816

Video label description: news Segment 0: 0.0s to 60.24s Confidence: 0.867252230644

Video label description: people Label category description: person Segment 0: 0.0s to 60.24s Confidence: 0.46747264266

Video label description: politics Segment 0: 0.0s to 60.24s Confidence: 0.319397002459

Das wars! Sie haben eine Annotationsaufgabe mit der Video Intelligence API ausgeführt.