סיווג נתוני תמונות באמצעות BigQuery ML

1. מבוא

בשיעור ה-Codelab הזה נדון בתרחיש לדוגמה של אחסון וניתוח תמונות של תנוחות יוגה ב-BigQuery והטמעה של מודל סיווג באמצעות BigQuery ML כדי לתייג את התנוחות באמצעות מבני SQL בלבד ולא צורה אחרת של קוד.

BigQuery ו-BQML

BigQuery הוא מחסן נתונים (data warehouse) ללא שרת (serverless), שיכול להתאים לעומס (scaling) מבייטים עד פטה-בייט, ללא תקורה תפעולית. אז זאת בחירה מצוינת לאחסון נתונים לאימון של למידת מכונה. נוסף על כך, היכולות המובנות של למידת מכונה ב-BigQuery ( BQML) וניתוח נתונים מאפשרות ליצור חיזויים ללא צורך בכתיבת קוד באמצעות שאילתות SQL בלבד. אפשר גם לגשת לנתונים ממקורות חיצוניים באמצעות שאילתות מאוחדות, ללא צורך בצינורות עיבוד נתונים מורכבים (ETL). כדי לקרוא מידע נוסף על כל מה שיש ל-BigQuery להציע, אפשר לעיין בדף של BigQuery.

עד עכשיו, אנחנו מכירים את BigQuery כמחסן נתונים מנוהל בענן, שעוזר למשתמשים לנתח נתונים מובנים ומובנים למחצה. אבל,

  • הרחבנו את השימוש ב-BigQuery לביצוע כל ניתוח הנתונים ולמידת המכונה גם על נתונים לא מובנים
  • אנחנו יכולים להשתמש בשאילתות SQL כדי לבצע ניתוח מעמיק של תמונות, סרטונים, אודיו ולמידת מכונה בקנה מידה נרחב, בלי לכתוב קוד נוסף.
  • יש לנו את היכולת לשלב נתונים מובנים ונתונים לא מובנים, כאילו כולם מתקיימים יחד בטבלה

נדון בהם בתרחיש לדוגמה שלנו לסיווג תנוחת יוגה, שמפורט בקטע הבא.

סיווג נתוני תמונות באמצעות BigQuery ML

הראשונה היא היכולת לעבד ולנתח תמונות באמצעות שאילתות מובנות, כאילו היו נתונים מובְנים. עכשיו אנחנו יכולים אפילו לחזות את התוצאות באמצעות מודלים של סיווג של למידת מכונה באמצעות BigQuery ML. צמצמתי את השלבים שקשורים ל-5 שלבים כדי שיהיה קל להבין אותם:

fe97945bce996e1.jpeg

השלבים שלמעלה עשויים להיות מורכבים אם מסתכלים עליהם רק כתוויות. הפרטים של כל אחד מהרכיבים המעורבים, כמו מערך נתונים של BigQuery, חיבור BigLake, קטגוריות של Cloud Storage (קונטיינרים), טבלת אובייקטים (מקור נתונים חיצוני), BQML וכו' מוגדרים בקטע ההטמעה. לכן, אם אתם עדיין לא מכירים את התנאים האלה, מומלץ לא להתייאש.

מה תפַתחו

יוצרים מודל לסיווג נתוני תמונות באמצעות BQML ומכסה את הנושאים הבאים:

  • מערך נתונים ב-BigQuery שיכיל את רכיבי הטבלה והמודל
  • הקטגוריה של Google Cloud Storage (GCS) לאחסון תמונות יוגה עבור המודל.
  • טבלה חיצונית לגישה לתמונות של Cloud Storage
  • חיבור BigLake לטבלה החיצונית כדי לגשת לתמונות ב-GCS
  • מודל ResNet בלמידת מכונה של BigQuery
  • הסקת מסקנות באמצעות המודל שנוצר
  • BigQuery SQL לניתוח נתוני תמונות
  • BigQuery SQL כדי להריץ שאילתות על הנתונים המובְנים והבלתי מובנים ביחד

מה תלמדו

  • איך יוצרים קטגוריה של Cloud Storage ומאחסנים תמונות
  • איך יוצרים מערך נתונים, טבלה וחיבור ב-BigQuery
  • איך יוצרים מודל לסיווג נתוני תמונה באמצעות BQML
  • איך לבצע חיזוי באמצעות המודל שנוצר באמצעות BigQuery ML
  • איך שולחים שאילתות על תמונות ומשלבים אותן עם נתונים מובְנים באמצעות BigQuery SQL

2. דרישות

  • דפדפן כמו Chrome או Firefox
  • פרויקט ב-Google Cloud שמופעל בו חיוב ושמכיל את שירותי BigQuery, Cloud Storage ו-BigLake Connection
  • הקטע הבא כולל רשימת שלבים ליצירת האפליקציה לסיווג נתוני תמונות

3. יצירת מערך נתונים וחיבור BigLake

לצורך זיהוי תמונות של 5 תנוחות יוגה, השתמשתי במערך נתונים שזמין לציבור וניתן לגשת למערך הנתונים מהמאגר הזה. תנוחות היוגה שאנחנו מזהים מוגבלות לתנוחות דאון-דוג, אלת, פלאנק, עץ ולוחם 2. לפני שמתחילים ביצירת מערך הנתונים ב-BigQuery, חשוב לבחור או ליצור פרויקט ב-Google Cloud ולבדוק אם האפשרות חיוב מופעלת בפרויקט. מפעילים את BigQuery API ואת BigQuery Connection API. חשוב לשים לב שכל השירותים שבהם נעשה שימוש בהטמעה הזו צריכים להיות באותו אזור לפי בחירה.

א. יוצרים את מערך הנתונים yoga_set. לפי השלבים הבאים:

נכנסים ל-BigQuery Editor ומקלידים את הפקודה:

CREATE SCHEMA `<<project_id>>.yoga_set`;

ב. BigLake Connection מאפשר לנו לחבר את מקור הנתונים החיצוני תוך שמירה על אבטחה ובקרת גישה פרטניות ל-BigQuery, שבמקרה שלנו הוא Cloud Storage של נתוני התמונה. נשתמש בחיבור הזה כדי לקרוא אובייקטים מ-Cloud Storage. כדי ליצור חיבור BigLake, צריך לבצע את השלבים הבאים.

לוחצים על ADD DATA בחלונית Explorer שבדף BigQuery:

4cb42b1245bb0ba6.png"הוספת נתונים חיצוניים" ל-BigQuery מסך

לוחצים על חיבורים למקורות נתונים חיצוניים ובוחרים באפשרות BigLake ופונקציות מרוחקות:

9ffec2b2bfcc3cd5.pngהגדרת חיבור של מקור נתונים חיצוני

צריך לספק מזהה חיבור וליצור את החיבור. חשוב לרשום את מזהה חשבון השירות שיוצג במסך לאחר יצירת החיבור <<SERVICE_ACCOUNT>>. בדוגמה שלנו, מזהה החיבור הוא "yoga-pose-conn". חשוב לזכור את האזור.

4. יצירת קטגוריה של Google Cloud Storage והענקת הרשאות

אנחנו נשתמש בקטגוריה של Google Cloud Storage כדי להכיל את קובצי התמונות של תנוחות היוגה שבהן אנחנו רוצים ליצור את המודל. קטגוריות הן קונטיינרים של Cloud Storage שמכילים את התמונות שאנחנו עומדים לנתח.

א. נכנסים ל-Google Cloud Storage באמצעות חיפוש במסוף ואז לוחצים על Buckets כדי להגיע לדף הבית של Buckets ולוחצים על CREATE

a6f6b26cffb53ae0.pngדף הקטגוריות של Google Cloud Storage

ב. בדף Create a bucket (יצירת קטגוריה), מזינים את פרטי הקטגוריה (שם ייחודי) וממשיכים, מוודאים שהם נמצאים באותו אזור כמו מערך הנתונים והחיבור שצוין בשלבים שלמעלה, ולוחצים על 'יצירה'.

1280366a42b7bdf6.pngדף יצירת קטגוריה ב-Google Cloud Storage

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

ג. אחרי יצירת הקטגוריה, מאחסנים את התמונות (באמצעות פקודות מסוף או Cloud Shell או באופן פרוגרמטי) ומעניקים את ההרשאות הדרושות לחשבון השירות של החיבור (ששמרנו קודם) כדי לגשת לתמונות

> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"

5. יצירת טבלת אובייקטים

אפשר ליצור טבלת אובייקטים חיצונית מ-BigQuery כדי לגשת לנתונים הלא מובְנים בקטגוריה באמצעות החיבור שיצרנו. מריצים את הפקודה CREATE SQL מתוך BigQuery Editor:

CREATE OR REPLACE EXTERNAL TABLE `<<dataset>>.<<table_name>>`
WITH CONNECTION `us.<<connection-name>>`
OPTIONS(
object_metadata="SIMPLE", uris=["gs://<<bucket>>/<<folder_if_exists>>/*.jpg"]);

טבלה חיצונית נוצרת באופן הבא:

bda48f566e0c292f.png

נריץ שאילתה מהירה על תנוחה מהטבלה החיצונית החדשה שנוצרה:

SELECT data , uri
FROM `yoga_set.yoga_poses`
WHERE REGEXP_CONTAINS(uri, 'gs://yoga_images/Downdog')
Limit 1;

כמו שאפשר לראות בצילום המסך בהמשך, אפשר ליצור תמונות לא מובנות ולפעול לפיהן כאילו הן נתונים מובְנים:

7d1784122b5013f.png

עכשיו נייצא את תוצאת השאילתה שלמעלה לקטע קוד קטן של Python כדי להמחיש את התוצאה:

לוחצים על 'שמירת התוצאות' ובוחרים באפשרות 'קובץ מקומי בפורמט CSV'. לייצא את התוצאה. פותחים את ה-notebook של Colab (או יוצרים אותו) ומקלידים את הקוד הבא:

from IPython.display import display
from PIL import Image
import io
import pandas as pd
import base64
df = pd.read_csv('/content/sample_data/<<your_csv>>')
imgdata = base64.b64decode(str(df.data[0]))
image = Image.open(io.BytesIO(imgdata))
display(image)

מבצעים כדי לראות את התוצאה כך:

b8edd68cb281786a.png

אחרי שיצרנו את הטבלה החיצונית וניגשנו לתמונות מ-Cloud Storage רק באמצעות שאילתות SQL, עכשיו נעבור לחלק הבא – יצירת מודל הסיווג.

6. יצירת המודל והעלאה שלו ל-Google Cloud Storage

לצורך ההטמעה הזאת, נשתמש במודל ResNet 50 שעבר אימון מקדים כדי להריץ את ההסקה על טבלת האובייקטים שיצרנו. המודל ResNet 50 מנתח קובצי תמונה ומפיק פלט של כמה וקטורים שמייצגים את הסבירות שתמונה שייכת למחלקה המתאימה (logits).

לפני שממשיכים לשלב הזה, חשוב לוודא שיש לכם את כל ההרשאות הנדרשות. לאחר מכן מבצעים את השלבים הבאים:

  1. מורידים את המודל מהמיקום הזה ושומרים אותו במיקום המקומי
  2. הוא צריך לבטל את החבילה ב-Saved_model.pb ובתיקיית המשתנים
  3. מעלים את שני הנתונים האלו (הקובץ והתיקייה) לקטגוריה שיצרנו בקטע הקודם

2629ff3eda214946.pngקטגוריה של Google Cloud Storage 'yoga_images' עם קובצי המודל של ResNet שהועלו

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

7. טוענים את המודל ל-BQML ומסיקים

בשלב הזה נטענו את המודל לאותו מערך נתונים של BigQuery כמו הטבלה החיצונית שיצרנו קודם, ונחיל אותו על התמונות שאחסנו ב-Cloud Storage.

א. מ-BigQuery Editor, מריצים את הצהרת ה-SQL הבאה

CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');

בסיום הביצוע (הפעולה עשויה להימשך זמן מה בהתאם למערך הנתונים), המודל יופיע בקטע 'מערך הנתונים' ב-BigQuery.

435fa0919aeb57a6.pngמערך הנתונים של BigQuery מציג את המודל שנוצר

ב. בודקים את המודל כדי לראות את שדות הקלט והפלט שלו.

מרחיבים את מערך הנתונים ולוחצים על המודל שיצרנו עכשיו, 'yoga_poses_resnet'. לוחצים על הכרטיסייה Schema:

e88928764f10f6ff.pngכרטיסיית סכימה של הגדרת מודל ב-BigQuery

בקטע 'תוויות' מופיע הכיתוב 'Activate_49' שמייצג את שדה הפלט. בקטע 'תכונות' מופיע הכיתוב 'input_1' שמייצג את השדה שצפוי להיות קלט למודל. אתם מציינים את הפרמטר "input_1" בשאילתת ההסקה (או בשאילתת החיזוי) כשדה שבו מעבירים את ה'בדיקה' .

ג. זה הזמן לגלות את תנוחת היוגה שלך!

נשתמש במודל שיצרנו כדי לסווג את נתוני התמונות לבדיקה. ודאו שיש לכם כמה תמונות לבדיקה (תנוחות יוגה) שזוהו בקטגוריה של Cloud Storage, ושהפכו אותן לטבלה החיצונית כשיצרתם אותה. אנחנו נשאל באופן סלקטיבי את התמונות לבדיקה ב-BigQuery כדי לבצע את ההסקה באמצעות מודל BQML שיצרנו. כדי להפעיל את הבדיקה, צריך להשתמש בשאילתה הבאה.

SELECT *
FROM ML.PREDICT(
MODEL yoga_set.yoga_poses_resnet,
(SELECT uri, ML.DECODE_IMAGE(data) AS input_1
FROM yoga_set.yoga_poses where REGEXP_CONTAINS(uri,
'gs://yoga_images/Downdog/00000097.jpg')));

בשאילתה שלמעלה, אנחנו בוחרים תמונה אחת לבדיקה שמזוהה כמכיל ערך URI ספציפי (00000097.jpg) בטבלה החיצונית. כמו כן, החלק SELECT משתמש במבנה ML.DECODE_IMAGE כשדה "input_1" כדי שהפונקציה ML.PREDICT תפעל.

כשתהליך ההפעלה יסתיים, התוצאה תוצג באופן הבא:

867018993845e943.png

אם אתם מכירים לעומק את מודל ResNet, זה יעזור להבין את הסיווג. אחרת, נוסיף קוד קטע קצר שיעזור לכם להבין את הסיווג באופן חזותי.

ד. החלקת התוצאה

אחת הדרכים להמחשת הפלט שלמעלה היא באמצעות מבנה UNNEST של BigQuery SQL על ערכי השדה Activate_49. אפשר להיעזר בשאילתה שבהמשך כדי לשטח את התוצאה מהשלב הקודם. אם רוצים להוסיף תוויות טקסט למחלקה שמתקבלת, אפשר להוסיף את הלוגיקה במקום ה-placeholder <<LABEL_LOGIC>> בשאילתה (לבטל תגובה כשמשתמשים).

with predictions as (
SELECT
Uri, data, SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 1)] as img,  
i as label_i,
<<LABEL_LOGIC>> label,
Score
FROM ML.PREDICT(
MODEL yoga_set.yoga_poses_resnet,
(SELECT data, uri, ML.DECODE_IMAGE(data) AS input_1
FROM yoga_set.yoga_poses 
WHERE
REGEXP_CONTAINS(uri,'gs://yoga_images/Goddess/00000007.jpg'))),
UNNEST(activation_49) as score WITH OFFSET i)
SELECT * FROM predictions 
ORDER BY score DESC
LIMIT  5;

בלי הלוגיקה של הוספת תוויות למחלקה, הפלט של השאילתה אמור להיות למטה:

71f580f41f0811f3.png

עם זאת, במקרה שלי השתמשתי בלוגיקה לדוגמה, והתוצאה היא:

1c6df6ecd14fba1.png

תוכלו לקרוא מידע נוסף על המודל וליישם את הלוגיקה שהכי מתאימה לנתונים שלכם ולפלט של המודל.

ה. המחשה חזותית של ההסקה

לבסוף, קטע קוד קצר של Python כדי להציג את התוצאות מהסיווג! מייצאים את תוצאת השאילתה שלמעלה לקובץ CSV ומזכירים אותה בקוד Python.

68756e7e4b8d7a29.png

פלט התמונה שלמעלה מתייחס לתנוחת היוגה "Downward כלב" שזה בדיוק אותו קלט בדיקה שהעברתנו לשאילתת ML.PREDICT לסיווג באמצעות BQML!

8. איחוד נתונים מובנים ונתונים לא מובנים

לבסוף, החלק האהוב עליי בהטמעה הזו הוא לאחד את השדות מהטבלה היחסית המובנית עם נתוני התמונות הלא מובנים. יצרתי טבלה מובנית ב-BigQuery באותו מערך נתונים כמו הטבלה החיצונית כדי לשמור את התנוחה והנתונים שקשורים לבריאות.

125bdf848c86fbe.pngהטבלה המובנית של BigQuery "yoga_health" סכימה

התמונה שלמעלה מייצגת את הסכימה של טבלת הנתונים המובְנים שנקראת 'yoga_health' והשדות הם: תנוחה, ריכוז, בריאות_תועלת ונשימה. השאילתה הבאה משלבת גם נתונים מובנים וגם נתונים לא מובנים:

SELECT SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 2)] as pose,
a.health_benefit, breath, focus, data
FROM `abis-345004.yoga_set.yoga_health` a, yoga_set.yoga_poses b
WHERE a.pose = SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 2)];

לפניכם התוצאה:

469bdfcffa9e19fd.png

הערה: את כל השאילתות שעליהן דיברנו בבלוג הזה אפשר להריץ ישירות מ-Python Notebook, באמצעות הפקודות BigQuery Magic.

9. הסרת המשאבים

כדי לא לצבור חיובים לחשבון Google Cloud עבור המשאבים שבהם השתמשתם בפוסט הזה:

  1. במסוף Google Cloud, נכנסים לדף Manage resources:
  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete (מחיקה).
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down

10. מזל טוב

מעולה! אחסנתם בהצלחה נתונים לא מובנים והרצתם שאילתות על הנתונים ב-BigQuery, יצרתם מודל סיווג באמצעות BQML ותחזית של תנוחות יוגה לבדיקה יחד עם המודל. אם רוצים להטמיע את זה, מתחילים לעבוד עם הפרויקט ב-Google Cloud. בנוסף, אם מעניין אותך לקרוא מידע נוסף על מסדי נתונים או על הטמעות אחרות של אפליקציות קצה ב-Google Cloud, אפשר להיכנס לבלוגים שלי.