۱. اهداف
نمای کلی
این آزمایشگاه کد بر ایجاد یک برنامه Vertex AI Vision سرتاسری تمرکز دارد تا ارسال ویدیوها با ویژگی فیلتر حرکت را نشان دهد. در این آموزش، پارامترهای مختلف در پیکربندی فیلتر حرکت را بررسی خواهیم کرد:
- حساسیت تشخیص حرکت
- حداقل طول رویداد
- پنجره نگاه به گذشته
- زمان خنک شدن
- منطقه تشخیص حرکت
آنچه یاد خواهید گرفت
- نحوه دریافت ویدیوها برای پخش آنلاین
- ویژگیهای مختلف موجود در فیلتر حرکت و نحوه استفاده از آنها
- آمار فیلتر حرکت را از کجا میتوان بررسی کرد؟
- نحوه تنظیم تنظیمات بر اساس ویدیوی شما
۲. قبل از شروع
- در کنسول گوگل کلود، در صفحه انتخاب پروژه، یک پروژه گوگل کلود را انتخاب یا ایجاد کنید . توجه : اگر قصد ندارید منابعی را که در این روش ایجاد میکنید، نگه دارید، به جای انتخاب یک پروژه موجود، یک پروژه ایجاد کنید. پس از اتمام این مراحل، میتوانید پروژه را حذف کنید و تمام منابع مرتبط با پروژه را حذف کنید. به انتخاب پروژه بروید
- مطمئن شوید که صورتحساب برای پروژه ابری شما فعال است. یاد بگیرید که چگونه بررسی کنید که آیا صورتحساب در یک پروژه فعال است یا خیر .
- فعال کردن رابطهای برنامهنویسی کاربردی موتور محاسباتی و هوش مصنوعی بینایی.
ایجاد حساب کاربری سرویس:
- در کنسول گوگل کلود، به صفحه ایجاد حساب کاربری سرویس بروید. به بخش ایجاد حساب کاربری سرویس بروید
- پروژه خود را انتخاب کنید.
- در فیلد نام حساب سرویس ، یک نام وارد کنید. کنسول گوگل کلود فیلد شناسه حساب سرویس را بر اساس این نام پر میکند. در فیلد توضیحات حساب سرویس ، توضیحی وارد کنید. به عنوان مثال، حساب سرویس برای شروع سریع.
- روی ایجاد کلیک کنید و ادامه دهید .
- برای دسترسی به پروژه خود، نقش(های) زیر را به حساب سرویس خود اعطا کنید: Vision AI > Vision AI Editor, Compute Engine > Compute Instance Admin (beta), Storage > Storage Object Viewer † . در لیست انتخاب نقش ، یک نقش را انتخاب کنید. برای نقشهای اضافی، روی افزودن نقش دیگر کلیک کنید و هر نقش اضافی را اضافه کنید. توجه : فیلد نقش بر منابعی که حساب سرویس شما میتواند در پروژه شما به آنها دسترسی داشته باشد، تأثیر میگذارد. میتوانید این نقشها را لغو کنید یا بعداً نقشهای اضافی اعطا کنید. در محیطهای تولید، نقشهای مالک، ویرایشگر یا بیننده را اعطا نکنید. در عوض، یک نقش از پیش تعریف شده یا نقش سفارشی که نیازهای شما را برآورده میکند، اعطا کنید.
- روی ادامه کلیک کنید.
- برای پایان ایجاد حساب کاربری سرویس، روی «انجام شد» کلیک کنید. پنجره مرورگر خود را نبندید. در مرحله بعدی از آن استفاده خواهید کرد.
ایجاد کلید حساب سرویس:
- در کنسول گوگل کلود، روی آدرس ایمیل حساب سرویسی که ایجاد کردهاید کلیک کنید.
- روی کلیدها کلیک کنید.
- روی افزودن کلید کلیک کنید و سپس روی ایجاد کلید جدید کلیک کنید.
- روی ایجاد کلیک کنید. یک فایل کلید JSON در رایانه شما دانلود میشود.
- روی بستن کلیک کنید.
- رابط خط فرمان گوگل کلود (Google Cloud CLI) را نصب و راهاندازی کنید .
† این نقش فقط در صورتی مورد نیاز است که یک فایل ویدیویی نمونه را از یک فضای ذخیرهسازی ابری کپی کنید.
۳. فیلتر حرکت
فیلتر حرکت، بخشهایی از فیلم محصول و حرکت را که شامل رویدادهای حرکتی است، ضبط میکند. با تنظیم حساسیت حرکت، حداقل طول رویداد، پنجره نگاه به عقب، دوره خنک شدن و منطقه تشخیص حرکت، کاربر میتواند فیلتر را بر اساس نیازهای خود پیکربندی کند.
پیکربندی فیلتر حرکت
۵ پیکربندی در فیلتر حرکت برای سفارشیسازی وجود دارد.
- حساسیت به حرکت: میزان حساسیت به حرکت باید چقدر باشد.
- حداقل طول رویداد: حداقل طولی که یک رویداد حرکتی ثبت خواهد شد.
- پنجرهی نگاه به گذشته: ضبط ویدیو قبل از تشخیص حرکت، چه مدت باید طول بکشد.
- دوره آرامش: پس از پایان یک رویداد حرکتی، یک دوره آرامش با مدت زمان مشخص شده اتفاق میافتد. در طول دوره آرامش، رویدادهای حرکتی فعال نمیشوند.
- منطقه تشخیص حرکت: منطقه پیکربندی شده توسط کاربر برای مشخص کردن محل اجرای تشخیص حرکت. (در بخش بعدی به تفصیل توضیح داده خواهد شد)
حساسیت حرکتی
از پرچم motion_detection_sensitivity در دستور vaictl استفاده کنید.
رشتهای. پیشفرض متوسط. میتوانید از بین کم، متوسط یا زیاد یکی را انتخاب کنید.
هرچه حساسیت تشخیص حرکت بالاتر باشد، به نویز و حرکات کوچکتر حساستر است. این تنظیم برای تنظیماتی که اشیاء متحرک کوچکتر (مانند افراد از فاصله دور) و روشنایی پایدار وجود دارد، توصیه میشود.
از سوی دیگر، حساسیت پایین، حساسیت کمتری به تداخل نوری دارد. این تنظیم برای زمانی که تداخل نوری بیشتری وجود دارد، مانند محیط بیرون و برای کیفیت پایین ویدیو که ممکن است نویز بیشتری وجود داشته باشد، عالی است. از آنجایی که این تنظیم، تهاجمیترین فیلترینگ از بین همه است، میتواند حرکات اشیاء کوچک را نادیده بگیرد.
حداقل طول رویداد
از پرچم min_event_length_in_seconds در دستور vaictl استفاده کنید.
عدد صحیح. پیشفرض ۱۰ ثانیه. محدوده از ۰ ثانیه تا ۳۶۰۰ ثانیه.
حداقل مدت زمان ویدیوهای رویداد حرکتی که پس از شناسایی یک بخش از رویداد حرکتی در فریم، تجزیه و تحلیل میشوند.
پنجره نگاه به گذشته
از پرچم look_back_window_in_seconds در دستور vaictl استفاده کنید.
عدد صحیح. پیشفرض ۳ ثانیه. محدوده از ۰ ثانیه تا ۳۶۰۰ ثانیه.
پنجرهی نگاه به گذشته، مدت زمانی است که قبل از تشخیص یک رویداد حرکتی، در حافظهی پنهان (cache) ذخیره میشود. این پنجره زمانی مفید است که بخواهیم ببینیم چند ثانیه قبل از تشخیص رویدادهای حرکتی، چه اتفاقی در فریم میافتد.
دوره خنک شدن
از پرچم cool_down_period_in_seconds در دستور vaictl استفاده کنید.
عدد صحیح. پیشفرض ۳۰۰ ثانیه. محدوده از ۰ ثانیه تا ۳۶۰۰ ثانیه.
دوره خنکسازی مدت زمانی است که تشخیص حرکت پس از ثبت یک رویداد حرکتی متوقف میشود. در طول دوره خنکسازی، هیچ محاسباتی برای تشخیص حرکت اجرا نخواهد شد.
۴. مثال فیلتر حرکت پایه
دفترچه راهنمای SDK ویکتل
برای بررسی راهنمای vaictl برای جریان ورودی با فیلتر حرکت، از دستور زیر استفاده کنید.
vaictl send video-file applying motion-filter -h
تهیه نمونه ویدیو
- شما میتوانید یک ویدیوی نمونه را با دستور 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 .
آمادهسازی متغیرهای محیطی
متغیرهای محیطی زیر را برای استفاده از الگوی دستور ارائه شده تنظیم کنید.
متغیرهای vaictl
- 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
متغیرهای فیلتر حرکت
- حساسیت به حرکت: میزان حساسیت تشخیص حرکت.
- MIN_EVENT_LENGTH: حداقل طول رویدادهای حرکتی.
- LOOK_BACK_WINDOW: مدت زمان ضبط قبل از اولین حرکت در یک رویداد حرکتی.
- دوره کاهش دما (COOL_DOWN_PERIOD): مدت زمانی که تشخیص حرکت پس از ثبت یک رویداد حرکتی متوقف میشود.
export MOTION_SENSITIVITY=<low or medium or high> export MIN_EVENT_LENGTH=<0-3600> export LOOK_BACK_WINDOW=<0-3600> export COOL_DOWN_PERIOD=<0-3600>
آمادهسازی فرمان فیلتر حرکت
دو گزینه برای استفاده از فیلتر حرکت با جریان ورودی وجود دارد. گزینه اول ارسال رویدادهای حرکت به یک جریان در کنسول ابری است. گزینه دوم ارسال رویدادهای حرکت به حافظه محلی است.
ارسال نتایج به کنسول ابری
شما میتوانید از vaictl برای پخش دادههای ویدئویی خروجی به کنسول ابری استفاده کنید. با فعال کردن رابط برنامهنویسی کاربردی هوش مصنوعی بینایی (Vision AI API) در کنسول ابری شروع کنید.
ثبت جریان جدید
- روی تب Streams در پنل سمت چپ Vertex AI Vision کلیک کنید.
- روی ثبت نام کلیک کنید
- در قسمت نام جریان
motion-detection-streamرا وارد کنید. - در منطقه
us-central1را وارد کنید - ثبت نام کلیک کنید
ارسال نتایج به استریم
این دستور یک فایل ویدیویی را به یک جریان (stream) استریم میکند. اگر از آپشن –loop استفاده کنید، ویدیو تا زمانی که دستور را متوقف کنید، در جریان (stream) به صورت حلقهای (loop) پخش میشود. ما این دستور را به عنوان یک کار پسزمینه اجرا خواهیم کرد تا پخش آن ادامه یابد.
برای اینکه برنامه در پسزمینه اجرا شود، nohup به ابتدا و & را به انتها اضافه کنید.
INPUT_VIDEO=street_vehicles_people.mp4
vaictl -p $PROJECT \
-l $LOCATION_ID \
-c application-cluster-0 \
--service-endpoint visionai.googleapis.com \
send video-file --file-path $INPUT_VIDEO \
applying motion-filter
--motion-sensitivity=$MOTION_SENSITIVITY \
--min-event-length=$MIN_EVENT_LENGTH \
--lookback-length=$LOOK_BACK_WINDOW \
--cooldown-length=$COOL_DOWN_PERIOD \
to streams motion-detection-stream --loop
ممکن است بین شروع عملیات دریافت پیام vaictl و نمایش ویدیو در داشبورد حدود ۱۰۰ ثانیه طول بکشد.
پس از اینکه دریافت جریان در دسترس قرار گرفت، میتوانید با انتخاب جریان ترافیک، فید ویدیو را در تب جریانها در داشبورد Vertex AI Vision مشاهده کنید.
ارسال نتایج به حافظه محلی
این دستور یک فایل ویدیویی را به یک جریان (stream) استریم میکند.
برای اینکه برنامه در پسزمینه اجرا شود، nohup به ابتدا و & را به انتها اضافه کنید.
INPUT_VIDEO=street_vehicles_people.mp4
OUTPUT_PATH=<path_to_store_motion_events_on_local_disk>
nohup vaictl -p $PROJECT \
-l $LOCATION_ID \
-c application-cluster-0 \
--service-endpoint visionai.googleapis.com \
send video-file --file-path $INPUT_VIDEO \
applying motion-filter
--motion-sensitivity=$MOTION_SENSITIVITY \
--min-event-length=$MIN_EVENT_LENGTH \
--lookback-length=$LOOK_BACK_WINDOW \
--cooldown-length=$COOL_DOWN_PERIOD \
to mp4file --mp4-file-path=$OUTPUT_PATH --loop
۵. منطقه تشخیص حرکت
در این بخش به بررسی کاربرد ناحیه تشخیص حرکت و نحوه پیکربندی آن خواهیم پرداخت. این ناحیه با پوشاندن حرکت از مناطقی که مورد توجه شما نیستند، برای بهبود تشخیص حرکت در نظر گرفته شده است.
ناحیه تشخیص حرکت دو نوع دارد، (1) نواحی مثبت که در آنها تشخیص حرکت فقط در ناحیه حاشیهنویسی شده اجرا میشود؛ (2) نواحی منفی که در آنها تشخیص حرکت هرگونه حرکتی را در ناحیه حاشیهنویسی شده نادیده میگیرد.
حاشیهنویسی منطقه
برای وارد کردن مختصات چندضلعیهای منطقهای، از flag zone_annotation در دستور vaictl استفاده کنید.
رشته. پیشفرض برای حاشیهنویسی منطقه خالی است.
حاشیهنویسی ناحیه، یک ورودی رشتهای از کاربر خواهد بود که نواحی موجود در فریم را که کاربر میخواهد پنهان شود یا روی آن فوکوس شود، نشان میدهد. برای حاشیهنویسی ناحیه، کاربر باید مختصات تصویر محور x و y را برای هر گره در ناحیه مشخص کند. یک ناحیه برای تشکیل یک چندضلعی باید سه یا چند گره داشته باشد. میتواند چندین ناحیه در یک فریم وجود داشته باشد. اگر نواحی با یکدیگر همپوشانی داشته باشند، ناحیهای که توسط هر دو ناحیه پوشش داده میشود، همچنان پوشش داده خواهد شد.
حاشیهنویسی منطقه، سینتکس ورودی خاصی دارد که باید از آن پیروی کرد.
- برای نشان دادن یک گره واحد، از
:برای اتصال محورهای x و y مختصات تصویر استفاده کنید. برای مثال، گره(0,0)در گوشه بالا سمت چپ به صورت0:0نشان داده میشود. - برای مشخص کردن تمام گرههای یک منطقه، از علامت
;برای اتصال گرهها استفاده کنید. به عنوان مثال، برای منطقهای با گرههای(0,0)،(100,0)،(100,100)و(0, 100)، منطقه به صورت0:0;100:0;100:100;0:100نشان داده میشود. همیشه گرهها را به عنوان گرههای متصل کننده کنار یکدیگر وارد کنید، ترتیب میتواند هم در جهت عقربههای ساعت و هم در خلاف جهت عقربههای ساعت باشد.
*یک زون مربعی با چهار گره.
*یک ناحیه مثلثی با سه گره.
- برای مشخص کردن چندین منطقه در یک فریم، از علامت
-برای اتصال مناطق مختلف استفاده کنید. برای مثال، اگر بخواهیم هر دو مقدار(0,0)،(100,0)،(100,100)،(0,100)و(120,120)،(110,150)،(200,160)را وارد کنیم، حاشیهنویسی منطقه ورودی0:0;100:0;100:100;0:100-120:120;110:150;200:160خواهد بود.
*دو منطقه در یک قاب.
برای دریافت مختصات از تصویر، ابزارهای آنلاینی وجود دارند که به شما در دریافت مختصات کمک میکنند. برای مثال، به Wolfram - Get Coordinates from Image مراجعه کنید.
منطقه حاشیه نویسی شده را حذف کنید
برای پیکربندی تشخیص حرکت در منطقه یا خارج از منطقه، از flag exclude_annotated_zone در دستور vaictl استفاده کنید.
بولی. پیشفرض نادرست.
حذف ناحیه حاشیهنویسی شده یک ورودی بولی از کاربر است که نشان میدهد آیا کاربر مایل است ناحیه حاشیهنویسی شده را در تشخیص حرکت حذف کند یا خیر.
- اگر روی
trueتنظیم شود، منطقه حاشیهنویسی شده به عنوان یک منطقه منفی عمل میکند. حرکات در مناطق حاشیهنویسی شده شناسایی نمیشوند.
*فقط تشخیص حرکت را خارج از مناطق ورودی اجرا کنید.
- اگر روی false تنظیم شود، آن منطقه به عنوان یک منطقه مثبت عمل میکند، جایی که تشخیص حرکت روی آن تمرکز خواهد کرد.
*فقط تشخیص حرکت را در مناطق ورودی اجرا کنید.
۶. مثال فیلتر حرکتی با منطقه تشخیص حرکت
در این مثال، ما از ویدئویی استفاده خواهیم کرد که در پیشزمینه آن درختی دائماً در حال حرکت است. در تنظیمات فیلتر حرکت معمولی، ویدئو فقط یک رویداد حرکتی تولید میکند که مدت زمان ویدئوی اصلی را دارد، زیرا فیلتر حرکت، درخت متحرک را به عنوان "در حال حرکت مداوم در کل ویدئو" ثبت میکند. با این حال، با کمک منطقه تشخیص حرکت، میتوانیم به درستی حرکت درخت را ماسک کنیم و روی حرکت خودروها و عابران پیاده تمرکز کنیم.
آمادهسازی ویدیو
ویدیوی نمونه (gs://cloud-samples-data/vertex-ai-vision/dynamic-background-fall.mp4) شامل درخت، ماشین و عابر پیاده از www.changedetection.net است.
اعتبار ویدیو: N. Goyette، P.-M. Jodoin، F. Porikli، J. Konrad، و P. Ishwar، changedetection.net: یک مجموعه داده جدید معیار تشخیص تغییر ، در مجموعه مقالات کارگاه IEEE در مورد تشخیص تغییر (CDW-2012) در CVPR-2012، پراویدنس، رود آیلند، 16-21 ژوئن 2012
آمادهسازی متغیر محیطی
متغیرهای پروژه ابری گوگل
export PROJECT_ID=<Your Google Cloud project ID> export LOCATION_ID=us-central1 export LOCAL_FILE=street_vehicles_people.mp4
پیکربندی اولیه فیلتر حرکت.
export MOTION_SENSITIVITY=<low or medium or high> export MIN_EVENT_LENGTH=<0-3600> export LOOK_BACK_WINDOW=<0-3600> export COOL_DOWN_PERIOD=<0-3600>
پیکربندی منطقه تشخیص حرکت
برای مشاهده انواع مختلف کاربرد ناحیه تشخیص حرکت، از پایین انتخاب کنید.
درخت را برای تشخیص حرکت مستثنی کنید.
export ZONE_ANNOTATION="0:0;680:0;660:70;380:320;100:150" export EXCLUDE_ANNOTATED_ZONE=true
*فقط تشخیص حرکت را خارج از مناطق ورودی اجرا کنید.
تشخیص حرکت را در خیابان متمرکز کنید.
export ZONE_ANNOTATION="0:300;780:300;780:480;0:480" export EXCLUDE_ANNOTATED_ZONE=false
*فقط تشخیص حرکت را خارج از مناطق ورودی اجرا کنید.
ارسال جریان ویدیو با فیلتر حرکت
رویدادهای حرکتی را به کنسول ابری ارسال کنید
شما میتوانید از vaictl برای پخش دادههای ویدئویی خروجی به کنسول ابری استفاده کنید. با فعال کردن رابط برنامهنویسی کاربردی هوش مصنوعی بینایی (Vision AI API) در کنسول ابری شروع کنید.
ثبت جریان جدید
- روی تب Streams در پنل سمت چپ Vertex AI Vision کلیک کنید.
- روی ثبت نام کلیک کنید
- در قسمت نام جریان
motion-detection-streamرا وارد کنید. - در منطقه
us-central1را وارد کنید - ثبت نام کلیک کنید
ارسال نتایج به استریم
این دستور یک فایل ویدیویی را به یک جریان (stream) استریم میکند. اگر از آپشن –loop استفاده کنید، ویدیو تا زمانی که دستور را متوقف کنید، در جریان (stream) به صورت حلقهای (loop) پخش میشود. ما این دستور را به عنوان یک کار پسزمینه اجرا خواهیم کرد تا پخش آن ادامه یابد.
برای اینکه برنامه در پسزمینه اجرا شود، nohup به ابتدا و & را به انتها اضافه کنید.
vaictl -p $PROJECT \
-l $LOCATION_ID \
-c application-cluster-0 \
--service-endpoint visionai.googleapis.com \
send video-file --file-path $INPUT_VIDEO \
applying motion-filter
--motion-sensitivity=$MOTION_SENSITIVITY \
--min-event-length=$MIN_EVENT_LENGTH \
--lookback-length=$LOOK_BACK_WINDOW \
--cooldown-length=$COOL_DOWN_PERIOD \
--zone_annotation=ZONE_ANNOTATION \
--exclude_annotated_zone=$EXCLUDE_ANNOTATED_ZONE \
to streams motion-detection-stream --loop
ممکن است بین شروع عملیات دریافت پیام vaictl و نمایش ویدیو در داشبورد حدود ۱۰۰ ثانیه طول بکشد.
پس از اینکه دریافت جریان در دسترس قرار گرفت، میتوانید با انتخاب جریان ترافیک، فید ویدیو را در تب جریانها در داشبورد Vertex AI Vision مشاهده کنید.
ارسال نتایج به حافظه محلی
این دستور یک فایل ویدیویی را به یک جریان (stream) استریم میکند. اگر از آپشن –loop استفاده کنید، ویدیو تا زمانی که دستور را متوقف کنید، در جریان (stream) به صورت حلقهای (loop) پخش میشود. ما این دستور را به عنوان یک کار پسزمینه اجرا خواهیم کرد تا پخش آن ادامه یابد.
برای اینکه برنامه در پسزمینه اجرا شود، nohup به ابتدا و & را به انتها اضافه کنید.
OUTPUT_PATH=<path_to_store_motion_events>
vaictl -p $PROJECT \
-l $LOCATION_ID \
-c application-cluster-0 \
--service-endpoint visionai.googleapis.com \
send video-file --file-path $INPUT_VIDEO \
applying motion-filter
--motion-sensitivity=$MOTION_SENSITIVITY \
--min-event-length=$MIN_EVENT_LENGTH \
--lookback-length=$LOOK_BACK_WINDOW \
--cooldown-length=$COOL_DOWN_PERIOD \
--zone_annotation=$ZONE_ANNOTATION \
--exclude_annotated_zone=$EXCLUDE_ANNOTATED_ZONE \
to mp4file --mp4-file-path=$OUTPUT_PATH --loop
۷. تبریک
تبریک میگویم، آزمایشگاه را تمام کردید!
تمیز کردن
برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این آموزش، عملیات vaictl SDK را از طریق خط فرمان با ctrl + z خاتمه دهید.
منابع
https://cloud.google.com/vision-ai/docs/overview
https://cloud.google.com/vision-ai/docs/motion-filtering-model
https://cloud.google.com/vision-ai/docs/create-manage-streams
بازخورد
برای ارائه بازخورد اینجا کلیک کنید