Tutorial deteksi pergantian shot

Audience

Tutorial ini dirancang untuk memungkinkan Anda secara cepat mulai menjelajahi dan mengembangkan aplikasi dengan Video Intelligence API. Kursus ini dirancang untuk orang-orang yang memahami pemrograman dasar, meskipun tanpa banyak pengetahuan pemrograman, Anda harus dapat mengikutinya. Setelah mengikuti tutorial ini, Anda akan 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. 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 beberapa prasyarat:

Membuat anotasi video menggunakan deteksi pergantian shot

Tutorial ini memandu Anda memahami aplikasi Video API dasar, menggunakan permintaan SHOT_CHANGE_DETECTION. Permintaan SHOT_CHANGE_DETECTION akan memberikan hasil anotasi:

  • Daftar semua gambar yang terjadi dalam video
  • Untuk setiap pengambilan gambar, cantumkan waktu mulai dan berakhirnya pengambilan gambar

Kita akan menampilkan seluruh kode terlebih dahulu. (Perlu diperhatikan bahwa kami telah menghapus sebagian besar komentar dari kode ini untuk menunjukkan kepada Anda seberapa singkat kode tersebut. Kami akan memberikan lebih banyak komentar selagi menelusuri kode tersebut.)

import argparse

from google.cloud import videointelligence

def analyze_shots(path):
    """Detects camera shot changes."""
    video_client = videointelligence.VideoIntelligenceServiceClient()
    features = [videointelligence.Feature.SHOT_CHANGE_DETECTION]
    operation = video_client.annotate_video(
        request={"features": features, "input_uri": path}
    )
    print("\nProcessing video for shot change annotations:")

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

    for i, shot in enumerate(result.annotation_results[0].shot_annotations):
        start_time = (
            shot.start_time_offset.seconds + shot.start_time_offset.microseconds / 1e6
        )
        end_time = (
            shot.end_time_offset.seconds + shot.end_time_offset.microseconds / 1e6
        )
        print("\tShot {}: {} to {}".format(i, start_time, end_time))

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

    analyze_shots(args.path)

Aplikasi sederhana ini melakukan tugas-tugas berikut:

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

Kita akan membahas langkah-langkah ini secara lebih mendetail di bawah.

Mengimpor library

import argparse

from google.cloud import videointelligence

Kita mengimpor argparse untuk memungkinkan aplikasi menerima nama file input sebagai argumen.

Untuk menggunakan Video Intelligence API, kami juga mengimpor library google.cloud.videointelligence, yang menyimpan direktori panggilan API dan konstanta enumerasi.

Menjalankan aplikasi

parser = argparse.ArgumentParser(
    description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument("path", help="GCS path for shot change detection.")
args = parser.parse_args()

analyze_shots(args.path)

Di sini, kita mengurai argumen yang diteruskan untuk URI Google Cloud Storage nama file video dan meneruskannya 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 paling sederhana untuk mendapatkan kredensial adalah dengan menggunakan Kredensial Default Aplikasi (ADC). Secara default, ADC akan 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. Lihat Menyiapkan Akun Layanan untuk mengetahui informasi selengkapnya.)

Membuat permintaan

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

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

Cuplikan kode ini melakukan tugas-tugas berikut:

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

Membangun operasi yang berjalan lama

Saat pertama kali mengeksekusi permintaan terhadap Video Intelligence API, kita tidak mendapatkan hasil langsung; sebagai gantinya, kita akan mendapatkan nama operasi, yang disimpan dalam kolom name respons, yang kemudian dapat kita gunakan untuk memeriksa hasilnya di lain waktu.

Meneruskan nama operasi tersebut (yang merupakan string numerik) ke metode operations Operations Service Video Intelligence API untuk menampilkan status operasi saat ini. Contoh respons ditampilkan di bawah ini:

{
   "response":{
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoResponse"
   },
   "name":"us-west1.17159971042783089144",
   "metadata":{
      "annotationProgress":[
         {
            "inputUri":"/video/gbikes_dinosaur.mp4",
            "updateTime":"2017-01-27T19:45:54.297807Z",
            "startTime":"2017-01-27T19:45:54.275023Z"
         }
      ],
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoProgress"
   }
}

Perhatikan bahwa kolom response saat ini hanya berisi kolom @type, yang menunjukkan jenis respons tersebut. Setelah hasilnya benar-benar tersedia, kolom respons akan berisi hasil dari jenis tersebut.

Memeriksa operasi

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

Dengan menggunakan permintaan operasi yang ada untuk operasi yang ada, kita membuat loop while untuk memeriksa status operasi tersebut secara berkala. Setelah operasi menunjukkan bahwa operasi tersebut adalah done, kita akan keluar dari loop dan dapat mengurai respons.

Uraikan respons

for i, shot in enumerate(result.annotation_results[0].shot_annotations):
    start_time = (
        shot.start_time_offset.seconds + shot.start_time_offset.microseconds / 1e6
    )
    end_time = (
        shot.end_time_offset.seconds + shot.end_time_offset.microseconds / 1e6
    )
    print("\tShot {}: {} to {}".format(i, start_time, end_time))

Setelah operasi selesai, responsnya akan berisi AnnotateVideoResponse, yang terdiri dari daftar annotationResults, satu untuk setiap video yang dikirim dalam permintaan. Karena hanya mengirim satu video dalam permintaan, kita mengambil shotAnnotations pertama dari hasil. Kita membahas semua 'segmen' untuk video ini.

Menjalankan aplikasi

Untuk menjalankan aplikasi, cukup teruskan Cloud Storage URI video:

$ python shotchange.py gs://cloud-samples-data/video/gbikes_dinosaur.mp4
operationId=us-west1.12468772851081463748
Operation us-west1.12468772851081463748 started: 2017-01-30T01:53:45.981043Z
Processing video for shot change annotations:
Finished processing.
  Shot 0: 0.0 to 5.166666
  Shot 1: 5.233333 to 10.066666
  Shot 2: 10.1 to 28.133333
  Shot 3: 28.166666 to 42.766666

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