הרצת הסקה על טבלאות של אובייקטים בתמונות

במסמך הזה מוסבר איך להשתמש ב-BigQuery ML כדי להריץ הסקה על טבלאות של אובייקטים בתמונות.

אפשר להריץ הסקה על נתוני תמונות באמצעות טבלת אובייקטים כקלט לפונקציה ML.PREDICT.

כדי לעשות את זה, קודם צריך לבחור מודל מתאים, להעלות אותו ל-Cloud Storage ולייבא אותו ל-BigQuery על ידי הפעלת ההצהרה CREATE MODEL. אתם יכולים ליצור מודל משלכם או להוריד מודל מ-TensorFlow Hub.

מגבלות

  • השימוש ב-BigQuery ML במודלים מיובאים עם טבלאות אובייקטים נתמך רק כשמשתמשים בתמחור לפי קיבולת באמצעות הזמנות. תמחור לפי דרישה לא נתמך.
  • קבצי התמונות שמשויכים לטבלת האובייקטים צריכים לעמוד בדרישות הבאות:
    • קטנים מ-20MB.
    • פורמט JPEG, ‏ PNG או BMP.
  • הגודל הכולל של קובצי התמונות שמשויכים לטבלת האובייקטים צריך להיות קטן מ-1TB.
  • המודל חייב להיות אחד מהבאים:

  • המודל צריך לעמוד בדרישות ובמגבלות הקלט שמתוארות בהצהרה בנושא 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.
  • המודל צריך להיות מאומן עם תמונות באחד ממרחבי הצבעים הבאים:

    • RGB
    • HSV
    • YIQ
    • YUV
    • GRAYSCALE

    אתם יכולים להשתמש בפונקציה ML.CONVERT_COLOR_SPACE כדי להמיר תמונות קלט למרחב הצבעים שבו המודל אומן.

דוגמאות למודלים

המודלים הבאים ב-TensorFlow Hub פועלים עם BigQuery ML ועם טבלאות של אובייקטים של תמונות:

ההרשאות הנדרשות

  • כדי להעלות את המודל ל-Cloud Storage, צריך את ההרשאות storage.objects.create ו-storage.objects.get.
  • כדי לטעון את המודל ל-BigQuery ML, אתם צריכים את ההרשאות הבאות:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • כדי להריץ הסקה, אתם צריכים את ההרשאות הבאות:

    • bigquery.tables.getData בטבלת האובייקטים
    • bigquery.models.getData במודל
    • bigquery.jobs.create

לפני שמתחילים

  1. In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Cloud de Confiance project.

  3. Enable the BigQuery and BigQuery Connection API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

העלאת מודל ל-Cloud Storage

כדי להעלות מודל:

  1. אם יצרתם מודל משלכם, שמרו אותו באופן מקומי. אם אתם משתמשים במודל מ-TensorFlow Hub, אתם צריכים להוריד אותו למחשב המקומי. אם אתם משתמשים ב-TensorFlow, אמור להתקבל קובץ saved_model.pb ותיקייה variables של המודל.
  2. במידת הצורך, יוצרים קטגוריה של Cloud Storage.
  3. מעלים את הארטיפקטים של המודל לקטגוריה.

טעינת המודל ל-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/*');

בדיקת המודל

אפשר לבדוק את המודל שהועלה כדי לראות מהם שדות הקלט והפלט שלו. צריך להפנות לשדות האלה כשמריצים הסקה בטבלת האובייקטים.

כדי לבדוק מודל:

  1. עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית הימנית, לוחצים על כלי הניתוחים:

    כפתור מודגש לחלונית הסייר.

    אם החלונית הימנית לא מוצגת, לוחצים על הרחבת החלונית הימנית כדי לפתוח אותה.

  3. בחלונית Explorer, מרחיבים את הפרויקט ולוחצים על Datasets (מערכי נתונים).

  4. לוחצים על מערך הנתונים שמכיל את המודל.

  5. לוחצים על הכרטיסייה מודלים.

  6. בחלונית המודל שנפתחת, לוחצים על הכרטיסייה סכימה.

  7. בודקים את הקטע Labels (תוויות). כאן מציינים את השדות שהמודל מוציא כפלט.

  8. מעיינים בקטע תכונות. כך מזהים את השדות שצריך להזין במודל. מפנים אליהם בהצהרה SELECT של הפונקציה ML.DECODE_IMAGE.

כדי לבדוק מודל TensorFlow בצורה מפורטת יותר, למשל כדי לקבוע את הצורה של קלט המודל, צריך להתקין את TensorFlow ולהשתמש בפקודה saved_model_cli show.

עיבוד מקדים של תמונות

חובה להשתמש בפונקציה ML.DECODE_IMAGE כדי להמיר בייטים של תמונה לייצוג רב-ממדי של ARRAY. אפשר להשתמש בפלט של 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.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: השם של שדה להזנת קלט למודל. כדי למצוא את המידע הזה, אפשר לבדוק את המודל ולעיין בשמות השדות בקטע תכונות.
  • 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.PREDICT משתמשת ב-ML.RESIZE_IMAGE וב-ML.CONVERT_IMAGE_TYPE כדי לעבד את נתוני התמונה. הפונקציה מחזירה את תוצאות ההסקה של כל התמונות בטבלה decoded images, עבור מודל עם שדה להזנת קלט של 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. הפונקציה מחזירה את תוצאות ההסקה של כל התמונות בטבלה decoded images, עבור מודל עם שדה להזנת קלט של 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)
  );

המאמרים הבאים