1. บทนำ
ใน Codelab นี้ เราจะพูดถึงกรณีการใช้ในการจัดเก็บและวิเคราะห์รูปภาพของโยคะโพสใน BigQuery และการนำโมเดลการจัดประเภทด้วย BigQuery ML เพื่อติดป้ายกำกับท่าทางโดยใช้โครงสร้าง SQL เท่านั้น และไม่มีโค้ดรูปแบบอื่น
BigQuery และ BQML
BigQuery เป็นคลังข้อมูลในระบบมัลติคลาวด์แบบ Serverless ที่ปรับขนาดตั้งแต่ไบต์ไปจนถึงเพตะไบต์ได้โดยไม่มีค่าใช้จ่ายในการดำเนินการ จึงเป็นตัวเลือกที่ยอดเยี่ยมสำหรับการจัดเก็บข้อมูลการฝึก ML นอกจากนี้ ความสามารถด้านข้อมูลวิเคราะห์และแมชชีนเลิร์นนิงของ BigQuery ( BQML) ในตัวยังช่วยให้คุณสร้างการคาดการณ์แบบไม่ต้องเขียนโค้ดได้โดยใช้เพียงการค้นหา SQL เท่านั้น นอกจากนี้ยังสามารถเข้าถึงข้อมูลจากแหล่งที่มาภายนอกด้วยการค้นหาแบบรวมศูนย์ ทำให้ไม่จำเป็นต้องใช้ไปป์ไลน์ ETL ที่ซับซ้อน อ่านข้อมูลเพิ่มเติมเกี่ยวกับทุกสิ่งที่ BigQuery มีให้ได้ในหน้า BigQuery
ถึงตอนนี้ เรารู้จัก BigQuery ในชื่อคลังข้อมูลในระบบคลาวด์ที่มีการจัดการครบวงจรนี้ ซึ่งช่วยให้ผู้ใช้วิเคราะห์ข้อมูลที่มีโครงสร้างและกึ่งมีโครงสร้างได้ แต่
- เราได้ขยาย BigQuery เพื่อทำการวิเคราะห์และ ML กับข้อมูลที่ไม่มีโครงสร้างด้วย
- เราใช้การค้นหา SQL เพื่อทำการวิเคราะห์ ข้อมูลวิเคราะห์ และ ML อย่างเจาะลึกเกี่ยวกับรูปภาพ วิดีโอ เสียง ฯลฯ ในวงกว้างได้โดยไม่ต้องเขียนโค้ดเพิ่มเติม
- เรารวมข้อมูลที่มีโครงสร้างและข้อมูลที่ไม่มีโครงสร้างได้ราวกับว่าข้อมูลทั้งหมดมีอยู่ในตาราง
เราจะพูดถึงสิ่งเหล่านี้ใน Use Case การแยกประเภทท่าโยคะซึ่งจะกล่าวถึงในส่วนถัดไป
การแยกประเภทข้อมูลรูปภาพด้วย BigQuery ML
ความสามารถในการประมวลผลและวิเคราะห์รูปภาพโดยใช้การค้นหาแบบมีโครงสร้างได้เสมือนว่าเป็นข้อมูลที่มีโครงสร้างชนิดแรก ตอนนี้เราทำได้แม้กระทั่งคาดการณ์ผลลัพธ์โดยใช้โมเดลการแยกประเภทแมชชีนเลิร์นนิงด้วย BigQuery ML เราได้แบ่งขั้นตอนที่เกี่ยวข้องออกเป็น 5 ขั้นตอนเพื่อให้เข้าใจง่าย
ขั้นตอนข้างต้นอาจซับซ้อนขึ้นหากเราดูเป็นป้ายกำกับ รายละเอียดของแต่ละคอมโพเนนต์ที่เกี่ยวข้อง เช่น ชุดข้อมูล BigQuery, การเชื่อมต่อ BigLake, ที่เก็บข้อมูล Cloud Storage (คอนเทนเนอร์), ตารางออบเจ็กต์ (แหล่งข้อมูลภายนอก), BQML เป็นต้น ได้รับการกำหนดทั้งหมดไว้ในส่วนการใช้งาน ดังนั้นอย่าเพิ่งถอดใจ หากคุณยังไม่คุ้นเคยกับคำเหล่านี้
สิ่งที่คุณจะสร้าง
คุณจะต้องสร้างโมเดลการจัดประเภทข้อมูลรูปภาพด้วย BQML ซึ่งครอบคลุมรายการต่อไปนี้
- ชุดข้อมูล BigQuery ที่จะมีคอมโพเนนต์ของตารางและโมเดล
- ที่เก็บข้อมูล Google Cloud Storage (GCS) สำหรับจัดเก็บรูปภาพโยคะสำหรับโมเดล
- ตารางภายนอกสำหรับการเข้าถึงอิมเมจ Cloud Storage
- การเชื่อมต่อ BigLake สำหรับตารางภายนอกเพื่อเข้าถึงรูปภาพใน GCS
- โมเดล ResNet ใน BigQuery ML
- การอนุมานโดยใช้โมเดลที่สร้างขึ้น
- BigQuery SQL สำหรับการวิเคราะห์ข้อมูลรูปภาพ
- ใช้ BigQuery SQL เพื่อค้นหาข้อมูลที่มีโครงสร้างและไม่มีโครงสร้างร่วมกัน
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้างที่เก็บข้อมูล Cloud Storage และเก็บรูปภาพ
- วิธีสร้างชุดข้อมูล ตาราง และการเชื่อมต่อ BigQuery
- วิธีสร้างโมเดลการจัดประเภทข้อมูลรูปภาพโดยใช้ BQML
- วิธีคาดการณ์ด้วยโมเดลที่สร้างขึ้นโดยใช้ BigQuery ML
- วิธีค้นหารูปภาพและรวมกับข้อมูลที่มีโครงสร้างโดยใช้ BigQuery SQL
2. ข้อกำหนด
3. สร้างชุดข้อมูลและการเชื่อมต่อ BigLake
สำหรับกรณีการใช้งานของการตรวจหารูปภาพของท่าโยคะ 5 ท่า เราได้ใช้ชุดข้อมูลที่เผยแพร่ต่อสาธารณะและคุณสามารถเข้าถึงชุดข้อมูลได้จากที่เก็บนี้ ท่าโยคะที่เราระบุอยู่นั้นจำกัดอยู่แค่ดาวน์ด็อก เทพธิดา แพลงก์ ต้นไม้ และ Warrior2 ก่อนที่จะเริ่มสร้างชุดข้อมูล 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 Connection
คลิก "เพิ่มข้อมูล" ในแผงสำรวจของหน้า BigQuery
BigQuery "เพิ่มข้อมูลภายนอก" หน้าจอ
คลิกการเชื่อมต่อกับแหล่งข้อมูลภายนอก แล้วเลือกตัวเลือก BigLake และฟังก์ชันระยะไกล
กำหนดค่าการเชื่อมต่อแหล่งข้อมูลภายนอก
ระบุรหัสการเชื่อมต่อและสร้างการเชื่อมต่อ อย่าลืมจดรหัสบัญชีบริการที่จะแสดงบนหน้าจอเมื่อมีการสร้างการเชื่อมต่อ <<SERVICE_ACCOUNT>> ในตัวอย่างของเรา รหัสการเชื่อมต่อคือ "yoga-pose-conn" อย่าลืมจดบันทึกภูมิภาค
4. สร้างที่เก็บข้อมูล Google Cloud Storage และให้สิทธิ์
เราจะใช้ที่เก็บข้อมูล Google Cloud Storage เพื่อเก็บไฟล์ภาพของท่าโยคะที่เราต้องการสร้างโมเดล ที่เก็บข้อมูลคือคอนเทนเนอร์ Cloud Storage ที่มีรูปภาพที่เราจะวิเคราะห์
ก. ไปที่ Google Cloud Storage โดยค้นหาในคอนโซล แล้วคลิกที่เก็บข้อมูลเพื่อเข้าสู่หน้าแรกของที่เก็บข้อมูล แล้วคลิกสร้าง
หน้าที่เก็บข้อมูล Google Cloud Storage
ข. ในหน้า "สร้างที่เก็บข้อมูล" ให้ป้อนข้อมูลที่เก็บข้อมูล (ชื่อที่ไม่ซ้ำกัน) แล้วดำเนินการต่อ ตรวจสอบว่าข้อมูลดังกล่าวอยู่ในภูมิภาคเดียวกับชุดข้อมูลและการเชื่อมต่อที่กล่าวถึงในขั้นตอนข้างต้น แล้วคลิกสร้าง
Google Cloud Storage สร้างหน้าที่เก็บข้อมูล
ก่อนไปยังขั้นตอนถัดไป โปรดตรวจสอบว่าคุณระบุบัญชีบริการ ชื่อที่เก็บข้อมูล และเส้นทางแล้ว
ค. เมื่อสร้างที่เก็บข้อมูลแล้ว ให้จัดเก็บรูปภาพ (ผ่านคอนโซลหรือคำสั่ง Cloud Shell หรือแบบเป็นโปรแกรม) และให้สิทธิ์ที่จำเป็นสำหรับบัญชีบริการสำหรับการเชื่อมต่อ (ที่เราบันทึกไว้ก่อนหน้านี้) เพื่อเข้าถึงอิมเมจ
> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"
5. สร้างตารางออบเจ็กต์
สร้างตารางออบเจ็กต์ภายนอกจาก BigQuery เพื่อเข้าถึงข้อมูลที่ไม่มีโครงสร้างในที่เก็บข้อมูลโดยใช้การเชื่อมต่อที่เราสร้างขึ้น เรียกใช้ CREATE SQL ด้านล่างจากตัวแก้ไข 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 ไฟล์ในเครื่อง" เพื่อส่งออกผลลัพธ์ จากนั้นเปิด Colab Notebook (หรือสร้างสมุดบันทึก) และพิมพ์โค้ดด้านล่าง
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 Model ที่ฝึกล่วงหน้าเพื่อเรียกใช้อนุมานในตารางออบเจ็กต์ที่เราเพิ่งสร้างขึ้น โมเดล ResNet 50 จะวิเคราะห์ไฟล์ภาพและแสดงผลกลุ่มเวกเตอร์ที่แสดงถึงแนวโน้มที่รูปภาพจะอยู่ในคลาสที่เกี่ยวข้อง (logit)
ก่อนที่จะไปยังขั้นตอนนี้ โปรดตรวจสอบว่าคุณมีสิทธิ์ที่จำเป็นทั้งหมดแล้ว จากนั้นทำตามขั้นตอนต่อไปนี้
- ดาวน์โหลดโมเดลจากตำแหน่งนี้ และบันทึกไว้ในเครื่องของคุณ
- ไฟล์ควรแยกแพ็กเกจลงใน saved_model.pb และอยู่ในโฟลเดอร์ตัวแปร
- อัปโหลด 2 รายการเหล่านี้ (ไฟล์และโฟลเดอร์) ลงในที่เก็บข้อมูลที่เราสร้างในส่วนก่อนหน้า
ที่เก็บข้อมูล Google Cloud Storage "yoga_images" ด้วยไฟล์โมเดล ResNet ที่อัปโหลด
เมื่อขั้นตอนนี้เสร็จเรียบร้อยแล้ว ไฟล์ที่เกี่ยวข้องกับโมเดลของคุณควรแสดงอยู่ในที่เก็บข้อมูลเดียวกันกับรูปภาพดังที่แสดงในรูปภาพด้านบน
7. โหลดโมเดลลงใน BQML และ Infer
ในขั้นตอนนี้ เราจะโหลดโมเดลลงในชุดข้อมูล BigQuery เดียวกันกับตารางภายนอกที่เราสร้างขึ้นก่อนหน้านี้ และนำไปใช้กับรูปภาพที่เราจัดเก็บไว้ใน Cloud Storage
ก. เรียกใช้คำสั่ง SQL ต่อไปนี้จาก BigQuery Editor
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" ในการค้นหาการอนุมาน (หรือคำค้นหาการคาดการณ์) ของคุณเป็นฟิลด์ที่คุณส่งสำหรับ "การทดสอบ"
ค. อนุมานท่าโยคะของคุณ
ลองใช้โมเดลที่เราเพิ่งสร้างขึ้นในการจัดประเภทข้อมูลรูปภาพทดสอบของเรา ตรวจดูว่าคุณมีรูปภาพทดสอบ (ท่าโยคะ) ที่ระบุจากที่เก็บข้อมูล 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 แบบเจาะลึก ข้อมูลนี้จะช่วยทำความเข้าใจการแยกประเภทได้ หรือลองสร้างข้อมูลโค้ดสั้นๆ เพื่อให้เข้าใจการแยกประเภท
ง. การขยายผลลัพธ์
วิธีหนึ่งในการแสดงภาพเอาต์พุตข้างต้นคือการปรับค่าช่อง Operat_49 ให้แยกเป็นหลายรายการโดยใช้โครงสร้าง UNNEST ของ BigQuery SQL โปรดดูคำค้นหาด้านล่างสำหรับการขยายผลลัพธ์จากขั้นตอนก่อนหน้านี้ หากต้องการติดป้ายกำกับคลาสที่เป็นข้อความเพิ่มเติม คุณสามารถใช้ตรรกะแทนตัวยึดตำแหน่ง <<LABEL_LOGIC>> ในข้อความค้นหา (uncomment เมื่อใช้)
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 ที่มีโครงสร้างในชุดข้อมูลเดียวกับตารางภายนอกเพื่อเก็บท่าทางและข้อมูลที่เกี่ยวข้องกับสุขภาพ
ตารางที่มีโครงสร้างของ BigQuery "yoga_health" สคีมา
รูปภาพด้านบนแสดงสคีมาของตาราง Structured Data ชื่อ "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)];
ผลลัพธ์มีดังนี้
หมายเหตุ: เรียกใช้การค้นหาทั้งหมดที่เราได้พูดถึงในบล็อกนี้ได้โดยตรงจากสมุดบันทึก Python โดยใช้คำสั่ง BigQuery Magic
9. ล้างข้อมูล
โปรดทำตามขั้นตอนต่อไปนี้เพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในโพสต์นี้
- ในคอนโซล Google Cloud ให้ไปที่หน้าจัดการทรัพยากร
- ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิกลบ
- ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเครื่องเพื่อลบโปรเจ็กต์
10. ขอแสดงความยินดี
ยินดีด้วย คุณจัดเก็บ ค้นหา ข้อมูลที่ไม่มีโครงสร้าง ใน BigQuery สร้างโมเดลการจัดประเภทโดยใช้ BQML และทำท่าทางทดสอบโยคะที่คาดการณ์ไว้พร้อมโมเดลดังกล่าวเรียบร้อยแล้ว หากต้องการนําไปใช้ ให้เริ่มต้นโปรเจ็กต์ Google Cloud นอกจากนี้ หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับฐานข้อมูลหรือการติดตั้งใช้งานแอปพลิเคชันอื่นๆ ใน Google Cloud โปรดไปที่บล็อกของฉัน