הרצת הסקה על טבלאות של אובייקטים בתמונות
במאמר הזה מוסבר איך להשתמש ב-BigQuery ML כדי להריץ הסקות על טבלאות אובייקטים של תמונות.
כדי להריץ הסקה על נתוני תמונות, אפשר להשתמש בטבלת אובייקטים כקלט של הפונקציה ML.PREDICT.
כדי לעשות את זה, קודם צריך לבחור מודל מתאים, להעלות אותו ל-Cloud Storage ולייבא אותו ל-BigQuery על ידי הפעלת ההצהרה CREATE MODEL.
אתם יכולים ליצור מודל משלכם או להוריד מודל מ-TensorFlow Hub.
מגבלות
- אפשר להשתמש במודלים מיובאים של BigQuery ML עם טבלאות אובייקטים רק כשמשתמשים בתמחור מבוסס-קיבולת באמצעות הזמנות. תמחור על פי דרישה לא נתמך.
- קובצי התמונות שמשויכים לטבלת האובייקטים צריכים לעמוד בדרישות הבאות:
- הגודל שלהם קטן מ-20MB.
- להיות בפורמט JPEG, PNG או BMP.
- הגודל הכולל של קובצי התמונות שמשויכים לטבלת האובייקטים צריך להיות פחות מ-1TB.
- כדי לשפר את הביצועים של הרישום והשאילתות, ציינו עד 10 מזהי URI של מקורות באפשרות
urisשל טבלת האובייקטים. אם תציינו יותר מ-10 מזהי URI של קטגוריות, המספר הכולל של הקבצים שבהם טבלת האובייקטים יכולה לתמוך יקטן, ושאילתות עלולות להיכשל עם שגיאת זיכרוןResources exceeded during query executionכשמציגים מספר גדול של קבצים. אם אתם צריכים להפנות ליותר מ-10 קטגוריות, פצלו אותן לכמה טבלאות אובייקטים. המודל צריך להיות אחד מהבאים:
- מודל TensorFlow או TensorFlow Lite בפורמט SavedModel.
- מודל PyTorch בפורמט ONNX.
המודל צריך לעמוד בדרישות ובמגבלות הקלט שמתוארות בהצהרה של
CREATE MODELלגבי ייבוא מודלים של TensorFlow.גודל המודל אחרי סריאליזציה צריך להיות קטן מ-450MB.
הגודל של המודל אחרי ביטול ההמרה לסדרה (בזיכרון) צריך להיות קטן מ-1,000MB.
טנזור הקלט של המודל צריך לעמוד בקריטריונים הבאים:
- סוג הנתונים צריך להיות
tf.float32עם ערכים ב-[0, 1)או סוג הנתונים צריך להיותtf.uint8עם ערכים ב-[0, 255). - הן בצורה
[batch_size, width, height, 3], כאשר:- הערך של
batch_sizeצריך להיות-1,Noneאו1. - הערכים של
widthו-heightחייבים להיות גדולים מ-0.
- הערך של
- סוג הנתונים צריך להיות
המודל צריך להיות מאומן עם תמונות באחד ממרחבי הצבעים הבאים:
RGBHSVYIQYUVGRAYSCALE
אתם יכולים להשתמש בפונקציה
ML.CONVERT_COLOR_SPACEכדי להמיר את תמונות הקלט למרחב הצבעים שבו המודל אומן.
מודלים לדוגמה
המודלים הבאים ב-TensorFlow Hub פועלים עם BigQuery ML ועם טבלאות אובייקטים של תמונות:
- ResNet 50. כדי לנסות להשתמש במודל הזה, עיינו במדריך הפעלת הסקה בטבלת אובייקטים באמצעות מודל סיווג.
- MobileNet V3. כדי לנסות להשתמש במודל הזה, ראו מדריך: הרצת הסקה בטבלת אובייקטים באמצעות מודל וקטור תכונות.
ההרשאות הנדרשות
- כדי להעלות את המודל ל-Cloud Storage, צריך את ההרשאות
storage.objects.createו-storage.objects.get. כדי לטעון את המודל ל-BigQuery ML, אתם צריכים את ההרשאות הבאות:
bigquery.jobs.createbigquery.models.createbigquery.models.getDatabigquery.models.updateData
כדי להריץ הסקה, צריך את ההרשאות הבאות:
-
bigquery.tables.getDataבטבלת האובייקטים -
bigquery.models.getDataבמודל bigquery.jobs.create
-
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the BigQuery and BigQuery Connection API APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the BigQuery and BigQuery Connection API APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.
העלאת מודל ל-Cloud Storage
כדי להעלות מודל:
- אם יצרתם מודל משלכם, שמרו אותו באופן מקומי. אם אתם משתמשים במודל מ-TensorFlow Hub, הורידו אותו למכונה המקומית. אם אתם משתמשים ב-TensorFlow, אתם אמורים לקבל קובץ
saved_model.pbותיקייתvariablesלמודל. - אם צריך, יוצרים קטגוריה של Cloud Storage.
- מעלים את פריטי המידע שנוצרו במודל לקטגוריה.
טעינת המודל ל-BigQuery ML
טעינת מודל שעובד עם טבלאות של אובייקטים של תמונות זהה לטעינת מודל שעובד עם נתונים מובְנים. כדי לטעון מודל ל-BigQuery ML:
CREATE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME` OPTIONS( model_type = 'MODEL_TYPE', model_path = 'BUCKET_PATH');
מחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט.-
DATASET_ID: המזהה של קבוצת הנתונים שתכיל את המודל. -
MODEL_NAME: שם המודל. -
MODEL_TYPE: משתמשים באחד מהערכים הבאים:-
TENSORFLOWלמודל TensorFlow -
ONNXלמודל PyTorch בפורמט ONNX
-
-
BUCKET_PATH: הנתיב לקטגוריה של Cloud Storage שמכילה את המודל, בפורמט[gs://bucket_name/[folder_name/]*].
בדוגמה הבאה נעשה שימוש בפרויקט ברירת המחדל, ונטען מודל TensorFlow ל-BigQuery ML בתור my_vision_model, באמצעות הקובץ saved_model.pb והתיקייה variables מ-gs://my_bucket/my_model_folder:
CREATE MODEL `my_dataset.my_vision_model` OPTIONS( model_type = 'TENSORFLOW', model_path = 'gs://my_bucket/my_model_folder/*');
בדיקת המודל
אתם יכולים לבדוק את המודל שהועלה כדי לראות מהם שדות הקלט והפלט שלו. צריך להפנות לשדות האלה כשמריצים את ההסקה בטבלת האובייקטים.
כדי לבדוק מודל:
נכנסים לדף BigQuery.
בחלונית השמאלית, לוחצים על Explorer:

אם החלונית הימנית לא מוצגת, לוחצים על הרחבת החלונית הימנית כדי לפתוח אותה.
בחלונית Explorer, מרחיבים את הפרויקט ולוחצים על Datasets.
לוחצים על מערך הנתונים שמכיל את המודל.
לוחצים על הכרטיסייה Models.
בחלונית המודל שנפתחת, לוחצים על הכרטיסייה Schema.
מעיינים בקטע תוויות. השדות האלה מזהים את הפלט של המודל.
מעיינים בקטע תכונות. כאן מצוינים השדות שצריך להזין במודל. מפנים אליהם בהצהרה
SELECTשל הפונקציהML.DECODE_IMAGE.
כדי לבדוק מודל TensorFlow בצורה מפורטת יותר, למשל כדי לקבוע את צורת הקלט של המודל, מתקינים את TensorFlow ומשתמשים בפקודה saved_model_cli show.
עיבוד מקדים של תמונות
כדי להמיר בייטים של תמונה לייצוג ARRAY רב-ממדי, צריך להשתמש בפונקציה ML.DECODE_IMAGE. אפשר להשתמש בפלט של ML.DECODE_IMAGE ישירות בפונקציה ML.PREDICT, או לכתוב את התוצאות של ML.DECODE_IMAGE בעמודה בטבלה ולהפנות לעמודה הזו כשקוראים לפונקציה ML.PREDICT.
בדוגמה הבאה, הפלט של הפונקציה ML.DECODE_IMAGE נכתב לטבלה:
CREATE OR REPLACE TABLE mydataset.mytable AS ( SELECT ML.DECODE_IMAGE(data) AS decoded_image FROM mydataset.object_table );
כדי לעבד את התמונות כך שיתאימו למודל, אפשר להשתמש בפונקציות הבאות:
- הפונקציה
ML.CONVERT_COLOR_SPACEממירה תמונות עם מרחב צבעיםRGBלמרחב צבעים אחר. - הפונקציה
ML.CONVERT_IMAGE_TYPEממירה את ערכי הפיקסלים שמוחזרים על ידי הפונקציהML.DECODE_IMAGEממספרים בנקודה צפה למספרים שלמים בטווח של[0, 255). - הפונקציה
ML.RESIZE_IMAGEמשנה את הגודל של תמונות.
אפשר להשתמש בהן כחלק מהפונקציה ML.PREDICT, או להריץ אותן על עמודה בטבלה שמכילה פלט של נתוני תמונה מ-ML.DECODE_IMAGE.
הרצת הסקה
אחרי שטוענים מודל מתאים, ואחרי שמעבדים מראש את נתוני התמונה (אם רוצים), אפשר להריץ הסקה על נתוני התמונה.
כדי להריץ הסקה:
SELECT * FROM ML.PREDICT( MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`, (SELECT [other columns from the object table,] IMAGE_DATA AS MODEL_INPUT FROM PROJECT_ID.DATASET_ID.TABLE_NAME) );
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט שמכיל את המודל ואת טבלת האובייקטים. -
DATASET_ID: המזהה של מערך הנתונים שמכיל את המודל ואת טבלת האובייקטים. -
MODEL_NAME: שם המודל. -
IMAGE_DATA: נתוני התמונה, שמיוצגים על ידי הפלט של הפונקציהML.DECODE_IMAGEאו על ידי עמודה בטבלה שמכילה פלט של נתוני תמונה שלML.DECODE_IMAGEאו פונקציות אחרות לעיבוד תמונות. -
MODEL_INPUT: השם של שדה להזנת קלט במודל. כדי למצוא את המידע הזה, צריך לבדוק את המודל ולעיין בשמות השדות בקטע Features. -
TABLE_NAME: השם של טבלת האובייקטים.
דוגמאות
דוגמה 1
בדוגמה הבאה משתמשים בפונקציה ML.DECODE_IMAGE ישירות בפונקציה ML.PREDICT. היא מחזירה את תוצאות ההסקה לכל התמונות בטבלת האובייקטים, למודל עם שדה להזנת קלט input ושדה פלט feature:
SELECT * FROM ML.PREDICT( MODEL `my_dataset.vision_model`, (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 480, 480, FALSE) AS input FROM `my_dataset.object_table`) );
דוגמה 2
בדוגמה הבאה, הפונקציה ML.DECODE_IMAGE משמשת ישירות בפונקציה ML.PREDICT, והפונקציה ML.CONVERT_COLOR_SPACE משמשת בפונקציה ML.PREDICT כדי להמיר את מרחב הצבעים של התמונה מ-RBG ל-YIQ. בנוסף, מוסבר איך להשתמש בשדות של טבלת האובייקטים כדי לסנן את האובייקטים שנכללים בהסקה.
היא מחזירה את תוצאות ההסקה לכל תמונות ה-JPG בטבלת האובייקטים, למודל עם שדה קלט input ושדה פלט feature:
SELECT * FROM ML.PREDICT( MODEL `my_dataset.vision_model`, (SELECT uri, ML.CONVERT_COLOR_SPACE(ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 280, TRUE), 'YIQ') AS input FROM `my_dataset.object_table` WHERE content_type = 'image/jpeg') );
דוגמה 3
בדוגמה הבאה השתמשנו בתוצאות מ-ML.DECODE_IMAGE שנכתבו לעמודה בטבלה, אבל לא עברו עיבוד נוסף. היא משתמשת ב-ML.RESIZE_IMAGE וב-ML.CONVERT_IMAGE_TYPE בפונקציה ML.PREDICT כדי לעבד את נתוני התמונה. היא מחזירה את תוצאות ההסקה לכל התמונות בטבלת התמונות המפוענחות, למודל עם שדה להזנת קלט של input ושדה פלט של feature.
יוצרים את טבלת התמונות המפוענחות:
CREATE OR REPLACE TABLE `my_dataset.decoded_images` AS (SELECT ML.DECODE_IMAGE(data) AS decoded_image FROM `my_dataset.object_table`);
מריצים הסקה על טבלת התמונות המפוענחות:
SELECT * FROM ML.PREDICT( MODEL`my_dataset.vision_model`, (SELECT uri, ML.CONVERT_IMAGE_TYPE(ML.RESIZE_IMAGE(decoded_image, 480, 480, FALSE)) AS input FROM `my_dataset.decoded_images`) );
דוגמה 4
בדוגמה הבאה נעשה שימוש בתוצאות מ-ML.DECODE_IMAGE שנכתבו לעמודה בטבלה ועברו עיבוד מראש באמצעות ML.RESIZE_IMAGE. היא מחזירה את תוצאות ההסקה לכל התמונות בטבלת התמונות המפוענחות, למודל עם שדה להזנת קלט של input ושדה פלט של feature.
יוצרים את הטבלה:
CREATE OR REPLACE TABLE `my_dataset.decoded_images` AS (SELECT ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data) 480, 480, FALSE) AS decoded_image FROM `my_dataset.object_table`);
מריצים הסקה על טבלת התמונות המפוענחות:
SELECT * FROM ML.PREDICT( MODEL `my_dataset.vision_model`, (SELECT uri, decoded_image AS input FROM `my_dataset.decoded_images`) );
דוגמה 5
בדוגמה הבאה משתמשים בפונקציה ML.DECODE_IMAGE ישירות בפונקציה ML.PREDICT. בדוגמה הזו, למודל יש שדה פלט אחד (embeddings) ושני שדות להזנת קלט: אחד שמצפה לתמונה (f_img) ואחד שמצפה למחרוזת (f_txt). קלט התמונה מגיע מטבלת האובייקטים וקלט המחרוזת מגיע מטבלה רגילה ב-BigQuery, שמחוברת לטבלת האובייקטים באמצעות העמודה uri.
SELECT * FROM ML.PREDICT( MODEL `my_dataset.mixed_model`, (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(my_dataset.my_object_table.data), 224, 224, FALSE) AS f_img, my_dataset.image_description.description AS f_txt FROM `my_dataset.object_table` JOIN `my_dataset.image_description` ON object_table.uri = image_description.uri) );
המאמרים הבאים
- איך מנתחים טבלאות אובייקטים באמצעות פונקציות מרוחקות
- נסו להריץ הסקה על טבלת אובייקטים באמצעות מודל וקטור תכונות.
- נסו להריץ הסקה על טבלת אובייקטים באמצעות מודל סיווג.
- איך מנתחים טבלת אובייקטים באמצעות פונקציה מרוחקת
- נסו להוסיף הערות לתמונה באמצעות הפונקציה
ML.ANNOTATE_IMAGE.