在工业环境中,确保工人的安全是至关重要的。一种有效的方法是通过创建一个计算机视觉系统来识别“红区”,即重型机械频繁移动的区域,工人在这些区域需要格外小心。本教程将指导完成构建红区检测系统的过程。完成本指南后,将拥有一个可以实时识别并突出显示危险区域的工作模型。
首先,注册并创建一个Roboflow账户。然后,进入工作区并创建一个项目,自定义项目名称和注释组。确保选择的是目标检测项目。接下来,添加图像。使用的图像来自这个YouTube视频。可以将YouTube URL输入到Roboflow中,以快速创建数据集。然后,添加希望模型检测的类别。接下来,开始对数据集进行注释。建议在训练第一个模型之前至少获得50张注释图像。使用Roboflow中的边界框功能绘制注释,并为每张图像重复此步骤。最后,生成一个标记图像的数据集版本。每个版本都是唯一的,并且与训练的模型相关联,因此可以迭代进行增强和数据实验。
使用Roboflow的多边形区域创建器,可以创建一个工人应该警惕重型机械的红区。将点保存在一个名为“zone”的变量中。
完成模型构建的所有先决条件后,可以开始编码应用程序。首先,下载所需的库。
!pip install roboflow pillow supervision numpy inference
接下来,导入库。
import supervision as sv
import cv2
from typing import Union, List, Optional
from inference.core.interfaces.camera.entities import VideoFrame
from inference import InferencePipeline
from google.colab.patches import cv2_imshow
from datetime import datetime
import numpy as np
zone = np.array([[661, 1638],[1005, 2142],[1649, 1822],[1281, 1342],[665, 1638]])
在这部分,将编写代码来处理预测结果,并在图像上添加不同的注释。
COLOR_ANNOTATOR = sv.ColorAnnotator()
LABEL_ANNOTATOR = sv.LabelAnnotator()
def on_prediction(
predictions: Union[dict, List[Optional[dict]]],
video_frame: Union[VideoFrame, List[Optional[VideoFrame]]],
) -> None:
global zone
if not isinstance(predictions, list):
predictions = [predictions]
video_frame = [video_frame]
for prediction, frame in zip(predictions, video_frame):
if prediction is None:
continue
# SOME PROCESSING
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,
)
polyzone = sv.PolygonZone(
polygon=zone,
)
label = "Clear"
zone_presence = polyzone.trigger(detections)
for presence in zone_presence:
if presence:
label = "Occupied"
print("NOT SAFE")
zone_annotated = sv.PolygonZoneAnnotator(
zone=polyzone,
color=sv.Color.RED,
thickness=5,
)
annotated_frame = zone_annotated.annotate(
scene=annotated_frame,
label=label
)
start_point = (2450, 0)
end_point = (2900, 300)
cv2.rectangle(annotated_frame, start_point, end_point, (255, 255, 255), cv2.FILLED)
text = label
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 3
font_color = (0, 0, 255)
line_type = 5
center_x = (start_point[0] + end_point[0]) // 2
center_y = (start_point[1] + end_point[1]) // 2
# Get the text size
(text_width, text_height), baseline = cv2.getTextSize(text, font, font_scale, line_type)
# Calculate the bottom-left corner of the text to center it
text_x = center_x - text_width // 2
text_y = center_y + text_height // 2
# Add the text
cv2.putText(annotated_frame, text, (text_x, text_y), font, font_scale, font_color, line_type)
cv2.imshow("frame", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
现在,可以将所有部分整合在一起,创建一个可以实时检测工人是否安全以及他们是否处于红区的模型。
pipeline = InferencePipeline.init(
video_reference="VIDEO_PATH",
model_id="PATH_TO_MODEL",
max_fps = 30,
confidence=0.8,
api_key="YOUR_API_KEY",
on_prediction=on_prediction,
)
pipeline.start()
确保使用的是用于模型的数据源相同的视频。现在,能够根据工人的位置判断他们是否安全,以及他们是否处于红区。
通过遵循这些步骤,可以创建一个强大的红区检测模型,通过识别危险区域来增强工人的安全。本指南已经带了解了如何使用Roboflow设置模型,定义红区,并将检测系统集成到实时视频流中。