Tutorial: Menganalisis tabel objek menggunakan fungsi jarak jauh

Tutorial ini menunjukkan cara membuat tabel objek berdasarkan gambar dari set data bunga, membuat fungsi jarak jauh yang melabeli gambar menggunakan Cloud Vision API, lalu menganalisis gambar di tabel objek menggunakan fungsi jarak jauh.

Izin yang diperlukan

  • Untuk membuat set data, Anda memerlukan izin bigquery.datasets.create.
  • Untuk membuat resource koneksi, Anda memerlukan izin berikut:

    • bigquery.connections.create
    • bigquery.connections.get
  • Untuk memberikan izin ke akun layanan koneksi, Anda memerlukan izin berikut:

    • resourcemanager.projects.setIamPolicy
  • Untuk membuat tabel objek, Anda memerlukan izin berikut:

    • bigquery.tables.create
    • bigquery.tables.update
    • bigquery.connections.delegate
  • Untuk membuat fungsi jarak jauh, Anda memerlukan izin yang terkait dengan peran Cloud Functions Developer.

  • Untuk memanggil fungsi jarak jauh, Anda memerlukan peran Cloud Run Invoker.

  • Untuk menganalisis tabel objek dengan fungsi jarak jauh, Anda memerlukan izin bigquery.tables.getData pada tabel objek.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

  • BigQuery: You incur storage costs for the object table you create in BigQuery.
  • Cloud Functions: You incur costs for invoking the remote function and for any compute resources it uses, including calls to Cloud Vision API.

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Untuk informasi selengkapnya tentang harga Cloud Storage, lihat halaman Harga Cloud Storage.

Untuk informasi selengkapnya tentang harga penyimpanan BigQuery, lihat Harga penyimpanan dalam dokumentasi BigQuery.

Untuk informasi selengkapnya tentang harga Cloud Functions, lihat halaman Harga Cloud Functions.

Untuk informasi selengkapnya tentang harga Vision API, lihat Harga Cloud Vision dalam dokumentasi Vision.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Enable the BigQuery, BigQuery Connection API, and Cloud Functions APIs.

    Enable the APIs

  5. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  6. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  7. Enable the BigQuery, BigQuery Connection API, and Cloud Functions APIs.

    Enable the APIs

Membuat fungsi Cloud Functions

Untuk membuat fungsi, ikuti langkah-langkah berikut:

  1. Buka halaman Cloud Functions.

    Buka Cloud Functions

  2. Klik Create function.

  3. Untuk Environment, pilih 2nd gen.

  4. Untuk Function name, ketik vision-ai.

  5. Klik Next.

  6. Untuk Runtime, pilih Python 3.9.

  7. Untuk Entry point, ketik label_detection.

  8. Pilih main.py. Salin dan tempel kode berikut:

    Python

    import urllib.request
    
    import flask
    import functions_framework
    from google.cloud import vision
    
    
    @functions_framework.http
    def label_detection(request: flask.Request) -> flask.Response:
        """BigQuery remote function to label input images.
        Args:
            request: HTTP request from BigQuery
            https://cloud.google.com/bigquery/docs/reference/standard-sql/remote-functions#input_format
        Returns:
            HTTP response to BigQuery
            https://cloud.google.com/bigquery/docs/reference/standard-sql/remote-functions#output_format
        """
        try:
            client = vision.ImageAnnotatorClient()
            calls = request.get_json()["calls"]
            replies = []
            for call in calls:
                content = urllib.request.urlopen(call[0]).read()
                results = client.label_detection({"content": content})
                replies.append(vision.AnnotateImageResponse.to_dict(results))
            return flask.make_response(flask.jsonify({"replies": replies}))
        except Exception as e:
            return flask.make_response(flask.jsonify({"errorMessage": str(e)}), 400)
    
    

  9. Pilih requirements.txt. Salin dan tempel teks berikut:

    Flask==2.2.2
    functions-framework==3.5.0
    google-cloud-vision==3.4.2
    Werkzeug==2.3.7
    

  10. Klik Deploy.

  11. Setelah fungsi selesai di-deploy, klik tab Trigger.

  12. Salin nilai Trigger URL dan simpan di tempat lain. Anda memerlukan informasi ini saat membuat fungsi jarak jauh.

Membuat set data

Buat set data bernama remote_function_test:

SQL

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Editor, jalankan pernyataan SQL berikut:

    CREATE SCHEMA `PROJECT_ID.remote_function_test`;
    

    Ganti PROJECT_ID dengan project ID Anda.

bq

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

  2. Jalankan perintah bq mk untuk membuat set data:

      bq mk --dataset --location=us PROJECT_ID:remote_function_test
      

    Ganti PROJECT_ID dengan project ID Anda.

Buat koneksi

Buat koneksi bernama lake-connection:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Klik Add data, lalu klik External data source.

  3. Dalam daftar Connection type, pilih BigLake and remote functions (Cloud Resource).

  4. Di kolom Connection ID, ketik lake-connection.

  5. Klik Create connection.

  6. Di panel Connection info, salin nilai dari kolom Service account id dan simpan di suatu tempat. Anda memerlukan informasi ini untuk memberikan izin ke akun layanan koneksi.

bq

  1. Di Cloud Shell, jalankan perintah bq mk untuk membuat koneksi:

    bq mk --connection --location=us --connection_type=CLOUD_RESOURCE \
    lake-connection
    
  2. Jalankan perintah bq show untuk mengambil informasi tentang koneksi:

    bq show --connection us.lake-connection
    
  3. Dari kolom properties, salin nilai properti serviceAccountId dan simpan di suatu tempat. Anda memerlukan informasi ini untuk memberikan izin ke akun layanan koneksi.

Membuat bucket Cloud Storage

Buat bucket Cloud Storage untuk menampung set data bunga.

Memberikan izin ke akun layanan koneksi

Untuk memberikan izin ke akun layanan, ikuti langkah-langkah berikut:

  1. Buka halaman IAM & Admin.

    Buka IAM & Admin

  2. Klik Grant Access.

    Dialog Add principals akan terbuka.

  3. Di kolom New principals, masukkan ID akun layanan yang Anda salin sebelumnya.

  4. Di kolom Select a role, pilih Cloud Run, lalu pilih Cloud Run Invoker.

  5. Klik Add another role.

  6. Di kolom Select a role, pilih Cloud Storage, lalu pilih Storage Object Viewer.

  7. Klik Save.

Mengupload set data ke Cloud Storage

Dapatkan file set data dan sediakan di Cloud Storage:

  1. Download set data bunga ke komputer lokal Anda.
  2. Upload set data ke bucket yang Anda buat sebelumnya.

Membuat tabel objek

Buat tabel objek bernama sample_images berdasarkan set data bunga yang Anda upload:

SQL

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Editor, jalankan pernyataan SQL berikut:

    CREATE EXTERNAL TABLE remote_function_test.sample_images
    WITH CONNECTION `us.lake-connection`
    OPTIONS(
      object_metadata = 'SIMPLE',
      uris = ['gs://BUCKET_NAME/*']);
    

    Ganti BUCKET_NAME dengan nama bucket yang Anda buat sebelumnya.

bq

Di Cloud Shell, jalankan perintah bq mk untuk membuat koneksi:

bq mk --table \
--external_table_definition=gs:"//BUCKET_NAME/*@us.lake-connection" \
--object_metadata=SIMPLE \
remote_function_test.sample_images

Ganti BUCKET_NAME dengan nama bucket yang Anda buat sebelumnya.

Membuat fungsi jarak jauh BigQuery

Buat fungsi jarak jauh bernama label_detection:

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Editor, jalankan pernyataan SQL berikut:

    CREATE OR REPLACE FUNCTION `remote_function_test.label_detection` (signed_url_ STRING) RETURNS JSON
    REMOTE WITH CONNECTION `us.lake-connection`
    OPTIONS(
    endpoint = 'TRIGGER_URL',
    max_batching_rows = 1
    );
    

    Ganti TRIGGER_URL dengan URL pemicu yang Anda simpan sebelumnya. URL akan terlihat seperti https://vision-ai-1abcd2efgh-uc.a.run.app.

Memanggil fungsi jarak jauh

Panggil fungsi jarak jauh label_detection pada tabel objek sample_images:

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Editor, jalankan pernyataan SQL berikut:

    SELECT uri, remote_function_test.label_detection(signed_url)
    FROM EXTERNAL_OBJECT_TRANSFORM(
    TABLE remote_function_test.sample_images,
    ["SIGNED_URL"]
    )
    LIMIT 100;
    

    Hasilnya akan terlihat seperti berikut:

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    | uri                                                           | f0_                                                                                                            |
    —---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    |  gs://bq_huron_demo/flowers/daisy/100080576_f52e8ee070_n.jpg  |  {"face_annotations":[],"label_annotations":[{"confidence":0.0,"description":"Flower",                         |
    |                                                               |  "locale":"","locations":[],"mid":"/m/0c9ph5","properties":[],"score":0.9785631,"topicality":0.9785631},       |
    |                                                               |  {"confidence":0.0,"description":"Plant","locale":"","locations":[],"mid":"/m/05s2s","properties":[],          |
    |                                                               |  "Score":0.9635679,"topicality":0.9635679},{"confidence":0.0,"description":"camomile","locale":"",             |
    |                                                               |  "locations":[],"mid":"/m/011bc8hg","properties":[],"score":0.9110366,"topicality":0.9110366},                 |
    |                                                               |  {"confidence":0.0,"description":"Petal","locale":"","locations":[],"mid":"/m/016q19","properties":[],         |
    |                                                               |  "score":0.8927441,"topicality":0.8927441},{"confidence":0.0,"description":"Chamaemelum nobile","locale":"",   |
    |                                                               |  "locations":[],"mid":"/m/05cmcg","properties":[],"score":0.8460995,"topicality":0.8460995},                   |
    |                                                               |   {"confidence":0.0,"description":"Flowering plant","locale":"","locations":[],"mid":"/m/04sjm",               |
    |                                                               |  "properties":[],"score":0.7642974,"topicality":0.7642974},{"confidence":0.0,"description":"Annual plant",     |
    |                                                               |  "locale":"","locations":[],"mid":"/m/0jqb","properties":[],"score":0.7478164,                                 |
    |                                                               |  "topicality":0.7478164},{"confidence":0.0,"description":"Close-up","locale":"","locations":[],                |
    |                                                               |  "mid":"/m/02cqfm","properties":[],"score":0.7207553,"topicality":0.7207553},{"confidence":0.0,                |
    |                                                               |  "description":"Oxeye daisy","locale":"","locations":[],"mid":"/m/02qvnf","properties":[],                     |
    |                                                               |  "score":0.71786934,"topicality":0.71786934},{"confidence":0.0,"description":"Daisy family","locale":"",       |
    |                                                               |  "locations":[],"mid":"/m/0l5r","properties":[],"score":0.7164383,"topicality":0.7164383}],                    |
    |                                                               |  "landmark_annotations":[],"localized_object_annotations":[],"logo_annotations":[],"text_annotations":[]}      |
    —---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    | gs://bq_huron_demo/flowers/daisy/10140303196_b88d3d6cec.jpg   |  {"face_annotations":[],"label_annotations":[{"confidence":0.0,"description":"Flower","locale":"",             |
    |                                                               |  "locations":[],"mid":"/m/0c9ph5","properties":[],"score":0.9770426,"topicality":0.9770426},                   |
    |                                                               |  {"confidence":0.0,"description":"Plant","locale":"","locations":[],"mid":"/m/05s2s",                          |
    |                                                               |  "Properties":[],"score":0.95798975,"topicality":0.95798975},{"confidence":0.0,                                |
    |                                                               |  "description":"Petal","locale":"","locations":[],"mid":"/m/016q19","properties":[],                           |
    |                                                               |  "score":0.88984144,"topicality":0.88984144},{"confidence":0.0,"description":"Yellow",                         |
    |                                                               |  "locale":"","locations":[],"mid":"/m/088fh","properties":[],"score":0.84456813,                               |
    |                                                               |  "Topicality":0.84456813},{"confidence":0.0,"description":"camomile","locale":"",                              |
    |                                                               |  "locations":[],"mid":"/m/011bc8hg","properties":[],"score":0.7926449, "topicality":0.7926449},                |
    |                                                               |  {"confidence":0.0,"description":"Annual plant","locale":"","locations":[],"mid":"/m/0jqb",                    |
    |                                                               |  "Properties":[],"score":0.75020844, "topicality":0.75020844},{"confidence":0.0,                               |
    |                                                               |  "description":"Flowering plant","locale":"","locations":[],"mid":"/m/04sjm",                                  |
    |                                                               |  "Properties":[],"score":0.7403478,"topicality":0.7403478},{"confidence":0.0,                                  |
    |                                                               |  "description":"Chamaemelum nobile","locale":"","locations":[],"mid":"/m/05cmcg",                              |
    |                                                               |  "Properties":[],"score":0.7264577,"topicality":0.7264577},{"confidence":0.0,                                  |
    |                                                               |  "description":"Close-up","locale":"","locations":[],"mid":"/m/02cqfm","properties":[],                        |
    |                                                               |  "score":0.721242,"topicality":0.721242},{"confidence":0.0,"description":"Daisy family",                       |
    |                                                               |  "locale":"","locations":[],"mid":"/m/0l5r","properties":[],"score":0.7012979,                                 |
    |                                                               |  "Topicality":0.7012979}],"landmark_annotations":[],"localized_object_annotations":[],                         |
    |                                                               |  "logo_annotations":[],"text_annotations":[]}                                                                  |
    —------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------
    
    

Pembersihan

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.