实时人体检测与区域监控模型

在确保遵循所有安全规则和法规的前提下,计算机视觉技术的一个潜在应用是识别何时有人进入受限区域。这可以用于监控区域的进入情况,并统计区域内的人数,以确保区域不会过于拥挤。本教程将介绍如何创建自己的实时人体检测模型,并向系统添加区域监控功能。

步骤概述

要构建此应用程序,将遵循以下步骤:

  • 训练人体检测模型
  • 安装并导入库
  • 从参考图像中定义感兴趣的区域
  • 定义颜色注释器
  • 编写逻辑以监控区域内的人员
  • 测试程序

创建模型

首先,创建一个免费的Roboflow账户。然后,点击“创建项目”以创建一个新项目。为项目设置一个名称,并选择“对象检测”项目类型。接下来,添加图像。使用的图像可以通过此链接下载。确保下载数据集并将文件保存在某个位置。将下载的图像添加到数据集中并继续。然后,添加希望模型检测的类别。对于用例,只需要一个类别:人。现在已经拥有注释和图像,可以生成标记图像的数据集版本。每个版本都是唯一的,并与训练模型相关联,因此可以迭代增强和数据实验。

安装并导入库

首先,安装所需的库。为此,需要运行以下代码:

!pip install supervision inference

接下来,创建一个新的Python文件,并将以下库导入到脚本中:

import supervision as sv import cv2 from typing import Union, List, Optional from inference.core.interfaces.camera.entities import VideoFrame from inference import InferencePipeline import numpy as np

从图像创建区域

要跟踪人员何时进入和退出区域,需要确切定义想要跟踪的区域。使用多边形区域,可以通过拖放图像并创建首选的区域。打开多边形区域,将想要使用的图像拖入编辑器,然后单击绘制围绕想要跟踪的区域的多边形:将NumPy点复制到程序中:

zone = np.array( [ [426, 228], [358, 393], [367, 434], [392, 464], [427, 486], [479, 492], [533, 504], [895, 511], [872, 243], [429, 226], ] )

为了显示模型预测的位置,需要使用注释器。Supervision是一个全面的计算机视觉库,它具有展示人类所需的确切注释工具。使用Supervision,可以通过以下代码片段向项目添加检测功能。

COLOR_ANNOTATOR = sv.ColorAnnotator() LABEL_ANNOTATOR = sv.LabelAnnotator()

创建区域逻辑

现在准备定义逻辑以跟踪人员何时进入和退出区域。为此,将使用Supervision中的多边形区域功能,这是一个开源的Python包,用于处理计算机视觉模型的实用工具。这是需要的代码:

def zone_logic(zone, detections, frame): polyzone = sv.PolygonZone( polygon=zone, ) zone_annotated = sv.PolygonZoneAnnotator( zone=polyzone, color=sv.Color.RED, thickness=5, ) people_in_box = 0 zone_presence = polyzone.trigger(detections) zone_present_idxs = [idx for idx, present in enumerate(zone_presence) if present] for detection in zone_present_idxs: people_in_box += 1 annotated_frame = zone_annotated.annotate( scene=frame, label=f"People inside Zone: {people_in_box}" )

现在,可以开始创建计数背后的逻辑。首先,将盒子中的人数设置为0。接下来,触发zone_presence,它将检测区域内有多少被检测到的人类。使用这个数字,使用一个简单的for循环来增加people_in_the_box变量。最后,使用Supervision中的区域注释器来显示区域内有多少人。

定义运行模型的函数

最后,需要定义一个函数,让可以使用模型运行推理。这个函数应该接受一个字典作为预测(Roboflow模型的格式)和一个VideoFrame作为视频帧。这是需要的代码:

def on_prediction( predictions: Union[dict, List[Optional[dict]]], video_frame: Union[VideoFrame, List[Optional[VideoFrame]]], ) -> None: for prediction, frame in zip(predictions, video_frame): if prediction is None: continue image = frame.image detections = sv.Detections.from_inference(prediction) annotated_frame = image annotated_frame = COLOR_ANNOTATOR.annotate( scene=annotated_frame, detections=detections ) annotated_frame = LABEL_ANNOTATOR.annotate( scene=annotated_frame, detections=detections, ) zone_logic(zone, detections, annotated_frame) cv2.imshow("frame", annotated_frame) if cv2.waitKey(1) & 0xFF == ord("q"): Break

在这个函数中,循环遍历每个预测并获取帧。获取图像后,可以使用预测中的检测来注释图像。使用先前定义的颜色和标签注释器来实现这一点。接下来,调用区域逻辑函数并显示注释帧。最后,通过调用在Roboflow上制作的模型将所有内容连接在一起。使用以下代码片段调用代码。确保用自己的信息替换必要的信息。

pipeline = InferencePipeline.init( video_reference="VIDEO", model_id="MODEL_ID", max_fps = 60, confidence=CONFIDENCE, api_key="API_KEY", on_prediction=on_prediction, ) pipeline.start()
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485