১. উদ্দেশ্যসমূহ
সংক্ষিপ্ত বিবরণ
এই কোডল্যাবটি রিটেইল ভিডিও ফুটেজ ব্যবহার করে কিউ সাইজ নিরীক্ষণের জন্য শুরু থেকে শেষ পর্যন্ত একটি ভার্টেক্স এআই ভিশন অ্যাপ্লিকেশন তৈরির উপর আলোকপাত করবে। আমরা নিম্নলিখিত বিষয়গুলো ক্যাপচার করার জন্য প্রি-ট্রেইনড স্পেশালাইজড মডেলের অকুপেন্সি অ্যানালিটিক্স ইনবিল্ট ফিচারগুলো ব্যবহার করব:
- সারিতে দাঁড়িয়ে থাকা লোকের সংখ্যা গণনা করুন।
- কাউন্টারে সেবা গ্রহণকারী লোকের সংখ্যা গণনা করুন।
আপনি যা শিখবেন
- Vertex AI Vision-এ কীভাবে একটি অ্যাপ্লিকেশন তৈরি এবং ডিপ্লয় করবেন
- জুপিটার নোটবুক থেকে vaictl ব্যবহার করে কীভাবে একটি ভিডিও ফাইল থেকে RTSP স্ট্রিম সেট আপ করতে হয় এবং সেই স্ট্রিমটি Vertex AI Vision-এ ইনজেস্ট করতে হয়।
- অকুপেন্সি অ্যানালিটিক্স মডেল এবং এর বিভিন্ন বৈশিষ্ট্য কীভাবে ব্যবহার করবেন।
- আপনার স্টোরেজে থাকা Vertex AI Vision-এর Media Warehouse-এ কীভাবে ভিডিও অনুসন্ধান করবেন
- কীভাবে আউটপুটকে BigQuery-এর সাথে সংযুক্ত করবেন, মডেলের json আউটপুট থেকে তথ্য আহরণের জন্য SQL কোয়েরি লিখবেন এবং সেই আউটপুট ব্যবহার করে মূল ভিডিওতে লেবেল ও টীকা যুক্ত করবেন।
খরচ:
গুগল ক্লাউডে এই ল্যাবটি চালানোর মোট খরচ প্রায় ২ ডলার।
২. শুরু করার আগে
একটি প্রজেক্ট তৈরি করুন এবং এপিআইগুলো সক্রিয় করুন:
- গুগল ক্লাউড কনসোলে, প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন । দ্রষ্টব্য : এই পদ্ধতিতে তৈরি করা রিসোর্সগুলো যদি আপনি রাখতে না চান, তবে বিদ্যমান কোনো প্রজেক্ট নির্বাচন করার পরিবর্তে একটি নতুন প্রজেক্ট তৈরি করুন। এই ধাপগুলো শেষ করার পর, আপনি প্রজেক্টটি ডিলিট করতে পারেন, যার ফলে প্রজেক্টটির সাথে যুক্ত সমস্ত রিসোর্স মুছে যাবে। প্রজেক্ট সিলেক্টরে যান।
- আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন, তা জেনে নিন।
- কম্পিউট ইঞ্জিন, ভার্টেক্স এপিআই, নোটবুক এপিআই এবং ভিশন এআই এপিআই সক্রিয় করুন। এপিআইগুলো সক্রিয় করুন।
একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন:
- Google Cloud কনসোলে, 'Create service account' পেজে যান। 'Create service account'-এ যান।
- আপনার প্রকল্পটি নির্বাচন করুন।
- সার্ভিস অ্যাকাউন্ট নেম ফিল্ডে একটি নাম লিখুন। গুগল ক্লাউড কনসোল এই নামের উপর ভিত্তি করে সার্ভিস অ্যাকাউন্ট আইডি ফিল্ডটি পূরণ করে দেবে। সার্ভিস অ্যাকাউন্ট ডেসক্রিপশন ফিল্ডে একটি বিবরণ লিখুন। উদাহরণস্বরূপ, কুইকস্টার্টের জন্য সার্ভিস অ্যাকাউন্ট।
- তৈরি করুন-এ ক্লিক করুন এবং চালিয়ে যান ।
- আপনার প্রোজেক্টে অ্যাক্সেস দেওয়ার জন্য, আপনার সার্ভিস অ্যাকাউন্টে নিম্নলিখিত রোল(গুলি) মঞ্জুর করুন:
- ভিশন এআই > ভিশন এআই সম্পাদক
- কম্পিউট ইঞ্জিন > কম্পিউট ইনস্ট্যান্স অ্যাডমিন (বিটা)
- BigQuery > BigQuery অ্যাডমিন .
'ভূমিকা নির্বাচন করুন' তালিকা থেকে একটি ভূমিকা নির্বাচন করুন। অতিরিক্ত ভূমিকার জন্য, 'আরও একটি ভূমিকা যোগ করুন'- এ ক্লিক করুন এবং প্রতিটি অতিরিক্ত ভূমিকা যোগ করুন।
- চালিয়ে যান-এ ক্লিক করুন।
- সার্ভিস অ্যাকাউন্ট তৈরি করা শেষ করতে 'Done'-এ ক্লিক করুন। আপনার ব্রাউজার উইন্ডোটি বন্ধ করবেন না। পরবর্তী ধাপে আপনি এটি ব্যবহার করবেন।
৩. জুপিটার নোটবুক সেট আপ করুন
অকুপেন্সি অ্যানালিটিক্সে একটি অ্যাপ তৈরি করার আগে, আপনাকে অবশ্যই একটি স্ট্রিম নিবন্ধন করতে হবে যা পরবর্তীতে অ্যাপটি ব্যবহার করতে পারবে।
এই টিউটোরিয়ালে আপনি একটি Jupyter Notebook ইনস্ট্যান্স তৈরি করবেন যা একটি ভিডিও হোস্ট করবে, এবং সেই নোটবুক থেকে স্ট্রিমিং ভিডিও ডেটা পাঠাবেন। আমরা Jupyter Notebook ব্যবহার করছি কারণ এটি আমাদের শেল কমান্ড চালানোর পাশাপাশি কাস্টম প্রি/পোস্ট প্রসেসিং কোড একটি একক স্থানে রান করার সুবিধা দেয়, যা দ্রুত পরীক্ষা-নিরীক্ষার জন্য খুবই উপযোগী। আমরা এই নোটবুকটি ব্যবহার করব:
- আরটিএসপি সার্ভারকে ব্যাকগ্রাউন্ড প্রসেস হিসেবে চালান।
- vaictl কমান্ডটিকে ব্যাকগ্রাউন্ড প্রসেস হিসেবে চালান।
- অকুপেন্সি অ্যানালিটিক্স আউটপুট বিশ্লেষণ করতে কোয়েরি এবং প্রসেসিং কোড চালান।
একটি জুপিটার নোটবুক তৈরি করুন
একটি Jupyter Notebook ইনস্ট্যান্স থেকে ভিডিও পাঠানোর প্রথম ধাপ হলো, পূর্ববর্তী ধাপে তৈরি করা আমাদের সার্ভিস অ্যাকাউন্টটি ব্যবহার করে নোটবুকটি তৈরি করা।
- কনসোলে, Vertex AI পেজে যান। Vertex AI Workbench-এ যান।
- ব্যবহারকারী-পরিচালিত নোটবুকগুলিতে ক্লিক করুন

- নতুন নোটবুক > টেনসরফ্লো এন্টারপ্রাইজ ২.৬ (এলটিএস সহ) > জিপিইউ ছাড়া- তে ক্লিক করুন

- জুপিটার নোটবুকের জন্য নাম লিখুন। আরও তথ্যের জন্য, রিসোর্স নামকরণের নিয়মাবলী দেখুন।

- উন্নত বিকল্পগুলিতে ক্লিক করুন
- অনুমতি বিভাগে নিচে স্ক্রোল করুন
- কম্পিউট ইঞ্জিন ডিফল্ট পরিষেবা অ্যাকাউন্ট ব্যবহার করুন বিকল্পটি আনচেক করুন
- পূর্ববর্তী ধাপে তৈরি করা সার্ভিস অ্যাকাউন্টের ইমেলটি যোগ করুন। এবং Create-এ ক্লিক করুন।

- ইনস্ট্যান্সটি তৈরি হয়ে গেলে ওপেন জুপিটারল্যাব (OPEN JUPYTERLAB)-এ ক্লিক করুন।
৪. ভিডিও স্ট্রিম করার জন্য একটি নোটবুক সেট আপ করুন।
অকুপেন্সি অ্যানালিটিক্সে একটি অ্যাপ তৈরি করার আগে, আপনাকে অবশ্যই একটি স্ট্রিম নিবন্ধন করতে হবে যা পরবর্তীতে অ্যাপটি ব্যবহার করতে পারবে।
এই টিউটোরিয়ালে আমরা আমাদের জুপিটার নোটবুক ইনস্ট্যান্স ব্যবহার করে একটি ভিডিও হোস্ট করব এবং নোটবুক টার্মিনাল থেকে সেই স্ট্রিমিং ভিডিও ডেটা পাঠাব।
vaictl কমান্ড-লাইন টুলটি ডাউনলোড করুন
- খোলা Jupyterlab ইনস্ট্যান্সটিতে, লঞ্চার থেকে একটি নোটবুক খুলুন।

- নোটবুক সেলে নিম্নলিখিত কমান্ড ব্যবহার করে Vertex AI Vision (vaictl) কমান্ড লাইন টুল, rtsp সার্ভার কমান্ড লাইন টুল এবং open-cv টুল ডাউনলোড করুন:
!wget -q https://github.com/aler9/rtsp-simple-server/releases/download/v0.20.4/rtsp-simple-server_v0.20.4_linux_amd64.tar.gz
!wget -q https://github.com/google/visionai/releases/download/v0.0.4/visionai_0.0-4_amd64.deb
!tar -xf rtsp-simple-server_v0.20.4_linux_amd64.tar.gz
!pip install opencv-python --quiet
!sudo apt-get -qq remove -y visionai
!sudo apt-get -qq install -y ./visionai_0.0-4_amd64.deb
!sudo apt-get -qq install -y ffmpeg
৫. স্ট্রিমিংয়ের জন্য একটি ভিডিও ফাইল গ্রহণ করুন
প্রয়োজনীয় কমান্ড লাইন টুলগুলো দিয়ে আপনার নোটবুক পরিবেশ সেট আপ করার পর, আপনি একটি নমুনা ভিডিও ফাইল কপি করে vaictl ব্যবহার করে আপনার অকুপেন্সি অ্যানালিটিক্স অ্যাপে ভিডিও ডেটা স্ট্রিম করতে পারেন।
একটি নতুন স্ট্রিম নিবন্ধন করুন
- Vertex AI Vision-এর বাম প্যানেলে থাকা স্ট্রিমস ট্যাবে ক্লিক করুন।
- উপরে থাকা রেজিস্টার বাটনে ক্লিক করুন

- Stream name-এর জায়গায় 'queue-stream' লিখুন।
- অঞ্চল অংশে, পূর্ববর্তী ধাপে নোটবুক তৈরির সময় নির্বাচিত অঞ্চলটিই বেছে নিন।
- রেজিস্টার ক্লিক করুন
আপনার ভিএম-এ একটি নমুনা ভিডিও কপি করুন।
- আপনার নোটবুকে নিম্নলিখিত wget কমান্ডটি ব্যবহার করে একটি নমুনা ভিডিও কপি করুন।
!wget -q https://github.com/vagrantism/interesting-datasets/raw/main/video/collective_activity/seq25_h264.mp4
ভিএম থেকে ভিডিও স্ট্রিম করুন এবং আপনার স্ট্রিমে ডেটা অন্তর্ভুক্ত করুন।
- এই স্থানীয় ভিডিও ফাইলটি অ্যাপের ইনপুট স্ট্রিমে পাঠাতে, আপনার নোটবুক সেলে নিম্নলিখিত কমান্ডটি ব্যবহার করুন। আপনাকে অবশ্যই নিম্নলিখিত ভেরিয়েবল প্রতিস্থাপনগুলি করতে হবে:
- PROJECT_ID: আপনার গুগল ক্লাউড প্রজেক্ট আইডি।
- অবস্থান: আপনার অবস্থান আইডি। উদাহরণস্বরূপ, us-central1। আরও তথ্যের জন্য, ক্লাউড অবস্থানসমূহ দেখুন।
- LOCAL_FILE: একটি স্থানীয় ভিডিও ফাইলের ফাইলের নাম। উদাহরণস্বরূপ,
seq25_h264.mp4।
PROJECT_ID='<Your Google Cloud project ID>'
LOCATION='<Your stream location>'
LOCAL_FILE='seq25_h264.mp4'
STREAM_NAME='queue-stream'
- একটি rtsp-simple-server চালু করুন যেখানে আমরা rtsp প্রোটোকল ব্যবহার করে ভিডিও ফাইলটি স্ট্রিম করব।
import os
import time
import subprocess
subprocess.Popen(["nohup", "./rtsp-simple-server"], stdout=open('rtsp_out.log', 'a'), stderr=open('rtsp_err.log', 'a'), preexec_fn=os.setpgrp)
time.sleep(5)
- আরটিএসপি স্ট্রিমে ভিডিও লুপ করার জন্য এফএফএমপিইজি কমান্ড লাইন টুল ব্যবহার করুন।
subprocess.Popen(["nohup", "ffmpeg", "-re", "-stream_loop", "-1", "-i", LOCAL_FILE, "-c", "copy", "-f", "rtsp", f"rtsp://localhost:8554/{LOCAL_FILE.split('.')[0]}"], stdout=open('ffmpeg_out.log', 'a'), stderr=open('ffmpeg_err.log', 'a'), preexec_fn=os.setpgrp)
time.sleep(5)
- পূর্ববর্তী ধাপে তৈরি করা আমাদের Vertex AI Vision স্ট্রিম 'queue-stream'-এ rtsp সার্ভার uri থেকে ভিডিও স্ট্রিম করতে vaictl কমান্ড লাইন টুলটি ব্যবহার করুন।
subprocess.Popen(["nohup", "vaictl", "-p", PROJECT_ID, "-l", LOCATION, "-c", "application-cluster-0", "--service-endpoint", "visionai.googleapis.com", "send", "rtsp", "to", "streams", "queue-stream", "--rtsp-uri", f"rtsp://localhost:8554/{LOCAL_FILE.split('.')[0]}"], stdout=open('vaictl_out.log', 'a'), stderr=open('vaictl_err.log', 'a'), preexec_fn=os.setpgrp)
vaictl ইনজেস্ট অপারেশন শুরু হওয়ার পর থেকে ড্যাশবোর্ডে ভিডিওটি প্রদর্শিত হতে প্রায় ১০০ সেকেন্ড সময় লাগতে পারে।
স্ট্রিম ইনজেশন উপলব্ধ হওয়ার পর, আপনি Vertex AI Vision ড্যাশবোর্ডের Streams ট্যাবে queue-stream নির্বাচন করে ভিডিও ফিডটি দেখতে পারবেন।

৬. একটি অ্যাপ্লিকেশন তৈরি করুন
প্রথম ধাপ হলো এমন একটি অ্যাপ তৈরি করা যা আপনার ডেটা প্রসেস করবে। একটি অ্যাপকে এমন একটি স্বয়ংক্রিয় পাইপলাইন হিসেবে ভাবা যেতে পারে যা নিম্নলিখিত বিষয়গুলোকে সংযুক্ত করে:
- ডেটা ইনজেশন : একটি ভিডিও ফিড স্ট্রিমে ইনজেস্ট করা হয়।
- ডেটা বিশ্লেষণ : ডেটা গ্রহণের পর একটি এআই (কম্পিউটার ভিশন) মডেল যুক্ত করা যেতে পারে।
- ডেটা স্টোরেজ : ভিডিও ফিডের দুটি সংস্করণ (মূল স্ট্রিম এবং এআই মডেল দ্বারা প্রক্রিয়াকৃত স্ট্রিম) একটি মিডিয়া ওয়্যারহাউসে সংরক্ষণ করা যেতে পারে।
গুগল ক্লাউড কনসোলে একটি অ্যাপকে গ্রাফ হিসেবে দেখানো হয়।
একটি খালি অ্যাপ তৈরি করুন
অ্যাপ গ্রাফে তথ্য যোগ করার আগে, আপনাকে প্রথমে একটি খালি অ্যাপ তৈরি করতে হবে।
গুগল ক্লাউড কনসোলে একটি অ্যাপ তৈরি করুন।
- গুগল ক্লাউড কনসোলে যান।
- Vertex AI Vision ড্যাশবোর্ডের অ্যাপ্লিকেশন ট্যাবটি খুলুন। অ্যাপ্লিকেশন ট্যাবে যান
- Create বাটনটিতে ক্লিক করুন।

- অ্যাপের নাম হিসেবে ' queue-app' লিখুন এবং আপনার অঞ্চল নির্বাচন করুন।
- তৈরি করুন- এ ক্লিক করুন।
অ্যাপ কম্পোনেন্ট নোড যোগ করুন
খালি অ্যাপ্লিকেশনটি তৈরি করার পরে, আপনি অ্যাপ গ্রাফে তিনটি নোড যোগ করতে পারেন:
- ইনজেশন নোড : এটি সেই স্ট্রিম রিসোর্স যা আপনার নোটবুকে তৈরি করা একটি rtsp ভিডিও সার্ভার থেকে পাঠানো ডেটা গ্রহণ করে।
- প্রসেসিং নোড : অকুপেন্সি অ্যানালিটিক্স মডেল যা গৃহীত ডেটার উপর কাজ করে।
- স্টোরেজ নোড : এটি হলো মিডিয়া ওয়্যারহাউস যা প্রক্রিয়াকৃত ভিডিও সংরক্ষণ করে এবং মেটাডেটা স্টোর হিসেবে কাজ করে। এই মেটাডেটা স্টোরগুলোতে গৃহীত ভিডিও ডেটা সম্পর্কিত অ্যানালিটিক্স তথ্য এবং এআই মডেল দ্বারা অনুমিত তথ্য অন্তর্ভুক্ত থাকে।
কনসোলে আপনার অ্যাপে কম্পোনেন্ট নোড যোগ করুন।
- Vertex AI Vision ড্যাশবোর্ডের অ্যাপ্লিকেশন ট্যাবটি খুলুন। অ্যাপ্লিকেশন ট্যাবে যান
এটি আপনাকে প্রসেসিং পাইপলাইনের গ্রাফ ভিজ্যুয়ালাইজেশনে নিয়ে যাবে।
একটি ডেটা ইনজেশন নোড যোগ করুন
- একটি ইনপুট স্ট্রিম নোড যোগ করতে, সাইড মেনুর কানেক্টরস সেকশনে থাকা স্ট্রিমস অপশনটি নির্বাচন করুন।
- যে স্ট্রিম মেনুটি খুলবে তার সোর্স বিভাগে, অ্যাড স্ট্রিমস নির্বাচন করুন।
- Add streams মেনুতে, queue-stream নির্বাচন করুন।
- অ্যাপ গ্রাফে স্ট্রিমটি যোগ করতে, ‘অ্যাড স্ট্রিমস’ এ ক্লিক করুন।
একটি ডেটা প্রসেসিং নোড যোগ করুন
- অকুপেন্সি কাউন্ট মডেল নোড যোগ করতে, সাইড মেনুর স্পেশালাইজড মডেলস সেকশন থেকে অকুপেন্সি অ্যানালিটিক্স অপশনটি নির্বাচন করুন।
- ডিফল্ট নির্বাচন 'People' অপরিবর্তিত রাখুন। 'Vehicles' আগে থেকেই নির্বাচিত থাকলে, সেটির টিক চিহ্ন তুলে দিন।

- অ্যাডভান্সড অপশনস সেকশনে, ক্রিয়েট অ্যাক্টিভ জোন/লাইনস- এ ক্লিক করুন।

- কোনো নির্দিষ্ট জোনে লোক গণনা করার জন্য পলিগন টুল ব্যবহার করে সক্রিয় জোনগুলো আঁকুন। সেই অনুযায়ী জোনটির নামকরণ করুন।

- উপরে থাকা ব্যাক অ্যারোতে ক্লিক করুন।

- কনজেশন শনাক্ত করার জন্য ডওয়েল টাইমের সেটিংস যোগ করতে চেকবক্সে ক্লিক করুন।

একটি ডেটা স্টোরেজ নোড যোগ করুন
- আউটপুট গন্তব্য (স্টোরেজ) নোড যোগ করতে, সাইড মেনুর কানেক্টরস সেকশন থেকে ভিশন এআই ওয়্যারহাউস অপশনটি নির্বাচন করুন।
- এর মেনু খুলতে Vertex AI Warehouse Connector-এ ক্লিক করুন, এরপর Connect warehouse-এ ক্লিক করুন।
- Connect warehouse মেনুতে, Create new warehouse নির্বাচন করুন। ওয়্যারহাউসটির নাম দিন queue-warehouse, এবং TTL সময়কাল ১৪ দিন রাখুন।
- গুদামটি যোগ করতে Create বাটনে ক্লিক করুন।
৭. আউটপুটকে BigQuery টেবিলের সাথে সংযুক্ত করুন
যখন আপনি আপনার Vertex AI Vision অ্যাপে একটি BigQuery কানেক্টর যোগ করবেন, তখন কানেক্টেড অ্যাপের সমস্ত মডেল আউটপুট টার্গেট টেবিলে অন্তর্ভুক্ত হয়ে যাবে।
আপনি হয় নিজের BigQuery টেবিল তৈরি করে অ্যাপে BigQuery কানেক্টর যোগ করার সময় সেই টেবিলটি নির্দিষ্ট করে দিতে পারেন, অথবা Vertex AI Vision অ্যাপ প্ল্যাটফর্মকে স্বয়ংক্রিয়ভাবে টেবিলটি তৈরি করতে দিতে পারেন।
স্বয়ংক্রিয় টেবিল তৈরি
যদি আপনি Vertex AI Vision অ্যাপ প্ল্যাটফর্মকে স্বয়ংক্রিয়ভাবে টেবিল তৈরি করতে দেন, তাহলে BigQuery কানেক্টর নোড যোগ করার সময় আপনি এই অপশনটি নির্দিষ্ট করতে পারেন।
স্বয়ংক্রিয় টেবিল তৈরি ব্যবহার করতে চাইলে নিম্নলিখিত ডেটাসেট এবং টেবিলের শর্তাবলী প্রযোজ্য হবে:
- ডেটা সেট: স্বয়ংক্রিয়ভাবে তৈরি হওয়া ডেটা সেটের নাম হলো visionai_dataset।
- টেবিল: স্বয়ংক্রিয়ভাবে তৈরি হওয়া টেবিলের নাম হলো visionai_dataset.APPLICATION_ID।
- ত্রুটি ব্যবস্থাপনা:
- একই ডেটাসেটের অধীনে একই নামের টেবিল বিদ্যমান থাকলে, স্বয়ংক্রিয়ভাবে কোনো টেবিল তৈরি হয় না।
- Vertex AI Vision ড্যাশবোর্ডের অ্যাপ্লিকেশন ট্যাবটি খুলুন। অ্যাপ্লিকেশন ট্যাবে যান
- তালিকা থেকে আপনার অ্যাপ্লিকেশনের নামের পাশে থাকা ‘ভিউ অ্যাপ’ নির্বাচন করুন।
- অ্যাপ্লিকেশন বিল্ডার পেজে কানেক্টর সেকশন থেকে BigQuery নির্বাচন করুন।
- BigQuery পাথ ফিল্ডটি খালি রাখুন।

- স্টোর মেটাডেটা থেকে: শুধুমাত্র 'অকুপেন্সি অ্যানালিটিক্স' নির্বাচন করুন এবং স্ট্রিমগুলো আনচেক করুন।
চূড়ান্ত অ্যাপ গ্রাফটি দেখতে এইরকম হবে:

৮. ব্যবহারের জন্য আপনার অ্যাপটি স্থাপন করুন।
প্রয়োজনীয় সমস্ত উপাদান দিয়ে আপনার এন্ড-টু-এন্ড অ্যাপটি তৈরি করার পর, অ্যাপটি ব্যবহারের শেষ ধাপ হলো এটিকে ডিপ্লয় করা।
- Vertex AI Vision ড্যাশবোর্ডের অ্যাপ্লিকেশন ট্যাবটি খুলুন। অ্যাপ্লিকেশন ট্যাবে যান
- তালিকায় queue-app অ্যাপটির পাশে থাকা View app নির্বাচন করুন।
- স্টুডিও পেজ থেকে ডিপ্লয় বাটনে ক্লিক করুন।
- পরবর্তী নিশ্চিতকরণ ডায়ালগে, 'Deploy'-এ ক্লিক করুন। ডেপ্লয়মেন্ট প্রক্রিয়াটি সম্পন্ন হতে কয়েক মিনিট সময় লাগতে পারে। ডেপ্লয়মেন্ট শেষ হলে, নোডগুলোর পাশে সবুজ টিক চিহ্ন দেখা যাবে।

৯. স্টোরেজ ওয়্যারহাউসে ভিডিও কন্টেন্ট অনুসন্ধান করুন।
আপনার প্রসেসিং অ্যাপে ভিডিও ডেটা অন্তর্ভুক্ত করার পর, আপনি বিশ্লেষণ করা ভিডিও ডেটা দেখতে পারবেন এবং অকুপেন্সি অ্যানালিটিক্স তথ্যের ভিত্তিতে ডেটা অনুসন্ধান করতে পারবেন।
- Vertex AI Vision ড্যাশবোর্ডের Warehouses ট্যাবটি খুলুন। Warehouses ট্যাবে যান
- তালিকায় queue-warehouse ওয়্যারহাউসটি খুঁজুন এবং View assets-এ ক্লিক করুন।
- 'People count' সেকশনে, সর্বনিম্ন মান (Min value) ১ এবং সর্বোচ্চ মান (Max value) ৫ সেট করুন।
- Vertex AI Vision-এর মিডিয়া ওয়্যারহাউসে সংরক্ষিত প্রক্রিয়াকৃত ভিডিও ডেটা ফিল্টার করতে, সার্চ-এ ক্লিক করুন।

গুগল ক্লাউড কনসোলে অনুসন্ধান শর্তের সাথে মিলে যাওয়া সংরক্ষিত ভিডিও ডেটার একটি দৃশ্য।
১০. BigQuery টেবিল ব্যবহার করে আউটপুট টীকাযুক্ত ও বিশ্লেষণ করুন
- নোটবুকের সেলে নিম্নলিখিত ভেরিয়েবলগুলো ইনিশিয়ালাইজ করুন।
DATASET_ID='vision_ai_dataset'
bq_table=f'{PROJECT_ID}.{DATASET_ID}.queue-app'
frame_buffer_size=10000
frame_buffer_error_milliseconds=5
dashboard_update_delay_seconds=3
rtsp_url='rtsp://localhost:8554/seq25_h264'
- এখন আমরা নিম্নলিখিত কোড ব্যবহার করে rtsp স্ট্রিম থেকে ফ্রেমগুলো ক্যাপচার করব:
import cv2
import threading
from collections import OrderedDict
from datetime import datetime, timezone
frame_buffer = OrderedDict()
frame_buffer_lock = threading.Lock()
stream = cv2.VideoCapture(rtsp_url)
def read_frames(stream):
global frames
while True:
ret, frame = stream.read()
frame_ts = datetime.now(timezone.utc).timestamp() * 1000
if ret:
with frame_buffer_lock:
while len(frame_buffer) >= frame_buffer_size:
_ = frame_buffer.popitem(last=False)
frame_buffer[frame_ts] = frame
frame_buffer_thread = threading.Thread(target=read_frames, args=(stream,))
frame_buffer_thread.start()
print('Waiting for stream initialization')
while not list(frame_buffer.keys()): pass
print('Stream Initialized')
- bigquery টেবিল থেকে ডেটার টাইমস্ট্যাম্প এবং অ্যানোটেশন তথ্য সংগ্রহ করুন এবং ক্যাপচার করা ফ্রেমের ছবিগুলো সংরক্ষণ করার জন্য একটি ডিরেক্টরি তৈরি করুন:
from google.cloud import bigquery
import pandas as pd
client = bigquery.Client(project=PROJECT_ID)
query = f"""
SELECT MAX(ingestion_time) AS ts
FROM `{bq_table}`
"""
bq_max_ingest_ts_df = client.query(query).to_dataframe()
bq_max_ingest_epoch = str(int(bq_max_ingest_ts_df['ts'][0].timestamp()*1000000))
bq_max_ingest_ts = bq_max_ingest_ts_df['ts'][0]
print('Preparing to pull records with ingestion time >', bq_max_ingest_ts)
if not os.path.exists(bq_max_ingest_epoch):
os.makedirs(bq_max_ingest_epoch)
print('Saving output frames to', bq_max_ingest_epoch)
- নিম্নলিখিত কোড ব্যবহার করে ফ্রেমগুলিতে টীকা যোগ করুন:
import json
import base64
import numpy as np
from IPython.display import Image, display, HTML, clear_output
im_width = stream.get(cv2.CAP_PROP_FRAME_WIDTH)
im_height = stream.get(cv2.CAP_PROP_FRAME_HEIGHT)
dashdelta = datetime.now()
framedata = {}
cntext = lambda x: {y['entity']['labelString']: y['count'] for y in x}
try:
while True:
try:
annotations_df = client.query(f'''
SELECT ingestion_time, annotation
FROM `{bq_table}`
WHERE ingestion_time > TIMESTAMP("{bq_max_ingest_ts}")
''').to_dataframe()
except ValueError as e:
continue
bq_max_ingest_ts = annotations_df['ingestion_time'].max()
for _, row in annotations_df.iterrows():
with frame_buffer_lock:
frame_ts = np.asarray(list(frame_buffer.keys()))
delta_ts = np.abs(frame_ts - (row['ingestion_time'].timestamp() * 1000))
delta_tx_idx = delta_ts.argmin()
closest_ts_delta = delta_ts[delta_tx_idx]
closest_ts = frame_ts[delta_tx_idx]
if closest_ts_delta > frame_buffer_error_milliseconds: continue
image = frame_buffer[closest_ts]
annotations = json.loads(row['annotation'])
for box in annotations['identifiedBoxes']:
image = cv2.rectangle(
image,
(
int(box['normalizedBoundingBox']['xmin']*im_width),
int(box['normalizedBoundingBox']['ymin']*im_height)
),
(
int((box['normalizedBoundingBox']['xmin'] + box['normalizedBoundingBox']['width'])*im_width),
int((box['normalizedBoundingBox']['ymin'] + box['normalizedBoundingBox']['height'])*im_height)
),
(255, 0, 0), 2
)
img_filename = f"{bq_max_ingest_epoch}/{row['ingestion_time'].timestamp() * 1000}.png"
cv2.imwrite(img_filename, image)
binimg = base64.b64encode(cv2.imencode('.jpg', image)[1]).decode()
curr_framedata = {
'path': img_filename,
'timestamp_error': closest_ts_delta,
'counts': {
**{
k['annotation']['displayName'] : cntext(k['counts'])
for k in annotations['stats']["activeZoneCounts"]
},
'full-frame': cntext(annotations['stats']["fullFrameCount"])
}
}
framedata[img_filename] = curr_framedata
if (datetime.now() - dashdelta).total_seconds() > dashboard_update_delay_seconds:
dashdelta = datetime.now()
clear_output()
display(HTML(f'''
<h1>Queue Monitoring Application</h1>
<p>Live Feed of the queue camera:</p>
<p><img alt="" src="{img_filename}" style="float: left;"/></a></p>
<table border="1" cellpadding="1" cellspacing="1" style="width: 500px;">
<caption>Current Model Outputs</caption>
<thead>
<tr><th scope="row">Metric</th><th scope="col">Value</th></tr>
</thead>
<tbody>
<tr><th scope="row">Serving Area People Count</th><td>{curr_framedata['counts']['serving-zone']['Person']}</td></tr>
<tr><th scope="row">Queueing Area People Count</th><td>{curr_framedata['counts']['queue-zone']['Person']}</td></tr>
<tr><th scope="row">Total Area People Count</th><td>{curr_framedata['counts']['full-frame']['Person']}</td></tr>
<tr><th scope="row">Timestamp Error</th><td>{curr_framedata['timestamp_error']}</td></tr>
</tbody>
</table>
<p> </p>
'''))
except KeyboardInterrupt:
print('Stopping Live Monitoring')

- নোটবুক মেনু বারের স্টপ বাটন ব্যবহার করে অ্যানোটেশন টাস্কটি বন্ধ করুন।

- নিম্নলিখিত কোডটি ব্যবহার করে আপনি স্বতন্ত্র ফ্রেমগুলিতে পুনরায় যেতে পারেন:
from IPython.html.widgets import Layout, interact, IntSlider
imgs = sorted(list(framedata.keys()))
def loadimg(frame):
display(framedata[imgs[frame]])
display(Image(open(framedata[imgs[frame]]['path'],'rb').read()))
interact(loadimg, frame=IntSlider(
description='Frame #:',
value=0,
min=0, max=len(imgs)-1, step=1,
layout=Layout(width='100%')))

১১. অভিনন্দন
অভিনন্দন, আপনি ল্যাবটি শেষ করেছেন!
পরিষ্কার করা
এই টিউটোরিয়ালে ব্যবহৃত রিসোর্সগুলোর জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, হয় রিসোর্সগুলো যে প্রজেক্টে রয়েছে সেটি ডিলিট করে দিন, অথবা প্রজেক্টটি রেখে দিয়ে আলাদা আলাদা রিসোর্সগুলো ডিলিট করে দিন।
প্রকল্পটি মুছে ফেলুন
স্বতন্ত্র সম্পদ মুছে ফেলুন
সম্পদ
https://cloud.google.com/vision-ai/docs/overview
https://cloud.google.com/vision-ai/docs/occupancy-count-tutorial