طبقه بندی داده های تصویر با BigQuery ML

1. مقدمه

در این لبه کد، ما در مورد استفاده از ذخیره و تجزیه و تحلیل تصاویر پوزهای یوگا در BigQuery و پیاده سازی یک مدل طبقه بندی با BigQuery ML برای برچسب گذاری پوزها با استفاده از ساختارهای SQL و بدون هیچ شکل دیگری از کد بحث خواهیم کرد.

BigQuery و BQML

BigQuery یک انبار داده بدون سرور و چند ابری است که می تواند از بایت تا پتابایت با سربار عملیاتی صفر مقیاس شود. این باعث می شود که آن را به یک انتخاب عالی برای ذخیره داده های آموزشی ML تبدیل کنید. علاوه بر این، یادگیری ماشینی داخلی BigQuery ( BQML ) و قابلیت‌های تجزیه و تحلیل به شما امکان می‌دهد پیش‌بینی‌های بدون کد را فقط با استفاده از پرس‌وجوهای SQL ایجاد کنید. و می‌توانید با کوئری‌های فدرال به داده‌ها از منابع خارجی دسترسی پیدا کنید و نیاز به خطوط لوله ETL پیچیده را از بین ببرید. می‌توانید در صفحه BigQuery درباره همه چیزهایی که BigQuery ارائه می‌کند بیشتر بخوانید.

تا کنون، BigQuery را به عنوان این انبار داده ابری کاملاً مدیریت شده می شناسیم که به کاربران کمک می کند داده های ساختار یافته و نیمه ساختار یافته را تجزیه و تحلیل کنند. اما،

  • BigQuery گسترش یافته است تا تمام تجزیه و تحلیل ها و ML را روی داده های بدون ساختار نیز انجام دهد
  • ما می توانیم از پرس و جوهای SQL برای انجام تجزیه و تحلیل دقیق، تجزیه و تحلیل و ML بر روی تصاویر، ویدیوها، صدا و غیره در مقیاس بدون نیاز به نوشتن کد اضافی استفاده کنیم.
  • ما این توانایی را داریم که داده های ساختاریافته و بدون ساختار را طوری ترکیب کنیم که انگار همه آنها با هم در یک جدول وجود دارند

ما این موارد را در مورد استفاده طبقه بندی پوز یوگا که در بخش بعدی پوشش داده شده است، مورد بحث قرار خواهیم داد.

طبقه بندی داده های تصویر با BigQuery ML

داشتن توانایی پردازش و تجزیه و تحلیل تصاویر با استفاده از پرس و جوهای ساختاریافته به گونه ای که گویی داده های ساختاری هستند اولین در نوع خود است. اکنون حتی می‌توانیم نتایج را با استفاده از مدل‌های طبقه‌بندی یادگیری ماشین با استفاده از BigQuery ML پیش‌بینی کنیم. من مراحل مربوط به آن را به 5 مرحله برای درک آسان خلاصه کرده ام:

fe97945bce996e1.jpeg

اگر فقط به عنوان برچسب به آنها نگاه کنیم، مراحل فوق می تواند پیچیده باشد. جزئیات هر یک از اجزای درگیر مانند BigQuery Dataset، اتصال BigLake، سطل های ذخیره سازی ابری (ظروف)، جدول شی (منبع داده خارجی)، BQML و غیره همگی در بخش پیاده سازی تعریف شده اند. بنابراین اگر هنوز با این اصطلاحات آشنا نیستید ناامید نشوید.

چیزی که خواهی ساخت

شما یک مدل طبقه بندی داده های تصویری با BQML ایجاد خواهید کرد که موارد زیر را پوشش می دهد:

  • یک مجموعه داده BigQuery که شامل جدول و اجزای مدل است
  • سطل Google Cloud Storage (GCS) برای ذخیره تصاویر یوگا برای مدل
  • یک جدول خارجی برای دسترسی به تصاویر ذخیره سازی ابری
  • یک اتصال BigLake برای جدول خارجی برای دسترسی به تصاویر در GCS
  • مدل ResNet در BigQuery ML
  • استنتاج با استفاده از مدل ایجاد شده
  • BigQuery SQL برای تجزیه و تحلیل داده های تصویر
  • BigQuery SQL برای پرس و جوی داده های ساختاریافته و بدون ساختار با هم

چیزی که یاد خواهید گرفت

  • نحوه ایجاد یک سطل ذخیره سازی ابری و ذخیره تصاویر
  • نحوه ایجاد مجموعه داده، جدول و اتصال BigQuery
  • نحوه ایجاد یک مدل طبقه بندی داده های تصویری با استفاده از BQML
  • چگونه با مدل ایجاد شده با استفاده از BigQuery ML پیش بینی کنیم
  • چگونه با استفاده از BigQuery SQL تصاویر را پرس و جو کنیم و با داده های ساختاریافته ترکیب کنیم

2. الزامات

  • مرورگری مانند کروم یا فایرفاکس
  • یک پروژه Google Cloud با فعال‌سازی صورت‌حساب که شامل خدمات BigQuery، Cloud Storage و BigLake Connection شماست.
  • بخش بعدی لیستی از مراحل ایجاد برنامه طبقه بندی داده های تصویری را دارد

3. Dataset و یک اتصال BigLake ایجاد کنید

برای استفاده ما از تشخیص تصویر 5 حالت یوگا، من از مجموعه داده های عمومی در دسترس استفاده کرده ام و شما می توانید از این مخزن به مجموعه داده دسترسی داشته باشید. ژست های یوگا که ما شناسایی می کنیم به Downdog، Goddess، Plank، Tree و Warrior2 محدود می شود. قبل از شروع ایجاد BigQuery Dataset، مطمئن شوید که یک پروژه Google Cloud را انتخاب کرده یا ایجاد کرده اید و بررسی کنید که آیا صورتحساب در پروژه فعال است یا خیر. BigQuery API و BigQuery Connection API را فعال کنید . لطفاً توجه داشته باشید که تمام خدمات مورد استفاده در این پیاده سازی باید در همان منطقه انتخابی باشند.

الف مجموعه داده "yoga_set" را با استفاده از مراحل زیر ایجاد کنید:

به ویرایشگر BigQuery بروید و دستور را تایپ کنید:

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

ب BigLake Connection به ما این امکان را می دهد که منبع داده خارجی را وصل کنیم در حالی که کنترل دسترسی و امنیت دقیق BigQuery را حفظ می کنیم، که در مورد ما فضای ذخیره سازی ابری برای داده های تصویر است. ما از این اتصال برای خواندن اشیا از Cloud Storage استفاده خواهیم کرد. مراحل زیر را برای ایجاد اتصال BigLake دنبال کنید.

روی ADD DATA در صفحه Explorer صفحه BigQuery کلیک کنید:

4cb42b1245bb0ba6.png صفحه BigQuery "افزودن داده های خارجی".

روی Connections to external data sources کلیک کنید و گزینه BigLake and Remote functions را انتخاب کنید:

9ffec2b2bfcc3cd5.png پیکربندی اتصال منبع داده خارجی

شناسه اتصال را ارائه دهید و اتصال را ایجاد کنید. به یاد داشته باشید که شناسه حساب سرویس را که پس از ایجاد اتصال روی صفحه نمایش داده می شود، یادداشت کنید <<SERVICE_ACCOUNT>>. در مثال ما، شناسه اتصال "yoga-pose-conn" است. به یاد داشته باشید که به منطقه توجه کنید.

4. Google Cloud Storage Bucket را ایجاد کنید و مجوزها را اعطا کنید

ما می‌خواهیم از سطل Google Cloud Storage برای حاوی فایل‌های تصویری پوزهای یوگا استفاده کنیم که می‌خواهیم مدل را روی آن‌ها ایجاد کنیم. سطل ها ظروف Cloud Storage هستند که حاوی تصاویری هستند که ما می خواهیم تجزیه و تحلیل کنیم.

الف با جستجوی آن در کنسول به Google Cloud Storage بروید و سپس روی Buckets کلیک کنید تا در صفحه اصلی Buckets قرار بگیرید و روی ایجاد کلیک کنید.

a6f6b26cffb53ae0.png صفحه Google Cloud Storage Buckets

ب در صفحه ایجاد یک سطل، اطلاعات سطل خود را وارد کنید (یک نام منحصر به فرد) و ادامه دهید، مطمئن شوید که در همان منطقه مجموعه داده و اتصال مورد بحث در مراحل بالا قرار دارد و روی ایجاد کلیک کنید.

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 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)

برای مشاهده نتیجه به صورت زیر اجرا کنید:

b8edd68cb281786a.png

اکنون که جدول خارجی را ایجاد کرده ایم و تنها با استفاده از پرس و جوهای SQL به تصاویر از فضای ذخیره سازی ابری دسترسی پیدا کرده ایم، اجازه دهید به بخش بعدی که ایجاد مدل طبقه بندی است، برویم.

6. مدل را ایجاد کنید و آن را در Google Cloud Storage آپلود کنید

برای این پیاده سازی، ما از مدل ResNet 50 از قبل آموزش دیده برای اجرای استنتاج بر روی جدول شی که به تازگی ایجاد کردیم استفاده می کنیم. مدل ResNet 50 فایل های تصویری را تجزیه و تحلیل می کند و دسته ای از بردارها را نشان می دهد که احتمال تعلق یک تصویر به کلاس مربوطه (logits) را نشان می دهد.

قبل از رفتن به این مرحله، مطمئن شوید که تمام مجوزهای لازم را در اختیار دارید. سپس مراحل زیر را دنبال کنید:

  1. مدل را از این مکان دانلود کرده و در محلی خود ذخیره کنید
  2. باید در saved_model.pb و پوشه متغیرها باز شود
  3. این دو (فایل و پوشه) را در سطلی که در قسمت قبل ایجاد کردیم آپلود کنید

2629ff3eda214946.png Google Cloud Storage Bucket "yoga_images" با فایل های ResNet Model آپلود شده است

پس از اتمام این مرحله، فایل‌های مربوط به مدل شما باید در همان سطلی که تصاویر شما در تصویر بالا مشاهده می‌کنید، وجود داشته باشند.

7. مدل را در BQML بارگذاری کنید و نتیجه بگیرید

در این مرحله، می‌خواهیم مدل را در همان BigQuery Dataset به‌عنوان جدول خارجی که قبلاً ایجاد کرده‌ایم بارگذاری کنیم و آن را برای تصاویری که در Cloud Storage ذخیره کرده‌ایم اعمال کنیم.

الف از BigQuery Editor، عبارت SQL زیر را اجرا کنید

CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');

پس از اتمام اجرا (که بسته به مجموعه داده شما ممکن است کمی طول بکشد)، مدل را در بخش Dataset خود در BigQuery مشاهده خواهید کرد.

435fa0919aeb57a6.png مجموعه داده BigQuery مدل ایجاد شده را فهرست می کند

ب مدل را بررسی کنید تا فیلدهای ورودی و خروجی آن را ببینید.

مجموعه داده را گسترش دهید و بر روی مدلی که به تازگی ایجاد کردیم، "yoga_poses_resnet" کلیک کنید. روی تب Schema کلیک کنید:

e88928764f10f6ff.png برگه طرحواره تعریف مدل BigQuery

در قسمت برچسب ها، فیلد «activation_49» را می بینید که نشان دهنده فیلد خروجی است. در بخش Features، می‌توانید "input_1" را ببینید که نمایانگر فیلدی است که انتظار می‌رود ورودی مدل باشد. شما "input_1" را در جستار استنتاج (یا پرس و جوی پیش بینی) خود به عنوان فیلدی که برای داده های "تست" خود ارسال می کنید، ارجاع می دهید.

ج ژست یوگا خود را استنباط کنید!

بیایید از مدلی که ایجاد کردیم برای طبقه بندی داده های تصویر آزمایشی خود استفاده کنیم. مطمئن شوید که تعدادی عکس آزمایشی (حالت‌های یوگا) از سطل ذخیره‌سازی ابری خود دارید که در زمان ایجاد آن در جدول خارجی قرار گرفتند. ما به طور انتخابی برای آن تصاویر آزمایشی در 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 را عمیقاً می شناسند، این باید به درک طبقه بندی کمک کند. در غیر این صورت، بیایید یک قطعه کوچک را کدگذاری کنیم تا طبقه بندی را به صورت بصری درک کنیم.

د صاف کردن نتیجه

یکی از راه‌های تجسم خروجی بالا، صاف کردن مقادیر فیلد 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;

بدون منطق برچسب گذاری کلاس، خروجی پرس و جو در زیر آمده است:

71f580f41f0811f3.png

با این حال در مورد من، من یک منطق نمونه را اعمال کرده ام و نتیجه زیر است:

1c6df6ecd14fba1.png

می‌توانید در مورد مدل بیشتر بخوانید و منطقی را که با داده‌های شما و خروجی مدل بهتر کار می‌کند، اعمال کنید.

ه. تجسم استنتاج

در نهایت، یک قطعه سریع پایتون برای تجسم نتیجه از طبقه بندی! نتیجه پرس و جو فوق را به یک فایل CSV صادر کنید و به آن در کد پایتون ارجاع دهید.

68756e7e4b8d7a29.png

خروجی تصویر بالا به پوز یوگا «Downward Dog» اشاره دارد که دقیقاً همان ورودی آزمایشی است که برای طبقه‌بندی با استفاده از BQML در پرس‌وجوی ML.PREDICT ارسال کردیم!

8. یکسان سازی داده های ساختاریافته و بدون ساختار

در نهایت، بخش مورد علاقه من از این پیاده سازی این است که فیلدهای جدول رابطه ساختاریافته خود را با داده های تصویری بدون ساختار یکسان کنم. من یک جدول BigQuery ساختاریافته در همان مجموعه داده جدول خارجی ایجاد کردم تا پوز و داده‌های مربوط به سلامت آن را نگه دارم.

125bdf848c86fbe.png طرحواره "yoga_health" جدول ساختار یافته BigQuery

تصویر بالا طرحی از جدول داده های ساختاریافته با نام "yoga_health" را نشان می دهد و فیلدها عبارتند از pose، focus، health_benefit و تنفس. پرس و جوی زیر هم به داده های ساختاریافته و هم بدون ساختار می پیوندد:

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

توجه: تمام پرس و جوهایی که در این وبلاگ پوشش داده ایم را می توان مستقیماً از نوت بوک پایتون شما با استفاده از دستورات جادویی BigQuery اجرا کرد.

9. پاکسازی کنید

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید.

  1. در کنسول Google Cloud، به صفحه مدیریت منابع بروید
  2. در لیست پروژه، پروژه ای را که می خواهید حذف کنید انتخاب کنید و سپس روی Delete کلیک کنید
  3. در محاوره، شناسه پروژه را تایپ کنید و سپس روی Shut down کلیک کنید تا پروژه حذف شود

10. تبریک می گویم

تبریک می گویم! شما با موفقیت داده‌های بدون ساختار را در BigQuery ذخیره کرده‌اید، یک مدل طبقه‌بندی با استفاده از BQML ایجاد کرده‌اید و حالت‌های آزمایشی یوگا را با مدل پیش‌بینی کرده‌اید. اگر دوست دارید این را پیاده سازی کنید، با پروژه Google Cloud خود شروع کنید. همچنین، اگر می‌خواهید درباره پایگاه‌های داده یا سایر پیاده‌سازی‌های کاربردی نهایی در Google Cloud اطلاعات بیشتری کسب کنید، لطفاً به وبلاگ‌های من سر بزنید.