1. مقدمة
في هذا الدرس التطبيقي حول الترميز، سنتناول حالة استخدام لتخزين صور أوضاع اليوغا وتحليلها في BigQuery، وتنفيذ نموذج تصنيف باستخدام BigQuery ML لتصنيف الأوضاع باستخدام بنى SQL فقط وبدون أي شكل آخر من أشكال الرموز البرمجية.
BigQuery وBQML
BigQuery هو مستودع بيانات متعدد السحب الإلكترونية يعمل بدون خادم ويمكنه التوسّع من البايت إلى البيتابايت بدون أي تكاليف تشغيلية إضافية. وهذا يجعلها خيارًا رائعًا لتخزين بيانات التدريب الخاصة بالتعلم الآلي. بالإضافة إلى ذلك، تتيح لك إمكانات BigQuery Machine Learning ( BQML) وإمكانات التحليلات المضمّنة إنشاء توقّعات بدون كتابة أي رمز باستخدام طلبات SQL فقط. ويمكنك الوصول إلى البيانات من مصادر خارجية باستخدام طلبات البحث الموحّدة، ما يلغي الحاجة إلى مسارات ETL المعقّدة. يمكنك الاطّلاع على مزيد من المعلومات حول كل ما تقدّمه BigQuery في صفحة BigQuery.
حتى الآن، نعرف BigQuery على أنّه مستودع بيانات سحابي مُدار بالكامل يساعد المستخدمين في تحليل البيانات المنظَّمة وشبه المنظَّمة. ولكن،
- تم توسيع نطاق BigQuery ليشمل إجراء جميع عمليات الإحصاء وتعلُّم الآلة على البيانات غير المنظَّمة أيضًا
- يمكننا استخدام لغة الاستعلامات البنيوية (SQL) لإجراء تحليلات مفيدة وإحصاءات وتعلُّم الآلة على الصور والفيديوهات والصوت وما إلى ذلك على نطاق واسع بدون الحاجة إلى كتابة رمز إضافي
- لدينا القدرة على دمج البيانات المنظَّمة وغير المنظَّمة كما لو كانت كلها موجودة معًا في جدول
سنتناول هذه المقاييس في حالة استخدام "تصنيف وضعيات اليوغا" التي سنتحدّث عنها في القسم التالي.
تصنيف بيانات الصور باستخدام 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 لتحليل بيانات الصور
- لغة الاستعلامات البنيوية (SQL) في BigQuery للاستعلام عن البيانات المنظَّمة وغير المنظَّمة معًا
أهداف الدورة التعليمية
- كيفية إنشاء حزمة في Cloud Storage وتخزين الصور فيها
- كيفية إنشاء مجموعة بيانات وجدول وعملية ربط في BigQuery
- كيفية إنشاء نموذج لتصنيف بيانات الصور باستخدام BQML
- كيفية التوقّع باستخدام النموذج الذي تم إنشاؤه باستخدام BigQuery ML
- كيفية طلب الصور ودمجها مع البيانات المنظَّمة باستخدام طلبات SQL في BigQuery
2. المتطلبات
3- إنشاء مجموعة بيانات وعملية ربط BigLake
بالنسبة إلى حالة الاستخدام الخاصة بنا في رصد 5 وضعيات يوغا، استخدمتُ مجموعة بيانات متاحة للجميع، ويمكنك الوصول إلى مجموعة البيانات من مستودع GitHub هذا. تقتصر وضعيات اليوغا التي نرصدها على وضعية الكلب المتجه للأسفل ووضعية الإلهة ووضعية اللوح ووضعية الشجرة ووضعية المحارب 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 Connection.
انقر على "إضافة بيانات" (ADD DATA) في جزء "المستكشف" (Explorer) من صفحة BigQuery:
شاشة "إضافة بيانات خارجية" في BigQuery
انقر على عمليات الربط بمصادر البيانات الخارجية واختَر خيار BigLake و"الدوال عن بُعد":
ضبط إعدادات الاتصال بمصدر بيانات خارجي
قدِّم رقم تعريف الاتصال وأنشئ الاتصال. احرص على تدوين معرّف حساب الخدمة الذي سيظهر على الشاشة بعد إنشاء الاتصال <<SERVICE_ACCOUNT>>. في مثالنا، معرّف الاتصال هو "yoga-pose-conn". تذكَّر تدوين المنطقة.
4. إنشاء حزمة Google Cloud Storage ومنح الأذونات
سنستخدم حزمة Google Cloud Storage لاحتواء ملفات صور وضعيات اليوغا التي نريد إنشاء النموذج عليها. الحِزم هي حاويات Cloud Storage التي تحتوي على الصور التي سنحلّلها.
أ. انتقِل إلى Google Cloud Storage من خلال البحث عنه في وحدة التحكّم، ثم انقر على "الحِزم" (Buckets) للانتقال إلى الصفحة الرئيسية للحِزم، ثم انقر على "إنشاء" (CREATE).
صفحة حِزم 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 لتصوّر النتيجة:
انقر على "حفظ النتائج" (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 ملفات الصور ويُخرج مجموعة من المتجهات التي تمثّل احتمالية انتماء صورة إلى الفئة المقابلة (logits).
قبل الانتقال إلى هذه الخطوة، تأكَّد من توفّر جميع الأذونات اللازمة. بعد ذلك، اتّبِع الخطوات التالية:
- نزِّل النموذج من هذا الموقع الجغرافي واحفظه في جهازك
- يجب أن يتم فك حزمة الملف إلى saved_model.pb ومجلد المتغيرات.
- حمِّل هذين العنصرين (الملف والمجلد) إلى الحِزمة التي أنشأناها في القسم السابق.
حزمة Google Cloud Storage "yoga_images" التي تم تحميل ملفات نموذج ResNet إليها
بعد إكمال هذه الخطوة، يجب أن تكون الملفات ذات الصلة بالنموذج متوفرة في الحزمة نفسها التي تحتوي على الصور كما هو موضّح في الصورة أعلاه.
7. تحميل النموذج إلى BQML والاستنتاج
في هذه الخطوة، سنحمّل النموذج إلى مجموعة بيانات BigQuery نفسها التي أنشأنا فيها الجدول الخارجي سابقًا، وسنطبّقه على الصور التي خزّناها في Cloud Storage.
أ. من "محرّر BigQuery"، نفِّذ عبارة SQL التالية
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')));
في الاستعلام أعلاه، نختار صورة اختبار واحدة تم تحديدها على أنّها تحتوي على قيمة معرّف موارد موحّد (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 Notebook باستخدام أوامر BigQuery Magic.
9- تَنظيم
لتجنُّب تحمّل رسوم في حسابك على Google Cloud مقابل الموارد المستخدَمة في هذه المشاركة، اتّبِع الخطوات التالية.
- في Google Cloud Console، انتقِل إلى صفحة إدارة الموارد.
- في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على "حذف".
- في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على "إيقاف" لحذف المشروع.
10. تهانينا
تهانينا! لقد تمكّنت بنجاح من تخزين البيانات غير المنظَّمة والاستعلام عنها في BigQuery، وإنشاء "نموذج تصنيف" باستخدام BQML، والتنبؤ بوضعيات اليوغا التجريبية باستخدام النموذج. إذا أردت تنفيذ ذلك، ابدأ بمشروعك على Google Cloud. إذا أردت معرفة المزيد عن قواعد البيانات أو عمليات تنفيذ التطبيقات الأخرى المتكاملة في Google Cloud، يُرجى الانتقال إلى مدوّناتي.