تصنيف بيانات الصور باستخدام BigQuery ML

1. مقدمة

في هذا الدرس التطبيقي حول الترميز، سنناقش حالة استخدام تخزين وتحليل صور أوضاع اليوغا في BigQuery وتنفيذ نموذج تصنيف باستخدام BigQuery ML لتسمية الأوضاع باستخدام تراكيب SQL فقط وبدون أي شكل آخر من الرموز.

BigQuery وBQML

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

تُعرف أداة BigQuery حتى الآن بأنّها مستودع بيانات السحابة الإلكترونية المُدار بالكامل الذي يساعد المستخدمين في تحليل البيانات المنظَّمة وشبه المنظَّمة. لَكِنْ،

  • توسع BigQuery لإجراء جميع التحليلات وتعلُّم الآلة على البيانات غير المهيكلة أيضًا
  • يمكننا استخدام استعلامات SQL لإجراء تحليل مستنيرة وتحليلات وتعلُّم الآلة على الصور والفيديوهات والصوت وما إلى ذلك على نطاق واسع دون الحاجة إلى كتابة تعليمات برمجية إضافية
  • لدينا القدرة على الجمع بين البيانات المهيكلة وغير المهيكلة كما لو كانت جميعها موجودة معًا في جدول

سنناقش ذلك في حالة استخدام تصنيف وضعية اليوغا التي يتناولها القسم التالي.

تصنيف بيانات الصور باستخدام BigQuery ML

إنّ القدرة على معالجة الصور وتحليلها باستخدام طلبات البحث المنظَّمة هي الأولى من نوعها. يمكننا الآن حتى التنبؤ بالنتائج باستخدام نماذج تصنيف التعلم الآلي باستخدام BigQuery ML. لقد اختصرت المراحل التي ينطوي عليها الفهم في 5 خطوات لتسهيل فهمها:

fe97945bce996e1.jpeg

قد تكون الخطوات المذكورة أعلاه معقدة إذا كنا ننظر إليها فقط كتسميات. في قسم التنفيذ، يتم تحديد تفاصيل كل عنصر من المكوّنات المعنيّة، مثل مجموعة بيانات BigQuery واتصال BigLake وCloud Storage Buckets (الحاويات) وجدول العناصر (مصدر البيانات الخارجي) وBQML وما إلى ذلك. لذلك لا تفقد الثقة إذا لم تكن معتادًا على هذه المصطلحات بعد.

ما الذي ستقوم ببنائه

ستنشئ نموذجًا لتصنيف بيانات الصور مع BQML يغطي ما يلي:

  • مجموعة بيانات BigQuery لتحتوي على مكونات الجدول والنموذج
  • حزمة Google Cloud Storage (GCS) لتخزين صور اليوغا للنموذج
  • جدول خارجي للوصول إلى صور Cloud Storage
  • اتصال BigLake للجدول الخارجي للوصول إلى الصور في فريق GCS
  • نموذج ResNet في تعلُّم الآلة في BigQuery
  • الاستنتاج باستخدام النموذج الذي تم إنشاؤه
  • لغة الاستعلامات البنيوية (SQL) في BigQuery لتحليل بيانات الصور
  • BigQuery SQL للاستعلام عن البيانات المهيكلة وغير المهيكلة معًا

ما ستتعرَّف عليه

  • كيفية إنشاء حزمة Cloud Storage وتخزين الصور
  • كيفية إنشاء مجموعة بيانات وجدول وربط في BigQuery
  • كيفية إنشاء نموذج تصنيف بيانات الصور باستخدام BQML
  • كيفية التنبؤ من خلال النموذج الذي تم إنشاؤه باستخدام BigQuery ML
  • كيفية طلب البحث عن الصور والدمج مع البيانات المنظَّمة باستخدام لغة الاستعلامات البنيوية (SQL) في BigQuery

2. المتطلبات

  • متصفح، مثل Chrome أو Firefox
  • مشروع على Google Cloud تم تفعيل الفوترة فيه ويحتوي على خدمات BigQuery وCloud Storage وBigLake Connection
  • يتضمّن القسم التالي قائمة بالخطوات اللازمة لإنشاء تطبيق تصنيف بيانات الصور.

3- إنشاء مجموعة بيانات واتصال BigLake

في حالة استخدامنا لرصد الصور لخمس أوضاع يوغا، استخدمتُ مجموعة البيانات المتاحة للجميع ويمكنك الوصول إلى مجموعة البيانات من خلال المستودع هذا. تقتصر وضعات اليوجا التي نحددها على Downdog والإلهة والبلانك والشجرة والمحارب 2. قبل البدء بإنشاء مجموعة بيانات في BigQuery، احرص على اختيار مشروع على Google Cloud أو إنشاء مشروع والتحقّق مما إذا كانت الفوترة مفعَّلة فيه. تفعيل BigQuery API وBigQuery Connection API يُرجى العِلم أنّ جميع الخدمات المستخدَمة في عملية التنفيذ هذه يجب أن تكون في المنطقة نفسها التي يتم اختيارها.

أ. إنشاء مجموعة البيانات "yoga_set" باستخدام الخطوات الموضحة أدناه:

انتقل إلى محرر BigQuery واكتب الأمر:

CREATE SCHEMA `<<project_id>>.yoga_set`;

ب- يتيح لنا BigLake Connection ربط مصدر البيانات الخارجي مع الاحتفاظ بالتحكُّم في الوصول إلى BigQuery الدقيق والدقيق، وهو في حالتنا خدمات Cloud Storage لبيانات الصور. سنستخدم هذا الاتصال لقراءة العناصر من Cloud Storage. اتبع الخطوات أدناه لإنشاء اتصال BigLake Connection.

انقر فوق "ADD DATA" (إضافة بيانات) في جزء "Explorer" (المستكشف) من صفحة BigQuery:

4cb42b1245bb0ba6.png"إضافة بيانات خارجية" في BigQuery الشاشة

انقر على الاتصالات بمصادر البيانات الخارجية وحدِّد خيار BigLake وRemote الدالتين:

9ffec2b2bfcc3cd5.pngإعداد اتصال مصدر البيانات الخارجي

قدِّم رقم تعريف الاتصال وأنشِئ الاتصال. لا تنسَ تدوين رقم تعريف حساب الخدمة الذي سيظهر على الشاشة بعد إنشاء الاتصال <<SERVICE_ACCOUNT>>. في المثال السابق، رقم تعريف الاتصال هو "yoga-pose-conn". تذكر تحديد المنطقة.

4. إنشاء حزمة Google Cloud Storage ومنح الأذونات

سنستخدم حزمة Google Cloud Storage لتضمين ملفات صور وضعيات اليوغا التي نريد إنشاء النموذج عليها. الحزم عبارة عن حاويات في Cloud Storage تحتوي على الصور التي نحللها.

أ. انتقِل إلى Google Cloud Storage من خلال البحث عنها في وحدة التحكّم، ثم انقر على "Buckets" (الحزم) للوصول إلى صفحة Buckets الرئيسية، ثم انقر على "CREATE" (إنشاء)

a6f6b26cffb53ae0.pngصفحة حزم Google Cloud Storage

ب- في صفحة "إنشاء حزمة"، أدخِل معلومات الحزمة (اسم فريد) وتابِع، تأكَّد من أنّها في المنطقة نفسها التي تقع فيها مجموعة البيانات والاتصال الذي تمت مناقشته في الخطوات أعلاه، ثم انقر على "إنشاء".

1280366a42b7bdf6.pngإنشاء صفحة حزمة في 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"]);

يتم إنشاء الجدول الخارجي كما هو موضّح أدناه:

bda48f566e0c292f.png

لنطلب بسرعة عن وضعية معيّنة من الجدول الخارجي الذي تم إنشاؤه حديثًا:

SELECT data , uri
FROM `yoga_set.yoga_poses`
WHERE REGEXP_CONTAINS(uri, 'gs://yoga_images/Downdog')
Limit 1;

كما ترى في لقطة الشاشة أدناه، يمكنك إنشاء صور غير مهيكلة والعمل عليها كما لو كانت بيانات مهيكلة:

7d1784122b5013f.png

لنقم الآن بتصدير نتيجة الاستعلام أعلاه إلى مقتطف بايثون صغير لعرض النتيجة:

انقر على "حفظ النتائج" واختَر "ملف CSV المحلي". لتصدير النتيجة. بعد ذلك، افتح ورقة ملاحظات 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)

نفِّذ هذا الإجراء للاطّلاع على النتيجة على النحو التالي:

b8edd68cb281786a.png

والآن بعد أن أنشأنا الجدول الخارجي ووصلنا إلى الصور من Cloud Storage فقط باستخدام استعلامات SQL، لننتقل إلى القسم التالي وهو إنشاء نموذج التصنيف.

6- إنشاء النموذج وتحميله إلى Google Cloud Storage

لتنفيذ هذا الإجراء، سنستخدم نموذج ResNet 50 المدرَّب مسبقًا لتنفيذ الاستنتاج على جدول الكائنات الذي أنشأناه للتو. يحلل نموذج ResNet 50 ملفات الصور ويخرج مجموعة من المتجهات التي تمثل احتمالية انتماء الصورة إلى الفئة المقابلة لها (logits).

قبل الانتقال إلى هذه الخطوة، تأكَّد من أنّه لديك جميع الأذونات اللازمة. بعد ذلك، يُرجى اتّباع الخطوات التالية:

  1. نزِّل النموذج من هذا الموقع الجغرافي واحفظه في منطقتك.
  2. يجب إلغاء حزمةته في saved_model.pb ومجلد متغيرات.
  3. حمِّل هذين العنصرَين (الملف والمجلد) إلى الحزمة التي أنشأناها في القسم السابق.

2629ff3eda214946.pngحزمة 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>>/*');

بعد اكتمال التنفيذ (الأمر الذي قد يستغرق بعض الوقت اعتمادًا على مجموعة البيانات)، سترى النموذج مُدرجًا في قسم "مجموعة البيانات" في BigQuery.

435fa0919aeb57a6.pngتسرد مجموعة بيانات BigQuery النموذج الذي تم إنشاؤه

ب- افحص النموذج للاطّلاع على حقلَي الإدخال والمخرجات.

قم بتوسيع مجموعة البيانات وانقر فوق النموذج الذي أنشأناه للتو "yoga_positions_resnet". انقر فوق علامة التبويب المخطط:

e88928764f10f6ff.pngعلامة تبويب لمخطط تعريف نموذج BigQuery

في قسم "التصنيفات"، سيظهر الرمز " التحرير_49" الذي يمثل حقل الإخراج. في قسم "الميزات"، يمكنك رؤية "input_1" الذي يمثل الحقل المتوقع إدخاله في النموذج. ستشير إلى "input_1" في طلب الاستنتاج (أو طلب البحث الخاص بالتنبؤ) باعتباره الحقل الذي تمرره لاختبار "الاختبار" البيانات.

ج. استنتاج وضعية اليوغا

لنستخدم النموذج الذي أنشأناه للتو لتصنيف بيانات الصور الاختبارية. تأكَّد من أنّ بعض الصور الاختبارية (وضعيات اليوغا) تم تحديدها من خلال Cloud Storage Bucket ودمجتها في الجدول الخارجي عند إنشائها. وسنقوم بشكل انتقائي بالاستعلام عن صور الاختبار هذه في 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.

وبعد اكتمال التنفيذ، ستَظهر النتيجة كما هو موضّح أدناه:

867018993845e943.png

أما بالنسبة إلى الأشخاص الذين يعرفون نموذج ResNet بعمق، فسيساعدهم ذلك في فهم طريقة التصنيف. أو لنقم بترميز مقتطف صغير لفهم التصنيف بشكل مرئي.

د- تنظيم النتيجة

تتمثل إحدى طرق تصور الإخراج أعلاه في تبسيط قيم الحقل enable_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;

بدون منطق تصنيف الفئة، يوجد أدناه مخرجات الاستعلام:

71f580f41f0811f3.png

ومع ذلك، فقد طبقتُ نموذجًا منطقًا في حالتي، وفي ما يلي النتيجة:

1c6df6ecd14fba1.png

ويمكنك قراءة المزيد عن النموذج وتطبيق المنطق الذي يعمل بشكل أفضل مع بياناتك وناتج النموذج.

هـ- تصور الاستنتاج

وأخيرًا، هناك مقتطف بايثون سريع لتصوير نتيجة التصنيف! قم بتصدير نتيجة الاستعلام أعلاه إلى ملف CSV والرجوع إليها في التعليمات البرمجية بايثون.

68756e7e4b8d7a29.png

يشير إخراج الصورة أعلاه إلى وضعية اليوجا "الكلب المتجه للأسفل" وهو بالضبط إدخال الاختبار نفسه الذي مررناه في استعلام ML.PREDICT للتصنيف باستخدام BQML!

8. توحيد البيانات المهيكلة وغير المهيكلة

أخيرًا، الجزء المفضّل من عملية التنفيذ هذه هو توحيد الحقول من جدولي الارتباطي المنظَّم مع بيانات الصور غير المنظَّمة هذه. لقد أنشأت جدول BigQuery منظمًا في نفس مجموعة البيانات مثل الجدول الخارجي للاحتفاظ بالوضع والبيانات المتعلقة بالصحة.

125bdf848c86fbe.pngجدول 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)];

وفي ما يلي النتيجة:

469bdfcffa9e19fd.png

ملاحظة: يمكن تشغيل جميع طلبات البحث التي تناولناها في هذه المدونة مباشرةً من مفكرة Python باستخدام أوامر BigQuery Magic.

9. تَنظيم

لتجنُّب تحصيل رسوم من حسابك على Google Cloud مقابل الموارد المستخدَمة في هذه المشاركة، يُرجى اتّباع الخطوات التالية.

  1. في وحدة التحكّم في Google Cloud، انتقِل إلى صفحة إدارة الموارد.
  2. في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على "حذف".
  3. في مربّع الحوار، اكتب معرّف المشروع، ثم انقر على "إيقاف التشغيل" لحذف المشروع.

10. تهانينا

تهانينا لقد نجحت في تخزين البيانات غير المهيكلة والاستعلام عن البيانات غير المهيكلة في BigQuery، وإنشاء نموذج تصنيف باستخدام BQML ووضعات يوغا للاختبار المتوقعة مع النموذج. إذا أردت تنفيذه، يمكنك بدء استخدام مشروعك على Google Cloud. وإذا أردت أيضًا الاطّلاع على مزيد من المعلومات عن قواعد البيانات أو غيرها من عمليات تنفيذ التطبيقات الشاملة في Google Cloud، يُرجى الانتقال إلى مدوّناتي.