使用YOLO11进行驾驶疲劳检测及警报的实战教程
创作时间:
作者:
@小白创作中心
使用YOLO11进行驾驶疲劳检测及警报的实战教程
引用
CSDN
1.
https://blog.csdn.net/qq_42589613/article/details/143956447
本文将研究如何在OpenCV中使用YOLO11对象检测模型来检测视频中的眼睛闭合,并在眼睛闭合超过指定阈值时发出警告。我们还将讨论应用这种方法进行实时检测的可能性。
眼睛闭合检测在许多现实应用中是一个重要的用例,从监测驾驶员疲劳到确保在关键环境中的警觉性。
环境配置
在我们开始之前,请确保您安装了以下库:
- OpenCV:用于视频处理和显示结果。
- Ultralytics YOLO:一种流行且高效的深度学习模型,用于对象检测。
要安装必要的库,可以运行:
pip install opencv-python
pip install ultralytics
闭眼检测基本步骤
- 加载YOLO模型:我们加载一个预先训练好的YOLO模型(
best.pt)进行眼睛检测。这个模型被训练成识别两种状态:“闭”和“开”的眼睛。 - 读取输入视频:使用OpenCV逐帧读取视频。
- 执行对象检测:YOLO用于检测每帧中眼睛的状态,是闭合还是睁开的状态。
- 跟踪眼睛闭合持续时间:如果检测到眼睛“闭合”超过指定阈值,则显示警告。
- 显示结果:结果将写入输出视频文件,如果需要,警告消息将覆盖在帧上。
完整代码
下面是使用YOLO11和OpenCV检测视频中眼睛闭合的完整Python代码:
import cv2
from ultralytics import YOLO
# 加载预训练的YOLO模型
model = YOLO("best.pt")
names = model.names
# 打开视频文件
cap = cv2.VideoCapture("video.mp4")
assert cap.isOpened(), "读取视频文件出错"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
# 初始化视频写入器以保存输出
video_writer = cv2.VideoWriter("output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
# 初始化用于检测眼睛闭合的变量
eye_closed_frames = 0
eye_closed_threshold_seconds = 1 # 阈值(秒)
eye_closed_threshold_frames = eye_closed_threshold_seconds * fps # 将秒转换为帧数
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("视频帧为空或视频处理已成功完成。")
break
# 使用YOLO预测眼睛状态
results = model.predict(im0, show=False)
boxes = results[0].boxes.xyxy.cpu().tolist()
clss = results[0].boxes.cls.cpu().tolist()
annotator = Annotator(im0, line_width=2, example=names)
eye_closed = False # 标记当前帧中眼睛是否闭合
if boxes is not None:
for box, cls in zip(boxes, clss):
clsName = names[int(cls)]
xmax = int(box[0])
ymin = int(box[1])
xmin = int(box[2])
ymax = int(box[3])
# 根据类别名称设置颜色
if clsName == 'closed':
clr = (0, 0, 255)
eye_closed = True # 标记眼睛为闭合
elif clsName == 'opened':
clr = (0, 255, 0)
# 绘制边界框和标签
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1
font_thickness = 2
tw, th = cv2.getTextSize(clsName, font, font_scale, font_thickness)[0]
cv2.rectangle(im0, (xmin, ymin), (xmax, ymax), color=clr, thickness=2)
cv2.putText(im0, clsName, (xmax, ymin - 5), font, font_scale, color=clr, thickness=font_thickness)
# 检查眼睛闭合持续时间
if eye_closed:
eye_closed_frames += 1
else:
# 如果眼睛未闭合,重置计数器
eye_closed_frames = 0
# 如果眼睛闭合时间超过阈值,显示警告
if eye_closed_frames > eye_closed_threshold_frames:
print("警告:眼睛闭合时间超过2秒!")
cv2.putText(im0, "警告:眼睛闭合时间超过2秒!", (50, 50), font, font_scale, (0, 0, 255), font_thickness)
# 将处理后的帧写入输出视频
video_writer.write(im0)
# 释放资源
cap.release()
video_writer.release()
代码详细解释
模型加载:
- 使用来自
ultralytics库的YOLO类加载YOLO模型,并提取类名。
视频处理:
- 使用
cv2.VideoCapture打开输入视频,并初始化视频编写器以保存输出。
逐帧检测:
- 视频是逐帧处理的。对于每一帧,YOLO模型用于检测眼睛并将其分类为“闭合”或“打开”。
闭眼检测:
- 计数器(
eye_closed_frames)跟踪眼睛被检测为“闭合”的连续帧的数量。“如果此计数超过阈值(在本例中为1秒的帧),则会显示警告消息。
警告消息显示:
- 每当眼睛已经闭合超过阈值持续时间时,警告消息被动态地覆盖在视频上。
摄像头实时检测
上面演示的方法可以适用于使用网络摄像头或实时视频源的实时检测。以下是您如何实现这一点:
- 捕获实时视频:通过将
cv2.VideoCapture参数更改为0(默认网络摄像头),将视频文件输入替换为实时视频源。
cap = cv2.VideoCapture(0) # Use 0 for the default camera, or 1, 2, etc. for other cameras
优化实时性能:
- 为了确保流畅的实时性能,您可能需要通过使用较小的模型(如YOLO11n)或在GPU上运行(如果可用)来优化模型推理速度。
实时显示结果:
- 使用
cv2.imshow()实时显示视频源:
cv2.imshow("Eye Closure Detection", im0)
if cv2.waitKey(1) & 0xFF == ord('q'): # Press 'q' to quit
break
通过YOLO和OpenCV的结合,您可以在视频中甚至实时有效地检测眼睛闭合。该技术具有许多实际应用,包括驾驶员监控系统,疲劳检测和各种安全关键领域的警觉性验证。通过利用像YOLO这样的深度学习模型,您可以在检测眼睛闭合等细微面部表情时实现高准确性和性能。
热门推荐
滕州古城墙:2000年沧桑见证,从军事防御到文化地标
滕州陶山公园:秋色正浓,范蠡左丘明遗迹犹存
现代女性的情绪管理:从压力到自我成长
幸福爱情如何改变女性性格?
武则天登基:开创中国历史上独一无二的女皇时代
玩转无锡必打卡三景:鼋头渚、南长街、惠山古镇两日游全攻略
兴化烫干丝:一碗干丝里的千年古城味道
陈老大梅花糕海棠糕:苏州百年老字号的甜蜜传承
手机壳挑选攻略:从需求到选购全解析
深圳宝安燕罗街道开展网格员心理健康培训,提供30种解压方法
朱玉洁:24小时在线的网格员,筑牢社区防疫屏障
静海区探索“全科网格”新模式,网格员成社区和谐守护者
人参副作用竟伤心血管?
秋冬咳嗽必备:南杏枇杷叶炖鲫鱼
秋冬咳嗽怎么办?中医教你喝鲫鱼汤
咳嗽时喝鲫鱼汤真的有用吗?
免疫疾病患者如何应对肺囊虫病带来的心理压力
从刘谦案例看肺结节定期随访:及时发现早期肺癌
红旗16FE:中国中程防空导弹的突破与创新
红旗16防空导弹珠海航展亮相:技术升级与出口潜力双突破
嵌入式燃气灶安装指南:5步安装+安全使用要点
高考数学焦虑?学霸教你这样调整心态
冰箱的起源与发展
五一错峰度假首选:3.1亿打造的微山岛栖凤园,250元起享湖景生态民宿
吉大一院举办音乐养心之旅:淡忧伤歌曲助力心理疗愈
立体画派:西方现代艺术的重要流派
既有前景,又有钱景的小众宝藏硕士——艺术疗愈
超现实主义的诞生:马格利特、米罗、恩斯特等大师的杰作展
滕州微山湖红荷湿地:万亩荷花与多元体验成就“江北第一”
海上风电:从技术到政府监管的全方位解析