Vertex AI Vision 流量監控應用程式

1. 目標

總覽

本程式碼研究室著重於建立端對端 Vertex AI Vision 應用程式,以便監控即時流量影片片段。我們會使用預先訓練的專業模型入座率分析內建功能來擷取下列資料:

  • 計算在特定路線上行駛的車輛和過馬路的人數。
  • 計算道路上任何固定區域的車輛/人數。
  • 偵測道路任一區域的壅塞情形。

課程內容

  • 如何設定 VM 擷取影片以供串流播放
  • 如何在 Vertex AI Vision 中建立應用程式
  • 可用於「入住率分析」的不同功能及其使用方式
  • 如何部署應用程式
  • 如何在 Vertex AI Vision 的媒體倉儲中搜尋影片。
  • 如何將輸出內容連結至 BigQuery、編寫 SQL 查詢,從模型的 JSON 輸出內容中擷取洞察,並在 Looker Studio 中即時以圖表呈現結果。

2. 事前準備

  1. 在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案注意:如果您不打算保留在這項程序中建立的資源,請建立新專案,不要選取現有專案。完成這些步驟後,您就可以刪除專案,並移除相關聯的所有資源。前往專案選取器
  2. 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能
  3. 啟用 Compute Engine 和 Vision AI API。啟用 API

建立服務帳戶:

  1. 前往 Google Cloud 控制台的「Create service account」(建立服務帳戶) 頁面。前往「Create service account」(建立服務帳戶)
  2. 選取專案。
  3. 在「Service account name」(服務帳戶名稱) 欄位中輸入名稱。Google Cloud 控制台會根據這個名稱填入「Service account ID」欄位。在「服務帳戶說明」欄位中輸入說明。例如,快速入門指南的服務帳戶。
  4. 按一下 [建立並繼續]
  5. 如要提供專案存取權,請將下列角色授予服務帳戶:Vision AI > Vision AI 編輯者、Compute Engine > Compute 執行個體管理員 (Beta 版)、Storage > Storage 物件檢視者 †。在「請選擇角色」清單中,選取所需角色。如要新增其他角色,請按一下「新增其他角色」,然後新增各個角色。注意:「Role」欄位會影響服務帳戶可在專案中存取哪些資源。您日後可以撤銷這些角色或授予其他角色。在實際環境中,請勿授予擁有者、編輯者或檢視者角色。請改為授予符合需求的預先定義角色自訂角色
  6. 按一下「繼續」
  7. 按一下「Done」,即完成建立服務帳戶。請勿關閉瀏覽器視窗。您會在下一個步驟中用到。

建立服務帳戶金鑰:

  1. 在 Google Cloud 控制台中,按一下您建立的服務帳戶電子郵件地址。
  2. 按一下「Keys」
  3. 依序點選「新增金鑰」和「建立新的金鑰」
  4. 按一下「建立」,JSON 金鑰檔案會下載至您的電腦。
  5. 按一下「關閉」
  6. 安裝初始化 Google Cloud CLI。

† 只有在從 Cloud Storage 值區複製影片檔案範例時,才需要這個角色。

3. 設定 VM 以串流播放影片

在 Occupancy Analytics 中建立應用程式前,您必須註冊可供應用程式日後使用的串流。

在本教學課程中,您將建立可代管影片的 Compute Engine VM 執行個體,並從 VM 傳送串流影片資料。

建立 Linux VM

從 Compute Engine VM 執行個體傳送影片的第一步,就是建立 VM 執行個體。

  1. 前往控制台的「VM instances」(VM 執行個體) 頁面。前往 VM 執行個體
  2. 選取您的專案並點選 [繼續]
  3. 點選「建立執行個體」
  4. 指定 VM 的「名稱」。詳情請參閱資源命名慣例
  5. 選用:變更此 VM 的「Zone」。Compute Engine 會隨機排列每個地區的區域清單,鼓勵跨多個區域使用。
  6. 接受其餘預設選項。如要進一步瞭解這些選項,請參閱「建立及啟動 VM」一文。
  7. 如要建立並啟動 VM,請按一下 [Create] (建立)

設定 VM 環境

VM 啟動後,您可以使用控制台透過瀏覽器使用 SSH 連線至 VM。然後下載 vaictl 指令列工具,將影片擷取至串流中。

建立與 VM 的 SSH 連線

  1. 前往控制台的「VM instances」(VM 執行個體) 頁面。前往 VM 執行個體
  2. 在您建立的執行個體列的「連線」部分,按一下「SSH」。連至該執行個體的 SSH 連線就會在新瀏覽器視窗中開啟。UI 中的 SSH 選項

下載 vaictl 指令列工具

  1. 在「SSH-in-browser」視窗中執行下列指令,下載 Vertex AI Vision (vaictl) 指令列工具:
wget https://github.com/google/visionai/releases/download/v0.0.4/visionai_0.0-4_amd64.deb
  1. 執行下列指令,安裝指令列工具:
sudo apt install ./visionai_0.0-4_amd64.deb
  1. 您可以執行下列指令來測試安裝作業:
vaictl --help

4. 擷取要串流的影片檔案

設定 VM 環境後,您可以複製範例影片檔案,然後使用 vaictl 將影片資料串流至入住人數分析應用程式。

請先在 Cloud 控制台中啟用 Vision AI API

註冊新的串流

  1. 按一下 Vertex AI Vision 左側面板中的「串流」分頁標籤。
  2. 按一下「註冊」
  3. 在串流名稱中輸入「traffic-stream」
  4. 在「region」(區域) 中輸入「us-central1」
  5. 按一下「註冊」

串流需要幾分鐘才能註冊。

將範例影片複製到 VM

  1. 在 VM 的「SSH-in-browser」視窗中,使用下列 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 .

從 VM 串流播放影片,並將資料擷取至串流中

  1. 如要將這個本機影片檔案傳送至應用程式輸入串流,請使用下列指令。您必須替換以下變數:
  • PROJECT_ID:您的 Google Cloud 專案 ID。
  • LOCATION_ID:您的位置 ID。例如 us-central1。詳情請參閱「Cloud 據點」。
  • LOCAL_FILE:本機影片檔案的檔案名稱。例如 street_vehicles_people.mp4。
  • –loop 標記:選用。循環播放檔案資料,模擬串流。
export PROJECT_ID=<Your Google Cloud project ID>
export LOCATION_ID=us-central1
export LOCAL_FILE=street_vehicles_people.mp4
  1. 這個指令會將影片檔案串流至串流。如果使用 –loop 旗標,系統會將影片重複播放至串流中,直到你停止指令為止。我們會以背景工作形式執行這項指令,這樣即使 VM 已中斷連線,也能繼續串流。
  • ( 在開頭加上 nohup,結尾加上「&'」可將其設為背景工作)
nohup vaictl -p $PROJECT_ID \
    -l $LOCATION_ID \
    -c application-cluster-0 \
    --service-endpoint visionai.googleapis.com \
send video-file to streams 'traffic-stream' --file-path $LOCAL_FILE --loop &

啟動 vaictl 擷取作業到資訊主頁中顯示的影片,可能需要約 100 秒的時間。

系統提供串流擷取後,選取流量串流,即可在 Vertex AI Vision 資訊主頁的「串流」分頁中查看視訊動態饋給。

前往「串流」分頁

透過 UI 查看即時影像即時檢視畫面:系統將影片擷取至 Google Cloud 控制台中的串流。影片來源: PixabayElizabeth Mavor (已新增像素)。

5. 建立應用程式

第一步是建立可處理資料的應用程式。應用程式可視為自動化管道,可連結下列項目:

  • 資料擷取:將影片動態饋給擷取至串流。
  • 資料分析:在擷取後,您可以新增 AI(電腦視覺) 模型。
  • 資料儲存空間:兩個版本的影片動態饋給 (原始串流和 AI 模型處理的串流) 可儲存在媒體倉儲中。

在 Google Cloud 控制台中,應用程式會以圖表表示。

建立空白的應用程式

您必須先建立空白應用程式,才能填入應用程式圖表。

在 Google Cloud 控制台中建立應用程式。

  1. 前往 Google Cloud 控制台
  2. 開啟 Vertex AI Vision 資訊主頁的「應用程式」分頁。

前往「應用程式」分頁

  1. 按一下「新增」按鈕。
  2. 輸入「traffic-app」做為應用程式名稱,並選擇區域。
  3. 按一下「建立」

新增應用程式元件節點

建立空白應用程式後,您可以將這三個節點新增至應用程式圖表:

  1. 攝入節點:攝入從您建立的 Compute Engine VM 執行個體傳送的資料的串流資源。
  2. 處理節點:負責處理攝入資料的占用率分析模型。
  3. 儲存節點:儲存經過處理的影片,並做為中繼資料儲存空間的媒體倉儲。中繼資料儲存庫包含擷取的影片資料分析資訊,以及 AI 模型推斷的資訊。

在控制台中為應用程式新增元件節點。

  1. 開啟 Vertex AI Vision 資訊主頁的「應用程式」分頁。前往「應用程式」分頁
  2. 在流量應用程式行中,選取「查看圖表」。這會帶您前往處理管道的圖表視覺化畫面。

新增資料匯入節點

  1. 如要新增輸入串流節點,請在側邊選單的「Connectors」(連接器) 區段中選取「Streams」(串流) 選項。
  2. 在隨即開啟的「Stream」選單的「Source」部分中,選取「Add Stream」
  3. 在「Add streams」選單中,選擇「Register new streams」,然後將 traffic-stream 新增為串流名稱。
  4. 如要將串流新增至應用程式圖表,請按一下「新增串流」

新增資料處理節點

  1. 如要新增入住人數模型節點,請在側邊選單的「Specialized models」(專用模型) 區段中,選取「occupancy analytics」(入住人數分析) 選項。
  2. 保留預設選項「人物」和「車輛」
  3. 在「線條交叉」中新增線條。使用多點線條工具,在需要偵測車輛或人員進出的地方繪製線條。
  4. 繪製活動區,以便計算該區域內的人數/車輛數量。
  5. 新增停留時間設定,以便在繪製活動區域時偵測壅塞。
  • (目前不支援同時偵測到活動區和範圍線。一次只能使用一項功能)。

3acdb6f1e8474e07.png ce63449d601995e9.png

194c54d2bbcf7e8a.png

新增資料儲存節點

  1. 如要新增輸出目的地 (儲存空間) 節點,請在側邊選單的「Connectors」(連接器) 區段中選取「Vertex AI Vision's Media Warehouse」(Vertex AI Vision 的媒體倉儲) 選項。
  2. 在「Vertex AI Vision 的媒體倉儲」選單中,按一下「連結倉儲」
  3. 在「Connect Warehouse」(連結倉儲) 選單中,選取「Create new warehouse」(新建倉儲)。將倉儲命名為 traffic-warehouse,並將 TTL 持續時間保留 14 天。
  4. 按一下「Create」(建立) 按鈕來新增倉儲。

6. 將輸出內容連結至 BigQuery 資料表

將 BigQuery 連接器新增至 Vertex AI Vision 應用程式後,所有已連結的應用程式模型輸出內容都會擷取至目標資料表。

您可以自行建立 BigQuery 資料表,並在將 BigQuery 連接器新增至應用程式時指定該資料表,或是讓 Vertex AI Vision 應用程式平台自動建立資料表。

自動建立資料表

如果您讓 Vertex AI Vision 應用程式平台自動建立資料表,則可在新增 BigQuery 連接器節點時指定這個選項。

如要使用自動建立表格功能,請遵守下列資料集和表格條件:

  • 資料集:系統會自動建立名為 visionai_dataset 的資料集。
  • 資料表:自動建立的資料表名稱為 visionai_dataset.APPLICATION_ID。
  • 錯誤處理:
  • 如果在同一個資料集底下有同名的資料表,系統不會自動建立。
  1. 開啟 Vertex AI Vision 資訊主頁的「應用程式」分頁。前往「應用程式」分頁
  2. 在清單中選取應用程式名稱旁的「查看應用程式」
  3. 在應用程式建構工具頁面中,從「連接器」專區選取「BigQuery」
  4. 請勿在「BigQuery 路徑」欄位中輸入任何內容。ee0b67d4ab2263d.png
  5. 在「儲存中繼資料來源:」中,只選取「occupancy Analytics」,並取消勾選串流。

最終的應用程式圖表應如下所示:

1787242465fd6da7.png

7. 部署應用程式以供使用

在使用所有必要元件建構端對端應用程式後,使用應用程式的最後一步就是部署應用程式。

  1. 開啟 Vertex AI Vision 資訊主頁的「應用程式」分頁。前往「應用程式」分頁
  2. 在清單中,選取流量應用程式旁邊的「查看圖表」
  3. 在應用程式圖表建構工具頁面中,按一下「Deploy」按鈕。
  4. 在下列確認對話方塊中,選取「部署」。部署作業可能需要幾分鐘才能完成。部署完成後,節點旁邊會顯示綠色勾號。ee78bbf00e5db898.png

8. 在儲存倉庫中搜尋影片內容

將影片資料擷取至處理應用程式後,您可以查看已分析的影片資料,並根據人流分析資訊搜尋資料。

  1. 開啟 Vertex AI Vision 資訊主頁的「倉庫」分頁。前往「倉庫」分頁
  2. 在清單中找出「traffic-warehouse」倉庫,然後按一下「View assets」
  3. 在「人數計數」或「車輛計數」部分,將「最小值」設為 1,並將「最大值」設為 5。
  4. 如要篩選儲存在 Vertex AI Vision 媒體倉儲中的已處理影片資料,請按一下「搜尋」

e636361b19738c8d.png

Google Cloud 主控台中儲存的影片資料,符合搜尋條件的檢視畫面。影片版權: Elizabeth Mavor,圖片來源:Pixabay (已套用搜尋條件)。

9. 在 BigQuery 資料表中分析輸出結果

前往 BigQuery

選取資料集:visionai_dataset

選取資料表:您的 APPLICATION_ID (在本例中為 traffic-app)

按一下表格名稱右側的三點圖示,然後點選「查詢」

編寫下列查詢

查詢 1:查詢每分鐘每條線路的車輛數量

abc.sql

—- Get list of active marked lines for each timeframe
WITH line_array AS (
  SELECT
  t.ingestion_time AS ingestion_time,
  JSON_QUERY_ARRAY(t.annotation.stats["crossingLineCounts"]) AS lines
  FROM
  `PROJ_ID.visionai_dataset.APP_ID` AS t
),
—- Flatten active lines to get individual entities details
flattened AS (
  SELECT
  line_array.ingestion_time,
  JSON_VALUE(line.annotation.id) as line_id,
  JSON_QUERY_ARRAY(line["positiveDirectionCounts"]) AS entities
  FROM line_array, unnest(line_array.lines) as line
 )
—- Generate aggregate vehicle count per zone w.r.t time 
SELECT
  STRING(TIMESTAMP_TRUNC(ingestion_time, MINUTE) ) AS time, line_id,
  SUM(INT64(entity["count"])) as vehicle_count
FROM
  flattened, UNNEST(flattened.entities) AS entity
WHERE JSON_VALUE(entity['entity']['labelString']) = 'Vehicle'
GROUP BY time, line_id

查詢 2:透過查詢檢查每個可用區的每分鐘車輛數量

—- Get list of active zones for each timeframe
WITH zone_array AS (
     SELECT
     t.ingestion_time AS ingestion_time,
     JSON_QUERY_ARRAY(t.annotation.stats["activeZoneCounts"]) AS zones
     FROM
     `PROJ_ID.visionai_dataset.APP_ID` AS t
),
—- Flatten active zones to get individual entities details
flattened AS (
   SELECT zone_array.ingestion_time, JSON_VALUE(zone.annotation.id) as zone_id,
         JSON_QUERY_ARRAY(zone["counts"]) AS entities
   FROM zone_array, unnest(zone_array.zones) as zone
 )
—- Generate aggregate vehicle count per zone w.r.t time 
SELECT 
STRING(TIMESTAMP_TRUNC(ingestion_time, MINUTE) ) AS time, 
zone_id,
SUM(INT64(entity["count"])) as vehicle_count
FROM flattened, UNNEST(flattened.entities) AS entity
WHERE JSON_VALUE(entity['entity']['labelString']) = 'Vehicle'
GROUP BY time, zone_id

在上述查詢中,您可以將「Vehicle」變更為「Person」,以便計算人數。

本程式碼研究室只會顯示查詢 1 的資料範例和圖表。您可以按照類似的程序處理查詢 2。

e6fd891f3a46246.png

按一下右側選單中的「探索資料」,然後選取「透過 Looker Studio 探索」

9e737ddb4d0d25b6.png

在「維度」窗格中新增時間,並將時間設定變更為日期時間。在「細分維度」中新增 line_id。b5da9704ccd8db.png

上方圖表顯示每分鐘穿越每條線的車輛/人員數量。

深藍色和淺藍色長條代表兩個不同的 line-id。

10. 恭喜

恭喜,您已完成實驗室!

清理

如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除專案

刪除個別資源

資源

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

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

意見回饋

按這裡提供意見回饋

問卷調查

您要如何使用這個教學課程?

只閱讀 閱讀並完成練習

本程式碼研究室有多實用?

很實用 還算實用