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

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

  • המודל צריך לעמוד בדרישות ובמגבלות הקלט שמתוארות בהצהרה של 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. נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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.enable permission. 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.

    Enable the APIs

  5. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. 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.enable permission. 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.

    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. בחלונית השמאלית, לוחצים על Explorer:

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

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

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

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

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

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

  7. מעיינים בקטע תוויות. השדות האלה מזהים את הפלט של המודל.

  8. מעיינים בקטע תכונות. כאן מצוינים השדות שצריך להזין במודל. מפנים אליהם בהצהרה 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.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)
  );

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