Dokumen deployment ini menjelaskan cara men-deploy Dataflow pipeline untuk memproses file gambar dalam skala besar dengan Cloud Vision API. Pipeline ini menyimpan hasil file yang diproses dalam BigQuery. Anda dapat menggunakan {i>file<i} untuk tujuan analitis atau untuk melatih Model BigQuery ML.
Pipeline Dataflow yang Anda buat dalam deployment ini dapat diproses jutaan gambar per hari. Satu-satunya batasan adalah Kuota Vision API. Anda dapat meningkatkan kuota Vision API berdasarkan timbangan lainnya.
Instruksi ini ditujukan untuk para insinyur data dan ilmuwan data. Ini dokumen ini mengasumsikan Anda memiliki pengetahuan dasar tentang membangun Dataflow pipeline menggunakan Java SDK Apache Beam, GoogleSQL untuk BigQuery, dan pembuatan skrip shell dasar. Tutorial ini juga mengasumsikan bahwa Anda sudah memahami Vision API.
Arsitektur
Diagram berikut mengilustrasikan alur sistem untuk membangun visi ML solusi analitik.
Dalam diagram sebelumnya, informasi mengalir melalui arsitektur sebagai berikut:
- Klien mengupload file gambar ke bucket Cloud Storage.
- Cloud Storage mengirimkan pesan tentang upload data ke Pub/Sub.
- Pub/Sub memberi tahu Dataflow tentang upload tersebut.
- Pipeline Dataflow mengirimkan gambar ke Vision API.
- Vision API memproses gambar, lalu menampilkan anotasi.
- Pipeline mengirimkan file yang telah dianotasi ke BigQuery untuk Anda untuk dianalisis.
Tujuan
- Membuat pipeline Apache Beam untuk analisis gambar dari gambar yang dimuat di Cloud Storage.
- Gunakan Dataflow Runner v2 untuk menjalankan pipeline Apache Beam dalam mode streaming guna menganalisis gambar segera file berhasil diupload.
- Gunakan Vision API untuk menganalisis gambar bagi sekumpulan jenis fitur.
- Menganalisis anotasi dengan BigQuery.
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah selesai membangun aplikasi contoh, Anda dapat menghindari melanjutkan penagihan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
- 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.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Di konsol Google Cloud, aktifkan Cloud Shell.
Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.
- Buat clone repositori GitHub yang berisi kode sumber
Pipeline Dataflow:
git clone https://github.com/GoogleCloudPlatform/dataflow-vision-analytics.git
- Buka folder root repositori:
cd dataflow-vision-analytics
- Ikuti petunjuk di
Memulai
dari repositori dataflow-vision-analytics di GitHub untuk
menyelesaikan tugas berikut:
- Mengaktifkan beberapa API.
- Membuat bucket Cloud Storage.
- Membuat langganan dan topik Pub/Sub.
- Membuat set data BigQuery.
- Siapkan beberapa variabel lingkungan untuk deployment ini.
Menjalankan pipeline Dataflow untuk semua fitur Vision API yang diimplementasikan
Pipeline Dataflow meminta dan memproses serangkaian Fitur dan atribut Vision API dalam file yang dianotasi.
Parameter yang tercantum dalam tabel berikut dikhususkan untuk Pipeline Dataflow dalam deployment ini. Untuk daftar lengkap parameter eksekusi Dataflow standar, lihat Menetapkan opsi pipeline Dataflow.
Nama parameter | Deskripsi |
---|---|
|
Jumlah gambar yang akan disertakan dalam permintaan untuk Vision API. Nilai defaultnya adalah 1. Anda dapat meningkatkan nilai ini hingga maksimum 16. |
|
Nama set data BigQuery output. |
|
Daftar fitur pemrosesan gambar. Pipeline ini mendukung properti label, penanda, logo, wajah, petunjuk pangkas, dan properti gambar baru. |
|
Parameter yang menentukan jumlah maksimum panggilan paralel ke Vision API. Nilai defaultnya adalah 1. |
|
Parameter string dengan menggunakan nama tabel untuk berbagai anotasi. Tujuan
nilai default disediakan untuk setiap tabel—misalnya,
label_annotation . |
|
Lamanya waktu tunggu sebelum memproses gambar ketika terdapat sekumpulan gambar. Defaultnya adalah 30 detik. |
|
ID langganan Pub/Sub yang menerima notifikasi Cloud Storage input. |
|
Project ID yang akan digunakan untuk Vision API. |
Di Cloud Shell, jalankan perintah berikut untuk memproses gambar untuk semua jenis fitur yang didukung oleh pipeline Dataflow:
./gradlew run --args=" \ --jobName=test-vision-analytics \ --streaming \ --runner=DataflowRunner \ --enableStreamingEngine \ --diskSizeGb=30 \ --project=${PROJECT} \ --datasetName=${BIGQUERY_DATASET} \ --subscriberId=projects/${PROJECT}/subscriptions/${GCS_NOTIFICATION_SUBSCRIPTION} \ --visionApiProjectId=${PROJECT} \ --features=IMAGE_PROPERTIES,LABEL_DETECTION,LANDMARK_DETECTION,LOGO_DETECTION,CROP_HINTS,FACE_DETECTION"
Akun layanan khusus harus memiliki akses baca ke bucket yang berisi gambar. Dengan kata lain, akun tersebut harus memiliki
roles/storage.objectViewer
peran diberikan pada bucket tersebut.Untuk informasi selengkapnya tentang penggunaan akun layanan khusus, lihat Keamanan dan izin Dataflow.
Buka URL yang ditampilkan di tab browser baru, atau buka Tugas Dataflow lalu pilih pipeline test-vision-analytics.
Setelah beberapa detik, grafik untuk tugas Dataflow akan muncul:
Pipeline Dataflow sedang berjalan dan menunggu untuk diterima notifikasi input dari langganan Pub/Sub.
Picu pemrosesan gambar Dataflow dengan mengupload keenam sampel ke bucket input:
gcloud storage cp data-sample/* gs://${IMAGE_BUCKET}
Di konsol Google Cloud, temukan panel Penghitung Kustom dan gunakan meninjau penghitung kustom di Dataflow dan memverifikasi bahwa Dataflow telah memproses keenam gambar tersebut. Anda dapat menggunakan fungsi filter panel untuk menavigasi ke metrik yang benar. Kepada hanya tampilkan penghitung yang dimulai dengan awalan
numberOf
, jenisnumberOf
di filter.Di Cloud Shell, validasikan bahwa tabel tersebut dibuat secara otomatis:
bq query --nouse_legacy_sql "SELECT table_name FROM ${BIGQUERY_DATASET}.INFORMATION_SCHEMA.TABLES ORDER BY table_name"
Outputnya adalah sebagai berikut:
+----------------------+ | table_name | +----------------------+ | crop_hint_annotation | | face_annotation | | image_properties | | label_annotation | | landmark_annotation | | logo_annotation | +----------------------+
Lihat skema untuk tabel
landmark_annotation
. TujuanLANDMARK_DETECTION
gambar fitur atribut yang ditampilkan dari panggilan API.bq show --schema --format=prettyjson ${BIGQUERY_DATASET}.landmark_annotation
Outputnya adalah sebagai berikut:
[ { "name":"gcs_uri", "type":"STRING" }, { "name":"feature_type", "type":"STRING" }, { "name":"transaction_timestamp", "type":"STRING" }, { "name":"mid", "type":"STRING" }, { "name":"description", "type":"STRING" }, { "name":"score", "type":"FLOAT" }, { "fields":[ { "fields":[ { "name":"x", "type":"INTEGER" }, { "name":"y", "type":"INTEGER" } ], "mode":"REPEATED", "name":"vertices", "type":"RECORD" } ], "name":"boundingPoly", "type":"RECORD" }, { "fields":[ { "fields":[ { "name":"latitude", "type":"FLOAT" }, { "name":"longitude", "type":"FLOAT" } ], "name":"latLon", "type":"RECORD" } ], "mode":"REPEATED", "name":"locations", "type":"RECORD" } ]
Lihat data anotasi yang dihasilkan oleh API dengan menjalankan perintah Perintah
bq query
untuk melihat semua tempat terkenal yang ditemukan dalam keenam gambar ini diurutkan berdasarkan skor yang paling mungkin:bq query --nouse_legacy_sql "SELECT SPLIT(gcs_uri, '/')[OFFSET(3)] file_name, description, score, locations FROM ${BIGQUERY_DATASET}.landmark_annotation ORDER BY score DESC"
Outputnya mirip dengan hal berikut ini:
+------------------+-------------------+------------+---------------------------------+ | file_name | description | score | locations | +------------------+-------------------+------------+---------------------------------+ | eiffel_tower.jpg | Eiffel Tower | 0.7251996 | ["POINT(2.2944813 48.8583701)"] | | eiffel_tower.jpg | Trocadéro Gardens | 0.69601923 | ["POINT(2.2892823 48.8615963)"] | | eiffel_tower.jpg | Champ De Mars | 0.6800974 | ["POINT(2.2986304 48.8556475)"] | +------------------+-------------------+------------+---------------------------------+
Untuk deskripsi terperinci dari semua kolom yang spesifik untuk anotasi, lihat
AnnotateImageResponse
Untuk menghentikan pipeline streaming, jalankan perintah berikut. Pipeline terus berjalan meskipun tidak ada lagi Pub/Sub notifikasi untuk diproses.
gcloud dataflow jobs cancel --region ${REGION} $(gcloud dataflow jobs list --region ${REGION} --filter="NAME:test-vision-analytics AND STATE:Running" --format="get(JOB_ID)")
Bagian berikut berisi lebih banyak contoh kueri yang menganalisis berbagai fitur gambar dari gambar.
Menganalisis set data Flickr30K
Di bagian ini, Anda akan mendeteksi label dan tempat terkenal di publik Set data gambar Flickr30k yang dihosting di Kaggle.
Di Cloud Shell, ubah pipeline Dataflow sehingga bisa dioptimalkan untuk set data besar. Untuk memungkinkan akses yang lebih tinggi throughput transaksi yang tinggi, serta meningkatkan
batchSize
dankeyRange
nilai. Dataflow menskalakan jumlah worker sebagai diperlukan:./gradlew run --args=" \ --runner=DataflowRunner \ --jobName=vision-analytics-flickr \ --streaming \ --enableStreamingEngine \ --diskSizeGb=30 \ --autoscalingAlgorithm=THROUGHPUT_BASED \ --maxNumWorkers=5 \ --project=${PROJECT} \ --region=${REGION} \ --subscriberId=projects/${PROJECT}/subscriptions/${GCS_NOTIFICATION_SUBSCRIPTION} \ --visionApiProjectId=${PROJECT} \ --features=LABEL_DETECTION,LANDMARK_DETECTION \ --datasetName=${BIGQUERY_DATASET} \ --batchSize=16 \ --keyRange=5"
Karena set data berukuran besar, Anda tidak dapat menggunakan Cloud Shell untuk mengambil gambar dari Kaggle dan mengirimkannya ke {i>Cloud Storage<i} direktori VM dengan bucket. Anda harus menggunakan VM dengan ukuran disk yang lebih besar untuk melakukannya.
Untuk mengambil gambar berbasis Kaggle dan mengirimkannya ke bucket Cloud Storage, ikuti petunjuk dalam Menyimulasikan gambar yang diupload ke bucket penyimpanan di repositori GitHub.
Untuk mengamati kemajuan proses penyalinan dengan melihat yang tersedia di UI Dataflow, buka Tugas Dataflow lalu pilih pipeline
vision-analytics-flickr
. Pelanggan penghitung akan berubah secara berkala hingga Dataflow pipeline memproses semua file.Outputnya mirip dengan screenshot Penghitung Kustom berikut . Salah satu {i>file<i} dalam {i>dataset<i} memiliki jenis yang salah, dan penghitung
rejectedFiles
mencerminkan hal tersebut. Ini nilai penghitung adalah perkiraan. Anda mungkin melihat jumlah yang lebih tinggi. Selain itu, kemungkinan besar jumlah anotasi akan berubah karena peningkatan akurasi pemrosesan oleh Vision API.Untuk menentukan apakah Anda mendekati atau melebihi batas ketersediaan lihat halaman kuota Vision API.
Dalam contoh ini, pipeline Dataflow hanya menggunakan sekitar 50% dari kuotanya. Berdasarkan persentase kuota yang Anda gunakan, Anda dapat memutuskan untuk meningkatkan paralelisme pipeline dengan meningkatkan nilai dari parameter
keyRange
.Menghentikan pipeline:
gcloud dataflow jobs list --region $REGION --filter="NAME:vision-analytics-flickr AND STATE:Running" --format="get(JOB_ID)"
Menganalisis anotasi di BigQuery
Dalam deployment ini, Anda telah memproses lebih dari 30.000 gambar untuk label dan anotasi {i>landmark<i}. Di bagian ini, Anda mengumpulkan statistik tentang file tersebut. Anda dapat menjalankan kueri ini di GoogleSQL untuk Workspace BigQuery atau Anda dapat menggunakan alat command line bq.
Perhatikan bahwa angka yang Anda lihat dapat berbeda dari contoh hasil kueri dalam deployment ini. Vision API terus meningkatkan akurasi analisisnya; analisis data dapat menghasilkan hasil yang lebih kaya dengan menganalisis gambar yang sama setelah Anda menguji solusinya.
Di Konsol Google Cloud, buka BigQuery Halaman Query editor dan jalankan perintah berikut untuk melihat 20 kueri teratas label dalam {i>dataset<i}:
SELECT description, count(*)ascount \ FROM vision_analytics.label_annotation GROUP BY description ORDER BY count DESC LIMIT 20
Outputnya mirip dengan hal berikut ini:
+------------------+-------+ | description | count | +------------------+-------+ | Leisure | 7663 | | Plant | 6858 | | Event | 6044 | | Sky | 6016 | | Tree | 5610 | | Fun | 5008 | | Grass | 4279 | | Recreation | 4176 | | Shorts | 3765 | | Happy | 3494 | | Wheel | 3372 | | Tire | 3371 | | Water | 3344 | | Vehicle | 3068 | | People in nature | 2962 | | Gesture | 2909 | | Sports equipment | 2861 | | Building | 2824 | | T-shirt | 2728 | | Wood | 2606 | +------------------+-------+
Menentukan label lain mana yang ada pada gambar dengan label, diberi peringkat menurut frekuensi:
DECLARE label STRING DEFAULT 'Plucked string instruments'; WITH other_labels AS ( SELECT description, COUNT(*) count FROM vision_analytics.label_annotation WHERE gcs_uri IN ( SELECT gcs_uri FROM vision_analytics.label_annotation WHERE description = label ) AND description != label GROUP BY description) SELECT description, count, RANK() OVER (ORDER BY count DESC) rank FROM other_labels ORDER BY rank LIMIT 20;
Outputnya adalah sebagai berikut. Untuk label Instrumen string yang dipetik yang digunakan dalam perintah sebelumnya, Anda akan melihat:
+------------------------------+-------+------+ | description | count | rank | +------------------------------+-------+------+ | String instrument | 397 | 1 | | Musical instrument | 236 | 2 | | Musician | 207 | 3 | | Guitar | 168 | 4 | | Guitar accessory | 135 | 5 | | String instrument accessory | 99 | 6 | | Music | 88 | 7 | | Musical instrument accessory | 72 | 8 | | Guitarist | 72 | 8 | | Microphone | 52 | 10 | | Folk instrument | 44 | 11 | | Violin family | 28 | 12 | | Hat | 23 | 13 | | Entertainment | 22 | 14 | | Band plays | 21 | 15 | | Jeans | 17 | 16 | | Plant | 16 | 17 | | Public address system | 16 | 17 | | Artist | 16 | 17 | | Leisure | 14 | 20 | +------------------------------+-------+------+
Lihat 10 tempat terkenal yang terdeteksi:
SELECT description, COUNT(description) AS count FROM vision_analytics.landmark_annotation GROUP BY description ORDER BY count DESC LIMIT 10
Outputnya adalah sebagai berikut:
+--------------------+-------+ | description | count | +--------------------+-------+ | Times Square | 55 | | Rockefeller Center | 21 | | St. Mark's Square | 16 | | Bryant Park | 13 | | Millennium Park | 13 | | Ponte Vecchio | 13 | | Tuileries Garden | 13 | | Central Park | 12 | | Starbucks | 12 | | National Mall | 11 | +--------------------+-------+
Tentukan gambar yang kemungkinan besar berisi waterfall:
SELECT SPLIT(gcs_uri, '/')[OFFSET(3)] file_name, description, score FROM vision_analytics.landmark_annotation WHERE LOWER(description) LIKE '%fall%' ORDER BY score DESC LIMIT 10
Outputnya adalah sebagai berikut:
+----------------+----------------------------+-----------+ | file_name | description | score | +----------------+----------------------------+-----------+ | 895502702.jpg | Waterfall Carispaccha | 0.6181358 | | 3639105305.jpg | Sahalie Falls Viewpoint | 0.44379658 | | 3672309620.jpg | Gullfoss Falls | 0.41680416 | | 2452686995.jpg | Wahclella Falls | 0.39005348 | | 2452686995.jpg | Wahclella Falls | 0.3792498 | | 3484649669.jpg | Kodiveri Waterfalls | 0.35024035 | | 539801139.jpg | Mallela Thirtham Waterfall | 0.29260656 | | 3639105305.jpg | Sahalie Falls | 0.2807213 | | 3050114829.jpg | Kawasan Falls | 0.27511594 | | 4707103760.jpg | Niagara Falls | 0.18691841 | +----------------+----------------------------+-----------+
Temukan gambar bangunan terkenal dalam jarak 3 kilometer dari Colosseum di Roma (fungsi
ST_GEOPOINT
menggunakan bujur dan lintang Colosseum):WITH landmarksWithDistances AS ( SELECT gcs_uri, description, location, ST_DISTANCE(location, ST_GEOGPOINT(12.492231, 41.890222)) distance_in_meters, FROM `vision_analytics.landmark_annotation` landmarks CROSS JOIN UNNEST(landmarks.locations) AS location ) SELECT SPLIT(gcs_uri,"/")[OFFSET(3)] file, description, ROUND(distance_in_meters) distance_in_meters, location, CONCAT("https://storage.cloud.google.com/", SUBSTR(gcs_uri, 6)) AS image_url FROM landmarksWithDistances WHERE distance_in_meters < 3000 ORDER BY distance_in_meters LIMIT 100
Saat Anda menjalankan kueri, Anda akan melihat bahwa ada beberapa gambar dari Colosseum, tetapi juga gambar Arch Of Constantine, Bukit Palatine, dan sejumlah tempat lain yang sering difoto.
Anda dapat memvisualisasikan data ini dengan Geo Viz BigQuery dengan menempelkan kueri sebelumnya. Pilih titik di peta untuk melihatnya detailnya. Atribut
Image_url
berisi link ke file gambar.
Satu catatan tentang hasil kueri. Informasi lokasi biasanya
tersedia untuk
{i>landmark.<i} Gambar yang sama dapat berisi beberapa lokasi untuk landmark yang sama.
Fungsi ini dijelaskan dalam
AnnotateImageResponse
.
Karena satu lokasi dapat menunjukkan lokasi adegan dalam gambar,
lebih dari satu
LocationInfo
elemen yang dapat digunakan. Lokasi lain dapat menunjukkan tempat
gambar diambil.
Pembersihan
Agar tidak menimbulkan biaya ke akun Google Cloud Anda untuk resource yang digunakan dalam panduan ini, hapus project yang berisi resource, atau mempertahankan proyek dan menghapus sumber daya individu.
Menghapus project Google Cloud
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project Google Cloud yang Anda buat untuk tutorial.
- Di konsol Google Cloud, buka halaman Manage resource.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Jika Anda memutuskan untuk menghapus fasilitas satu per satu, ikuti langkah-langkah di Pembersihan repositori GitHub.
Langkah selanjutnya
- Untuk mengetahui lebih banyak tentang arsitektur referensi, diagram, dan praktik terbaik lainnya, jelajahi Pusat Arsitektur Cloud.
Kontributor
Penulis:
- Masud Hasan | Site Reliability Engineering Manager
- Sergei Lilichenko | Arsitek Solusi
- Lakshmanan Sethu | Manajer Akun Teknis
Kontributor lainnya:
- Jiyeon Kang | Teknisi Pelanggan
- Sunil Kumar Jang Bahadur | Teknisi Pelanggan