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

ขั้นตอนข้างต้นอาจซับซ้อนหากเรามองว่าเป็นการติดป้ายกำกับ รายละเอียดของคอมโพเนนต์แต่ละรายการที่เกี่ยวข้อง เช่น ชุดข้อมูล BigQuery, การเชื่อมต่อ BigLake, บัคเก็ต Cloud Storage (คอนเทนเนอร์), ตารางออบเจ็กต์ (แหล่งข้อมูลภายนอก), BQML ฯลฯ จะกำหนดไว้ในส่วนการติดตั้งใช้งาน ดังนั้นอย่าท้อแท้หากคุณยังไม่คุ้นเคยกับคำศัพท์เหล่านี้
สิ่งที่คุณจะสร้าง
คุณจะสร้างโมเดลการแยกประเภทข้อมูลรูปภาพด้วย BQML ซึ่งครอบคลุมหัวข้อต่อไปนี้
- ชุดข้อมูล BigQuery ที่มีคอมโพเนนต์ตารางและโมเดล
- Bucket ของ Google Cloud Storage (GCS) สำหรับจัดเก็บรูปภาพโยคะสำหรับโมเดล
- ตารางภายนอกสำหรับการเข้าถึงรูปภาพใน Cloud Storage
- การเชื่อมต่อ BigLake สำหรับตารางภายนอกเพื่อเข้าถึงรูปภาพใน GCS
- โมเดล ResNet ใน BigQuery ML
- การอนุมานโดยใช้โมเดลที่สร้างขึ้น
- BigQuery SQL สำหรับการวิเคราะห์ข้อมูลรูปภาพ
- SQL ของ BigQuery เพื่อค้นหาข้อมูลที่มีโครงสร้างและไม่มีโครงสร้างร่วมกัน
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้าง Bucket ของ Cloud Storage และจัดเก็บรูปภาพ
- วิธีสร้างชุดข้อมูล ตาราง และการเชื่อมต่อ BigQuery
- วิธีสร้างโมเดลการแยกประเภทข้อมูลรูปภาพโดยใช้ BQML
- วิธีคาดการณ์ด้วยโมเดลที่สร้างขึ้นโดยใช้ BigQuery ML
- วิธีค้นหารูปภาพและรวมกับ Structured Data โดยใช้ BigQuery SQL
2. ข้อกำหนด
3. สร้างชุดข้อมูลและการเชื่อมต่อ BigLake
สำหรับกรณีการใช้งานการตรวจจับรูปภาพท่าโยคะ 5 ท่า เราใช้ชุดข้อมูลที่เผยแพร่ต่อสาธารณะ และคุณสามารถเข้าถึงชุดข้อมูลได้จากที่เก็บนี้ ท่าโยคะที่เรากำลังระบุมีเพียงท่าสุนัขก้มหน้า เทพธิดา แพลงก์ ต้นไม้ และนักรบ 2 ก่อนเริ่มสร้างชุดข้อมูล BigQuery โปรดเลือกหรือสร้างโปรเจ็กต์ Google Cloud และตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินในโปรเจ็กต์แล้ว เปิดใช้ BigQuery API และ BigQuery Connection API โปรดทราบว่าบริการทั้งหมดที่ใช้ในการติดตั้งใช้งานนี้ควรอยู่ในภูมิภาคเดียวกันกับที่เลือก
ก. สร้างชุดข้อมูล "yoga_set" โดยใช้ขั้นตอนที่แสดงด้านล่าง
ไปที่เครื่องมือแก้ไข BigQuery แล้วพิมพ์คำสั่งต่อไปนี้
CREATE SCHEMA `<<project_id>>.yoga_set`;
ข. การเชื่อมต่อ BigLake ช่วยให้เราเชื่อมต่อแหล่งข้อมูลภายนอกได้ในขณะที่ยังคงการควบคุมการเข้าถึงและความปลอดภัยของ BigQuery อย่างละเอียด ซึ่งในกรณีของเราคือ Cloud Storage สำหรับข้อมูลรูปภาพ เราจะใช้การเชื่อมต่อนี้เพื่ออ่านออบเจ็กต์จาก Cloud Storage ทำตามขั้นตอนด้านล่างเพื่อสร้างการเชื่อมต่อ BigLake
คลิกเพิ่มข้อมูลในแผง Explorer ของหน้า BigQuery
หน้าจอ "เพิ่มข้อมูลภายนอก" ของ BigQuery
คลิกการเชื่อมต่อกับแหล่งข้อมูลภายนอก แล้วเลือกตัวเลือกฟังก์ชัน BigLake และฟังก์ชันระยะไกล
กำหนดค่าการเชื่อมต่อแหล่งข้อมูลภายนอก
ระบุรหัสการเชื่อมต่อและสร้างการเชื่อมต่อ อย่าลืมจดรหัสบัญชีบริการที่จะแสดงบนหน้าจอเมื่อสร้างการเชื่อมต่อ <<SERVICE_ACCOUNT>> ในตัวอย่างของเรา รหัสการเชื่อมต่อคือ "yoga-pose-conn" อย่าลืมจดบันทึกภูมิภาค
4. สร้าง Bucket ของ Google Cloud Storage และให้สิทธิ์
เราจะใช้ Bucket ของ Google Cloud Storage เพื่อเก็บไฟล์รูปภาพของท่าโยคะที่เราต้องการสร้างโมเดล Bucket คือคอนเทนเนอร์ Cloud Storage ที่มีรูปภาพที่เราจะวิเคราะห์
ก. ไปที่ Google Cloud Storage โดยค้นหาในคอนโซล จากนั้นคลิกที่เก็บข้อมูลเพื่อไปยังหน้าแรกของที่เก็บข้อมูล แล้วคลิกสร้าง
หน้า Bucket ของ Google Cloud Storage
ข. ในหน้าสร้างที่เก็บข้อมูล ให้ป้อนข้อมูลที่เก็บข้อมูล (ชื่อที่ไม่ซ้ำ) แล้วดำเนินการต่อ ตรวจสอบว่าที่เก็บข้อมูลอยู่ในภูมิภาคเดียวกับชุดข้อมูลและการเชื่อมต่อที่กล่าวถึงในขั้นตอนข้างต้น แล้วคลิกสร้าง
หน้าสร้าง Bucket ของ Google Cloud Storage
ก่อนที่จะไปยังขั้นตอนถัดไป โปรดตรวจสอบว่าคุณได้จดบันทึกบัญชีบริการ ชื่อที่เก็บข้อมูล และเส้นทางแล้ว
ค. เมื่อสร้างที่เก็บข้อมูลแล้ว ให้จัดเก็บรูปภาพ (ผ่านคำสั่งคอนโซลหรือ Cloud Shell หรือแบบเป็นโปรแกรม) และให้สิทธิ์ที่จำเป็นแก่บัญชีบริการของการเชื่อมต่อ (ที่เราบันทึกไว้ก่อนหน้านี้) เพื่อเข้าถึงรูปภาพ
> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"
5. สร้างตารางออบเจ็กต์
สร้างตารางออบเจ็กต์ภายนอกจาก BigQuery เพื่อเข้าถึงข้อมูลที่ไม่มีโครงสร้างในที่เก็บข้อมูลโดยใช้การเชื่อมต่อที่เราสร้างขึ้น เรียกใช้ 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 จะวิเคราะห์ไฟล์รูปภาพและแสดงผลเวกเตอร์กลุ่มหนึ่งที่แสดงถึงความเป็นไปได้ที่รูปภาพจะอยู่ในคลาสที่เกี่ยวข้อง (ลอจิท)
ก่อนที่จะไปยังขั้นตอนถัดไป โปรดตรวจสอบว่าคุณมีสิทธิ์ที่จำเป็นทั้งหมด จากนั้นทำตามขั้นตอนด้านล่าง
- ดาวน์โหลดโมเดลจากตำแหน่งนี้แล้วบันทึกลงในเครื่อง
- โดยควรจะแตกไฟล์เป็น saved_model.pb และโฟลเดอร์ตัวแปร
- อัปโหลดทั้ง 2 รายการนี้ (ไฟล์และโฟลเดอร์) ไปยัง Bucket ที่เราสร้างไว้ในส่วนก่อนหน้า
Bucket ของ Google Cloud Storage "yoga_images" ที่อัปโหลดไฟล์โมเดล 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" ในการค้นหาการอนุมาน (หรือการค้นหาการคาดการณ์) เป็นฟิลด์ที่คุณส่งผ่านสำหรับข้อมูล "test"
ค. ทายท่าโยคะของคุณ
มาใช้โมเดลที่เราเพิ่งสร้างขึ้นเพื่อจัดประเภทข้อมูลรูปภาพทดสอบกัน ตรวจสอบว่าคุณมีรูปภาพทดสอบ (ท่าโยคะ) ที่ระบุจาก 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 ของ SQL ใน BigQuery โปรดดูการค้นหาด้านล่างเพื่อแปลงผลลัพธ์จากขั้นตอนก่อนหน้าให้เป็นรูปแบบแบน หากต้องการติดป้ายกำกับข้อความเพิ่มเติมให้กับคลาสผลลัพธ์ คุณสามารถใช้ตรรกะแทนที่ตัวยึดตำแหน่ง <<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

เอาต์พุตของรูปภาพด้านบนหมายถึงท่าโยคะ "สุนัขก้ม" ซึ่งเป็นอินพุตการทดสอบเดียวกันกับที่เราส่งไปยังคำค้นหา 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 โปรดไปที่บล็อกของฉัน