1. परिचय
इस कोडलैब में, हम BigQuery में योगा पॉज़ की इमेज को सेव करने और उनका विश्लेषण करने के इस्तेमाल के उदाहरण के बारे में चर्चा करेंगे. साथ ही, हम BigQuery एमएल के साथ क्लासिफ़िकेशन मॉडल लागू करने के बारे में भी बात करेंगे. इससे पोज़ को लेबल करने के लिए सिर्फ़ एसक्यूएल कंस्ट्रक्ट का इस्तेमाल किया जाएगा, किसी दूसरे कोड का इस्तेमाल नहीं किया जाएगा.
BigQuery और BQML
BigQuery, बिना सर्वर वाला मल्टी-क्लाउड डेटा वेयरहाउस है. यह डेटा वेयरहाउस को बाइट से पेटाबाइट तक स्केल कर सकता है, लेकिन इसमें कोई ऑपरेशन नहीं होता. इस वजह से, एमएल ट्रेनिंग डेटा को स्टोर करने का यह एक बेहतरीन विकल्प है. इसके अलावा, पहले से मौजूद BigQuery मशीन लर्निंग ( BQML) और विश्लेषण करने की सुविधाओं की मदद से, एसक्यूएल क्वेरी का इस्तेमाल करके बिना कोड वाले अनुमान बनाए जा सकते हैं. साथ ही, फ़ेडरेटेड क्वेरी वाले बाहरी सोर्स का डेटा ऐक्सेस किया जा सकता है. इससे, मुश्किल ETL पाइपलाइन की ज़रूरत नहीं पड़ती. BigQuery की सभी सुविधाओं के बारे में ज़्यादा जानने के लिए, BigQuery पेज देखें.
हमें अभी तक, BigQuery को पूरी तरह से मैनेज किए गए क्लाउड डेटा वेयरहाउस के तौर पर पता है. इसकी मदद से, उपयोगकर्ताओं को स्ट्रक्चर्ड और सेमी-स्ट्रक्चर्ड डेटा का विश्लेषण करने में मदद मिलती है. हालांकि,
- BigQuery का इस्तेमाल, बिना स्ट्रक्चर वाले डेटा के सभी आंकड़े और मशीन लर्निंग (एमएल) करने के लिए किया गया है
- हम बड़े पैमाने पर इमेज, वीडियो, ऑडियो वगैरह का विश्लेषण करने, मशीन लर्निंग का इस्तेमाल करने, और मशीन लर्निंग का इस्तेमाल करने के लिए एसक्यूएल क्वेरी का इस्तेमाल कर सकते हैं. इसके लिए, हमें अलग से कोई कोड लिखने की ज़रूरत नहीं पड़ती.
- हमारे पास स्ट्रक्चर्ड और अनस्ट्रक्चर्ड डेटा को इस तरह से जोड़ने की सुविधा है जैसे कि वे सभी किसी टेबल में एक साथ मौजूद हों
हम इनकी चर्चा अगले सेक्शन में बताए गए, योगा आसन के क्लासिफ़िकेशन के इस्तेमाल के उदाहरण में करेंगे.
BigQuery एमएल की मदद से, इमेज डेटा की कैटगरी तय करना
स्ट्रक्चर्ड क्वेरी का इस्तेमाल करके, इमेज को इस तरह से प्रोसेस करने और उनका विश्लेषण करने की सुविधा होना, जैसे कि यह अपनी तरह का पहला स्ट्रक्चर्ड डेटा है. अब हम BigQuery एमएल का इस्तेमाल करके, मशीन लर्निंग क्लासिफ़िकेशन मॉडल का इस्तेमाल करके भी नतीजों का अनुमान लगा सकते हैं. मैंने इसे आसानी से समझने के लिए, इसमें शामिल चरणों को पांच चरणों में सीमित कर दिया है:
अगर हम सिर्फ़ उन्हें लेबल के तौर पर देखें, तो ऊपर बताए गए तरीके मुश्किल हो सकते हैं. BigQuery डेटासेट, BigLake कनेक्शन, Cloud Storage बकेट (कंटेनर), ऑब्जेक्ट टेबल (बाहरी डेटा सोर्स), BQML वगैरह जैसे हर कॉम्पोनेंट की जानकारी, लागू करने वाले सेक्शन में दी गई है. इसलिए, अगर आपको अब तक इन शर्तों के बारे में पता नहीं है, तो निराश न हों.
आपको क्या बनाना होगा
आपको BQML की मदद से, इमेज डेटा क्लासिफ़िकेशन मॉडल बनाना होगा. इसमें ये चीज़ें शामिल होंगी:
- टेबल और मॉडल कॉम्पोनेंट शामिल करने के लिए BigQuery डेटासेट
- मॉडल के हिसाब से, योग की इमेज सेव करने के लिए Google Cloud Storage (GCS) बकेट
- Cloud Storage इमेज ऐक्सेस करने के लिए एक बाहरी टेबल
- GCS (जीसीएस) में इमेज ऐक्सेस करने के लिए, बाहरी टेबल के लिए BigLake कनेक्शन
- BigQuery ML में ResNet मॉडल
- बनाए गए मॉडल का इस्तेमाल करके अनुमान लगाना
- इमेज डेटा का विश्लेषण करने के लिए BigQuery एसक्यूएल
- स्ट्रक्चर्ड और अनस्ट्रक्चर्ड डेटा को एक साथ क्वेरी करने के लिए BigQuery एसक्यूएल
आप इन चीज़ों के बारे में जानेंगे
- Cloud Storage बकेट और स्टोर इमेज बनाने का तरीका
- BigQuery डेटासेट, टेबल, और कनेक्शन बनाने का तरीका
- BQML का इस्तेमाल करके, इमेज के डेटा की कैटगरी तय करने वाला मॉडल बनाने का तरीका
- BigQuery ML का इस्तेमाल करके, बनाए गए मॉडल के साथ अनुमान लगाने का तरीका
- BigQuery एसक्यूएल का इस्तेमाल करके, इमेज के लिए क्वेरी करने और स्ट्रक्चर्ड डेटा के साथ उन्हें जोड़ने का तरीका
2. ज़रूरी शर्तें
3. डेटासेट और BigLake कनेक्शन बनाएं
इमेज का पता लगाने वाले पांच योग आसन के लिए, हमने सार्वजनिक तौर पर उपलब्ध डेटासेट का इस्तेमाल किया है. आपके पास इस रेपो से डेटासेट को ऐक्सेस करने का विकल्प है. हम योगा के जिन पोज़ की पहचान कर रहे हैं वे डाउनडॉग, गॉडेस, प्लैंक, ट्री, और Warrior2 तक सीमित हैं. BigQuery डेटासेट बनाने से पहले, पक्का करें कि आपने Google Cloud प्रोजेक्ट चुना हो या बनाएं. साथ ही, यह भी देखें कि प्रोजेक्ट में बिलिंग चालू है या नहीं. BigQuery API और BigQuery कनेक्शन एपीआई चालू करें. कृपया ध्यान दें कि इस प्रोसेस में इस्तेमाल की जाने वाली सभी सेवाएं, चुने गए एक ही क्षेत्र में होनी चाहिए.
a. "yoga_set" डेटासेट बनाएं इसके लिए:
BigQuery Editor पर जाएं और कमांड टाइप करें:
CREATE SCHEMA `<<project_id>>.yoga_set`;
b. BigLake कनेक्शन की मदद से, हम BigQuery ऐक्सेस कंट्रोल और सुरक्षा को बनाए रखते हुए, बाहरी डेटा सोर्स को कनेक्ट कर पाते हैं. हमारे मामले में, इमेज के डेटा के लिए Cloud Storage का इस्तेमाल किया जाता है. हम इस कनेक्शन का इस्तेमाल, Cloud Storage में मौजूद ऑब्जेक्ट पढ़ने के लिए करेंगे. BigLake कनेक्शन बनाने के लिए, नीचे दिया गया तरीका अपनाएं.
BigQuery पेज के एक्सप्लोरर पैनल पर, 'डेटा जोड़ें' पर क्लिक करें:
BigQuery "बाहरी डेटा जोड़ें" स्क्रीन
बाहरी डेटा सोर्स के कनेक्शन पर क्लिक करें. इसके बाद, BigLake और रिमोट फ़ंक्शन के विकल्प चुनें:
बाहरी डेटा सोर्स का कनेक्शन कॉन्फ़िगर करें
कनेक्शन आईडी दें और कनेक्शन बनाएं. सेवा खाता आईडी को नोट करना न भूलें, जो कनेक्शन बनने के बाद स्क्रीन पर दिखेगा <<SERVICE_ACCOUNT>>. हमारे उदाहरण में, कनेक्शन आईडी "योग-पोज़-कॉन" है. क्षेत्र को नोट करना न भूलें.
4. Google Cloud Storage बकेट बनाएं और अनुमतियां दें
हम Google Cloud Storage बकेट का इस्तेमाल करके, योग के पोज़ वाली इमेज फ़ाइलों को शामिल करेंगे. ये ऐसी फ़ाइलें हैं जिनके आधार पर हमें योग बनाना है. बकेट, Cloud Storage के कंटेनर होते हैं. इनमें ऐसी इमेज होती हैं जिनका हम विश्लेषण करने वाले हैं.
a. Google Cloud Storage पर जाएं और उसे कंसोल में खोजें. इसके बाद, बकेट के होम पेज पर जाने के लिए बकेट पर क्लिक करें और 'बनाएं' पर क्लिक करें
Google Cloud Storage बकेट पेज
b. 'एक बकेट बनाएं' पेज पर, अपनी बकेट की जानकारी (एक खास नाम) डालें और जारी रखें, पक्का करें कि यह उसी क्षेत्र में हो जहां डेटासेट और ऊपर के चरणों में बताए गए कनेक्शन हैं और 'बनाएं' पर क्लिक करें.
Google Cloud Storage के लिए बकेट पेज बनाना
अगले चरण पर जाने से पहले, पक्का करें कि आपने अपना सेवा खाता, बकेट का नाम, और पाथ नोट कर लिया हो.
c. बकेट बन जाने के बाद, अपनी इमेज सेव करें (कंसोल या क्लाउड शेल कमांड या प्रोग्राम के हिसाब से) की मदद से. साथ ही, कनेक्शन के सेवा खाते (जिसे हमने पहले सेव किया था) को इमेज ऐक्सेस करने के लिए ज़रूरी अनुमतियां दें
> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"
5. ऑब्जेक्ट टेबल बनाना
हमने जो कनेक्शन बनाया है उसका इस्तेमाल करके, बकेट में स्ट्रक्चर नहीं किए गए डेटा को ऐक्सेस करने के लिए, BigQuery से एक बाहरी ऑब्जेक्ट टेबल बनाएं. नीचे दिए गए '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 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 Model का इस्तेमाल करेंगे. ResNet 50 मॉडल, इमेज फ़ाइलों का विश्लेषण करता है और वेक्टर का एक बैच तैयार करता है. इससे यह पता चलता है कि कोई इमेज, उससे जुड़ी क्लास (लॉजिट) से जुड़ी है या नहीं.
इस चरण पर जाने से पहले, पक्का करें कि आपके पास सभी ज़रूरी अनुमतियां हैं. इसके बाद, यह तरीका अपनाएं:
- इस जगह से मॉडल डाउनलोड करें और इसे अपने लोकल स्टोर में सेव करें
- इसे saved_model.pb और वैरिएबल फ़ोल्डर में अनपैकेज किया जाना चाहिए
- इन दोनों (फ़ाइल और फ़ोल्डर) को पिछले सेक्शन में बनाए गए बकेट में अपलोड करें
Google Cloud Storage बकेट "yoga_images" अपलोड की गई ResNet Model फ़ाइलों के साथ
यह चरण पूरा हो जाने के बाद, आपकी मॉडल संबंधी फ़ाइलें उसी बकेट में मौजूद होनी चाहिए, जिसमें आपकी चित्र ऊपर दी गई चित्र में दिखाई गई हैं.
7. मॉडल को BQML में लोड करें और अनुमान लगाएं
इस चरण में, हम मॉडल को उसी BigQuery डेटासेट में लोड करेंगे जो बाहरी टेबल में है. इसे Cloud Storage में सेव किया जाएगा.
a. BigQuery Editor से, यहां दिया गया एसक्यूएल स्टेटमेंट चलाएं
CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');
एक्ज़ीक्यूशन पूरा होने के बाद (इसमें आपके डेटासेट के आधार पर कुछ समय लग सकता है), आपको BigQuery में अपने डेटासेट सेक्शन में शामिल मॉडल दिखेगा.
BigQuery डेटासेट में, बनाए गए मॉडल की सूची है
b. मॉडल की जांच करके, उसके इनपुट और आउटपुट फ़ील्ड देखें.
डेटासेट को बड़ा करें और उस मॉडल पर क्लिक करें जिसे हमने अभी-अभी "yoga_poss_resnet" बनाया है. स्कीमा टैब पर क्लिक करें:
BigQuery मॉडल डेफ़िनिशन स्कीमा टैब
लेबल सेक्शन में, आपको "Activation_49" दिखेगा फ़ील्ड, जो आउटपुट फ़ील्ड को दिखाता है. सुविधाएं सेक्शन में, आपको "input_1" दिखेगा जो उस फ़ील्ड को दिखाता है जिसे मॉडल में इनपुट करना चाहिए. आप "input_1" का संदर्भ देंगे का इस्तेमाल, अपने अनुमान क्वेरी (या अनुमान क्वेरी) में, "test" के लिए पास की जाने वाली फ़ील्ड के तौर पर करें डेटा शामिल है.
c. योग करें!
आइए, अभी बनाए गए मॉडल का इस्तेमाल करके, टेस्ट इमेज डेटा को कैटगरी में बांटते हैं. पक्का करें कि आपके पास अपने Cloud Storage बकेट से पहचाने गए कुछ टेस्ट इमेज (योग की स्थितियां) हों, जिन्हें बनाते समय हमने उसे एक्सटर्नल टेबल में बदल दिया था. हम अभी-अभी बनाए गए BQML मॉडल का इस्तेमाल करके अनुमान लगाने के लिए, BigQuery में उन टेस्ट इमेज के लिए चुनिंदा क्वेरी करने जा रहे हैं. जांच को ट्रिगर करने के लिए, नीचे दी गई क्वेरी का इस्तेमाल करें.
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 एसक्यूएल के UNNEST कंस्ट्रक्ट का इस्तेमाल करके ऐक्टिवेशन_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 में डेटाबेस या अन्य पूरी तरह से लागू ऐप्लिकेशन के बारे में ज़्यादा जानना है, तो कृपया मेरे ब्लॉग पर जाएं.