1. บทนำ
ใน Codelab นี้ เราจะพูดถึงกรณีการใช้งานในการจัดเก็บและวิเคราะห์รูปภาพของท่าโยคะใน BigQuery และการใช้โมเดลการแยกประเภทด้วย BigQuery ML เพื่อติดป้ายกำกับท่าโยคะโดยใช้เฉพาะโครงสร้าง SQL และโค้ดรูปแบบอื่นๆ
BigQuery และ BQML
BigQuery เป็นคลังข้อมูลในระบบมัลติคลาวด์แบบ Serverless ที่ปรับขนาดได้ตั้งแต่ไบต์ไปจนถึงเพตะไบต์โดยไม่มีค่าใช้จ่ายในการดำเนินงาน จึงเป็นตัวเลือกที่ยอดเยี่ยมสำหรับการจัดเก็บข้อมูลฝึกฝน ML นอกจากนี้ ความสามารถด้านแมชชีนเลิร์นนิง ( BQML) และการวิเคราะห์ในตัวของ BigQuery ยังช่วยให้คุณสร้างการคาดการณ์แบบไม่ต้องใช้โค้ดได้โดยใช้เพียงการค้นหา SQL และคุณยังเข้าถึงข้อมูลจากแหล่งที่มาภายนอกได้ด้วยการค้นหาแบบรวมศูนย์ ซึ่งช่วยลดความจำเป็นในการใช้ไปป์ไลน์ ETL ที่ซับซ้อน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับทุกสิ่งที่ BigQuery มีให้ได้ใน หน้า BigQuery
จนถึงตอนนี้ เราทราบว่า BigQuery เป็นคลังข้อมูลในระบบคลาวด์ที่มีการจัดการอย่างเต็มรูปแบบ ซึ่งช่วยให้ผู้ใช้วิเคราะห์ข้อมูลที่มีโครงสร้างและกึ่งโครงสร้างได้ แต่
- BigQuery ได้ขยายขีดความสามารถให้ดำเนินการวิเคราะห์และ ML ทั้งหมดกับข้อมูลที่ไม่มีโครงสร้างได้ด้วย
- เราสามารถใช้การค้นหา SQL เพื่อทำการวิเคราะห์เชิงลึก การวิเคราะห์ และ ML กับรูปภาพ วิดีโอ เสียง ฯลฯ ในระดับที่ปรับขนาดได้โดยไม่ต้องเขียนโค้ดเพิ่มเติม
- เราสามารถรวมข้อมูลที่มีโครงสร้างและไม่มีโครงสร้างได้ราวกับว่าข้อมูลทั้งหมดอยู่ร่วมกันในตารางเดียว
เราจะพูดถึงเรื่องเหล่านี้ในกรณีการใช้งานการแยกประเภทท่าโยคะที่ครอบคลุมในส่วนถัดไป
การแยกประเภทข้อมูลรูปภาพด้วย BigQuery ML
ความสามารถในการประมวลผลและวิเคราะห์รูปภาพโดยใช้การค้นหาที่มีโครงสร้างราวกับว่ารูปภาพเป็นข้อมูลที่มีโครงสร้างนั้นเป็นความสามารถแรกในลักษณะนี้ ตอนนี้เราสามารถคาดการณ์ผลลัพธ์โดยใช้โมเดลการแยกประเภทแมชชีนเลิร์นนิงโดยใช้ BigQuery ML ได้แล้ว ผมได้สรุปขั้นตอนที่เกี่ยวข้องออกเป็น 5 ขั้นตอนเพื่อให้เข้าใจได้ง่าย ดังนี้

ขั้นตอนข้างต้นอาจซับซ้อนหากเรามองเพียงแค่ป้ายกำกับ รายละเอียดของคอมโพเนนต์แต่ละรายการที่เกี่ยวข้อง เช่น ชุดข้อมูล BigQuery, Lakehouse สำหรับการเชื่อมต่อ Apache Iceberg, Bucket ของ Cloud Storage (คอนเทนเนอร์), ตารางออบเจ็กต์ (แหล่งข้อมูลภายนอก), BQML ฯลฯ ทั้งหมดจะกำหนดไว้ในส่วนการใช้งาน ดังนั้นอย่าท้อแท้หากคุณยังไม่คุ้นเคยกับคำศัพท์เหล่านี้
สิ่งที่คุณจะได้สร้าง
คุณจะได้สร้างโมเดลการแยกประเภทข้อมูลรูปภาพด้วย BQML ซึ่งครอบคลุมสิ่งต่อไปนี้
- ชุดข้อมูล BigQuery ที่มีคอมโพเนนต์ตารางและโมเดล
- Bucket ของ Google Cloud Storage (GCS) สำหรับจัดเก็บรูปภาพโยคะสำหรับโมเดล
- ตารางภายนอกสำหรับการเข้าถึงรูปภาพ Cloud Storage
- การเชื่อมต่อ Lakehouse สำหรับตารางภายนอกเพื่อเข้าถึงรูปภาพใน GCS
- โมเดล ResNet ใน BigQuery ML
- การอนุมานโดยใช้โมเดลที่สร้างขึ้น
- BigQuery SQL สำหรับการวิเคราะห์ข้อมูลรูปภาพ
- BigQuery SQL สำหรับการค้นหาข้อมูลที่มีโครงสร้างและไม่มีโครงสร้างร่วมกัน
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้าง Bucket ของ Cloud Storage และจัดเก็บรูปภาพ
- วิธีสร้างชุดข้อมูล ตาราง และการเชื่อมต่อ BigQuery
- วิธีสร้างโมเดลการแยกประเภทข้อมูลรูปภาพโดยใช้ BQML
- วิธีคาดการณ์ด้วยโมเดลที่สร้างขึ้นโดยใช้ BigQuery ML
- วิธีค้นหารูปภาพและรวมกับ Structured Data โดยใช้ BigQuery SQL
2. ข้อกำหนด
3. สร้างชุดข้อมูลและการเชื่อมต่อ Lakehouse
สำหรับกรณีการใช้งานการตรวจจับรูปภาพท่าโยคะ 5 ท่า ผมได้ใช้ ชุดข้อมูลที่เปิดเผยต่อสาธารณะและคุณสามารถเข้าถึงชุดข้อมูลได้จากที่เก็บข้อมูลนี้ ท่าโยคะที่เราจะระบุจำกัดอยู่ที่ Downdog, Goddess, Plank, Tree และ Warrior2 ก่อนที่จะเริ่มสร้างชุดข้อมูล BigQuery โปรดเลือกหรือ สร้าง โปรเจ็กต์ Google Cloud และตรวจสอบว่าได้เปิดใช้ การเรียกเก็บเงิน ในโปรเจ็กต์แล้ว เปิดใช้ BigQuery API และ BigQuery Connection API โปรดทราบว่าบริการทั้งหมดที่ใช้ในการใช้งานนี้ควรอยู่ในภูมิภาคเดียวกันที่คุณเลือก
ก. สร้างชุดข้อมูล "yoga_set" โดยใช้ขั้นตอนที่แสดงด้านล่าง
ไปที่เครื่องมือแก้ไข BigQuery แล้วพิมพ์คำสั่งต่อไปนี้
CREATE SCHEMA `<<project_id>>.yoga_set`;
ข. การเชื่อมต่อ Lakehouse ช่วยให้เราเชื่อมต่อแหล่งข้อมูลภายนอกได้ในขณะที่ยังคงการควบคุมการเข้าถึง BigQuery แบบละเอียดและความปลอดภัย ซึ่งในกรณีนี้คือ Cloud Storage สำหรับข้อมูลรูปภาพ เราจะใช้การเชื่อมต่อนี้เพื่ออ่านออบเจ็กต์จาก Cloud Storage ทำตามขั้นตอนด้านล่างเพื่อสร้างการเชื่อมต่อ Lakehouse
คลิก "เพิ่มข้อมูล" ในบานหน้าต่าง Explorer ของหน้า BigQuery
หน้าจอ "เพิ่มข้อมูลภายนอก" ของ BigQuery
คลิกการเชื่อมต่อกับแหล่งข้อมูลภายนอก แล้วเลือกตัวเลือก Lakehouse และฟังก์ชันระยะไกล
กำหนดค่าการเชื่อมต่อแหล่งข้อมูลภายนอก
ระบุรหัสการเชื่อมต่อและสร้างการเชื่อมต่อ อย่าลืมจดรหัสบัญชีบริการที่จะแสดงบนหน้าจอเมื่อสร้างการเชื่อมต่อแล้ว <<SERVICE_ACCOUNT>> ในตัวอย่างของเรา รหัสการเชื่อมต่อคือ "yoga-pose-conn" อย่าลืมจดภูมิภาค
4. สร้าง Bucket ของ Google Cloud Storage และให้สิทธิ์
เราจะใช้ Bucket ของ Google Cloud Storage เพื่อเก็บไฟล์รูปภาพของท่าโยคะที่เราต้องการสร้างโมเดล Bucket คือคอนเทนเนอร์ Cloud Storage สำหรับเก็บรูปภาพที่เราจะวิเคราะห์
ก. ไปที่ Google Cloud Storage โดยค้นหาในคอนโซล แล้วคลิก "Buckets" เพื่อไปที่หน้าแรกของ Buckets และคลิก "สร้าง"
หน้า Buckets ของ Google Cloud Storage
ข. ในหน้า "สร้าง Bucket" ให้ป้อนข้อมูล Bucket (ชื่อที่ไม่ซ้ำกัน) แล้วคลิก "ต่อไป" ตรวจสอบว่า Bucket อยู่ในภูมิภาคเดียวกับชุดข้อมูลและการเชื่อมต่อที่กล่าวถึงในขั้นตอนข้างต้น แล้วคลิก "สร้าง"
หน้า "สร้าง Bucket" ของ Google Cloud Storage
ก่อนที่จะไปยังขั้นตอนถัดไป โปรดตรวจสอบว่าคุณได้จดบัญชีบริการ ชื่อ Bucket และเส้นทางแล้ว
ค. เมื่อสร้าง Bucket แล้ว ให้จัดเก็บรูปภาพ (ผ่านคอนโซลหรือคำสั่ง Cloud Shell หรือแบบเป็นโปรแกรม) และให้สิทธิ์ที่จำเป็นแก่บัญชีบริการของการเชื่อมต่อ (ที่เราบันทึกไว้ก่อนหน้านี้) เพื่อเข้าถึงรูปภาพ
> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"
5. สร้างตารางออบเจ็กต์
สร้างตารางออบเจ็กต์ภายนอกจาก BigQuery เพื่อเข้าถึงข้อมูลที่ไม่มีโครงสร้างใน Bucket โดยใช้การเชื่อมต่อที่เราสร้างขึ้น เรียกใช้ SQL CREATE ด้านล่างจากเครื่องมือแก้ไข BigQuery
CREATE OR REPLACE EXTERNAL TABLE `<<dataset>>.<<table_name>>`
WITH CONNECTION `us.<<connection-name>>`
OPTIONS(
object_metadata="SIMPLE", uris=["gs://<<bucket>>/<<folder_if_exists>>/*.jpg"]);
ระบบจะสร้างตารางภายนอกดังที่แสดงด้านล่าง

มาค้นหาท่าโยคะจากตารางภายนอกที่สร้างขึ้นใหม่กันอย่างรวดเร็ว
SELECT data , uri
FROM `yoga_set.yoga_poses`
WHERE REGEXP_CONTAINS(uri, 'gs://yoga_images/Downdog')
Limit 1;
ดังที่คุณเห็นในภาพหน้าจอด้านล่าง คุณสามารถสร้างและดำเนินการกับรูปภาพที่ไม่มีโครงสร้างได้ราวกับว่ารูปภาพเป็นข้อมูลที่มีโครงสร้าง

ตอนนี้มาส่งออกผลการค้นหาจากด้านบนไปยังข้อมูลโค้ด Python ขนาดเล็กเพื่อแสดงผลลัพธ์เป็นภาพกัน
คลิก "บันทึกผลลัพธ์" แล้วเลือกตัวเลือก "CSV Localfile" เพื่อส่งออกผลลัพธ์ จากนั้นเปิดสมุดบันทึก 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)
เรียกใช้เพื่อดูผลลัพธ์ดังนี้

ตอนนี้เราได้สร้างตารางภายนอกและเข้าถึงรูปภาพจาก Cloud Storage โดยใช้เพียงการค้นหา SQL แล้ว ไปที่ส่วนถัดไปเพื่อสร้างโมเดลการแยกประเภทกันเลย
6. สร้างโมเดลและอัปโหลดไปยัง Google Cloud Storage
สำหรับการใช้งานนี้ เราจะใช้โมเดล ResNet 50 ที่ฝึกไว้ล่วงหน้าเพื่อเรียกใช้การอนุมานในตารางออบเจ็กต์ที่เราเพิ่งสร้างขึ้น โมเดล ResNet 50 จะวิเคราะห์ไฟล์รูปภาพและแสดงผลเวกเตอร์เป็นชุดซึ่งแสดงถึงความน่าจะเป็นที่รูปภาพจะอยู่ในคลาสที่เกี่ยวข้อง (logits)
ก่อนที่จะไปยังขั้นตอนนี้ โปรดตรวจสอบว่าคุณมี สิทธิ์ที่จำเป็นทั้งหมด จากนั้นทำตามขั้นตอนด้านล่าง
- ดาวน์โหลดโมเดลจากตำแหน่งนี้และบันทึกไว้ในเครื่อง
- โมเดลควรคลายแพ็กเกจเป็น saved_model.pb และโฟลเดอร์ตัวแปร
- อัปโหลดไฟล์และโฟลเดอร์ทั้ง 2 รายการนี้ไปยัง Bucket ที่เราสร้างขึ้นในส่วนก่อนหน้า
Bucket "yoga_images" ของ Google Cloud Storage ที่อัปโหลดไฟล์โมเดล ResNet แล้ว
เมื่อทำขั้นตอนนี้เสร็จแล้ว ไฟล์ที่เกี่ยวข้องกับโมเดลควรอยู่ใน Bucket เดียวกับรูปภาพดังที่เห็นในรูปภาพด้านบน
7. โหลดโมเดลลงใน BQML และอนุมาน
ในขั้นตอนนี้ เราจะโหลดโมเดลลงในชุดข้อมูล BigQuery เดียวกันกับตารางภายนอกที่เราสร้างไว้ก่อนหน้านี้ และใช้โมเดลกับรูปภาพที่เราจัดเก็บไว้ใน Cloud Storage
ก. เรียกใช้คำสั่ง SQL ต่อไปนี้จากเครื่องมือแก้ไข BigQuery
CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');
เมื่อการดำเนินการเสร็จสมบูรณ์ (ซึ่งอาจใช้เวลาสักครู่ขึ้นอยู่กับชุดข้อมูล) คุณจะเห็นโมเดลแสดงอยู่ในส่วนชุดข้อมูลใน BigQuery
ชุดข้อมูล BigQuery ที่แสดงโมเดลที่สร้างขึ้น
ข. ตรวจสอบโมเดลเพื่อดูช่องอินพุตและเอาต์พุต
ขยายชุดข้อมูลแล้วคลิกโมเดลที่เราเพิ่งสร้างขึ้น "yoga_poses_resnet" คลิกแท็บ "สคีมา"
แท็บสคีมาคำจำกัดความโมเดล BigQuery
ในส่วน "ป้ายกำกับ" คุณจะเห็นช่อง "activation_49" ซึ่งแสดงถึงช่องเอาต์พุต ในส่วน "ฟีเจอร์" คุณจะเห็น "input_1" ซึ่งแสดงถึงช่องที่คาดว่าจะเป็นอินพุตของโมเดล คุณจะอ้างอิง "input_1" ในการค้นหาการอนุมาน (หรือการค้นหาการคาดการณ์) เป็นช่องที่คุณส่งผ่านสำหรับข้อมูล "ทดสอบ"
ค. อนุมานท่าโยคะ
มาใช้โมเดลที่เราเพิ่งสร้างขึ้นเพื่อแยกประเภทข้อมูลรูปภาพทดสอบกัน ตรวจสอบว่าคุณมีรูปภาพทดสอบ (ท่าโยคะ) ที่ระบุจาก Bucket ของ 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')));
ในการค้นหาข้างต้น เราเลือกรูปภาพทดสอบ 1 รูปที่ระบุว่ามีค่า URI ที่เฉพาะเจาะจง (00000097.jpg) ในตารางภายนอก นอกจากนี้ ส่วน SELECT ยังใช้โครงสร้าง ML.DECODE_IMAGE เป็นช่อง "input_1" เพื่อให้ฟังก์ชัน ML.PREDICT ทำงานได้
เมื่อการดำเนินการเสร็จสมบูรณ์ คุณจะเห็นผลลัพธ์ดังที่แสดงด้านล่าง

ตอนนี้สำหรับผู้ที่รู้จักโมเดล ResNet อย่างละเอียด การดำเนินการนี้จะช่วยให้เข้าใจการแยกประเภท หากไม่เป็นเช่นนั้น ลองเขียนข้อมูลโค้ดขนาดเล็กเพื่อทำความเข้าใจการแยกประเภทแบบเห็นภาพ
ง. ทำให้ผลลัพธ์แบน
วิธีหนึ่งในการแสดงเอาต์พุตข้างต้นเป็นภาพคือการทำให้ค่าช่อง activation_49 แบนโดยใช้โครงสร้าง UNNEST ของ BigQuery SQL โปรดดูการค้นหาด้านล่างเพื่อทำให้ผลลัพธ์จากขั้นตอนก่อนหน้าแบน หากต้องการติดป้ายกำกับคลาสที่เป็นผลลัพธ์เป็นข้อความเพิ่มเติม คุณสามารถใส่ตรรกะแทนที่ตัวยึดตำแหน่ง <<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;
หากไม่มีตรรกะการติดป้ายกำกับคลาส เอาต์พุตของการค้นหาจะเป็นดังนี้

อย่างไรก็ตาม ในกรณีของผม ผมได้ใช้ตรรกะตัวอย่างและผลลัพธ์เป็นดังนี้

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับโมเดลและใช้ตรรกะที่ทำงานได้ดีที่สุดกับข้อมูลและเอาต์พุตของโมเดล
จ. การแสดงการอนุมานเป็นภาพ
สุดท้ายนี้ ข้อมูลโค้ด Python อย่างรวดเร็วเพื่อแสดงผลลัพธ์จากการแยกประเภทเป็นภาพ ส่งออกผลการค้นหาข้างต้นเป็นไฟล์ CSV และอ้างอิงในโค้ด Python

เอาต์พุตของรูปภาพข้างต้นอ้างอิงถึงท่าโยคะ "Downward Dog" ซึ่งเป็นอินพุตทดสอบเดียวกันกับที่เราส่งผ่านไปยังการค้นหา ML.PREDICT เพื่อการแยกประเภทโดยใช้ BQML
8. รวมข้อมูลที่มีโครงสร้างและไม่มีโครงสร้าง
สุดท้ายนี้ ส่วนที่ผมชอบที่สุดในการใช้งานนี้คือการรวมช่องจากตารางเชิงสัมพันธ์ที่มีโครงสร้างเข้ากับข้อมูลรูปภาพที่ไม่มีโครงสร้างนี้ ผมได้สร้างตาราง BigQuery ที่มีโครงสร้างในชุดข้อมูลเดียวกับตารางภายนอกเพื่อเก็บท่าโยคะและข้อมูลที่เกี่ยวข้องกับสุขภาพ
สคีมาตารางที่มีโครงสร้าง "yoga_health" ของ BigQuery
รูปภาพด้านบนแสดงถึงสคีมาของตาราง Structured Data ที่ชื่อ "yoga_health" และช่องต่างๆ ได้แก่ pose, focus, health_benefit และ breath การค้นหาด้านล่างจะรวมข้อมูลที่มีโครงสร้างและไม่มีโครงสร้างเข้าด้วยกัน
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)];
ผลลัพธ์ที่ได้มีดังนี้

หมายเหตุ: คุณสามารถเรียกใช้การค้นหาทั้งหมดที่เรากล่าวถึงในบล็อกนี้ได้โดยตรงจากสมุดบันทึก Python โดยใช้คำสั่ง BigQuery Magic
9. ล้างข้อมูล
โปรดทำตามขั้นตอนต่อไปนี้เพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในโพสต์นี้
- ในคอนโซล Google Cloud ให้ไปที่หน้า จัดการทรัพยากร
- ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิก "ลบ"
- ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิก "ปิด" เพื่อลบโปรเจ็กต์
10. ขอแสดงความยินดี
ยินดีด้วย คุณจัดเก็บและค้นหาข้อมูลที่ไม่มีโครงสร้างใน BigQuery ได้สำเร็จ สร้างโมเดลการแยกประเภทโดยใช้ BQML และคาดการณ์ท่าโยคะทดสอบด้วยโมเดล หากต้องการใช้งานนี้ ให้เริ่มต้นด้วยโปรเจ็กต์ Google Cloud นอกจากนี้ หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับฐานข้อมูลหรือการใช้งานแอปพลิเคชันแบบครบวงจรอื่นๆ ใน Google Cloud โปรดไปที่ บล็อก ของผม