使用 OpenVINO™ 工具組的智慧排隊管理:AI 與物件偵測

概述

本教學課程說明如何使用 OpenVINO™ 工具組、Ultralytics YOLO* v8 與 Jupyter* Notebook,為零售結帳建立智慧排隊管理系統。查看實際評測基準資料後,您可以執行自己所設的實際評測基準。 

透過深度學習與電腦視覺偵測物件,企業可以獲得即時營運見解,然後提高效率和顧客滿意度。OpenVINO 工具組有助您解決常見的部署限制,例如在同一個系統上增加可用的攝影機數量。OpenVINO 工具組可縮短處理輸入資料,以及產生輸出預測的時間,讓您處理更多影格並加速決策。

這個應用程式專攻現今步調緊湊、首重顧客滿意度的零售環境。這個應用程式會偵測排隊的顧客,並提供即時的分析資料。這些資料讓門市可以引導排隊顧客,大幅縮短排隊等候的時間,而員工可以適時簡化結帳流程,提升顧客滿意度。

此外,這個解決方案適用於任何需要物件偵測、物件計數與決策的問題。

預先要求

  • 您的系統已安裝 Python* 3.8 或更新版本。
  • 您的系統已安裝 Git。
  • 連線系統的網路攝影機或網路監控攝影機。 
  • 符合 OpenVINO 工具組系統要求的支援硬體。
     

注意本教學課程使用 Intel® Core™ 處理器、Intel Atom® 處理器(原名為 Alder Lake)、第 4 代 Intel® Xeon® 可擴充處理器(原名為 Sapphire Rapids)與 Intel® Flex dGPU 作為示範。

步驟 1:複製存放庫

若要複製智慧排隊管理存放庫至系統,並安裝程式庫與工具,請使用以下命令:

sudo apt install git git-lfs gcc python3-venv python3-dev git clone –b recipes https://github.com/openvinotoolkit/openvino_notebooks.git openvino_notebooks

這個命令會複製存放庫至資料夾「openvino_notebooks」,並下載範例影片。接著,瀏覽至資料夾:  

cd openvino_notebooks/recipes/intelligent_queue_management

提取影片範例:

git lfs pull

這個應用程式使用 Python* 設定虛擬環境。如果您未安裝虛擬環境套件,請執行以下操作:

sudo apt-get update sudo apt-get upgrade sudo apt-get install python3-ven

如果您的裝置搭載 Intel 內建顯示卡並可啟用推斷,請安裝 oneAPI Level Zero 與 OpenCL™ 驅動程式適用的 Intel® 顯示晶片運算時間。Ubuntu* 20.04 的命令:

sudo apt-get install intel-opencl-icd

接著,準備虛擬環境。

步驟 2:建立並啟用虛擬環境

為避免影響系統全域,最佳的做法是在專屬環境隔離 Python 專案。若要設定虛擬環境,請開啟終端或命令提示字元,然後瀏覽至您要建立環境的目錄。接著,若要建立新的虛擬環境,請執行以下命令:

如果是 UNIX* 型作業系統(例如 Linux* 或 macOS*),請使用:

python3 -m venv venv

如果是 Windows*,請使用:

python -m venv venv

這個命令會在目前的資料夾中,建立新的虛擬環境「venv」。接著,啟用剛建立的環境。使用的命令因作業系統而異。

如果是 UNIX 型作業系統(例如 Linux 或 macOS),請使用:

source venv/bin/activate

如果是 Windows,請使用:

venvScriptsactivate

這個命令會啟用虛擬環境,並變更命令介面的提示。

 

步驟 3:安裝要求

若要執行智慧排隊管理應用程式,請安裝幾個依賴項。這些依賴項列於所附的要求檔案,並可使用 Python 套件安裝程式安裝。

若要安裝必要的 Python 程式庫,包括 OpenVINO 工具組與 YOLO* v8,請使用以下命令:

python -m pip install --upgrade pip pip install -r requirements.txt

已安裝所有依賴項與要求。接著,請最佳化並轉換模型,再執行應用程式。

 

步驟 4:啟動 Jupyter* Notebook

除了 Jupyter Notebook,存放庫也包含方便生產部署的指令碼。這些指令碼的程式碼與筆記本相同,所以您可以轉換模型,並直接從命令列執行智慧排隊管理應用程式,方便您在實際執行環境中自動化或擴充 AI 解決方案。

本教學課程使用 Jupyter Notebook。 

為啟動 JupyterLab 轉換並最佳化 YOLO v8 模型前,請在「intelligent_queue_management」筆記本中,執行以下命令:

jupyter lab docs

JupyterLab 會開啟包含筆記本的文件目錄。

 

步驟 5:轉換並最佳化模型

開啟「docs」資料夾中的「convert-and-optimize-the-model」筆記本。筆記本包含下載和轉換 YOLO v8 模型的詳細指令。這個指令會為搭配 OpenVINO 工具組使用,調整模型。

以下筆記本程式碼片段說明如何使用匯出方法轉換模型: 

# export model to OpenVINO format out_dir = det_model.export(format="openvino", dynamic=False, half=True)
  • det_model 即 YOLO v8 物件偵測模型。 
  • 格式設為「openvino」,以 OpenVINO 格式匯出模型。 
  • 動態參數設為「False」,所以您將匯出固定輸入大小的模型(即靜態模型)。靜態模型不可在不同推斷執行時,變更輸入張量的大小。
  • half 設為「True」,使用半精度浮點格式(FP16)計算模型權數。 

這個設定會轉換 YOLO v8 模型為 OpenVINO 中繼碼(IR)格式,因此您可以利用工具組的功能最佳化模型,並在各種硬體平台取得更好的效能。IR 格式是 OpenVINO 常見的格式,用於表示深度學習模型,並可實現不同硬體平台的高效推斷。 

步驟 6:使用 NNCF 訓練後量化 API 最佳化模型

請使用神經網路壓縮框架(NNCF)最佳化模型,再執行智慧排隊管理應用程式,因為這個工具提供進階運算法,可最佳化 OpenVINO 工具組中的神經網路,而且準確度的下降是微乎其微。

本教學課程使用 NNCF 8 位元訓練後量化,所以不必微調管道,即可最佳化模型。適用這個工具的 YOLO v8 模型:

  1. 載入要量化的資料集:若要有效量化模型,您需要同一個領域的樣本資料集,作為原始訓練資料。如果這個資料集是驗證資料集的子集最為理想。為獲得最佳效能,nncf.quantize 函數會使用這個資料集,調整模型的參數。 
  2. 使用 nncf.quantize 量化模型:這個函數會套用可偵測模型的 8 位元量化,降低模型運算和記憶體的要求。 
    注意雖然量化的目標是降低對準確度的影響,模型準確度仍可能略有下降。
  3. 序列化 OpenVINO 工具組 IR 模型:使用 openvino.runtime.serialize 函數,儲存最佳化的模型至磁碟。您之後可以載入序列化的模型用於推斷。 

接著,量化 IR 模型:

import numpy as np import nncf from torch.utils.data import DataLoader from torchvision import datasets from ultralytics.yolo.data import augment from openvino import runtime as ov # create the COCO validation dataset coco_dataset = datasets.CocoDetection("coco/images/val2017", annFile="coco/annotations/instances_val2017.json", ...) # get the loader with batch size 1 det_data_loader = DataLoader(coco_dataset, batch_size=1, shuffle=True) # transform input function def transform_fn(data_item): # skip the label return data_item[0] quantization_dataset = nncf.Dataset(det_data_loader, transform_fn) # load model core = ov.Core() ov_model = core.read_model(ov_model_path) ignored_scope = nncf.IgnoredScope(types=["Multiply", "Subtract", "Sigmoid"], names=["/model.22/dfl/conv/Conv", "/model.22/Add", ...]) # quantize quantized_model = nncf.quantize(ov_model, quantization_dataset, preset=nncf.QuantizationPreset.MIXED, ignored_scope=ignored_scope) # save to disk ov.serialize(quantized_model, str(int8_model_path))

 

步驟 7:執行智慧排隊管理應用程式

開啟 docs 資料夾中的「run-the-application」筆記本。這個筆記本包含詳細的指令,可執行智慧排隊管理應用程式、分析影片串流,以及偵測重點區域(ROI)的顧客人數。 

請以 OpenVINO 格式載入最佳化 YOLO v8 模型,再執行應用程式。若要載入模型,請使用以下程式碼:

# initialize OpenVINO core = ov.Core() # read the model from file model = core.read_model(model_path) # compile the model for latency mode model = core.compile_model(model, device_name="AUTO", config={"PERFORMANCE_HINT": "LATENCY"})

 筆記本說明如何使用預先處理、模型載入、主要處理函數,以及之前探討的預先處理步驟,執行智慧排隊管理應用程式。應用程式會分析影片串流,並顯示所偵測每個隊伍的顧客人數與 ROI。

  • 預先處理:應用程式的第一個步驟是預先處理輸入影片串流。這個流程包括調整影片影格與色彩空間,才符合模型的輸入要求。 
  • 後製:偵測到排隊顧客後,應用程式需要後製結果。後製包括根據可信臨界值與物件類別(例如只注意人),篩選偵測的物件。 
  • 主要處理函數:筆記本的主要處理函數用途是執行應用程式、處理影片串流,以及偵測排隊的顧客。主要處理函數使用載入的 YOLO v8 模型與 OpenVINO 工具組,執行物件偵測和排隊分析。 

在這個應用程式中,使用 zones.json 檔案定義影片串流中的 ROI。這些 ROI 是影片中特定的排隊區域,協助應用程式注意這些區域,但忽略其他區域。檔案包含一系列 JSON 物件,這些 JSON 物件分別是包含唯一 ID 的 ROI、定義多邊行區域的點數組、描述區域的的選用標籤。這個設定檔案是應用程式精確監控影片串流中排隊隊伍的關鍵。 

若要執行應用程式,請使用以下程式碼,設定影片路徑、模型路徑、區域設定檔案路徑與顧客限制: 

video_path = "../sample_video.mp4" # Provide Path to the video file or camera number (0, 1, 2, etc.) model_path = "../model/yolov8m_openvino_int8_model/yolov8m.xml" zones_config_file = "../zones.json" customers_limit = 3

queue_management 是函數。這個函數使用 OpenVINO 工具組執行影片檔案的物件偵測,並根據偵測物件計算每個區域的顧客人數。若要呼叫 queue_management 函數,請使用以下程式碼: 

queue_management(video_path, model_path, zones_config_file, customers_limit)

queue_management 函數需要四個引數:影片檔案的路徑、模型檔案的路徑、包含區域定義的 JSON 檔案路徑,以及指定時間區域的顧客人數上限。這個函數會顯示偵測到物件與區域注解重疊的輸出影片,並傳送警示通知至門市管理(如果有任何區域超出容納人數)。

接著,應用程式會分析影片串流,並偵測每個 ROI 的顧客人數。分析結果會顯示於終端,圖形界面顯示影片串流,以及所偵測每個隊伍的顧客人數與 ROI。若要停止應用程式,請隨時按 qesc。 

您目前已安裝完整功能的智慧排隊管理系統,可用於零售結帳案例,進而改善顧客滿意度、增加銷售額。 

 

步驟 8:使用 Benchmark_App 的效能評測基準

若要評估 YOLO v8 模型最佳化的效用,請使用 OpenVINO 工具組 benchmark_app,提供模型實際效能的見解,方便您規劃部署。 

yolo 第 8 版輸出量模型

使用第 4 代 Intel Xeon 可擴充處理器搭載的第 2023.0.0 版 OpenVINO 工具組,評測出的 YOLO v8m 模型結果:

輸出量:

  • FP16:252 FPS
  • int8:195 FPS

延遲: 

  • FP16:7.94 毫秒
  • int8:10.19 毫秒

這些結果顯示使用 int8 量化(NNCF)可產生最高的 FPS 輸出量。在實際案例中,以門市結帳通道的 1080p 攝影機為例,通常使用的幀率是 30 FPS,所以輸出量是 252 FPS 的 YOLO v8m 模型理論上可以透過第 4 代 Intel Xeon 可擴充處理器,同時處理 8 架攝影機(252/30 = ~8)。

注意這些數字是模型理論的最大值,實際效能可能因各種因素有所不同。建議您以自己的部署環境測試模型,瞭解實際效能。

評測使用第 4 代 Intel Xeon 可擴充處理器進行,提供可有效執行 YOLO v8m 模型的硬體基礎結構。

若要執行評測,請使用以下命令:

!benchmark_app -m $int8_model_det_path -d $device -hint latency -t 30

以您的 int8 模型路徑取代「$int8_model_det_path」,然後以您使用的特定裝置(CPU、GPU等)取代「$device」。這個命令會針對模型執行 30 秒推斷,然後提供模型效能的見解。 

注意這個命令未明確定義輸入資料形式,但使用「-hint latency」選項最佳化模型,實現低延遲。

如需可用選項的綜合概要,以及探索其他命令列選項,請執行「benchmark_app --help」。

結語

您已瞭解如何使用 OpenVINO 建立智慧排隊管理應用程式,使用 YOLO v8 物件偵測計算零售結帳人數。這兩者會提供您即時資料,協助引導顧客排隊並大幅縮短等候時間。

本教學課程使用 OpenVINO 工具組為零售結帳建立智慧排隊管理系統,但物件偵測有無限可能。舉例來説,排隊人潮不僅出現於結帳,而且偵測也不限於人潮。您可以應用本教學課程的核心原理,在之後的應用程式探索新的可能,例如偵測汽車緩解公路的交通堵塞,或者甚至規劃音樂會的觀眾入場路線。

如果您有任何問題或意見,請加入 GitHub*Intel 社群支援頻道的討論。若要進一步瞭解如何使用 OpenVINO 工具組開發,請參閱本文件。 

 

如需更詳細的效能評測資訊,請前往 GitHub