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

建立服務帳戶金鑰:

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

† 如果要從 Cloud Storage bucket 複製影片樣本檔,才需要這個角色。

3. 設定 VM 來串流影片

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

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

建立 Linux VM

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

  1. 前往控制台的「VM instances」(VM 執行個體) 頁面。前往 VM 執行個體
  2. 選取您的專案並點選 [繼續]
  3. 點選「建立執行個體」
  4. 指定 VM 的「Name」(名稱)。詳情請參閱「資源命名慣例」。
  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 連線視窗中,使用下列指令下載 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. 在區域中輸入「us-central1」
  5. 按一下「註冊」

系統需要幾分鐘才能完成註冊串流。

將影片樣本複製到 VM

  1. 在 VM 的「直接透過瀏覽器進行 SSH 連線」視窗中,使用下列 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 控制台中,即時查看影片擷取至串流的狀態。影片出處: Elizabeth MavorPixabay (已加入像素化效果)。

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. 在隨即開啟的「串流」選單中,選取「來源」部分的「新增串流」
  3. 在「新增串流」選單中,選擇「註冊新串流」,並將 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. 儲存中繼資料來源:中,只選取「車輛乘載人數分析」,並取消勾選串流。

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

1787242465fd6da7.png

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

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

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

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

將影片資料擷取至處理應用程式後,即可查看分析結果,並根據入住率數據分析資訊搜尋資料。

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

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」,以計算人數。

本程式碼研究室只會顯示 Query1 的範例資料和視覺化效果。您可以對 Query2 執行類似程序。

e6fd891f3a46246.png

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

9e737ddb4d0d25b6.png

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

上圖顯示每分鐘通過各條線的車輛/人數。

深藍色和淺藍色長條分別代表兩個不同的行 ID。

10. 恭喜

恭喜,您已完成本實驗室!

清理

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

刪除專案

刪除個別資源

資源

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

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

意見回饋

按一下這裡提供意見

問卷調查

您會如何使用本教學課程?

僅閱讀 閱讀並完成練習

您覺得這個程式碼研究室是否實用?

非常實用 還算實用