1. परिचय
इस कोडलैब में, हम BigQuery में योग की मुद्राओं की इमेज सेव करने और उनका विश्लेषण करने के इस्तेमाल के उदाहरण पर चर्चा करेंगे. साथ ही, हम BigQuery ML की मदद से क्लासिफ़िकेशन मॉडल लागू करने के बारे में भी जानेंगे, ताकि सिर्फ़ एसक्यूएल कंस्ट्रक्ट का इस्तेमाल करके मुद्राओं को लेबल किया जा सके. इसके लिए, किसी अन्य तरह के कोड का इस्तेमाल नहीं किया जाएगा.
BigQuery और BQML
BigQuery एक बिना सर्वर वाला मल्टी-क्लाउड डेटा वेयरहाउस है. इसे बाइट से लेकर पेटाबाइट तक बढ़ाया जा सकता है. साथ ही, इसे मैनेज करने में कोई अतिरिक्त खर्च नहीं आता. इसलिए, एमएल ट्रेनिंग डेटा को सेव करने के लिए यह एक बेहतरीन विकल्प है. इसके अलावा, BigQuery में पहले से मौजूद मशीन लर्निंग ( BQML) और विश्लेषण की सुविधाओं की मदद से, सिर्फ़ एसक्यूएल क्वेरी का इस्तेमाल करके नो-कोड अनुमान लगाए जा सकते हैं. साथ ही, फ़ेडरेटेड क्वेरी की मदद से बाहरी सोर्स से डेटा ऐक्सेस किया जा सकता है. इससे जटिल ईटीएल पाइपलाइन की ज़रूरत नहीं पड़ती. BigQuery के बारे में ज़्यादा जानने के लिए, BigQuery पेज पर जाएं.
अब तक, हम BigQuery को पूरी तरह से मैनेज किए जाने वाले क्लाउड डेटा वेयरहाउस के तौर पर जानते हैं. इससे उपयोगकर्ताओं को स्ट्रक्चर्ड और सेमी-स्ट्रक्चर्ड डेटा का विश्लेषण करने में मदद मिलती है. लेकिन,
- BigQuery को अब अनस्ट्रक्चर्ड डेटा पर भी सभी तरह के विश्लेषण और एमएल करने के लिए बढ़ाया गया है
- हम एसक्यूएल क्वेरी का इस्तेमाल करके, इमेज, वीडियो, ऑडियो वगैरह पर बड़े पैमाने पर अहम विश्लेषण, आंकड़ों का विश्लेषण, और एमएल कर सकते हैं. इसके लिए, हमें अतिरिक्त कोड लिखने की ज़रूरत नहीं होती
- हमारे पास स्ट्रक्चर्ड और अनस्ट्रक्चर्ड डेटा को एक साथ इस्तेमाल करने की सुविधा है. इससे ऐसा लगता है कि यह सारा डेटा एक ही टेबल में मौजूद है
हम अगले सेक्शन में, योग की मुद्राएं पहचानने के इस्तेमाल के उदाहरण में इनके बारे में बात करेंगे.
BigQuery ML की मदद से इमेज डेटा को कैटगरी में बांटना
स्ट्रक्चर्ड क्वेरी का इस्तेमाल करके, इमेज को प्रोसेस और उनका विश्लेषण करने की सुविधा पहली बार उपलब्ध कराई गई है. इससे इमेज को स्ट्रक्चर्ड डेटा की तरह इस्तेमाल किया जा सकता है. अब हम BigQuery ML का इस्तेमाल करके, मशीन लर्निंग क्लासिफ़िकेशन मॉडल की मदद से नतीजों का अनुमान भी लगा सकते हैं. हमने इस प्रोसेस को पांच चरणों में बांटा है, ताकि इसे आसानी से समझा जा सके:

अगर हम सिर्फ़ लेबल के तौर पर इन चरणों को देखते हैं, तो ये मुश्किल लग सकते हैं. लागू करने के सेक्शन में, शामिल किए गए हर कॉम्पोनेंट की जानकारी दी गई है. जैसे, BigQuery डेटासेट, BigLake कनेक्शन, Cloud Storage बकेट (कंटेनर), ऑब्जेक्ट टेबल (बाहरी डेटा सोर्स), BQML वगैरह. इसलिए, अगर आपको इन शब्दों के बारे में अभी तक जानकारी नहीं है, तो चिंता न करें.
आपको क्या बनाना है
आपको BQML की मदद से, इमेज डेटा क्लासिफ़िकेशन मॉडल बनाना होगा. इसमें ये चीज़ें शामिल होंगी:
- टेबल और मॉडल कॉम्पोनेंट को शामिल करने के लिए, BigQuery डेटासेट
- मॉडल के लिए योगा की इमेज सेव करने के लिए Google Cloud Storage (GCS) बकेट
- Cloud Storage में मौजूद इमेज को ऐक्सेस करने के लिए बाहरी टेबल
- GCS में मौजूद इमेज को ऐक्सेस करने के लिए, बाहरी टेबल के लिए BigLake कनेक्शन
- BigQuery ML में ResNet मॉडल
- बनाए गए मॉडल का इस्तेमाल करके अनुमान लगाना
- इमेज डेटा का विश्लेषण करने के लिए BigQuery SQL
- स्ट्रक्चर्ड और अनस्ट्रक्चर्ड डेटा पर एक साथ क्वेरी करने के लिए BigQuery SQL
आपको क्या सीखने को मिलेगा
- Cloud Storage बकेट बनाने और उसमें इमेज सेव करने का तरीका
- BigQuery डेटासेट, टेबल, और कनेक्शन बनाने का तरीका
- BQML का इस्तेमाल करके, इमेज डेटा क्लासिफ़िकेशन मॉडल बनाने का तरीका
- BigQuery ML का इस्तेमाल करके, बनाए गए मॉडल की मदद से अनुमान लगाने का तरीका
- BigQuery SQL का इस्तेमाल करके, इमेज को क्वेरी करने और स्ट्रक्चर्ड डेटा के साथ मिलाने का तरीका
2. ज़रूरी शर्तें
3. डेटासेट और BigLake कनेक्शन बनाना
हमने योग की पांच मुद्राओं की इमेज का पता लगाने के लिए, सार्वजनिक तौर पर उपलब्ध डेटासेट का इस्तेमाल किया है. इस repo से डेटासेट को ऐक्सेस किया जा सकता है. हम सिर्फ़ इन योगा पोज़ की पहचान कर रहे हैं: अधोमुख श्वानासन, उत्कटासन, प्लैंक, वृक्षासन, और वीरभद्रासन 2. BigQuery डेटासेट बनाने से पहले, पक्का करें कि आपने कोई Google Cloud प्रोजेक्ट चुना हो या बनाया हो. साथ ही, यह भी देखें कि प्रोजेक्ट के लिए बिलिंग की सुविधा चालू हो. BigQuery API और BigQuery Connection API को चालू करें. कृपया ध्यान दें कि इस सुविधा को लागू करने के लिए इस्तेमाल की जाने वाली सभी सेवाएं, आपके चुने गए क्षेत्र में होनी चाहिए.
a. नीचे दिए गए तरीके का इस्तेमाल करके, "yoga_set" डेटासेट बनाएं:
BigQuery एडिटर पर जाएं और यह कमांड टाइप करें:
CREATE SCHEMA `<<project_id>>.yoga_set`;
b. BigLake कनेक्शन की मदद से, बाहरी डेटा सोर्स को कनेक्ट किया जा सकता है. साथ ही, BigQuery के फ़ाइन-ग्रेन्ड ऐक्सेस कंट्रोल और सुरक्षा को बनाए रखा जा सकता है. हमारे मामले में, इमेज डेटा के लिए Cloud Storage का इस्तेमाल किया जाता है. हम इस कनेक्शन का इस्तेमाल, Cloud Storage से ऑब्जेक्ट पढ़ने के लिए करेंगे. BigLake कनेक्शन बनाने के लिए, यहां दिया गया तरीका अपनाएं.
BigQuery पेज के एक्सप्लोरर पैनल में, डेटा जोड़ें पर क्लिक करें:
BigQuery की "बाहरी डेटा जोड़ें" स्क्रीन
बाहरी डेटा सोर्स से कनेक्शन पर क्लिक करें. इसके बाद, BigLake और रिमोट फ़ंक्शन का विकल्प चुनें:
बाहरी डेटा सोर्स के कनेक्शन को कॉन्फ़िगर करना
कनेक्शन आईडी डालें और कनेक्शन बनाएं. कनेक्शन बन जाने के बाद, स्क्रीन पर दिखने वाले <<SERVICE_ACCOUNT>> सर्विस खाते के आईडी को नोट करना न भूलें. हमारे उदाहरण में, कनेक्शन आईडी "yoga-pose-conn" है. इलाके का नाम नोट करना न भूलें.
4. Google Cloud Storage बकेट बनाना और अनुमतियां देना
हम Google Cloud Storage बकेट का इस्तेमाल करेंगे, ताकि योग की उन मुद्राओं की इमेज फ़ाइलें सेव की जा सकें जिनके आधार पर हमें मॉडल बनाना है. बकेट, Cloud Storage कंटेनर होते हैं. इनमें उन इमेज को रखा जाता है जिनका हमें विश्लेषण करना है.
a. कंसोल में Google Cloud Storage खोजें और फिर बकेट पर क्लिक करके, बकेट के होम पेज पर जाएं. इसके बाद, बनाएं पर क्लिक करें
Google Cloud Storage बकेट पेज
b. 'बकेट बनाएं' पेज पर, बकेट की जानकारी (एक यूनीक नाम) डालें और जारी रखें. पक्का करें कि यह उसी क्षेत्र में हो जिस क्षेत्र में डेटासेट और ऊपर दिए गए चरणों में बताया गया कनेक्शन है. इसके बाद, 'बनाएं' पर क्लिक करें
Google Cloud Storage में बकेट बनाने का पेज
अगले चरण पर जाने से पहले, पक्का करें कि आपने अपने सेवा खाते, बकेट के नाम, और पाथ को नोट कर लिया हो.
c. बकेट बनाने के बाद, अपनी इमेज सेव करें. इसके लिए, कंसोल या Cloud Shell के कमांड या प्रोग्रामैटिक तरीके का इस्तेमाल करें. साथ ही, कनेक्शन के सेवा खाते (जिसे हमने पहले सेव किया था) को इमेज ऐक्सेस करने के लिए ज़रूरी अनुमतियां दें
> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"
5. ऑब्जेक्ट टेबल बनाना
हमने जो कनेक्शन बनाया है उसका इस्तेमाल करके, बकेट में मौजूद बिना स्ट्रक्चर वाले डेटा को ऐक्सेस करने के लिए, BigQuery से बाहरी ऑब्जेक्ट टेबल बनाएं. BigQuery एडिटर में जाकर, नीचे दिए गए CREATE SQL को चलाएं:
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 Notebook खोलें या एक नई 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)
नीचे दिए गए नतीजे देखने के लिए, इस कोड को लागू करें:

हमने बाहरी टेबल बना ली है और सिर्फ़ SQL क्वेरी का इस्तेमाल करके, Cloud Storage से इमेज ऐक्सेस कर ली हैं. अब हम अगले सेक्शन पर चलते हैं. इसमें क्लासिफ़िकेशन मॉडल बनाना है.
6. मॉडल बनाना और उसे Google Cloud Storage पर अपलोड करना
इस प्रोसेस के लिए, हम पहले से ट्रेन किए गए ResNet 50 मॉडल का इस्तेमाल करेंगे. इससे, हम अभी बनाई गई ऑब्जेक्ट टेबल पर अनुमान लगा पाएंगे. ResNet 50 मॉडल, इमेज फ़ाइलों का विश्लेषण करता है. साथ ही, यह संभावना दिखाता है कि कोई इमेज, संबंधित क्लास (लॉजेट) से जुड़ी है या नहीं.
इस चरण पर जाने से पहले, पक्का करें कि आपके पास सभी ज़रूरी अनुमतियां हों. इसके बाद, यहां दिया गया तरीका अपनाएं:
- इस जगह से मॉडल डाउनलोड करें और इसे अपने डिवाइस में सेव करें
- इसे saved_model.pb और वैरिएबल फ़ोल्डर में अनपैक किया जाना चाहिए
- पिछले सेक्शन में बनाए गए बकेट में, इन दोनों (फ़ाइल और फ़ोल्डर) को अपलोड करें
Google Cloud Storage बकेट "yoga_images" में ResNet मॉडल की फ़ाइलें अपलोड की गई हैं
यह चरण पूरा होने के बाद, मॉडल से जुड़ी फ़ाइलें उसी बकेट में मौजूद होनी चाहिए जिसमें आपकी इमेज मौजूद हैं. जैसा कि ऊपर दी गई इमेज में दिखाया गया है.
7. मॉडल को BQML में लोड करना और अनुमान लगाना
इस चरण में, हम मॉडल को उसी BigQuery डेटासेट में लोड करने जा रहे हैं जिसमें हमने पहले बाहरी टेबल बनाई थी. साथ ही, हम इसे उन इमेज के लिए लागू करेंगे जिन्हें हमने Cloud Storage में सेव किया है.
a. BigQuery एडिटर में जाकर, यह SQL स्टेटमेंट चलाएं
CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');
मॉडल तैयार होने के बाद, आपको BigQuery के डेटासेट सेक्शन में मॉडल दिखेगा. मॉडल तैयार होने में कुछ समय लग सकता है. यह समय आपके डेटासेट के साइज़ पर निर्भर करता है.
BigQuery डेटासेट, जिसमें बनाया गया मॉडल मौजूद है
b. मॉडल के इनपुट और आउटपुट फ़ील्ड देखने के लिए, उसकी जांच करें.
डेटासेट को बड़ा करें और अभी-अभी बनाए गए मॉडल "yoga_poses_resnet" पर क्लिक करें. स्कीमा टैब पर क्लिक करें:
BigQuery मॉडल की परिभाषा वाला स्कीमा टैब
लेबल सेक्शन में, आपको "activation_49" फ़ील्ड दिखेगा. यह आउटपुट फ़ील्ड को दिखाता है. सुविधाएं सेक्शन में, आपको "input_1" दिखेगा. यह उस फ़ील्ड को दिखाता है जिसे मॉडल में इनपुट किया जाना है. आपको अपनी अनुमान लगाने वाली क्वेरी (या पूर्वानुमान लगाने वाली क्वेरी) में "input_1" को उस फ़ील्ड के तौर पर रेफ़रंस करना होगा जिसे "टेस्ट" डेटा के लिए पास किया जा रहा है.
c. आपकी योग मुद्रा का अनुमान लगाना!
आइए, अभी बनाए गए मॉडल का इस्तेमाल करके, टेस्ट इमेज डेटा को कैटगरी में बांटें. पक्का करें कि आपके पास कुछ टेस्ट इमेज (योगा पोज़) हों. ये इमेज, आपके Cloud Storage बकेट से ली गई हों और हमने इन्हें External Table बनाते समय शामिल किया हो. हम 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')));
ऊपर दी गई क्वेरी में, हमने एक ऐसी टेस्ट इमेज चुनी है जिसमें बाहरी टेबल में मौजूद यूआरआई वैल्यू (00000097.jpg) शामिल है. साथ ही, SELECT पार्ट में ML.DECODE_IMAGE कंस्ट्रक्ट का इस्तेमाल फ़ील्ड "input_1" के तौर पर किया जाता है, ताकि ML.PREDICT फ़ंक्शन काम कर सके.
एक्ज़ीक्यूशन पूरा होने के बाद, आपको नतीजे इस तरह दिखेंगे:

अब जो लोग ResNet मॉडल के बारे में पूरी जानकारी रखते हैं उन्हें क्लासिफ़िकेशन समझने में मदद मिलेगी. अगर ऐसा नहीं है, तो आइए हम एक छोटा स्निपेट कोड करते हैं, ताकि क्लासिफ़िकेशन को विज़ुअल तौर पर समझा जा सके.
d. नतीजे को फ़्लैट किया जा रहा है
ऊपर दिए गए आउटपुट को विज़ुअलाइज़ करने का एक तरीका यह है कि BigQuery SQL के UNNEST कंस्ट्रक्ट का इस्तेमाल करके, activation_49 फ़ील्ड की वैल्यू को फ़्लैट किया जाए. पिछले चरण के नतीजे को फ़्लैट करने के लिए, कृपया नीचे दी गई क्वेरी देखें. अगर आपको नतीजे के तौर पर मिली क्लास को टेक्स्ट के तौर पर लेबल करना है, तो क्वेरी में <<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;
क्लास लेबलिंग लॉजिक के बिना, क्वेरी का आउटपुट यहां दिया गया है:

हालांकि, मैंने अपने मामले में एक सैंपल लॉजिक लागू किया है और यहां उसका नतीजा दिया गया है:

मॉडल के बारे में ज़्यादा जानकारी पढ़ी जा सकती है. साथ ही, अपने डेटा और मॉडल के आउटपुट के हिसाब से सबसे सही लॉजिक लागू किया जा सकता है.
e. अनुमान को विज़ुअलाइज़ करना
आखिर में, क्लासिफ़िकेशन के नतीजे को विज़ुअलाइज़ करने के लिए, Python का एक छोटा स्निपेट! ऊपर दिए गए क्वेरी के नतीजे को CSV फ़ाइल में एक्सपोर्ट करें और इसे Python कोड में रेफ़रंस के तौर पर इस्तेमाल करें.

ऊपर दी गई इमेज में, योग की "अधोमुख श्वानासन" मुद्रा दिखाई गई है. यह वही टेस्ट इनपुट है जिसे हमने BQML का इस्तेमाल करके क्लासिफ़िकेशन के लिए, ML.PREDICT क्वेरी में पास किया था!
8. स्ट्रक्चर्ड और अनस्ट्रक्चर्ड डेटा को एक साथ इस्तेमाल करना
आखिर में, मुझे इस सुविधा का यह हिस्सा सबसे ज़्यादा पसंद आया कि स्ट्रक्चर्ड रिलेशनल टेबल के फ़ील्ड को, बिना स्ट्रक्चर वाले इमेज डेटा के साथ जोड़ा जा सकता है. मैंने बाहरी टेबल के तौर पर इस्तेमाल किए जा रहे डेटासेट में ही, स्ट्रक्चर्ड BigQuery टेबल बनाई है. इसमें पोज़ और उससे जुड़ी सेहत का डेटा सेव किया जाता है.
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)];
नतीजा यहां दिया गया है:

ध्यान दें: इस ब्लॉग में शामिल की गई सभी क्वेरी को, BigQuery Magic कमांड का इस्तेमाल करके, सीधे तौर पर Python Notebook से चलाया जा सकता है.
9. व्यवस्थित करें
इस पोस्ट में इस्तेमाल किए गए संसाधनों के लिए, अपने Google Cloud खाते से शुल्क न लिए जाने के लिए, यह तरीका अपनाएं.
- Google Cloud Console में, संसाधन मैनेज करें पेज पर जाएं
- प्रोजेक्ट की सूची में, वह प्रोजेक्ट चुनें जिसे आपको मिटाना है. इसके बाद, मिटाएं पर क्लिक करें
- डायलॉग बॉक्स में, प्रोजेक्ट आईडी डालें. इसके बाद, प्रोजेक्ट मिटाने के लिए बंद करें पर क्लिक करें
10. बधाई हो
बधाई हो! आपने BigQuery में बिना स्ट्रक्चर वाला डेटा सेव किया है और उसकी क्वेरी की है. साथ ही, BQML का इस्तेमाल करके क्लासिफ़िकेशन मॉडल बनाया है और मॉडल की मदद से, योगा की टेस्ट पोज़िशन का अनुमान लगाया है. अगर आपको इसे लागू करना है, तो Google Cloud प्रोजेक्ट का इस्तेमाल शुरू करें. अगर आपको Google Cloud में डेटाबेस या अन्य ऐप्लिकेशन के एंड-टू-एंड इंप्लीमेंटेशन के बारे में ज़्यादा जानना है, तो कृपया मेरे ब्लॉग पर जाएं.