برنامه تشخیص صف ویژن Vertex AI

1. اهداف

بررسی اجمالی

این نرم افزار کد روی ایجاد یک برنامه Vertex AI Vision به صورت سرتاسر برای نظارت بر اندازه صف با استفاده از فیلم خرده فروشی تمرکز می کند. ما از ویژگی های داخلی تحلیل اشغال مدل تخصصی از پیش آموزش دیده برای ثبت موارد زیر استفاده خواهیم کرد:

  • تعداد افرادی که در صف ایستاده اند را بشمارید.
  • تعداد افرادی که در پیشخوان به آنها خدمات داده می شود را بشمارید.

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

  • نحوه ایجاد یک برنامه در Vertex AI Vision و استقرار آن
  • نحوه تنظیم یک جریان RTSP با استفاده از یک فایل ویدیویی و وارد کردن جریان به Vertex AI Vision با استفاده از vaictl از یک نوت بوک Jupyter.
  • نحوه استفاده از مدل Occupancy Analytics و ویژگی های مختلف آن.
  • نحوه جستجوی ویدیوها در انبار رسانه Vertex AI Vision.
  • نحوه اتصال خروجی به BigQuery، پرس و جوی SQL را بنویسید تا بینش را از خروجی json مدل استخراج کنید و از خروجی برای برچسب زدن و حاشیه نویسی ویدیوی اصلی استفاده کنید.

هزینه:

کل هزینه اجرای این آزمایشگاه در Google Cloud حدود 2 دلار است.

2. قبل از شروع

یک پروژه ایجاد کنید و API ها را فعال کنید:

  1. در کنسول Google Cloud، در صفحه انتخابگر پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید . توجه : اگر قصد ندارید منابعی را که ایجاد می کنید در این روش حفظ کنید، به جای انتخاب پروژه موجود، یک پروژه ایجاد کنید. پس از اتمام این مراحل، می توانید پروژه را حذف کنید و تمام منابع مرتبط با پروژه را حذف کنید. به انتخابگر پروژه بروید
  2. مطمئن شوید که صورتحساب برای پروژه Cloud شما فعال است. با نحوه بررسی فعال بودن صورت‌حساب در پروژه آشنا شوید.
  3. Compute Engine، Vertex API، Notebook API و Vision AI API را فعال کنید. API ها را فعال کنید

ایجاد یک حساب خدمات:

  1. در کنسول Google Cloud، به صفحه ایجاد حساب سرویس بروید. به ایجاد حساب سرویس بروید
  2. پروژه خود را انتخاب کنید
  3. در قسمت نام حساب سرویس ، یک نام وارد کنید. کنسول Google Cloud فیلد شناسه حساب سرویس را بر اساس این نام پر می کند. در قسمت Service account description یک توضیحات را وارد کنید. به عنوان مثال، حساب سرویس برای شروع سریع.
  4. روی ایجاد و ادامه کلیک کنید.
  5. برای دسترسی به پروژه خود، نقش(های) زیر را به حساب سرویس خود بدهید:
  • Vision AI > Vision AI Editor
  • Compute Engine > Compute Instance Admin (بتا)
  • BigQuery > BigQuery Admin.

در لیست انتخاب نقش ، یک نقش را انتخاب کنید. برای نقش های اضافی، روی افزودن نقش دیگری کلیک کنید و هر نقش اضافی را اضافه کنید.

  1. روی Continue کلیک کنید.
  2. برای تکمیل ساخت حساب سرویس روی Done کلیک کنید. پنجره مرورگر خود را نبندید. در مرحله بعد از آن استفاده خواهید کرد.

3. نوت بوک Jupyter را راه اندازی کنید

قبل از ایجاد یک برنامه در Occupancy Analytics، باید جریانی را ثبت کنید که بعداً توسط برنامه قابل استفاده باشد.

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

  1. سرور rtsp را به عنوان یک فرآیند پس زمینه اجرا کنید
  2. دستور vaictl را به عنوان فرآیند پس زمینه اجرا کنید
  3. برای تجزیه و تحلیل خروجی تجزیه و تحلیل اشغال، کوئری ها و کد پردازش را اجرا کنید

یک نوت بوک Jupyter ایجاد کنید

اولین گام در ارسال ویدیو از یک نمونه Jupyter Notebook ایجاد نوت بوک با حساب سرویس ما است که در مرحله قبل ایجاد شده است.

  1. در کنسول، به صفحه Vertex AI بروید. به Vertex AI Workbench بروید
  2. روی Notebooks User-managed کلیک کنید

65b7112822858dce.png

  1. روی New Notebook > Tensorflow Enterprise 2.6 (با LTS) > بدون GPU کلیک کنید

dc156f20b14651d7.png

  1. نام نوت بوک jupyter را وارد کنید. برای اطلاعات بیشتر، به قرارداد نامگذاری منابع مراجعه کنید.

b4dbc5fddc37e8d9.png

  1. روی گزینه های پیشرفته کلیک کنید
  2. به بخش مجوزها به پایین بروید
  3. تیک گزینه Use Compute Engine default service account account را بردارید
  4. ایمیل حساب سرویس ایجاد شده در مرحله قبل را اضافه کنید. و روی Create کلیک کنید.

ec0b9ef00f0ef470.png

  1. پس از ایجاد نمونه روی OPEN JUPYTERLAB کلیک کنید.

4. یک نوت بوک برای پخش ویدئو تنظیم کنید

قبل از ایجاد یک برنامه در Occupancy Analytics، باید جریانی را ثبت کنید که بعداً توسط برنامه قابل استفاده باشد.

در این آموزش ما از نمونه نوت بوک Jupyter برای میزبانی یک ویدیو استفاده می کنیم و شما آن داده های پخش جریانی ویدیو را از ترمینال Notebook ارسال می کنید.

ابزار خط فرمان vaictl را دانلود کنید

  1. در نمونه باز شده Jupyterlab، یک نوت بوک را از لانچر باز کنید.

a6d182923ae4ada3.png

  1. ابزار خط فرمان 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

5. یک فایل ویدئویی را برای پخش جریانی مصرف کنید

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

یک جریان جدید ثبت کنید

  1. روی تب streams در پنل سمت چپ Vertex AI Vision کلیک کنید.
  2. روی دکمه ثبت نام در بالا کلیک کنید eba418e723916514.png
  3. در نام Stream 'queue-stream' را وارد کنید
  4. در منطقه، همان منطقه ای را انتخاب کنید که در مرحله ایجاد Notebook در مرحله قبل انتخاب شده است.
  5. روی ثبت کلیک کنید

یک نمونه ویدیو را در VM خود کپی کنید

  1. در دفترچه یادداشت خود با دستور wget زیر یک ویدیوی نمونه را کپی کنید.
!wget -q https://github.com/vagrantism/interesting-datasets/raw/main/video/collective_activity/seq25_h264.mp4

ویدیو را از VM پخش کنید و داده ها را در جریان خود وارد کنید

  1. برای ارسال این فایل ویدئویی محلی به جریان ورودی برنامه، از دستور زیر در سلول نوت بوک خود استفاده کنید. شما باید متغیرهای زیر را جایگزین کنید:
  • PROJECT_ID: شناسه پروژه Google Cloud شما.
  • LOCATION: شناسه مکان شما. به عنوان مثال، us-central1. برای اطلاعات بیشتر، مکان‌های Cloud را ببینید.
  • 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. از ابزار خط فرمان ffmpeg برای لوپ کردن ویدیو در جریان rtsp استفاده کنید
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. از ابزار خط فرمان vaictl برای استریم ویدیو از سرور rtsp uri به جریان «queue-stream» Vertex AI Vision که در مرحله قبل ایجاد شده است استفاده کنید.
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 ingest و نمایش ویدیو در داشبورد 100 ثانیه طول بکشد.

پس از دریافت جریان، می‌توانید فید ویدیو را در برگه Streams داشبورد Vertex AI Vision با انتخاب جریان صف پخش ببینید.

به تب Streams بروید

1b7aac7d36552f29.png

6. یک برنامه ایجاد کنید

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

  • جذب داده : یک فید ویدیویی در یک جریان وارد می‌شود.
  • تجزیه و تحلیل داده ها : یک مدل AI (Computer Vision) را می توان پس از مصرف اضافه کرد.
  • ذخیره سازی داده ها : دو نسخه فید ویدیو (جریان اصلی و جریان پردازش شده توسط مدل هوش مصنوعی) را می توان در یک انبار رسانه ذخیره کرد.

در کنسول Google Cloud یک برنامه به صورت نمودار نمایش داده می شود.

یک برنامه خالی ایجاد کنید

قبل از اینکه بتوانید نمودار برنامه را پر کنید، ابتدا باید یک برنامه خالی ایجاد کنید.

یک برنامه در کنسول Google Cloud ایجاد کنید.

  1. به کنسول Google Cloud بروید.
  2. تب Applications داشبورد Vertex AI Vision را باز کنید. به تب Applications بروید
  3. روی دکمه Create کلیک کنید. 21ecba7a23e9979e.png
  4. " queue-app" را به عنوان نام برنامه وارد کنید و منطقه خود را انتخاب کنید.
  5. روی ایجاد کلیک کنید.

گره های جزء برنامه را اضافه کنید

پس از ایجاد برنامه خالی، می توانید سه گره را به نمودار برنامه اضافه کنید:

  1. Ingestion node : منبع جریانی است که داده‌های ارسال شده از یک سرور ویدیویی rtsp را که در نوت بوک ایجاد کرده‌اید جذب می‌کند.
  2. گره پردازش : مدل تجزیه و تحلیل اشغال که بر روی داده های دریافت شده عمل می کند.
  3. Storage Node : انبار رسانه ای که ویدیوهای پردازش شده را ذخیره می کند و به عنوان ذخیره ابرداده عمل می کند. ذخیره‌های ابرداده شامل اطلاعات تحلیلی در مورد داده‌های ویدیویی جذب شده و اطلاعات استنتاج شده توسط مدل‌های هوش مصنوعی است.

گره های مؤلفه را به برنامه خود در کنسول اضافه کنید.

  1. تب Applications داشبورد Vertex AI Vision را باز کنید. به تب Applications بروید

این شما را به تجسم نمودار خط لوله پردازش می برد.

یک گره انتقال داده اضافه کنید

  1. برای افزودن گره جریان ورودی، گزینه Streams را در قسمت Connectors منوی کناری انتخاب کنید.
  2. در بخش منبع از منوی جریانی که باز می‌شود، افزودن جریان‌ها را انتخاب کنید.
  3. در منوی افزودن جریان‌ها ، صف جریان را انتخاب کنید.
  4. برای افزودن جریان به نمودار برنامه، روی افزودن جریان‌ها کلیک کنید.

یک گره پردازش داده اضافه کنید

  1. برای افزودن گره مدل شمارش اشغال، در منوی کناری قسمت Specialized models، گزینه occupancy analytics را انتخاب کنید.
  2. انتخاب های پیش فرض افراد را رها کنید. اگر قبلاً انتخاب شده است، علامت Vehicles را بردارید.

618b0c9dc671bae3.png

  1. در قسمت Advanced Options بر روی Create Active Zones/Lines کلیک کنید 5b2f31235603e05d.png
  2. مناطق فعال را با استفاده از ابزار Polygon برای شمارش افراد در آن منطقه ترسیم کنید. بر این اساس منطقه را برچسب بزنید

50281a723650491f.png

  1. روی فلش برگشتی در بالا کلیک کنید.

2bf0ff4d029d29eb.png

  1. با کلیک کردن بر روی Checkbox تنظیماتی را برای زمان ماندن اضافه کنید تا ازدحام تشخیص داده شود.

c067fa256ca5bb96.png

یک گره ذخیره سازی داده اضافه کنید

  1. برای افزودن گره مقصد خروجی (ذخیره)، گزینه Vision AI Warehouse را در قسمت Connectors منوی کناری انتخاب کنید.
  2. روی Vertex AI Warehouse Connector کلیک کنید تا منوی آن باز شود، روی Connect warehouse کلیک کنید.
  3. در منوی Connect warehouse ، ایجاد انبار جدید را انتخاب کنید. نام صف انبار را نامگذاری کنید و مدت زمان TTL را 14 روز بگذارید.
  4. روی دکمه Create کلیک کنید تا انبار اضافه شود.

7. خروجی را به جدول BigQuery وصل کنید

هنگامی که یک رابط BigQuery را به برنامه Vertex AI Vision خود اضافه می کنید، همه خروجی های مدل برنامه متصل به جدول هدف وارد می شوند.

می‌توانید جدول BigQuery خود را ایجاد کنید و زمانی که یک رابط BigQuery را به برنامه اضافه می‌کنید، آن جدول را مشخص کنید یا به پلتفرم برنامه Vertex AI Vision اجازه دهید به طور خودکار جدول را ایجاد کند.

ایجاد جدول به صورت خودکار

اگر به پلتفرم برنامه Vertex AI Vision اجازه دهید به طور خودکار جدول را ایجاد کند، می توانید این گزینه را هنگام اضافه کردن گره اتصال BigQuery مشخص کنید.

اگر می‌خواهید از ایجاد جدول خودکار استفاده کنید، مجموعه داده و شرایط جدول زیر اعمال می‌شود:

  • مجموعه داده: نام مجموعه داده ایجاد شده به طور خودکار visionai_dataset است.
  • جدول: نام جدول ایجاد شده به طور خودکار visionai_dataset.APPLICATION_ID است.
  • رسیدگی به خطا:
  • اگر جدولی با همان نام تحت مجموعه داده یکسان وجود داشته باشد، ایجاد خودکار اتفاق نمی افتد.
  1. تب Applications داشبورد Vertex AI Vision را باز کنید. به تب Applications بروید
  2. مشاهده برنامه در کنار نام برنامه خود را از لیست انتخاب کنید.
  3. در صفحه سازنده برنامه ، BigQuery را از بخش Connectors انتخاب کنید.
  4. فیلد مسیر BigQuery را خالی بگذارید.

ee0b67d4ab2263d.png

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

نمودار نهایی برنامه باید به شکل زیر باشد:

da0a1a049843572f.png

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

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

  1. تب Applications داشبورد Vertex AI Vision را باز کنید. به تب Applications بروید
  2. نمایش برنامه را در کنار برنامه صف برنامه در لیست انتخاب کنید.
  3. از صفحه استودیو ، روی دکمه Deploy کلیک کنید.
  4. در گفتگوی تأیید زیر، روی Deploy کلیک کنید. عملیات استقرار ممکن است چند دقیقه طول بکشد تا کامل شود. پس از اتمام استقرار، تیک سبز رنگ در کنار گره ها ظاهر می شود. dc514d9b9f35099d.png

9. محتوای ویدیویی را در انبار ذخیره سازی جستجو کنید

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

  1. تب Warehouses داشبورد Vertex AI Vision را باز کنید. به برگه انبارها بروید
  2. انبار queue-warehouse را در لیست پیدا کنید و روی View assets کلیک کنید.
  3. در قسمت People count مقدار Min را 1 و حداکثر مقدار را 5 قرار دهید.
  4. برای فیلتر کردن داده‌های ویدیوی پردازش شده ذخیره شده در انبار رسانه Vertex AI Vision، روی جستجو کلیک کنید.

a0e5766262443d6c.png

نمایی از داده های ویدئویی ذخیره شده که با معیارهای جستجو در کنسول Google Cloud مطابقت دارد.

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. مهر زمان داده و اطلاعات حاشیه نویسی را از جدول 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)
  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. کار حاشیه نویسی را با استفاده از دکمه Stop در نوار منوی نوت بوک متوقف کنید

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 Cloud خود برای منابع استفاده شده در این آموزش، یا پروژه حاوی منابع را حذف کنید یا پروژه را نگه دارید و منابع فردی را حذف کنید.

پروژه را حذف کنید

منابع فردی را حذف کنید

منابع

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

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

مجوز

نظر سنجی

چگونه از این آموزش استفاده کردید؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

این کد لبه چقدر مفید بود؟

بسیار مفید نسبتا مفید است بی فایده

پیگیری این کد لبه چقدر آسان بود؟

آسان در حد متوسط دشوار