概述
本教程说明如何使用 OpenVINO™ 工具套件和 Ultralytics YOLOv8,再结合 Jupyter* Notebook 来构建用于零售结算的智能队列管理系统。查看实际基准测试数据,并能够按照自己的设置执行真实世界基准测试。
通过深度学习和计算机视觉进行对象检测,企业可以实时了解其运营情况,并提高效率和客户满意度。OpenVINO™ 工具套件可帮助您摆脱在部署时经常面临的限制,例如增加同一系统上可用摄像头的数量。OpenVINO™ 工具套件可最大限度缩短处理输入数据以输出预测所需的时间,允许您处理更多数据帧并加快决策速度。
此应用专门针对当今快节奏的零售环境而设计,在此环境中,客户满意度才是王道。该应用会检测队列中的客户数量,并提供实时分析数据。利用这些数据,店铺可以重新安排客户线路,最大限度地减少排队和等待时间,员工可以适当简化结算流程,从而提高客户满意度。
此外,还可以应用该解决方案来处理任何需要对象检测、对象计数和决策的问题。
必备条件
- 在系统上安装 python* 3.8 或更高版本。
- 在系统上安装 Git。
- 在系统上连接网络摄像头或 IP 摄像头。
- 符合 OpenVINO™ 工具套件系统要求的受支持硬件。
注意:本教程在英特尔® 酷睿™ 处理器、英特尔凌动® 处理器(原代号为 Alder Lake)、第四代英特尔® 至强® 可扩展处理器(原代号为 Sapphire Rapids)和英特尔® 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_notebook 文件夹,然后下载示例视频。接下来,导航到该文件夹:
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
如果采用搭载英特尔® 集成显卡的 CPU,要在此设备上启用推理,请安装英特尔® Graphics Compute Runtime for oneAPI Level Zero and OpenCL™ Driver。用于 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
这会激活虚拟环境,并更改 Shell 提示符,以表明这一点。
第 3 步:安装所需组件
智能队列管理应用具有许多依赖项,必须安装这些依赖项才能运行该应用。包含的需求文件中列出了这些依赖项,可以使用 Python 程序包安装程序进行安装。
要安装所需 Python 库,包括 OpenVINO™ 工具套件和 YOLOv8,请使用以下命令:
python -m pip install --upgrade pip pip install -r requirements.txt
现在已安装所有依赖项和所需组件。接下来,在运行应用之前,请先优化和转换模型。
第 4 步:启动 Jupyter* Notebook
除 Jupyter Notebook 以外,存储库中还包括脚本,以方便进行生产部署。这些脚本包含与笔记本相同的代码,便于您直接从命令行转换模型并运行智能队列管理应用,在生产环境中自动运行并扩展 AI 解决方案时,这样做特别有用。
本教程使用了 Jupyter Notebook。
在转换并优化 YOLOv8 模型之前,要启动 JupyterLab,请在 intelligent_queue_management 笔记本中运行以下命令:
jupyter lab docs
JupyterLab 会打开包含笔记本的文档目录。
第 5 步:转换并优化模型
打开 docs 文件夹中的 convert-and-optimize-the-model 笔记本。该笔记本包含下载并转换 YOLOv8 模型的详细说明。这会准备模型以便与 OpenVINO™ 工具套件一起使用。
以下笔记本代码片段演示了如何使用导出方法转换模型:
# export model to OpenVINO format out_dir = det_model.export(format="openvino", dynamic=False, half=True)
- det_model 代表 YOLOv8 目标检测模型。
- format 设置为 openvino,以按 OpenVINO 格式导出模型。
- dynamic 参数设置为 False,表示正以固定输入大小导出模型(即静态模型)。静态模型不允许在运行不同推理期间更改输入张量的维度。
- half 设置为 True,以对模型权重使用半精度浮点格式 (FP16)。
这会将 YOLOv8 模型转换为 OpenVINO 中间表示文件 (IR) 格式,便于您利用该工具套件的功能来优化模型,并在各种硬件平台上实现更出色的性能。IR 格式是 OpenVINO 用于表示深度学习模型的常用格式,可帮助跨不同硬件平台进行高效推理。
第 6 步:使用 NNCF 训练后量化 API 优化模型
在运行智能队列管理应用之前,您需要使用神经网络压缩框架 (NNCF) 来优化模型,该架构是一个提供高级算法的工具,可用于在 OpenVINO™ 工具套件中以最小精度下降优化神经网络。
本教程使用 NNCF 8 位训练后量化,它可在无需微调管道的情况下进行模型优化。这将应用于您的 YOLOv8 模型,如下所示:
- 加载数据集进行量化:要对模型进行高效量化,您需要来自与原始训练数据相同的域中的代表性数据集。理想情况下,它应该是验证数据集的子集。nncf.quantize 函数使用此数据集来调整模型参数,以实现最佳性能。
- 使用 nncf.quantize 对模型进行量化:此函数会对检测模型应用 8 位量化,这降低了模型的计算和内存要求。
注意:虽然量化的目标是最大限度地降低精度影响,但模型精度可能会出现轻微下降。 - 对 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 格式加载经优化的 YOLOv8 模型。要加载模型,请使用以下代码:
# 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 和每个队列中的客户数量。
- 预处理:应用中执行的第一个步骤是对输入视频流进行预处理。该过程包括调整视频帧的大小和颜色空间,以符合模型的输入要求。
- 后处理:检测队列中的客户数量后,应用需要对结果进行后处理。这包括根据置信度阈值和目标类别来过滤检测到的目标,例如仅突出显示人员。
- 主要处理函数:该笔记本中的主要处理函数负责运行应用、处理视频流,以及检测队列中的客户数量。该函数使用加载的 YOLOv8 模型和 OpenVINO™ 工具套件来执行对象检测和队列分析。
在此应用中,zones.json 文件用于定义视频流中的 ROI。这些 ROI 代表视频中的特定队列区域,有助于应用重点关注它们,而忽略其他区域。该文件包含一个 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 和每个队列中的客户数量。要停止该应用,请随时按 q 键或 esc 键。
现在,您拥有了功能齐全的智能队列管理系统,可将其用于零售结算场景,以提高客户满意度并增加销售额。
第 8 步:使用 Benchmark_App 进行性能基准测试
要评估 YOLOv8 模型优化的效率,请使用 OpenVINO™ 工具套件 benchmark_app,它可帮助深入了解模型的真实世界性能,并允许您规划部署。
在第四代英特尔® 至强® 可扩展处理器上使用 OpenVINO™ 工具套件版本 2023.0.0 对 YOLOv8m 模型进行基准测试的结果如下:
吞吐量:
- FP16:252 FPS
- int8:195 FPS
延迟:
- FP16:7.94 毫秒
- int8:10.19 毫秒
这些结果表明,就帧率 (FPS) 而言,使用 int8 量化 (NNCF) 得到的吞吐量最高。在商店结算通道等实际场景中,1080p 摄像头通常采用 30 FPS 的帧率,在第四代英特尔至强可扩展处理器上,吞吐量为 252 FPS 的 YOLOv8m 模型理论上可同时处理约 8 个摄像头(252/30 约等于 8)。
注意:这些数字代表模型理论上可实现的最佳性能,实际性能可能因各种因素而异。建议您在自己的部署环境中测试模型,以了解其真实世界性能。
基准测试在第四代英特尔® 至强® 可扩展处理器上进行,该处理器为高效运行 YOLOv8m 模型提供了硬件基础设施。
要运行基准测试,请使用以下命令:
!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 来创建使用 YOLOv8 目标检测的智能队列管理应用,以在零售结算时统计人数。这为您提供了实时数据,以重新安排客户队列,并最大限度地缩短等待时间。
虽然本教程使用 OpenVINO™ 工具套件为零售结算创建智能队列管理系统,但目标检测也具有巨大潜力。例如,在除结算以外的情况下,也可能需要排队,而且,您不仅限于检测人员。在构建下一个应用时,您可以应用本教程中阐述的核心原则来实现新的可能,如检测车辆以缓解公路交流拥堵,或是在音乐会场地为观众安排路线。
如有任何问题或想要发表意见,请加入 GitHub* 或英特尔社区支持频道上的讨论。欲了解使用 OpenVINO™ 工具套件进行开发的更多信息,请参阅此文档。
有关性能基准测试的更多详细信息,请访问 GitHub。