Tutorial Deteksi Label

Audience

Tutorial ini didesain untuk membantu Anda mulai menjelajahi dan mengembangkan aplikasi dengan Video Intelligence API. Python dirancang untuk orang yang sudah memiliki pengetahuan dasar tentang Python. Anda juga harus dapat mengikuti pengetahuan pemrograman yang terbatas. Setelah mempelajari tutorial ini, Anda seharusnya dapat menggunakan Dokumentasi referensi untuk membuat aplikasi dasar Anda sendiri.

Tutorial ini memandu aplikasi Video Intelligence API menggunakan kode Python. Tujuannya di sini bukan untuk menjelaskan library klien Python, tetapi menjelaskan cara melakukan panggilan ke Video Intelligence API menggunakan fitur deteksi label video. Aplikasi di Java dan Node.js pada dasarnya mirip.

Jika Anda mencari contoh khusus kode atau contoh dalam bahasa lain, lihat panduan cara kerja pendamping.

Prasyarat

Tutorial ini memiliki prasyarat berikut:

Membuat anotasi video menggunakan deteksi label

Tutorial ini memandu Anda memahami aplikasi Video API dasar, menggunakan permintaan LABEL_DETECTION. Permintaan LABEL_DETECTION menganotasi video dengan label (atau "tag") yang dipilih berdasarkan konten gambar. Misalnya, video kereta di persimpangan dapat menghasilkan label seperti "kereta", "transportasi", "perlintasan kereta api".

Berikut adalah seluruh kode yang diperlukan untuk tutorial ini. Sebagian besar komentar telah dihapus dari kode ini untuk menyoroti seberapa singkat kode tersebut. Sebaliknya, komentar akan diberikan nanti saat kita menelusuri kode.

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)

Aplikasi sederhana ini melakukan tugas-tugas berikut:

  1. Mengimpor library yang diperlukan untuk menjalankan aplikasi.
  2. Mengambil file video yang tersimpan di URI Cloud Storage sebagai argumen dan meneruskannya ke fungsi main().
  3. Mendapatkan kredensial untuk menjalankan layanan Video Intelligence API.
  4. Membuat permintaan anotasi video untuk dikirimkan ke layanan video.
  5. Mengirim permintaan dan menampilkan operasi yang berjalan lama.
  6. Melakukan loop pada operasi yang berjalan lama hingga video diproses dan menampilkan nilai yang tersedia.
  7. Mengurai respons untuk layanan dan menampilkan respons kepada pengguna.

Mengimpor library

import argparse

from google.cloud import videointelligence

Beberapa library standar diimpor: argparse untuk memungkinkan aplikasi menerima nama file input sebagai argumen, dan sys untuk memformat output sambil menunggu respons API. Paket time diimpor untuk menjalankan beberapa loop tunggu sederhana.

Saat menggunakan Video Intelligence API, Anda juga harus mengimpor google.cloud.videointelligence_v1 dan class enumerasinya, yang menyimpan direktori panggilan API.

Menjalankan aplikasi

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)

Di sini, argumen yang diteruskan akan diuraikan untuk URI Cloud Storage nama file video dan diteruskan ke fungsi main().

Melakukan autentikasi ke API

Sebelum berkomunikasi dengan layanan Video Intelligence API, Anda perlu mengautentikasi layanan menggunakan kredensial yang diperoleh sebelumnya. Dalam aplikasi, cara termudah untuk mendapatkan kredensial adalah dengan menggunakan Kredensial Default Aplikasi (ADC). Secara default, ADC mencoba mendapatkan kredensial dari file lingkungan GOOGLE_APPLICATION_CREDENTIALS, yang harus ditetapkan agar mengarah ke file kunci JSON akun layanan Anda. (Anda harus menyiapkan akun layanan dan lingkungan untuk menggunakan ADC di Panduan Memulai.

Membuat permintaan

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

Setelah layanan Video Intelligence API siap, Anda dapat membuat permintaan ke layanan tersebut. Permintaan ke Video Intelligence API disediakan sebagai objek JSON. Baca Referensi Video Intelligence API untuk mengetahui informasi lengkap tentang struktur spesifik permintaan semacam itu.

Cuplikan kode ini melakukan tugas-tugas berikut:

  1. Membuat JSON untuk permintaan POST ke metode annotate_video().
  2. Memasukkan lokasi Cloud Storage nama file video yang diteruskan ke permintaan.
  3. Menunjukkan bahwa metode annotate harus menjalankan LABEL_DETECTION.

Memeriksa operasi

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

Dengan menggunakan permintaan operasi yang ada untuk operasi yang ada, loop while dibuat untuk memeriksa status operasi tersebut secara berkala. Setelah operasi menunjukkan bahwa operasi tersebut adalah done, respons akan diuraikan.

Uraikan respons

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")

Setelah operasi selesai, respons akan berisi hasil dalam AnnotateVideoResponse yang terdiri dari daftar annotationResults, satu untuk setiap video yang dikirim dalam permintaan. Karena hanya satu video yang dikirim dalam permintaan, segmentLabelAnnotations pertama dari hasil akan diambil, semua label dalam segmentLabelAnnotations akan di-loop. Dengan hanya menggunakan segmentLabelAnnotations, tutorial ini hanya menampilkan anotasi tingkat video. Setiap segment_label menyertakan deskripsi (segment_label.description), daftar kategori entitas (segment_label.category_entities), dan daftar segmen yang mengidentifikasi waktu mulai/berakhir dari kemunculan label dalam video (harus berupa satu segmen yang mencakup seluruh segmen video atau video untuk segment_label_annotations).

{
   "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
                  }
                ]
              },
               ...
            ]
         }
      ]
   }
}

Karena hanya satu video yang dikirim dalam permintaan, description pertama dari hasil pertama akan dicetak.

Menjalankan aplikasi

Untuk menjalankan aplikasi Anda, cukup teruskan Cloud Storage URI video:

$ 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
...
 

Output

Berikut adalah contoh kemungkinan output.

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

Selamat! Anda telah menyelesaikan tugas anotasi menggunakan Video Intelligence API.