YOLOV3实现越界检测——智能安防
目录
应用前景
1. 安全监控系统
2. 家庭安防系统
3. 无人机监控
4. 交通管理
5. 无人驾驶技术
6. 大型活动现场
代码说明
1. YOLO 模型加载
2. 摄像头视频流捕获
3. 安全区域绘制
4. YOLOv3 目标检测
5. 过滤和标记人类目标
6. 入侵检测
7. 结果显示和退出
总结
整体代码
效果展示
应用前景
越界检测系统具有广泛的应用前景,尤其是在安全监控和自动化系统中。通过引入自定义的安全区域以及实时目标检测技术,系统可以在摄像头或无人机等设备上得到有效应用。以下是一些可能的应用场景及其前景:
1. 安全监控系统
- 应用场景:在工厂、仓库、停车场或其他重要区域内安装固定摄像头,用于监控特定的边界或区域。通过识别进入特定安全区的人,能够有效防止未经授权人员入侵或进入危险区域。
- 前景:相比于传统的摄像头监控系统,使用这种越界检测技术可以大大提升安全性。系统可以自动识别和告警,无需人为时刻监控。对高风险区域的自动监控,例如建筑工地和化工厂,这类系统能够防止工人意外进入危险区域,从而减少事故发生的可能性。
2. 家庭安防系统
- 应用场景:在住宅区内,通过摄像头实时监控门口或后院的活动。如果检测到有人进入设定的安全区域,系统可以发出警报,或者自动触发与智能家居系统联动的措施(如锁门、开灯等)。
- 前景:随着智能家居的普及,越来越多的家庭开始采用自动化的安防解决方案。这样的系统能够提供更为主动的安全保障,减少误报率,精准检测潜在威胁。此外,通过与手机端App或云端服务的结合,家庭成员可以随时远程监控家中状况,进一步提升安全感。
3. 无人机监控
- 应用场景:无人机在特定任务中,比如边境巡逻、森林火灾预防、农业监控等领域,能够实时巡逻和检测人员入侵特定区域。当无人机配备此类目标检测和越界检测功能时,能在广阔的视野中检测到非法入侵者并发出预警。
- 前景:随着无人机技术的进步,这种实时目标检测技术可以大幅度提升无人机的智能化程度,减少人工操作的负担。例如,在边境安全监控中,无人机可以自动检测非法入境者,并向控制中心实时传输信息;在农业中,系统可以帮助检测人员是否进入某些农田或设施区域,避免破坏。
4. 交通管理
- 应用场景:通过安装在街道、地铁站、机场或其他人流密集区域的摄像头,系统可以自动监控是否有行人进入危险区域,如高速公路、铁轨、或其他禁止通行区域。
- 前景:这种系统可以与城市的智能交通系统结合,自动识别危险行为或意外事件,及时通知交通管理人员,甚至自动触发警示灯、声音警报等。它能够在无人看守的区域提供全天候的监控服务,大幅提升城市公共安全。
5. 无人驾驶技术
- 应用场景:在无人驾驶车辆或自动化设备中,配备该类越界检测系统可以有效识别出是否有行人或其他物体进入车辆或设备的“安全区”,从而及时采取措施避免碰撞。
- 前景:该系统可以作为无人驾驶车载安全系统的一部分,增加设备的智能化水平,增强对复杂交通环境的应对能力。在仓储机器人中,这类系统还可以防止工人误入自动化工作区域,提升整体工作环境的安全性。
6. 大型活动现场
- 应用场景:在体育赛事、音乐会等大型活动场所,越界检测系统可以帮助监控观众区域和后台等特殊区域,防止非授权人员进入关键区域,保障活动的有序进行。
- 前景:这种应用可以有效地减少在大型人群活动中的混乱情况,增强活动的安全保障。同时,在紧急情况下,系统还可以帮助识别逃生通道上的异常情况,帮助安全人员迅速响应。
代码说明
这段代码的核心功能是使用 YOLOv3 模型进行实时的人类检测,并且在程序运行时让用户手动绘制一个安全区域矩形,检测是否有人进入这个区域。如果有人进入,程序会发出入侵警告,并将检测到的人用红色边框标记。以下是代码的详细实现思路:
1. YOLO 模型加载
- 使用
cv2.dnn.readNet
函数加载 YOLOv3 的权重文件和配置文件:net = cv2.dnn.readNet('../../needFiles/yolov3.weights', '../../needFiles/yolov3.cfg')
- 通过
net.getLayerNames()
获取网络的层名称,并得到模型的输出层,这些输出层将用于检测物体。 - 加载 COCO 数据集中的类别标签,程序只识别“person”类别,通过
classes.index("person")
得到人的类别索引。
2. 摄像头视频流捕获
- 使用
cv2.VideoCapture(0)
从摄像头捕获视频流。 - 该视频流会作为输入,逐帧传递给 YOLO 模型进行处理。
3. 安全区域绘制
- 通过 OpenCV 的
cv2.setMouseCallback
绑定鼠标事件,让用户手动框选一个矩形作为安全区域。def draw_rectangle(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: # 开始绘制,存储起点 drawing = True safety_zone = [(x, y)] elif event == cv2.EVENT_MOUSEMOVE and drawing: # 鼠标移动时,实时更新矩形 cv2.rectangle(img_copy, safety_zone[0], (x, y), (255, 0, 0), 2) elif event == cv2.EVENT_LBUTTONUP: # 绘制结束,存储矩形的结束点 drawing = False safety_zone.append((x, y))
- 这段代码中,用户通过拖动鼠标框选一个矩形区域,程序会在绘制完成后将该区域保存到
safety_zone
中。
4. YOLOv3 目标检测
- 对每一帧图像进行预处理,使用
cv2.dnn.blobFromImage
函数将图像转换为 YOLOv3 模型输入所需的格式。转换后的数据会被传入网络:blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False) net.setInput(blob) outs = net.forward(output_layers)
- YOLOv3 模型会输出检测结果,其中包括物体的类别、置信度、边界框信息等。
5. 过滤和标记人类目标
- 对每个检测结果,根据置信度阈值和类别筛选出“person”类别的检测框:
if class_id == person_label_index and confidence > 0.5: # 提取人类目标的边界框坐标和尺寸 center_x = int(detection[0] * width) center_y = int(detection[1] * height) w = int(detection[2] * width) h = int(detection[3] * height) x = int(center_x - w / 2) y = int(center_y - h / 2)
- 通过筛选出的边界框坐标、宽度和高度,程序可以绘制出每个人的矩形框。
6. 入侵检测
- 在检测到每个人的中心点后,程序会判断这个中心点是否位于用户绘制的安全区域内:
if safety_zone[0][0] < center_x < safety_zone[1][0] and safety_zone[0][1] < center_y < safety_zone[1][1]: color = (0, 0, 255) # 红色框表示入侵 cv2.putText(frame, "Intrusion Detected", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
- 如果中心点在安全区域内,说明有入侵行为,程序会用红色框标记入侵的目标,并显示“Intrusion Detected”警告。
7. 结果显示和退出
- 每一帧的处理结果会通过
cv2.imshow
显示出来。用户可以通过按下q
键退出程序。
cv2.imshow("Boundary Detection", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
总结
- 实现了一个简单的越界检测系统,使用 YOLOv3 模型检测视频中的人类,并且可以让用户手动定义一个安全区域。如果检测到有人进入该区域,系统会发出警告。
整体代码
import cv2
import numpy as np
# 加载 YOLO 模型
net = cv2.dnn.readNet('../../needFiles/yolov3.weights', '../../needFiles/yolov3.cfg')
layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]
# 加载类标签,只识别人
with open('../../needFiles/coco.names', 'r') as f:
classes = [line.strip() for line in f.readlines()]
# 只识别人类,类别索引是 0
person_label_index = classes.index("person")
# 设置视频源
cap = cv2.VideoCapture(0) # 使用摄像头或视频文件
# 定义一个全局变量来存储安全区域
safety_zone = None
drawing = False # 标志是否正在绘制安全区域
# 定义鼠标事件函数,用于选择安全区域
def draw_rectangle(event, x, y, flags, param):
global safety_zone, drawing
if event == cv2.EVENT_LBUTTONDOWN: # 开始绘制
drawing = True
safety_zone = [(x, y)] # 存储矩形的起始点
elif event == cv2.EVENT_MOUSEMOVE and drawing: # 鼠标移动,实时更新矩形
img_copy = frame.copy()
cv2.rectangle(img_copy, safety_zone[0], (x, y), (255, 0, 0), 2)
cv2.imshow('Draw Safety Zone', img_copy)
elif event == cv2.EVENT_LBUTTONUP: # 完成绘制
drawing = False
safety_zone.append((x, y)) # 存储矩形的结束点
# 创建窗口并绑定鼠标事件,用于绘制安全区域
cv2.namedWindow('Draw Safety Zone')
cv2.setMouseCallback('Draw Safety Zone', draw_rectangle)
# 获取用户手动框选的安全区域
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow('Draw Safety Zone', frame)
if safety_zone and len(safety_zone) == 2:
break # 已绘制完成
if cv2.waitKey(1) & 0xFF == ord('q'): # 按 'q' 键退出
break
cv2.destroyWindow('Draw Safety Zone')
# 开始处理视频帧,进行人类检测和区域入侵检测
while True:
ret, frame = cap.read()
if not ret:
break
height, width, channels = frame.shape
blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)
outs = net.forward(output_layers)
class_ids = []
confidences = []
boxes = []
for out in outs:
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if class_id == person_label_index and confidence > 0.5: # 只识别人类
center_x = int(detection[0] * width)
center_y = int(detection[1] * height)
w = int(detection[2] * width)
h = int(detection[3] * height)
x = int(center_x - w / 2)
y = int(center_y - h / 2)
boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)
# 非极大值抑制
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
# 绘制安全区域
cv2.rectangle(frame, safety_zone[0], safety_zone[1], (255, 0, 0), 2)
# 遍历检测结果
for i in indexes.flatten():
x, y, w, h = boxes[i]
label = str(classes[class_ids[i]])
color = (0, 255, 0) # 绿色框
# 计算物体的中心点
center_x = x + w // 2
center_y = y + h // 2
# 判断中心点是否进入安全区域
if safety_zone[0][0] < center_x < safety_zone[1][0] and safety_zone[0][1] < center_y < safety_zone[1][1]:
color = (0, 0, 255) # 红色框表示入侵
cv2.putText(frame, "Intrusion Detected", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# 画出物体边界框和标签
cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
cv2.putText(frame, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)
# 显示处理结果
cv2.imshow("Boundary Detection", frame)
# 按 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
效果展示
YOLOV3 安防警告,边界检测
哈哈哈哈哈哈哈哈哈,后面误入帅锅了