1- مقدمة
في هذا الدرس التطبيقي حول الترميز، سنناقش حالة استخدام تخزين صور وضعيات اليوغا وتحليلها في BigQuery، وتنفيذ نموذج تصنيف باستخدام BigQuery ML لتصنيف الوضعيات باستخدام بُنى SQL فقط وبدون أي شكل آخر من أشكال الرموز البرمجية.
BigQuery وBQML
BigQuery هو مستودع بيانات متعدد السحب الإلكترونية يعمل بدون خادم ويمكنه التوسّع من البايتات إلى البيتابايتات بدون أي تكاليف تشغيلية. ما يجعله خيارًا رائعًا لتخزين بيانات تدريب تعلُّم الآلة. بالإضافة إلى ذلك، تتيح لك إمكانات تعلُّم الآلة ( BQML) والتحليلات المضمّنة في BigQuery إنشاء توقّعات بدون رموز برمجية باستخدام طلبات SQL فقط. ويمكنك الوصول إلى البيانات من مصادر خارجية باستخدام طلبات البحث الموحّدة، ما يلغي الحاجة إلى مسارات ETL المعقّدة. يمكنك قراءة المزيد عن كل ما يقدّمه BigQuery في صفحة BigQuery page.
حتى الآن، نعرف BigQuery على أنّه مستودع بيانات في السحابة الإلكترونية مُدار بالكامل يساعد المستخدمين في تحليل البيانات المنظَّمة وشبه المنظَّمة. ولكن،
- توسّع BigQuery ليشمل إجراء جميع التحليلات وتعلُّم الآلة على البيانات غير المنظَّمة أيضًا
- يمكننا استخدام طلبات SQL لإجراء تحليلات ورؤى وتحليلات وتعلُّم آلة على الصور والفيديوهات والمقاطع الصوتية وما إلى ذلك على نطاق واسع بدون الحاجة إلى كتابة رموز برمجية إضافية
- لدينا القدرة على دمج البيانات المنظَّمة وغير المنظَّمة كما لو كانت جميعها موجودة معًا في جدول
سنتناول هذه النقاط في حالة استخدام تصنيف وضعيات اليوغا التي يتم تناولها في القسم التالي.
تصنيف بيانات الصور باستخدام BigQuery ML
إنّ القدرة على معالجة الصور وتحليلها باستخدام طلبات البحث المنظَّمة كما لو كانت بيانات منظَّمة هي الأولى من نوعها. يمكننا الآن حتى توقّع النتائج باستخدام نماذج تصنيف تعلُّم الآلة باستخدام BigQuery ML. لقد قمت بتضييق نطاق المراحل المعنيّة إلى 5 خطوات لسهولة الفهم:

قد تبدو الخطوات أعلاه معقّدة إذا نظرنا إليها على أنّها تصنيفات فقط. يتم تحديد تفاصيل كل مكوّن من المكوّنات المعنيّة، مثل مجموعة بيانات BigQuery، وLakehouse لعملية الربط بتنسيق Iceberg من Apache، وحِزم Cloud Storage (الحاويات)، وجدول الكائنات (مصدر البيانات الخارجي)، وBQML وما إلى ذلك، في قسم التنفيذ. لذا، لا تقلق إذا لم تكن على دراية بهذه المصطلحات بعد.
ما ستنشئه
ستنشئ نموذج تصنيف بيانات الصور باستخدام BQML، ويشمل ما يلي:
- مجموعة بيانات BigQuery تحتوي على الجدول ومكوّنات النموذج
- حزمة Google Cloud Storage (GCS) لتخزين صور اليوغا للنموذج
- جدول خارجي للوصول إلى صور Cloud Storage
- عملية ربط بـ Lakehouse للجدول الخارجي للوصول إلى الصور في GCS
- نموذج ResNet في BigQuery ML
- الاستنتاج باستخدام النموذج الذي تم إنشاؤه
- لغة الاستعلامات البنيوية (SQL) في BigQuery لتحليل بيانات الصور
- لغة الاستعلامات البنيوية (SQL) في BigQuery للاستعلام عن البيانات المنظَّمة وغير المنظَّمة معًا
أهداف الدورة التعليمية
- كيفية إنشاء حزمة في Cloud Storage وتخزين الصور
- كيفية إنشاء مجموعة بيانات وجدول وعملية ربط في BigQuery
- كيفية إنشاء نموذج تصنيف بيانات الصور باستخدام BQML
- كيفية التوقّع باستخدام النموذج الذي تم إنشاؤه باستخدام BigQuery ML
- كيفية الاستعلام عن الصور ودمجها مع البيانات المنظَّمة باستخدام طلبات SQL في BigQuery
2. المتطلبات
3. إنشاء مجموعة بيانات وعملية ربط بـ Lakehouse
بالنسبة إلى حالة استخدامنا المتمثلة في رصد 5 وضعيات يوغا في الصور، استخدمت مجموعة بيانات متاحة للجميع dataset ويمكنك الوصول إلى مجموعة البيانات من هذا repo. تقتصر وضعيات اليوغا التي نحدّدها على وضعية الكلب المتجه للأسفل ووضعية الإلهة ووضعية اللوح ووضعية الشجرة ووضعية المحارب 2. قبل البدء بإنشاء مجموعة بيانات BigQuery، تأكَّد من اختيار مشروع على Google Cloud أو إنشائه، وتحقَّق مما إذا كانت الفوترة مفعّلة في المشروع. فعِّل BigQuery API وBigQuery Connection API. يُرجى العِلم أنّ جميع الخدمات المستخدَمة في هذا التنفيذ يجب أن تكون في المنطقة نفسها التي تختارها.
أ. أنشئ مجموعة البيانات "yoga_set" باستخدام الخطوات الموضّحة أدناه:
انتقِل إلى BigQuery Editor واكتب الأمر:
CREATE SCHEMA `<<project_id>>.yoga_set`;
ب. تتيح لنا عملية الربط بـ Lakehouse ربط مصدر البيانات الخارجي مع الاحتفاظ بميزة التحكّم الدقيق في إمكانية الوصول والأمان في BigQuery، وهو في حالتنا Cloud Storage لبيانات الصور. سنستخدم عملية الربط هذه لقراءة الكائنات من Cloud Storage. اتّبِع الخطوات أدناه لإنشاء عملية الربط بـ Lakehouse.
انقر على "إضافة بيانات" (ADD DATA) في لوحة "Explorer" (المستكشف) ضمن صفحة BigQuery:
شاشة BigQuery "إضافة بيانات خارجية"
انقر على عمليات الربط بمصادر البيانات الخارجية (Connections to external data sources) واختَر خيار Lakehouse و"الدوال عن بُعد" (Remote functions):
ضبط عملية الربط بمصدر البيانات الخارجية
قدِّم رقم تعريف عملية الربط وأنشئ عملية الربط. تذكَّر تدوين رقم تعريف حساب الخدمة الذي سيظهر على الشاشة بعد إنشاء عملية الربط <<SERVICE_ACCOUNT>>. في مثالنا، رقم تعريف عملية الربط هو "yoga-pose-conn". تذكَّر تدوين المنطقة.
4. إنشاء حزمة في Google Cloud Storage ومنح الأذونات
سنستخدم حزمة Google Cloud Storage لتضمين ملفات صور وضعيات اليوغا التي نريد إنشاء النموذج عليها. الحِزم هي حاويات Cloud Storage تحتوي على الصور التي سنحلّلها.
أ. انتقِل إلى Google Cloud Storage من خلال البحث عنه في وحدة التحكّم، ثم انقر على "الحِزم" (Buckets) للانتقال إلى الصفحة الرئيسية للحِزم، وانقر على "إنشاء" (CREATE).
صفحة حِزم Google Cloud Storage
ب. في صفحة "إنشاء حزمة"، أدخِل معلومات الحزمة (اسمًا فريدًا) وتابِع، وتأكَّد من أنّها في المنطقة نفسها التي توجد فيها مجموعة البيانات وعملية الربط اللتين تمت مناقشتهما في الخطوات أعلاه، وانقر على "إنشاء" (create).
صفحة "إنشاء حزمة" في Google Cloud Storage
قبل الانتقال إلى الخطوة التالية، تأكَّد من تدوين حساب الخدمة واسم الحزمة والمسار.
ج. بعد إنشاء الحزمة، خزِّن صورك (من خلال وحدة التحكّم أو أوامر Cloud Shell أو برمجيًا) وامنح الأذونات اللازمة لحساب خدمة عملية الربط (الذي حفظناه سابقًا) للوصول إلى الصور.
> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"
5. إنشاء جدول كائنات
أنشئ جدول كائنات خارجيًا من BigQuery للوصول إلى البيانات غير المنظَّمة في الحزمة باستخدام عملية الربط التي أنشأناها. نفِّذ طلب SQL التالي من BigQuery Editor:
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 البرمجي لتصوّر النتيجة:
انقر على "حفظ النتائج" (SAVE RESULTS) واختَر خيار "ملف CSV محلي" (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 ومجلد variables.
- حمِّل هذين العنصرَين (الملف والمجلد) إلى الحزمة التي أنشأناها في القسم السابق.
حزمة Google Cloud Storage "yoga_images" التي تم تحميل ملفات نموذج ResNet إليها
بعد إكمال هذه الخطوة، يجب أن تظهر الملفات ذات الصلة بالنموذج في الحزمة نفسها التي تحتوي على صورك، كما هو موضّح في الصورة أعلاه.
7. تحميل النموذج إلى BQML والاستنتاج
في هذه الخطوة، سنحمِّل النموذج إلى مجموعة بيانات BigQuery نفسها التي تحتوي على الجدول الخارجي الذي أنشأناه سابقًا، ونطبّقه على الصور التي خزّناها في Cloud Storage.
أ. من BigQuery Editor، نفِّذ طلب SQL التالي:
CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');
بعد اكتمال التنفيذ (الذي قد يستغرق بعض الوقت حسب مجموعة البيانات)، سيظهر النموذج في قسم "مجموعة البيانات" (Dataset) في BigQuery.
مجموعة بيانات BigQuery تعرض النموذج الذي تم إنشاؤه
ب. افحص النموذج للاطّلاع على حقول الإدخال والإخراج.
وسِّع مجموعة البيانات وانقر على النموذج الذي أنشأناه للتو "yoga_poses_resnet". انقر على علامة التبويب "المخطط" (Schema):
علامة التبويب "المخطط" (Schema) لتعريف نموذج BigQuery
في قسم "التصنيفات" (Labels)، يظهر الحقل "activation_49" الذي يمثّل حقل الإخراج. في قسم "الميزات" (Features)، يظهر "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')));
في طلب البحث أعلاه، نختار صورة اختبار واحدة تم تحديدها على أنّها تحتوي على قيمة 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 البرمجي.

تشير نتيجة الصورة أعلاه إلى وضعية اليوغا "الكلب المتجه للأسفل"، وهي نفسها تمامًا بيانات الاختبار التي مرّرناها إلى طلب البحث ML.PREDICT للتصنيف باستخدام BQML!
8. توحيد البيانات المنظَّمة وغير المنظَّمة
أخيرًا، الجزء المفضّل لديّ في هذا التنفيذ هو توحيد الحقول من جدولي العلائقي المنظَّم مع بيانات الصور غير المنظَّمة هذه. لقد أنشأتُ جدول BigQuery منظَّمًا في مجموعة البيانات نفسها التي تحتوي على الجدول الخارجي لتخزين الوضعية والبيانات ذات الصلة بالصحة.
مخطط جدول BigQuery المنظَّم "yoga_health"
تمثّل الصورة أعلاه مخطط جدول البيانات المنظَّمة الذي يحمل الاسم "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، انتقِل إلى صفحة "إدارة الموارد".
- في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على "حذف" (Delete).
- في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على "إيقاف" (Shut down) لحذف المشروع.
10- تهانينا
تهانينا! لقد نجحت في تخزين البيانات غير المنظَّمة والاستعلام عنها في BigQuery، وأنشأت نموذج تصنيف باستخدام BQML، وتوقّعت وضعيات اليوغا التجريبية باستخدام النموذج. إذا أردت تنفيذ ذلك، ابدأ بمشروعك على Google Cloud. أيضًا، إذا أردت معرفة المزيد عن قواعد البيانات أو عمليات تنفيذ التطبيقات الأخرى المتكاملة في Google Cloud، يُرجى الانتقال إلى مدوناتي.