۱. اهداف
نمای کلی
این آزمایشگاه کد بر ایجاد یک برنامه Vertex AI Vision به صورت سرتاسری برای نظارت بر فیلمهای ویدیویی ترافیک در لحظه تمرکز خواهد کرد. ما از ویژگیهای داخلی مدل تخصصی از پیش آموزش دیده Occupancy analytics برای ثبت موارد زیر استفاده خواهیم کرد:
- تعداد وسایل نقلیه و افرادی که از یک خط مشخص از جاده عبور میکنند را بشمارید.
- تعداد وسایل نقلیه/افراد را در هر منطقه ثابتی از جاده بشمارید.
- تشخیص ازدحام در هر قسمت از جاده.
آنچه یاد خواهید گرفت
- نحوه تنظیم یک ماشین مجازی برای دریافت ویدیوها جهت پخش آنلاین
- نحوه ایجاد یک برنامه در Vertex AI Vision
- ویژگیهای مختلف موجود در Occupancy Analytics و نحوه استفاده از آنها
- نحوه استقرار برنامه
- نحوه جستجوی ویدیوها در فضای ذخیرهسازی شما در انبار رسانه Vertex AI Vision.
- نحوه اتصال خروجی به BigQuery، نوشتن کوئری SQL برای استخراج اطلاعات از خروجی json مدل و نمایش نتیجه در Looker Studio به صورت بلادرنگ.
۲. قبل از شروع
- در کنسول گوگل کلود، در صفحه انتخاب پروژه، یک پروژه گوگل کلود را انتخاب یا ایجاد کنید . توجه : اگر قصد ندارید منابعی را که در این روش ایجاد میکنید، نگه دارید، به جای انتخاب یک پروژه موجود، یک پروژه ایجاد کنید. پس از اتمام این مراحل، میتوانید پروژه را حذف کنید و تمام منابع مرتبط با پروژه را حذف کنید. به انتخاب پروژه بروید
- مطمئن شوید که صورتحساب برای پروژه ابری شما فعال است. یاد بگیرید که چگونه بررسی کنید که آیا صورتحساب در یک پروژه فعال است یا خیر .
- فعال کردن رابطهای برنامهنویسی کاربردی موتور محاسباتی و هوش مصنوعی بینایی.
ایجاد حساب کاربری سرویس:
- در کنسول گوگل کلود، به صفحه ایجاد حساب کاربری سرویس بروید. به بخش ایجاد حساب کاربری سرویس بروید
- پروژه خود را انتخاب کنید.
- در فیلد نام حساب سرویس ، یک نام وارد کنید. کنسول گوگل کلود فیلد شناسه حساب سرویس را بر اساس این نام پر میکند. در فیلد توضیحات حساب سرویس ، توضیحی وارد کنید. به عنوان مثال، حساب سرویس برای شروع سریع.
- روی ایجاد کلیک کنید و ادامه دهید .
- برای دسترسی به پروژه خود، نقش(های) زیر را به حساب سرویس خود اعطا کنید: Vision AI > Vision AI Editor, Compute Engine > Compute Instance Admin (beta), Storage > Storage Object Viewer † . در لیست انتخاب نقش ، یک نقش را انتخاب کنید. برای نقشهای اضافی، روی افزودن نقش دیگر کلیک کنید و هر نقش اضافی را اضافه کنید. توجه : فیلد نقش بر منابعی که حساب سرویس شما میتواند در پروژه شما به آنها دسترسی داشته باشد، تأثیر میگذارد. میتوانید این نقشها را لغو کنید یا بعداً نقشهای اضافی اعطا کنید. در محیطهای تولید، نقشهای مالک، ویرایشگر یا بیننده را اعطا نکنید. در عوض، یک نقش از پیش تعریف شده یا نقش سفارشی که نیازهای شما را برآورده میکند، اعطا کنید.
- روی ادامه کلیک کنید.
- برای پایان ایجاد حساب کاربری سرویس، روی «انجام شد» کلیک کنید. پنجره مرورگر خود را نبندید. در مرحله بعدی از آن استفاده خواهید کرد.
ایجاد کلید حساب سرویس:
- در کنسول گوگل کلود، روی آدرس ایمیل حساب سرویسی که ایجاد کردهاید کلیک کنید.
- روی کلیدها کلیک کنید.
- روی افزودن کلید کلیک کنید و سپس روی ایجاد کلید جدید کلیک کنید.
- روی ایجاد کلیک کنید. یک فایل کلید JSON در رایانه شما دانلود میشود.
- روی بستن کلیک کنید.
- رابط خط فرمان گوگل کلود (Google Cloud CLI) را نصب و راهاندازی کنید .
† این نقش فقط در صورتی مورد نیاز است که یک فایل ویدیویی نمونه را از یک فضای ذخیرهسازی ابری کپی کنید.
۳. یک ماشین مجازی برای پخش ویدیو تنظیم کنید
قبل از ایجاد یک برنامه در Occupancy Analytics، باید یک جریان (stream) ثبت کنید که بعداً توسط برنامه قابل استفاده باشد.
در این آموزش شما یک نمونه ماشین مجازی Compute Engine ایجاد میکنید که میزبان یک ویدیو است و دادههای ویدیویی استریمینگ را از ماشین مجازی ارسال میکنید.
ایجاد یک ماشین مجازی لینوکس
اولین قدم در ارسال ویدیو از یک نمونه ماشین مجازی Compute Engine، ایجاد نمونه ماشین مجازی است.
- در کنسول، به صفحه نمونههای ماشین مجازی بروید. به نمونههای ماشین مجازی بروید
- پروژه خود را انتخاب کنید و روی ادامه کلیک کنید.
- روی ایجاد نمونه کلیک کنید.
- یک نام برای ماشین مجازی خود تعیین کنید. برای اطلاعات بیشتر، به قرارداد نامگذاری منابع مراجعه کنید.
- اختیاری: منطقه (Zone ) این ماشین مجازی را تغییر دهید. موتور محاسبه (Compute Engine) فهرست مناطق (zones) درون هر منطقه را تصادفی میکند تا استفاده از آن در چندین منطقه را تشویق کند.
- گزینههای پیشفرض باقیمانده را بپذیرید. برای اطلاعات بیشتر در مورد این گزینهها، به بخش «ایجاد و شروع یک ماشین مجازی» مراجعه کنید.
- برای ایجاد و شروع ماشین مجازی، روی «ایجاد» کلیک کنید.
محیط VM را تنظیم کنید
پس از شروع به کار ماشین مجازی، میتوانید از طریق مرورگر خود با استفاده از کنسول به ماشین مجازی SSH متصل شوید. سپس، میتوانید ابزار خط فرمان vaictl را برای وارد کردن ویدیو به استریم خود دانلود کنید.
اتصال SSH را به ماشین مجازی خود برقرار کنید
- در کنسول، به صفحه نمونههای ماشین مجازی بروید. به نمونههای ماشین مجازی بروید
- در بخش Connect از خط نمونهای که ایجاد کردهاید، روی SSH کلیک کنید. این کار یک اتصال SSH را در یک پنجره مرورگر جدید باز میکند.

ابزار خط فرمان vaictl را دانلود کنید
- در پنجره SSH-in-browser ، ابزار خط فرمان Vertex AI Vision (vaictl) را با استفاده از دستور زیر دانلود کنید:
wget https://github.com/google/visionai/releases/download/v0.0.4/visionai_0.0-4_amd64.deb
- با اجرای دستور زیر، ابزار خط فرمان را نصب کنید:
sudo apt install ./visionai_0.0-4_amd64.deb
- میتوانید با اجرای دستور زیر، نصب را آزمایش کنید:
vaictl --help
۴. دریافت یک فایل ویدیویی برای پخش آنلاین
پس از تنظیم محیط ماشین مجازی خود، میتوانید یک فایل ویدیویی نمونه را کپی کرده و سپس با استفاده از vaictl دادههای ویدیویی را به برنامه تجزیه و تحلیل حضور خود منتقل کنید.
با فعال کردن رابط برنامهنویسی کاربردی هوش مصنوعی بینایی (Vision AI API) در کنسول ابری (Cloud Console) شروع کنید.
ثبت جریان جدید
- روی تب Streams در پنل سمت چپ Vertex AI Vision کلیک کنید.
- روی ثبت نام کلیک کنید
- در قسمت نام جریان، عبارت 'traffic-stream' را وارد کنید.
- در قسمت region، عبارت 'us-central1' را وارد کنید.
- ثبت نام کلیک کنید
ثبت نام در استریم چند دقیقه طول خواهد کشید.
یک ویدیوی نمونه را در ماشین مجازی خود کپی کنید
- در پنجره SSH-in-browser مربوط به ماشین مجازی خود، یک ویدیوی نمونه را با دستور gsutil cp زیر کپی کنید. متغیر زیر را جایگزین کنید:
- منبع: محل فایل ویدیویی مورد استفاده. میتوانید از منبع فایل ویدیویی خودتان (برای مثال، gs://BUCKET_NAME/FILENAME.mp4) استفاده کنید، یا از ویدیوی نمونه (gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4) (ویدیو با افراد و وسایل نقلیه، منبع ) استفاده کنید.
export SOURCE=gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4 gsutil cp $SOURCE .
پخش ویدئو از ماشین مجازی و دریافت دادهها به جریان شما
- برای ارسال این فایل ویدیویی محلی به جریان ورودی برنامه، از دستور زیر استفاده کنید. شما باید جایگزینیهای متغیر زیر را انجام دهید:
- PROJECT_ID: شناسه پروژه Google Cloud شما.
- LOCATION_ID: شناسه موقعیت مکانی شما. برای مثال، us-central1. برای اطلاعات بیشتر، به Cloud locations مراجعه کنید.
- فایل محلی: نام فایل ویدیویی محلی. برای مثال، street_vehicles_people.mp4.
- پرچم –loop: اختیاری. دادههای فایل را برای شبیهسازی استریمینگ حلقه میکند.
export PROJECT_ID=<Your Google Cloud project ID> export LOCATION_ID=us-central1 export LOCAL_FILE=street_vehicles_people.mp4
- این دستور یک فایل ویدیویی را به یک جریان (stream) استریم میکند. اگر از آپشن –loop استفاده کنید، ویدیو تا زمانی که دستور را متوقف کنید، در جریان (stream) به صورت حلقهای (loop) پخش میشود. ما این دستور را به عنوان یک کار پسزمینه اجرا خواهیم کرد تا حتی پس از قطع شدن اتصال ماشین مجازی، پخش ویدیو ادامه یابد.
- (برای اینکه برنامه در پسزمینه اجرا شود، nohup را به ابتدا و '&' را به انتها اضافه کنید)
nohup vaictl -p $PROJECT_ID \
-l $LOCATION_ID \
-c application-cluster-0 \
--service-endpoint visionai.googleapis.com \
send video-file to streams 'traffic-stream' --file-path $LOCAL_FILE --loop &
ممکن است بین شروع عملیات دریافت پیام vaictl و نمایش ویدیو در داشبورد حدود ۱۰۰ ثانیه طول بکشد.
پس از اینکه دریافت جریان در دسترس قرار گرفت، میتوانید با انتخاب جریان ترافیک، فید ویدیو را در تب جریانها در داشبورد Vertex AI Vision مشاهده کنید.
نمای زنده از ویدیویی که در حال ورود به استریم در کنسول گوگل کلود است. منبع ویدیو: الیزابت ماور در Pixabay ( پیکسلیشن اضافه شد ).
۵. یک برنامه کاربردی ایجاد کنید
اولین قدم ایجاد یک برنامه است که دادههای شما را پردازش کند. یک برنامه را میتوان به عنوان یک خط لوله خودکار در نظر گرفت که موارد زیر را به هم متصل میکند:
- دریافت داده : یک فید ویدیویی به یک جریان داده ارسال میشود.
- تجزیه و تحلیل دادهها : یک مدل هوش مصنوعی (بینایی رایانهای) میتواند پس از مصرف اضافه شود.
- ذخیرهسازی دادهها : دو نسخه از فید ویدیویی (جریان اصلی و جریان پردازششده توسط مدل هوش مصنوعی) میتوانند در یک انبار رسانه ذخیره شوند.
در کنسول گوگل کلود، یک برنامه به صورت یک گراف نمایش داده میشود.
ایجاد یک برنامه خالی
قبل از اینکه بتوانید نمودار برنامه را پر کنید، ابتدا باید یک برنامه خالی ایجاد کنید.
یک برنامه در کنسول Google Cloud ایجاد کنید.
- به کنسول گوگل کلود بروید.
- تب برنامهها را در داشبورد Vertex AI Vision باز کنید.
- روی دکمهی افزودن ایجاد کلیک کنید.
- به عنوان نام برنامه، عبارت traffic-app را وارد کنید و منطقه خود را انتخاب کنید.
- روی ایجاد کلیک کنید.
اضافه کردن گرههای کامپوننت برنامه
بعد از اینکه برنامه خالی را ایجاد کردید، میتوانید سه گره را به گراف برنامه اضافه کنید:
- گره مصرف (Ingestion node ): منبع جریانی که دادههای ارسالی از یک نمونه ماشین مجازی Compute Engine که شما ایجاد میکنید را مصرف میکند.
- گره پردازش : مدل تحلیل اشغال که بر اساس دادههای دریافتی عمل میکند.
- گره ذخیرهسازی : انبار رسانهای که ویدیوهای پردازششده را ذخیره میکند و به عنوان یک مخزن فراداده عمل میکند. مخازن فراداده شامل اطلاعات تحلیلی در مورد دادههای ویدیویی دریافتشده و اطلاعات استنباطشده توسط مدلهای هوش مصنوعی هستند.
گرههای کامپوننت را در کنسول به برنامه خود اضافه کنید.
- برگه برنامهها را از داشبورد Vertex AI Vision باز کنید. به برگه برنامهها بروید
- در خط traffic-app، گزینه View graph را انتخاب کنید. این گزینه شما را به تجسم نمودار خط لوله پردازش میبرد.
یک گره دریافت داده اضافه کنید
- برای افزودن یک گره جریان ورودی، گزینه Streams را در بخش Connectors از منوی کناری انتخاب کنید.
- در بخش منبع (Source) از منوی استریم (Stream) که باز میشود، گزینهی «افزودن استریمها» (Add streams) را انتخاب کنید.
- در منوی افزودن جریانها ، گزینه ثبت جریانهای جدید را انتخاب کنید و عبارت traffic-stream را به عنوان نام جریان اضافه کنید.
- برای افزودن جریان به نمودار برنامه، روی «افزودن جریانها» کلیک کنید.
افزودن یک گره پردازش داده
- برای افزودن گره مدل شمارش اشغال، گزینه تحلیل اشغال را در بخش مدلهای تخصصی از منوی کناری انتخاب کنید.
- گزینههای پیشفرض «افراد» و «وسایل نقلیه» را رها کنید.
- خطوط را در محل عبور خط اضافه کنید. از ابزار خط چند نقطهای برای رسم خطوطی که نیاز به تشخیص ورود یا خروج ماشینها یا افراد دارید، استفاده کنید.
- مناطق فعال را برای شمارش افراد/وسایل نقلیه در آن منطقه رسم کنید.
- تنظیماتی برای زمان توقف اضافه کنید تا در صورت ترسیم یک منطقه فعال، ازدحام تشخیص داده شود.
- (در حال حاضر، هر دو ویژگی عبور از خط و منطقه فعال به طور همزمان پشتیبانی نمیشوند. فقط از یکی از این ویژگیها در یک زمان استفاده کنید.)



افزودن یک گره ذخیرهسازی داده
- برای افزودن گره مقصد خروجی (ذخیرهسازی)، گزینه انبار رسانه Vertex AI Vision را در بخش Connectors از منوی کناری انتخاب کنید.
- در منوی انبار رسانه Vertex AI Vision ، روی اتصال انبار کلیک کنید.
- در منوی «اتصال انبار» ، «ایجاد انبار جدید» را انتخاب کنید. نام انبار را «ترافیک-انبار» بگذارید و مدت زمان TTL را روی ۱۴ روز بگذارید.
- برای افزودن انبار، روی دکمهی «ایجاد» کلیک کنید.
۶. خروجی را به جدول BigQuery وصل کنید
وقتی یک کانکتور BigQuery به برنامه Vertex AI Vision خود اضافه میکنید، تمام خروجیهای مدل برنامه متصل به جدول هدف منتقل میشوند.
شما میتوانید جدول BigQuery خودتان را ایجاد کنید و هنگام افزودن کانکتور BigQuery به برنامه، آن جدول را مشخص کنید، یا اجازه دهید پلتفرم برنامه Vertex AI Vision به طور خودکار جدول را ایجاد کند.
ایجاد خودکار جدول
اگر به پلتفرم برنامه Vertex AI Vision اجازه دهید جدول را به طور خودکار ایجاد کند، میتوانید هنگام افزودن گره کانکتور BigQuery این گزینه را مشخص کنید.
اگر میخواهید از ایجاد خودکار جدول استفاده کنید، شرایط زیر برای مجموعه دادهها و جدول اعمال میشود:
- مجموعه داده: نام مجموعه دادهای که به طور خودکار ایجاد شده است visionai_dataset است.
- جدول: نام جدولی که به طور خودکار ایجاد شده است visionai_dataset.APPLICATION_ID است.
- مدیریت خطا:
- اگر جدولی با همین نام و تحت همان مجموعه داده وجود داشته باشد، هیچ ایجاد خودکاری اتفاق نمیافتد.
- برگه برنامهها را از داشبورد Vertex AI Vision باز کنید. به برگه برنامهها بروید
- گزینه View app را که در کنار نام برنامه شما قرار دارد، از لیست انتخاب کنید.
- در صفحه سازنده برنامه، از بخش Connectors ، BigQuery را انتخاب کنید.
- فیلد مسیر BigQuery را خالی بگذارید.

- در فرادادههای فروشگاه از: فقط «تحلیل اشغال» را انتخاب کنید و تیک گزینه «جریانها» را بردارید.
نمودار نهایی برنامه باید به شکل زیر باشد:

۷. برنامه خود را برای استفاده مستقر کنید
بعد از اینکه برنامهی خود را به همراه تمام اجزای لازم ساختید، آخرین مرحله برای استفاده از برنامه، استقرار آن است.
- برگه برنامهها را از داشبورد Vertex AI Vision باز کنید. به برگه برنامهها بروید
- گزینه «مشاهده نمودار» را در کنار برنامه ترافیک در لیست انتخاب کنید.
- از صفحه سازنده نمودار برنامه، روی دکمه Deploy کلیک کنید.
- در پنجره تأیید زیر، گزینه Deploy را انتخاب کنید. عملیات استقرار ممکن است چند دقیقه طول بکشد. پس از اتمام استقرار، علامتهای سبز رنگ در کنار گرهها ظاهر میشوند.

۸. جستجوی محتوای ویدیویی در انبار ذخیرهسازی
پس از اینکه دادههای ویدیویی را به برنامه پردازش خود وارد کردید، میتوانید دادههای ویدیویی تحلیلشده را مشاهده کنید و دادهها را بر اساس اطلاعات تحلیلی مربوط به حضور افراد جستجو کنید.
- برگه انبارها را از داشبورد Vertex AI Vision باز کنید. به برگه انبارها بروید
- انبار ترافیک-انبار را در لیست پیدا کنید و روی مشاهده داراییها کلیک کنید.
- در بخش تعداد افراد یا تعداد وسایل نقلیه ، مقدار حداقل (Min) را روی ۱ و مقدار حداکثر (Max ) را روی ۵ تنظیم کنید.
- برای فیلتر کردن دادههای ویدیویی پردازششده ذخیرهشده در انبار رسانه Vertex AI Vision، روی جستجو کلیک کنید.

نمایی از دادههای ویدیویی ذخیره شده که با معیارهای جستجو در کنسول Google Cloud مطابقت دارد. منبع ویدیو: الیزابت ماور در Pixabay ( معیارهای جستجو اعمال شده است ).
۹. تجزیه و تحلیل خروجی در جدول BigQuery
به بیگ کوئری بروید
مجموعه داده را انتخاب کنید: visionai_dataset
جدول را انتخاب کنید: APPLICATION_ID شما (در این مورد traffic-app)
روی سه نقطه سمت راست نام جدول کلیک کنید و روی Query کلیک کنید.
کوئری زیر را بنویسید
پرس و جوی ۱: پرس و جویی برای بررسی تعداد وسایل نقلیه عبوری از هر خط در دقیقه
abc.sql
—- Get list of active marked lines for each timeframe
WITH line_array AS (
SELECT
t.ingestion_time AS ingestion_time,
JSON_QUERY_ARRAY(t.annotation.stats["crossingLineCounts"]) AS lines
FROM
`PROJ_ID.visionai_dataset.APP_ID` AS t
),
—- Flatten active lines to get individual entities details
flattened AS (
SELECT
line_array.ingestion_time,
JSON_VALUE(line.annotation.id) as line_id,
JSON_QUERY_ARRAY(line["positiveDirectionCounts"]) AS entities
FROM line_array, unnest(line_array.lines) as line
)
—- Generate aggregate vehicle count per zone w.r.t time
SELECT
STRING(TIMESTAMP_TRUNC(ingestion_time, MINUTE) ) AS time, line_id,
SUM(INT64(entity["count"])) as vehicle_count
FROM
flattened, UNNEST(flattened.entities) AS entity
WHERE JSON_VALUE(entity['entity']['labelString']) = 'Vehicle'
GROUP BY time, line_id
پرس و جوی ۲: پرس و جویی برای بررسی تعداد وسایل نقلیه در هر دقیقه در هر منطقه
—- Get list of active zones for each timeframe
WITH zone_array AS (
SELECT
t.ingestion_time AS ingestion_time,
JSON_QUERY_ARRAY(t.annotation.stats["activeZoneCounts"]) AS zones
FROM
`PROJ_ID.visionai_dataset.APP_ID` AS t
),
—- Flatten active zones to get individual entities details
flattened AS (
SELECT zone_array.ingestion_time, JSON_VALUE(zone.annotation.id) as zone_id,
JSON_QUERY_ARRAY(zone["counts"]) AS entities
FROM zone_array, unnest(zone_array.zones) as zone
)
—- Generate aggregate vehicle count per zone w.r.t time
SELECT
STRING(TIMESTAMP_TRUNC(ingestion_time, MINUTE) ) AS time,
zone_id,
SUM(INT64(entity["count"])) as vehicle_count
FROM flattened, UNNEST(flattened.entities) AS entity
WHERE JSON_VALUE(entity['entity']['labelString']) = 'Vehicle'
GROUP BY time, zone_id
در کوئریهای بالا میتوانید برای شمارش افراد، «وسیله نقلیه» را به «شخص» تغییر دهید.
این کدلب، دادههای نمونه و مصورسازی را فقط برای Query1 نشان میدهد. میتوانید فرآیند مشابهی را برای Query2 دنبال کنید.

روی «کاوش دادهها» در منوی سمت راست کلیک کنید و «کاوش با Looker Studio» را انتخاب کنید.

در بخش «بعد»، زمان را اضافه کنید و پیکربندی زمان را به تاریخ-زمان تغییر دهید. در بخش «بعد شکست»، line_id را اضافه کنید. 
نمودار بالا تعداد وسایل نقلیه/افرادی که در هر دقیقه از هر خط عبور میکنند را نشان میدهد.
نوارهای آبی پررنگ و آبی روشن، دو شناسه خط مختلف را نشان میدهند.
۱۰. تبریک
تبریک میگویم، آزمایشگاه را تمام کردید!
تمیز کردن
برای جلوگیری از تحمیل هزینه به حساب گوگل کلود خود برای منابع استفاده شده در این آموزش، یا پروژهای که شامل منابع است را حذف کنید، یا پروژه را نگه دارید و منابع تکی را حذف کنید.
پروژه را حذف کنید
حذف منابع تکی
منابع
https://cloud.google.com/vision-ai/docs/overview
https://cloud.google.com/vision-ai/docs/occupancy-count-tutorial
بازخورد
برای ارائه بازخورد اینجا کلیک کنید