在确保遵循所有安全规则和法规的前提下,计算机视觉技术的一个潜在应用是识别何时有人进入受限区域。这可以用于监控区域的进入情况,并统计区域内的人数,以确保区域不会过于拥挤。本教程将介绍如何创建自己的实时人体检测模型,并向系统添加区域监控功能。
要构建此应用程序,将遵循以下步骤:
首先,创建一个免费的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()