Ứng dụng Phát hiện hàng đợi tầm nhìn của Vertex AI

1. Mục tiêu

Tổng quan

Lớp học lập trình này sẽ tập trung vào việc tạo ứng dụng Vertex AI Vision từ đầu đến cuối để theo dõi kích thước hàng đợi bằng cảnh quay video bán lẻ. Chúng tôi sẽ sử dụng các tính năng tích hợp sẵn của mô hình Chuyên biệt Phân tích tỷ lệ kín phòng để thu thập những thông tin sau:

  • Đếm số người đang đứng trong hàng đợi.
  • Đếm số người được phục vụ tại quầy.

Kiến thức bạn sẽ học được

  • Cách tạo và triển khai ứng dụng trong Vertex AI Vision
  • Cách thiết lập luồng RTSP bằng tệp video và truyền luồng đó vào Vertex AI Vision bằng vaictl trong Sổ tay Jupyter.
  • Cách sử dụng mô hình Phân tích tỷ lệ kín phòng và các tính năng tương ứng.
  • Cách tìm video trong kho lưu trữ của Vertex AI Vision.
  • Cách kết nối đầu ra với BigQuery, viết truy vấn SQL để trích xuất thông tin chi tiết từ dữ liệu đầu ra json của mô hình, đồng thời sử dụng kết quả đó để gắn nhãn và chú thích cho video gốc.

Chi phí:

Tổng chi phí để chạy phòng thí nghiệm này trên Google Cloud là khoảng 2 đô la.

2. Trước khi bắt đầu

Tạo một dự án và bật các API:

  1. Trong bảng điều khiển Google Cloud, trên trang bộ chọn dự án, hãy chọn hoặc tạo một dự án Google Cloud. Lưu ý: Nếu bạn không định giữ lại tài nguyên mà bạn tạo trong quy trình này, hãy tạo một dự án thay vì chọn một dự án hiện có. Sau khi hoàn tất những bước này, bạn có thể xoá dự án, đồng thời xoá tất cả tài nguyên được liên kết với dự án. Chuyển đến bộ chọn dự án
  2. Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên Google Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên một dự án hay không.
  3. Bật Compute Engine, Vertex API, Notebook API và Vision AI API. Bật API

Tạo tài khoản dịch vụ:

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến trang Tạo tài khoản dịch vụ. Chuyển đến trang Tạo tài khoản dịch vụ
  2. Chọn dự án của bạn.
  3. Trong trường Tên tài khoản dịch vụ, hãy nhập tên. Bảng điều khiển Google Cloud sẽ điền vào trường Mã tài khoản dịch vụ theo tên này. Trong trường Mô tả tài khoản dịch vụ, hãy nhập nội dung mô tả. Ví dụ: Tài khoản dịch vụ để bắt đầu nhanh.
  4. Nhấp vào Tạo và tiếp tục.
  5. Để cấp quyền truy cập vào dự án của bạn, hãy cấp(các) vai trò sau cho tài khoản dịch vụ của bạn:
  • AI hỗ trợ thị giác > Người chỉnh sửa thị giác bằng AI
  • Công cụ điện toán > Quản trị viên phiên bản điện toán (thử nghiệm)
  • BigQuery > Quản trị BigQuery .

Trong danh sách Chọn vai trò, hãy chọn một vai trò. Để có các vai trò khác, hãy nhấp vào Thêm vai trò khác rồi thêm từng vai trò.

  1. Nhấp vào Tiếp tục.
  2. Nhấp vào Xong để hoàn tất việc tạo tài khoản dịch vụ. Đừng đóng cửa sổ trình duyệt. Bạn sẽ dùng chỉ mục này trong bước tiếp theo.

3. Thiết lập Sổ tay Jupyter

Trước khi tạo một Ứng dụng trong công cụ Phân tích về tỷ lệ kín phòng, bạn phải đăng ký một luồng để Ứng dụng có thể sử dụng sau này.

Trong hướng dẫn này, bạn tạo một phiên bản Jupyter Notebook lưu trữ video và bạn gửi dữ liệu video phát trực tuyến đó từ sổ tay đó. Chúng tôi đang sử dụng sổ tay jupyter vì nó cho phép bạn linh hoạt thực thi các lệnh shell cũng như chạy mã xử lý trước/sau tuỳ chỉnh ở một nơi rất phù hợp để thử nghiệm nhanh. Chúng tôi sẽ sử dụng sổ tay này để:

  1. Chạy máy chủ rtsp dưới dạng quy trình nền
  2. Chạy lệnh vaictl dưới dạng quy trình trong nền
  3. Chạy truy vấn và mã xử lý để phân tích kết quả phân tích số người lưu trú

Tạo sổ tay Jupyter

Bước đầu tiên trong việc gửi video từ phiên bản Jupyter Notebook là tạo sổ tay bằng tài khoản dịch vụ đã tạo ở bước trước.

  1. Trong bảng điều khiển, hãy truy cập vào trang Vertex AI. Truy cập vào Vertex AI Workbench
  2. Nhấp vào Sổ tay được người dùng quản lý

65b7112822858dce.png.

  1. Nhấp vào Sổ tay mới > Tensorflow Enterprise 2.6 (có LTS) > Không có GPU

dc156f20b14651d7.png

  1. Nhập tên cho sổ tay Jupyter. Để biết thêm thông tin, hãy xem Quy ước đặt tên tài nguyên.

b4dbc5fddc37e8d9.png

  1. Nhấp vào TÙY CHỌN NÂNG CAO
  2. Di chuyển xuống Các phần quyền
  3. Bỏ đánh dấu lựa chọn Use Compute Engine mặc định cho tài khoản dịch vụ
  4. Thêm email tài khoản dịch vụ được tạo ở bước trước. Sau đó, hãy nhấp vào Tạo.

ec0b9ef00f0ef470.png

  1. Sau khi tạo thực thể, hãy nhấp vào MỞ JUPYTERLAB.

4. Thiết lập Sổ tay để phát trực tuyến video

Trước khi tạo một Ứng dụng trong công cụ Phân tích về tỷ lệ kín phòng, bạn phải đăng ký một luồng để Ứng dụng có thể sử dụng sau này.

Trong hướng dẫn này, chúng ta sẽ sử dụng phiên bản Jupyter Notebook để lưu trữ video và bạn gửi dữ liệu video phát trực tuyến đó từ cửa sổ dòng lệnh của Notebook.

Tải công cụ dòng lệnh vaictl xuống

  1. Trong phiên bản Jupyterlab đã mở, hãy mở Notebook (Sổ tay) qua trình chạy.

a6d182923ae4ada3.png

  1. Tải công cụ dòng lệnh Vertex AI Vision (vaictl), công cụ dòng lệnh của máy chủ rtsp xuống, công cụ open-cv bằng lệnh sau trong ô của sổ tay:
!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. Truyền dẫn tệp video để phát trực tuyến

Sau khi thiết lập môi trường của sổ tay bằng các công cụ dòng lệnh cần thiết, bạn có thể sao chép tệp video mẫu rồi sử dụng vaictl để truyền dữ liệu video đến ứng dụng phân tích số người lưu trú.

Đăng ký một sự kiện phát trực tiếp mới

  1. Thẻ Lượt nhấp vào luồng trên bảng điều khiển bên trái của Vertex AI Vision.
  2. Nhấp vào nút Đăng ký ở đầu eba418e723916514.png
  3. Trong tên Luồng, hãy nhập 'queue-stream'
  4. Trong khu vực, hãy chọn chính khu vực đã chọn trong quá trình tạo Sổ tay ở bước trước.
  5. Nhấp vào Đăng ký

Sao chép một video mẫu vào máy ảo

  1. Trong sổ tay, hãy sao chép một video mẫu bằng lệnh wget sau đây.
!wget -q https://github.com/vagrantism/interesting-datasets/raw/main/video/collective_activity/seq25_h264.mp4

Phát trực tuyến video từ máy ảo và nhập dữ liệu vào sự kiện phát trực tiếp

  1. Để gửi tệp video trên máy này tới luồng đầu vào của ứng dụng, hãy sử dụng lệnh sau trong ô sổ tay của bạn. Bạn phải thực hiện các thay thế biến sau:
  • PROJECT_ID: Mã dự án trên Google Cloud của bạn.
  • VỊ TRÍ: ID vị trí của bạn. Ví dụ: us-central1. Để biết thêm thông tin, hãy xem bài viết Vị trí đám mây.
  • LOCAL_FILE: Tên tệp của tệp video cục bộ. Ví dụ: seq25_h264.mp4.
PROJECT_ID='<Your Google Cloud project ID>'
LOCATION='<Your stream location>'
LOCAL_FILE='seq25_h264.mp4'
STREAM_NAME='queue-stream'
  1. Khởi động máy chủ rtsp-simple-server, nơi chúng ta truyền trực tuyến tệp video bằng giao thức 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. Sử dụng công cụ dòng lệnh ffmpeg để lặp lại video trong luồng 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. Sử dụng công cụ dòng lệnh vaictl để phát trực tuyến video từ URI máy chủ rtsp đến luồng "queue-stream" của Vertex AI Vision đã tạo ở bước trước.
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)

Có thể mất khoảng 100 giây từ khi bắt đầu thao tác nhập vaictl đến khi video xuất hiện trong trang tổng quan.

Sau khi có quy trình truyền dẫn sự kiện phát trực tiếp, bạn có thể xem nguồn cấp dữ liệu video trong thẻ Bảng tin trên trang tổng quan của Vertex AI Vision bằng cách chọn sự kiện phát trực tiếp trong hàng đợi.

Chuyển đến thẻ Bảng tin

1b7aac7d36552f29.pngS

6. Tạo ứng dụng

Bước đầu tiên là tạo một ứng dụng xử lý dữ liệu của bạn. Ứng dụng có thể được coi là một quy trình tự động kết nối những thông tin sau:

  • Nhập dữ liệu: Nguồn cấp dữ liệu video được nhập vào luồng.
  • Phân tích dữ liệu: Bạn có thể thêm mô hình AI(Tầm nhìn máy tính) sau khi nhập dữ liệu.
  • Lưu dữ liệu: Hai phiên bản của nguồn cấp dữ liệu video (luồng gốc và luồng do mô hình AI xử lý) có thể được lưu trữ trong kho nội dung nghe nhìn.

Trong bảng điều khiển Google Cloud, ứng dụng được biểu thị dưới dạng biểu đồ.

Tạo một ứng dụng trống

Để có thể điền biểu đồ ứng dụng, trước tiên, bạn phải tạo một ứng dụng trống.

Tạo một ứng dụng trong bảng điều khiển Google Cloud.

  1. Truy cập vào bảng điều khiển của Google Cloud.
  2. Mở thẻ Ứng dụng trên trang tổng quan Vertex AI Vision. Chuyển đến thẻ Ứng dụng
  3. Nhấp vào nút Tạo. 21ecba7a23e9979e.png.
  4. Nhập "queue-app" (ứng dụng hàng đợi) làm tên ứng dụng và chọn khu vực của bạn.
  5. Nhấp vào Tạo.

Thêm nút thành phần ứng dụng

Sau khi tạo ứng dụng trống, bạn có thể thêm 3 nút vào biểu đồ ứng dụng:

  1. Nút truyền dẫn: Tài nguyên luồng nhập dữ liệu được gửi từ máy chủ video rtsp mà bạn đã tạo trong sổ tay.
  2. Nút xử lý: Mô hình phân tích số người lưu trú hoạt động dựa trên dữ liệu được nhập.
  3. Nút bộ nhớ: Kho nội dung nghe nhìn lưu trữ các video đã xử lý và đóng vai trò là kho lưu trữ siêu dữ liệu. Kho siêu dữ liệu có chứa thông tin phân tích về dữ liệu video đã nhập và thông tin do các mô hình AI suy luận.

Thêm các nút thành phần vào ứng dụng trong bảng điều khiển.

  1. Mở thẻ Ứng dụng trên trang tổng quan Vertex AI Vision. Chuyển đến thẻ Ứng dụng

Thao tác này sẽ đưa bạn đến hình ảnh trực quan hoá biểu đồ của quy trình xử lý.

Thêm nút nhập dữ liệu

  1. Để thêm nút luồng đầu vào, chọn tùy chọn Luồng trong phần Trình kết nối của menu bên.
  2. Trong phần Nguồn của trình đơn Luồng mở ra, hãy chọn Thêm luồng.
  3. Trong trình đơn Thêm luồng, hãy chọn luồng hàng đợi.
  4. Để thêm luồng vào biểu đồ ứng dụng, hãy nhấp vào Thêm luồng.

Thêm nút xử lý dữ liệu

  1. Để thêm nút mô hình về số người lưu trú, hãy chọn mục số liệu phân tích về số người lưu trú trong mục Mô hình chuyên biệt của trình đơn bên.
  2. Giữ nguyên lựa chọn mặc định Mọi người. Bỏ đánh dấu mục Xe nếu bạn đã chọn mục này.

618b0c9dc671bae3.png.

  1. Trong phần Advanced Options (Tuỳ chọn nâng cao), hãy nhấp vào Create Active Zones/Lines 5b2f31235603e05d.png.
  2. Vẽ các khu vực đang hoạt động bằng công cụ Đa giác để đếm số người trong khu vực đó. Gắn nhãn vùng đó cho phù hợp

50281a723650491f.pngS

  1. Nhấp vào Mũi tên quay lại ở trên cùng.

2bf0ff4d029d29eb.png.

  1. Thêm chế độ cài đặt cho thời gian dừng để phát hiện tình trạng tắc nghẽn bằng cách nhấp vào Hộp đánh dấu.

c067fa256ca5bb96.png

Thêm nút lưu trữ dữ liệu

  1. Để thêm nút đích đến đầu ra (bộ nhớ lưu trữ), hãy chọn tuỳ chọn VIsion AI Warehouse trong phần Connectors (Trình kết nối) của trình đơn bên.
  2. Nhấp vào Trình kết nối Vertex AI Warehouse để mở trình đơn, rồi nhấp vào Kết nối kho hàng.
  3. Trong trình đơn Kết nối kho hàng, hãy chọn Tạo kho hàng mới. Đặt tên cho kho hàng là queue-warehouse và để thời hạn TTL là 14 ngày.
  4. Nhấp vào nút Tạo để thêm kho hàng.

7. Kết nối đầu ra với bảng BigQuery

Khi bạn thêm trình kết nối BigQuery vào ứng dụng Vertex AI Vision của mình, thì tất cả dữ liệu đầu ra của mô hình ứng dụng đã kết nối sẽ được nhập vào bảng đích.

Bạn có thể tạo bảng BigQuery của riêng mình và chỉ định bảng đó khi thêm trình kết nối BigQuery vào ứng dụng hoặc để nền tảng ứng dụng Vertex AI Vision tự động tạo bảng.

Tạo bảng tự động

Nếu để nền tảng ứng dụng Vertex AI Vision tự động tạo bảng, bạn có thể chỉ định lựa chọn này khi thêm nút trình kết nối BigQuery.

Tập dữ liệu và các điều kiện sau đây của bảng sẽ được áp dụng nếu bạn muốn dùng tính năng tạo bảng tự động:

  • Tập dữ liệu: Tên tập dữ liệu được tạo tự động là visibilityai_dataset.
  • Bảng: Tên bảng được tạo tự động là visibilityai_dataset.APPLICATION_ID.
  • Xử lý lỗi:
  • Nếu bảng có cùng tên trong cùng một tập dữ liệu tồn tại, thì quá trình tạo tự động sẽ không diễn ra.
  1. Mở thẻ Ứng dụng trên trang tổng quan Vertex AI Vision. Chuyển đến thẻ Ứng dụng
  2. Chọn View app (Xem ứng dụng) bên cạnh tên ứng dụng của bạn trong danh sách.
  3. Trên trang trình tạo ứng dụng, hãy chọn BigQuery từ phần Trình kết nối.
  4. Để trống trường Đường dẫn BigQuery.

ee0b67d4ab2263d.png

  1. Trong phần siêu dữ liệu của cửa hàng from: chỉ chọn "số liệu phân tích về tỷ lệ kín phòng" rồi bỏ đánh dấu các sự kiện phát trực tiếp.

Biểu đồ ứng dụng hoàn thiện sẽ có dạng như sau:

da0a1a049843572f.png

8. Triển khai ứng dụng để sử dụng

Sau khi bạn đã tạo ứng dụng hoàn chỉnh với tất cả các thành phần cần thiết, bước cuối cùng để sử dụng ứng dụng là triển khai ứng dụng đó.

  1. Mở thẻ Ứng dụng trên trang tổng quan Vertex AI Vision. Chuyển đến thẻ Ứng dụng
  2. Chọn View app (Xem ứng dụng) bên cạnh ứng dụng queue-app (ứng dụng hàng đợi) trong danh sách.
  3. Trên trang Studio, hãy nhấp vào nút Deploy (Triển khai).
  4. Trong hộp thoại xác nhận sau, hãy nhấp vào Deploy (Triển khai). Hoạt động triển khai có thể mất vài phút để hoàn tất. Sau khi triển khai xong, dấu kiểm màu xanh lục sẽ xuất hiện bên cạnh các nút. dc514d9b9f35099d.png

9. Tìm kiếm nội dung video trong kho lưu trữ

Sau khi nhập dữ liệu video vào ứng dụng xử lý, bạn có thể xem dữ liệu video đã phân tích và tìm kiếm dữ liệu đó dựa trên thông tin phân tích về số người lưu trú.

  1. Mở thẻ Warehouses (Kho kho) trên trang tổng quan của Vertex AI Vision. Chuyển đến thẻ Kho hàng
  2. Tìm kho hàng trong hàng đợi trong danh sách, rồi nhấp vào Xem tài sản.
  3. Trong mục Số người, hãy đặt giá trị Tối thiểu thành 1 và giá trị Tối đa thành 5.
  4. Để lọc dữ liệu video đã xử lý được lưu trữ trong Media Warehouse của Vertex AI Vision, hãy nhấp vào Tìm kiếm.

a0e5766262443d6c.png

Chế độ xem dữ liệu video đã lưu trữ khớp với tiêu chí tìm kiếm trong bảng điều khiển Google Cloud.

10. Chú thích và phân tích kết quả bằng bảng BigQuery

  1. Trong Sổ tay, hãy khởi tạo các biến sau đây trong ô.
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. Bây giờ, chúng ta sẽ chụp các khung hình từ luồng rtsp bằng mã sau:
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. Lấy dấu thời gian dữ liệu và thông tin chú thích từ bảng BigQuery và tạo một thư mục để lưu trữ hình ảnh khung đã chụp:
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. Chú thích khung bằng đoạn mã sau:
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.pngS

  1. Dừng tác vụ chú thích bằng cách sử dụng nút Dừng trên thanh trình đơn của sổ tay

6c19cb00dcb28894.pngS

  1. Bạn có thể truy cập lại từng khung hình bằng đoạn mã sau:
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. Xin chúc mừng

Xin chúc mừng, bạn đã hoàn thành phòng thí nghiệm!

Dọn dẹp

Để tránh làm phát sinh chi phí cho các tài nguyên được sử dụng trong hướng dẫn này trong tài khoản Google Cloud của bạn, hãy xoá dự án chứa các tài nguyên đó, hoặc giữ lại dự án và xoá từng tài nguyên riêng lẻ.

Xoá dự án

Xoá từng tài nguyên

Tài nguyên

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

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

Giấy phép

Khảo sát

Bạn đã sử dụng hướng dẫn này như thế nào?

Chỉ có thể đọc Đọc và hoàn thành bài tập

Lớp học lập trình này có hữu ích không?

Rất hữu ích Khá hữu ích Không hữu ích

Bạn có thể dễ dàng theo dõi lớp học lập trình này không?

Dễ Trung bình Khó