ভার্টেক্স এআই ভিশন কিউ ডিটেকশন অ্যাপ

1. উদ্দেশ্য

ওভারভিউ

এই কোডল্যাবটি খুচরা ভিডিও ফুটেজ ব্যবহার করে সারির আকার নিরীক্ষণের জন্য একটি ভার্টেক্স এআই ভিশন অ্যাপ্লিকেশন তৈরির উপর ফোকাস করবে। নিম্নলিখিত বিষয়গুলি ক্যাপচার করতে আমরা পূর্ব-প্রশিক্ষিত বিশেষ মডেল অকুপেন্সি অ্যানালিটিক্স ইনবিল্ট বৈশিষ্ট্যগুলি ব্যবহার করব:

  • সারিতে দাঁড়িয়ে থাকা লোকের সংখ্যা গণনা করুন।
  • কাউন্টারে কত লোক সেবা পাচ্ছেন তা গণনা করুন।

আপনি কি শিখবেন

  • ভার্টেক্স এআই ভিশনে কীভাবে একটি অ্যাপ্লিকেশন তৈরি করবেন এবং এটি স্থাপন করবেন
  • কীভাবে একটি ভিডিও ফাইল ব্যবহার করে একটি আরটিএসপি স্ট্রিম সেট আপ করবেন এবং জুপিটার নোটবুক থেকে vaictl ব্যবহার করে ভার্টেক্স এআই ভিশনে স্ট্রিমটি ইনজেস্ট করবেন।
  • কিভাবে অকুপেন্সি অ্যানালিটিক্স মডেল এবং এর বিভিন্ন বৈশিষ্ট্য ব্যবহার করবেন।
  • আপনার স্টোরেজ ভার্টেক্স এআই ভিশনের মিডিয়া গুদামে ভিডিওগুলি কীভাবে অনুসন্ধান করবেন।
  • কিভাবে BigQuery-এ আউটপুট কানেক্ট করবেন, মডেলের json আউটপুট থেকে অন্তর্দৃষ্টি বের করতে SQL ক্যোয়ারী লিখুন এবং মূল ভিডিওটিকে লেবেল ও টীকা দিতে আউটপুট ব্যবহার করুন।

খরচ:

Google ক্লাউডে এই ল্যাবটি চালানোর জন্য মোট খরচ প্রায় $2।

2. আপনি শুরু করার আগে

একটি প্রকল্প তৈরি করুন এবং API সক্ষম করুন:

  1. Google ক্লাউড কনসোলে, প্রকল্প নির্বাচক পৃষ্ঠায়, একটি Google ক্লাউড প্রকল্প নির্বাচন করুন বা তৈরি করুনদ্রষ্টব্য : আপনি যদি এই পদ্ধতিতে আপনার তৈরি করা সংস্থানগুলি রাখার পরিকল্পনা না করেন তবে একটি বিদ্যমান প্রকল্প নির্বাচন করার পরিবর্তে একটি প্রকল্প তৈরি করুন৷ আপনি এই পদক্ষেপগুলি শেষ করার পরে, আপনি প্রকল্পের সাথে যুক্ত সমস্ত সংস্থান মুছে ফেলতে পারেন। প্রকল্প নির্বাচক যান
  2. নিশ্চিত করুন যে আপনার ক্লাউড প্রকল্পের জন্য বিলিং সক্ষম করা আছে৷ একটি প্রকল্পে বিলিং সক্ষম কিনা তা পরীক্ষা করতে শিখুন।
  3. Compute Engine, Vertex API, Notebook API এবং Vision AI API সক্ষম করুন৷ APIs সক্রিয় করুন

একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন:

  1. Google ক্লাউড কনসোলে, পরিষেবা অ্যাকাউন্ট তৈরি করুন পৃষ্ঠাতে যান। পরিষেবা অ্যাকাউন্ট তৈরি করুন এ যান
  2. আপনার প্রকল্প নির্বাচন করুন.
  3. পরিষেবা অ্যাকাউন্ট নাম ক্ষেত্রে, একটি নাম লিখুন। Google ক্লাউড কনসোল এই নামের উপর ভিত্তি করে পরিষেবা অ্যাকাউন্ট আইডি ক্ষেত্রটি পূরণ করে৷ পরিষেবা অ্যাকাউন্টের বিবরণ ক্ষেত্রে, একটি বিবরণ লিখুন। উদাহরণস্বরূপ, কুইকস্টার্টের জন্য সার্ভিস অ্যাকাউন্ট।
  4. তৈরি করুন এবং চালিয়ে যান ক্লিক করুন।
  5. আপনার প্রকল্পে অ্যাক্সেস প্রদান করতে, আপনার পরিষেবা অ্যাকাউন্টে নিম্নলিখিত ভূমিকা(গুলি) মঞ্জুর করুন:
  • ভিশন এআই > ভিশন এআই এডিটর
  • কম্পিউট ইঞ্জিন > কম্পিউট ইনস্ট্যান্স অ্যাডমিন (বিটা)
  • BigQuery > BigQuery অ্যাডমিন।

একটি ভূমিকা নির্বাচন করুন তালিকায়, একটি ভূমিকা নির্বাচন করুন৷ অতিরিক্ত ভূমিকার জন্য, অন্য ভূমিকা যোগ করুন ক্লিক করুন এবং প্রতিটি অতিরিক্ত ভূমিকা যোগ করুন।

  1. অবিরত ক্লিক করুন.
  2. পরিষেবা অ্যাকাউন্ট তৈরি করা শেষ করতে সম্পন্ন ক্লিক করুন। আপনার ব্রাউজার উইন্ডো বন্ধ করবেন না. আপনি পরবর্তী ধাপে এটি ব্যবহার করবেন।

3. জুপিটার নোটবুক সেট আপ করুন

অকুপেন্সি অ্যানালিটিক্সে একটি অ্যাপ তৈরি করার আগে, আপনাকে অবশ্যই একটি স্ট্রিম নিবন্ধন করতে হবে যা অ্যাপটি পরে ব্যবহার করতে পারে।

এই টিউটোরিয়ালে আপনি একটি জুপিটার নোটবুক উদাহরণ তৈরি করেন যা একটি ভিডিও হোস্ট করে এবং আপনি নোটবুক থেকে সেই স্ট্রিমিং ভিডিও ডেটা পাঠান। আমরা জুপিটার নোটবুক ব্যবহার করছি কারণ এটি শেল কমান্ডগুলি চালানোর পাশাপাশি কাস্টম প্রি/পোস্ট প্রসেসিং কোড চালানোর জন্য নমনীয়তা প্রদান করে যা দ্রুত পরীক্ষার জন্য খুব ভাল। আমরা এই নোটবুকটি ব্যবহার করব:

  1. একটি পটভূমি প্রক্রিয়া হিসাবে rtsp সার্ভার চালান
  2. পটভূমি প্রক্রিয়া হিসাবে vaictl কমান্ড চালান
  3. অকুপেন্সি অ্যানালিটিক্স আউটপুট বিশ্লেষণ করতে কোয়েরি এবং প্রসেসিং কোড চালান

একটি জুপিটার নোটবুক তৈরি করুন

জুপিটার নোটবুক ইন্সট্যান্স থেকে ভিডিও পাঠানোর প্রথম ধাপ হল আগের ধাপে তৈরি করা আমাদের পরিষেবা অ্যাকাউন্ট দিয়ে নোটবুক তৈরি করা।

  1. কনসোলে, Vertex AI পৃষ্ঠায় যান। Vertex AI Workbench এ যান
  2. ব্যবহারকারী-পরিচালিত নোটবুক-এ ক্লিক করুন

65b7112822858dce.png

  1. New Notebook > Tensorflow Enterprise 2.6 (LTS সহ) > GPU ছাড়া ক্লিক করুন

dc156f20b14651d7.png

  1. জুপিটার নোটবুকের নাম লিখুন। আরও তথ্যের জন্য, রিসোর্স নেমিং কনভেনশন দেখুন।

b4dbc5fddc37e8d9.png

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

ec0b9ef00f0ef470.png

  1. একবার ইন্সট্যান্স তৈরি হয়ে গেলে ওপেন জুপিটারল্যাবে ক্লিক করুন।

4. ভিডিও স্ট্রিম করতে একটি নোটবুক সেট আপ করুন৷

অকুপেন্সি অ্যানালিটিক্সে একটি অ্যাপ তৈরি করার আগে, আপনাকে অবশ্যই একটি স্ট্রিম নিবন্ধন করতে হবে যা অ্যাপটি পরে ব্যবহার করতে পারে।

এই টিউটোরিয়ালে আমরা একটি ভিডিও হোস্ট করতে আমাদের Jupyter Notebook ইন্সট্যান্স ব্যবহার করব এবং আপনি নোটবুক টার্মিনাল থেকে সেই স্ট্রিমিং ভিডিও ডেটা পাঠাবেন।

vaictl কমান্ড-লাইন টুলটি ডাউনলোড করুন

  1. খোলা জুপিটারল্যাব উদাহরণে, লঞ্চার থেকে একটি নোটবুক খুলুন।

a6d182923ae4ada3.png

  1. নোটবুক সেলে নিম্নলিখিত কমান্ডটি ব্যবহার করে Vertex AI Vision (vaictl) কমান্ড লাইন টুল, rtsp সার্ভার কমান্ড লাইন টুল, ওপেন-সিভি টুল ডাউনলোড করুন:
!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

5. স্ট্রিমিংয়ের জন্য একটি ভিডিও ফাইল ইনজেস্ট করুন

আপনি প্রয়োজনীয় কমান্ড লাইন সরঞ্জামগুলির সাথে আপনার নোটবুকের পরিবেশ সেট আপ করার পরে, আপনি একটি নমুনা ভিডিও ফাইল অনুলিপি করতে পারেন এবং তারপরে আপনার দখল বিশ্লেষণ অ্যাপে ভিডিও ডেটা স্ট্রিম করতে vaictl ব্যবহার করতে পারেন।

একটি নতুন স্ট্রিম নিবন্ধন করুন

  1. Vertex AI Vision-এর বাম প্যানেলে স্ট্রিম ট্যাবে ক্লিক করুন।
  2. উপরের রেজিস্টার বাটনে ক্লিক করুন eba418e723916514.png
  3. স্ট্রীমের নামে 'কিউ-স্ট্রিম' লিখুন
  4. অঞ্চলে, আগের ধাপে নোটবুক তৈরির সময় নির্বাচিত একই অঞ্চল বেছে নিন।
  5. নিবন্ধন ক্লিক করুন

আপনার ভিএম-এ একটি নমুনা ভিডিও কপি করুন

  1. আপনার নোটবুকে, নিম্নলিখিত wget কমান্ড দিয়ে একটি নমুনা ভিডিও অনুলিপি করুন।
!wget -q https://github.com/vagrantism/interesting-datasets/raw/main/video/collective_activity/seq25_h264.mp4

VM থেকে ভিডিও স্ট্রিম করুন এবং আপনার স্ট্রীমে ডেটা ইনজেস্ট করুন

  1. এই স্থানীয় ভিডিও ফাইলটিকে অ্যাপ ইনপুট স্ট্রীমে পাঠাতে, আপনার নোটবুক কক্ষে নিম্নলিখিত কমান্ডটি ব্যবহার করুন। আপনাকে অবশ্যই নিম্নলিখিত পরিবর্তনশীল প্রতিস্থাপন করতে হবে:
  • PROJECT_ID: আপনার Google ক্লাউড প্রকল্প আইডি।
  • অবস্থান: আপনার অবস্থান আইডি। উদাহরণস্বরূপ, 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'
  1. একটি 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)
  1. rtsp স্ট্রীমে ভিডিও লুপ করতে ffmpeg কমান্ড লাইন টুল ব্যবহার করুন
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)
  1. পূর্ববর্তী ধাপে তৈরি করা আমাদের Vertex AI ভিশন স্ট্রীম 'কিউ-স্ট্রিম'-এ 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 ইনজেস্ট অপারেশন শুরু করা এবং ভিডিও ড্যাশবোর্ডে প্রদর্শিত হতে ~100 সেকেন্ড সময় লাগতে পারে৷

স্ট্রীম ইনজেশন উপলব্ধ হওয়ার পরে, আপনি কিউ-স্ট্রিম স্ট্রীম নির্বাচন করে Vertex AI Vision ড্যাশবোর্ডের স্ট্রিম ট্যাবে ভিডিও ফিড দেখতে পারেন।

স্ট্রিম ট্যাবে যান

1b7aac7d36552f29.png

6. একটি অ্যাপ্লিকেশন তৈরি করুন

প্রথম ধাপ হল একটি অ্যাপ তৈরি করা যা আপনার ডেটা প্রসেস করে। একটি অ্যাপকে একটি স্বয়ংক্রিয় পাইপলাইন হিসাবে বিবেচনা করা যেতে পারে যা নিম্নলিখিতগুলিকে সংযুক্ত করে:

  • ডেটা ইনজেশন : একটি ভিডিও ফিড একটি স্ট্রীমে ইনজেস্ট করা হয়।
  • ডেটা বিশ্লেষণ : ইনজেশনের পরে একটি এআই (কম্পিউটার ভিশন) মডেল যোগ করা যেতে পারে।
  • ডেটা স্টোরেজ : ভিডিও ফিডের দুটি সংস্করণ (মূল স্ট্রিম এবং এআই মডেল দ্বারা প্রক্রিয়াকৃত স্ট্রিম) একটি মিডিয়া গুদামে সংরক্ষণ করা যেতে পারে।

Google ক্লাউড কনসোলে একটি অ্যাপকে একটি গ্রাফ হিসাবে উপস্থাপন করা হয়।

একটি খালি অ্যাপ তৈরি করুন

আপনি অ্যাপ গ্রাফ পপুলেট করার আগে, আপনাকে প্রথমে একটি খালি অ্যাপ তৈরি করতে হবে।

Google ক্লাউড কনসোলে একটি অ্যাপ তৈরি করুন।

  1. গুগল ক্লাউড কনসোলে যান।
  2. ভার্টেক্স এআই ভিশন ড্যাশবোর্ডের অ্যাপ্লিকেশন ট্যাবটি খুলুন। অ্যাপ্লিকেশন ট্যাবে যান
  3. Create বাটনে ক্লিক করুন। 21ecba7a23e9979e.png
  4. অ্যাপের নাম হিসেবে ' কিউ-অ্যাপ' লিখুন এবং আপনার অঞ্চল বেছে নিন।
  5. তৈরি করুন ক্লিক করুন।

অ্যাপ কম্পোনেন্ট নোড যোগ করুন

আপনি খালি অ্যাপ্লিকেশন তৈরি করার পরে, আপনি অ্যাপ গ্রাফে তিনটি নোড যুক্ত করতে পারেন:

  1. ইনজেশন নোড : স্ট্রিম রিসোর্স যা আপনার নোটবুকে তৈরি করা একটি rtsp ভিডিও সার্ভার থেকে পাঠানো ডেটা ইনজেস্ট করে।
  2. প্রসেসিং নোড : অকুপেন্সি অ্যানালিটিক্স মডেল যা ইনজেস্টেড ডেটার উপর কাজ করে।
  3. স্টোরেজ নোড : মিডিয়া গুদাম যা প্রক্রিয়াকৃত ভিডিও সংরক্ষণ করে এবং একটি মেটাডেটা স্টোর হিসাবে কাজ করে। মেটাডেটা স্টোরগুলিতে অন্তর্ভূক্ত ভিডিও ডেটা এবং এআই মডেলগুলির দ্বারা অনুমানকৃত তথ্য সম্পর্কে বিশ্লেষণ তথ্য অন্তর্ভুক্ত থাকে।

কনসোলে আপনার অ্যাপে কম্পোনেন্ট নোড যোগ করুন।

  1. ভার্টেক্স এআই ভিশন ড্যাশবোর্ডের অ্যাপ্লিকেশন ট্যাবটি খুলুন। অ্যাপ্লিকেশন ট্যাবে যান

এটি আপনাকে প্রক্রিয়াকরণ পাইপলাইনের গ্রাফ ভিজ্যুয়ালাইজেশনে নিয়ে যায়।

একটি ডেটা ইনজেশন নোড যোগ করুন

  1. একটি ইনপুট স্ট্রিম নোড যোগ করতে, পাশের মেনুর সংযোগকারী বিভাগে স্ট্রিম বিকল্পটি নির্বাচন করুন।
  2. খোলে স্ট্রীম মেনুর উৎস বিভাগে, স্ট্রীম যোগ করুন নির্বাচন করুন।
  3. স্ট্রীম যোগ করুন মেনুতে, সারি-স্ট্রীম বেছে নিন।
  4. অ্যাপ গ্রাফে স্ট্রীম যোগ করতে, স্ট্রীম যোগ করুন ক্লিক করুন।

একটি ডেটা প্রসেসিং নোড যোগ করুন

  1. অকুপেন্সি কাউন্ট মডেল নোড যোগ করতে, পাশের মেনুর বিশেষায়িত মডেল বিভাগে অকুপেন্সি অ্যানালিটিক্স বিকল্পটি নির্বাচন করুন।
  2. ডিফল্ট নির্বাচন ত্যাগ করুন মানুষগাড়ির টিক চিহ্ন সরিয়ে দিন যদি এটি ইতিমধ্যেই নির্বাচিত থাকে।

618b0c9dc671bae3.png

  1. Advanced Options বিভাগে, Create Active Zones/Lines- এ ক্লিক করুন 5b2f31235603e05d.png
  2. সেই জোনে লোক গণনা করতে বহুভুজ টুল ব্যবহার করে সক্রিয় অঞ্চলগুলি আঁকুন। সেই অনুযায়ী জোন লেবেল করুন

50281a723650491f.png

  1. উপরে Back Arrow এ ক্লিক করুন।

2bf0ff4d029d29eb.png

  1. চেকবক্সে ক্লিক করে কনজেশন শনাক্ত করতে থাকার সময়ের জন্য সেটিংস যোগ করুন।

c067fa256ca5bb96.png

একটি ডেটা স্টোরেজ নোড যোগ করুন

  1. আউটপুট গন্তব্য (স্টোরেজ) নোড যোগ করতে, পাশের মেনুর সংযোগকারী বিভাগে ভিশন এআই ওয়ারহাউস বিকল্পটি নির্বাচন করুন।
  2. Vertex AI Warehouse Connector এর মেনু খুলতে ক্লিক করুন, Connect warehouse এ ক্লিক করুন।
  3. সংযোগ গুদাম মেনুতে, নতুন গুদাম তৈরি করুন নির্বাচন করুন। গুদামের সারি-গুদামটির নাম দিন এবং TTL সময়কাল 14 দিন রেখে দিন।
  4. গুদাম যোগ করতে তৈরি বোতামে ক্লিক করুন।

7. BigQuery টেবিলে আউটপুট সংযুক্ত করুন

আপনি যখন আপনার Vertex AI Vision অ্যাপে একটি BigQuery সংযোগকারী যোগ করেন তখন সমস্ত সংযুক্ত অ্যাপ মডেল আউটপুট টার্গেট টেবিলে প্রবেশ করা হবে।

আপনি হয় আপনার নিজস্ব BigQuery টেবিল তৈরি করতে পারেন এবং অ্যাপে একটি BigQuery সংযোগকারী যোগ করার সময় সেই টেবিলটি নির্দিষ্ট করতে পারেন, অথবা Vertex AI Vision অ্যাপ প্ল্যাটফর্মকে স্বয়ংক্রিয়ভাবে টেবিল তৈরি করতে দিন।

স্বয়ংক্রিয় টেবিল তৈরি

আপনি যদি Vertex AI Vision অ্যাপ প্ল্যাটফর্মকে স্বয়ংক্রিয়ভাবে টেবিল তৈরি করতে দেন, আপনি BigQuery সংযোগকারী নোড যোগ করার সময় এই বিকল্পটি নির্দিষ্ট করতে পারেন।

আপনি যদি স্বয়ংক্রিয় টেবিল তৈরি ব্যবহার করতে চান তবে নিম্নলিখিত ডেটাসেট এবং টেবিল শর্তাবলী প্রযোজ্য:

  • ডেটাসেট: স্বয়ংক্রিয়ভাবে তৈরি ডেটাসেটের নাম হল visionai_dataset।
  • টেবিল: স্বয়ংক্রিয়ভাবে তৈরি টেবিলের নাম হল visionai_dataset.APPLICATION_ID।
  • ত্রুটি পরিচালনা:
  • যদি একই ডেটাসেটের অধীনে একই নামের টেবিলটি বিদ্যমান থাকে, তাহলে কোনো স্বয়ংক্রিয় সৃষ্টি হবে না।
  1. ভার্টেক্স এআই ভিশন ড্যাশবোর্ডের অ্যাপ্লিকেশন ট্যাবটি খুলুন। অ্যাপ্লিকেশন ট্যাবে যান
  2. তালিকা থেকে আপনার অ্যাপ্লিকেশনের নামের পাশে দেখুন অ্যাপ নির্বাচন করুন।
  3. অ্যাপ্লিকেশন নির্মাতা পৃষ্ঠায় সংযোগকারী বিভাগ থেকে BigQuery নির্বাচন করুন।
  4. BigQuery পাথ ক্ষেত্রটি খালি রাখুন।

ee0b67d4ab2263d.png

  1. স্টোরের মেটাডেটা থেকে: শুধুমাত্র 'অকুপেন্সি অ্যানালিটিক্স' নির্বাচন করুন এবং স্ট্রিমগুলি আনচেক করুন।

চূড়ান্ত অ্যাপ গ্রাফটি এইরকম হওয়া উচিত:

da0a1a049843572f.png

8. ব্যবহারের জন্য আপনার অ্যাপ স্থাপন করুন

আপনি সমস্ত প্রয়োজনীয় উপাদান সহ আপনার এন্ড-টু-এন্ড অ্যাপটি তৈরি করার পরে, অ্যাপটি ব্যবহার করার শেষ ধাপ হল এটি স্থাপন করা।

  1. ভার্টেক্স এআই ভিশন ড্যাশবোর্ডের অ্যাপ্লিকেশন ট্যাবটি খুলুন। অ্যাপ্লিকেশন ট্যাবে যান
  2. তালিকার সারি-অ্যাপ অ্যাপের পাশে দেখুন অ্যাপ নির্বাচন করুন।
  3. স্টুডিও পৃষ্ঠা থেকে, ডিপ্লোয় বোতামে ক্লিক করুন।
  4. নিম্নলিখিত নিশ্চিতকরণ ডায়ালগে, ডিপ্লোয় ক্লিক করুন। স্থাপন অপারেশন সম্পূর্ণ হতে কয়েক মিনিট সময় লাগতে পারে। স্থাপনা শেষ হওয়ার পর, নোডের পাশে সবুজ চেক চিহ্ন প্রদর্শিত হবে। dc514d9b9f35099d.png

9. স্টোরেজ গুদামে ভিডিও সামগ্রী অনুসন্ধান করুন

আপনি আপনার প্রসেসিং অ্যাপে ভিডিও ডেটা ইনজেস্ট করার পরে, আপনি বিশ্লেষণ করা ভিডিও ডেটা দেখতে পারেন এবং অকুপেন্সি অ্যানালিটিক্স তথ্যের ভিত্তিতে ডেটা অনুসন্ধান করতে পারেন৷

  1. ভার্টেক্স এআই ভিশন ড্যাশবোর্ডের গুদাম ট্যাবটি খুলুন। গুদাম ট্যাবে যান
  2. তালিকায় সারি-গুদাম গুদাম খুঁজুন এবং সম্পদ দেখুন ক্লিক করুন।
  3. লোক গণনা বিভাগে, সর্বনিম্ন মান 1 এবং সর্বোচ্চ মান 5 এ সেট করুন।
  4. Vertex AI Vision-এর মিডিয়া গুদামে সংরক্ষিত প্রক্রিয়াকৃত ভিডিও ডেটা ফিল্টার করতে, অনুসন্ধানে ক্লিক করুন।

a0e5766262443d6c.png

সঞ্চিত ভিডিও ডেটার একটি দৃশ্য যা Google ক্লাউড কনসোলে অনুসন্ধানের মানদণ্ডের সাথে মেলে৷

10. BigQuery টেবিল ব্যবহার করে আউটপুট টীকা এবং বিশ্লেষণ করুন

  1. নোটবুকে, ঘরে নিম্নলিখিত ভেরিয়েবলগুলি শুরু করুন।
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'
  1. এখন আমরা নিম্নলিখিত কোড ব্যবহার করে 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')
  1. বিগকোয়েরি টেবিল থেকে ডেটা টাইমস্ট্যাম্প এবং টীকা তথ্য টানুন এবং ক্যাপচার করা ফ্রেম চিত্রগুলি সংরক্ষণ করার জন্য একটি ডিরেক্টরি তৈরি করুন:
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)
  1. নিম্নলিখিত কোড ব্যবহার করে ফ্রেম টীকা করুন:
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>&nbsp;</p>
        '''))
except KeyboardInterrupt:
  print('Stopping Live Monitoring')

9426ffe2376f0a7d.png

  1. নোটবুক মেনু বারে স্টপ বোতাম ব্যবহার করে টীকা টাস্ক বন্ধ করুন

6c19cb00dcb28894.png

  1. আপনি নিম্নলিখিত কোড ব্যবহার করে পৃথক ফ্রেম পুনরায় দেখতে পারেন:
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%')))

78b63b546a4c883b.png

11. অভিনন্দন

অভিনন্দন, আপনি ল্যাব শেষ!

পরিষ্কার কর

এই টিউটোরিয়ালে ব্যবহৃত সংস্থানগুলির জন্য আপনার Google ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে, হয় সংস্থানগুলি রয়েছে এমন প্রকল্পটি মুছুন, অথবা প্রকল্পটি রাখুন এবং পৃথক সংস্থানগুলি মুছুন৷

প্রকল্পটি মুছুন

পৃথক সম্পদ মুছুন

সম্পদ

https://cloud.google.com/vision-ai/docs/overview

https://cloud.google.com/vision-ai/docs/occupancy-count-tutorial

লাইসেন্স

জরিপ

আপনি কিভাবে এই টিউটোরিয়াল ব্যবহার করেছেন?

শুধুমাত্র মাধ্যমে এটি পড়ুন এটা পড়ুন এবং ব্যায়াম সম্পন্ন

এই কোডল্যাব কতটা দরকারী ছিল?

খুব দরকারী পরিমিতভাবে দরকারী দরকারী নয়

এই কোডল্যাব অনুসরণ করা কতটা সহজ ছিল?

সহজ পরিমিত কঠিন