基于YOLO与 Depth-Anything的游泳馆溺水检测与报警系统 (作者:陈雨希 学校:上海市彭浦初级中学)

来源于:知识就是力量
发布时间:2025-10-17 15:40:06
    小字号

基于YOLO与 Depth-Anything的游泳馆溺水检测与报警系统

作者:陈雨希    学校:上海市彭浦初级中学 

摘要:随着溺水事故成为全球范围内青少年意外死亡的主因之一,游泳馆溺水事件监测与报警技术需求日益迫切。本文提出了一种基于YOLO和Depth-Anything的溺水检测与报警系统。该系统利用高清摄像头与开源技术,包括MediaPipe姿态检测和Depth-Anything深度估算,实现实时溺水检测、位置判定及报警功能。具体而言,系统通过YOLO模型与关键点运动速率、加速度及倾斜角度分析识别溺水行为,并利用Depth-Anything模型估算溺水人员的深度信息,结合多摄像头布局快速定位溺水区域。硬件方面设计了一款基于ESP32的提醒装置,集成蜂鸣器、LED显示屏和彩色灯,提供声光报警,同时通过阿里云短信服务向相关负责人发送警报。本系统具有较多优势。首先,实现了低成本构建,适应复杂水下环境的检测能力,以及模块化设计的可扩展性。通过将多种开源软硬件技术结合,在保证实时性和精确性的同时,简化了安装与维护过程,具有广阔应用前景。实验表明,系统可显著提升游泳馆溺水风险预警效率,为公共场所安全管理提供技术支持。
关键词:溺水检测;YOLO模型;深度估算;ESP32单片机;实时报警系统 

1.课题背景
        近年来,溺水事故像一个无情的阴影,笼罩在全球各地,尤其是儿童和青少年对象,已成为意外伤亡的“头号杀手”之一。你知道吗?据世界卫生组织(WHO)的权威数据,每年竟有超过37万人因为溺水死亡。令人遗憾的是,我国每年有超过5万名青少年因溺水而亡。这些悲剧大多发生在救生措施不及时的游泳池。2020年7月,江苏苏州一游泳馆内,一名10岁男孩在浅水区滑入深水区溺亡,尽管有救生员在场,但因人多混乱未能及时发现。2021年8月,广东深圳一五星级酒店泳池内,一名9岁男童溺水昏迷,及时获救后脱险。类似事件也发生在湖北武汉和北京。2019年6月,武汉一名12岁男孩在深水区溺亡,尽管救生员及时救援仍未能挽回生命。2018年8月,北京朝阳区一游泳馆的8岁女孩因救生员分心未及时获救,虽脱险但需长期治疗。这些事件促使社会对游泳场所安全管理提出更高要求。
        因此,作为初中生的我开始了现有场馆溺水救治设施与设备的研究。我发现当前溺水救治机制完全不足以满足需求。尽管场所已采取多种安全措施,如设置救生员、安装监控设备等,但溺水事故的发生率仍较高。其中一个重要原因是传统监控手段难以应对大规模的游泳人群和复杂的水下环境。救生员需同时监控多个游泳者,且人的注意力和反应速度有限,往往难及时察觉正在发生的溺水事故。现有监控系统虽能提供实时视频,但无法自动检测和报警,依赖人工判断易导致救援延误。
2.研究现状
        我在查阅文献后发现,现有技术已经出了一些设备与设施。一些公司和研究机构已开发出一些设备与装置来进行泳池检测与保护。这些系统通过多模态传感器融合技术,结合传感器实现了基本的溺水行为检测。此外,他们还尝试利用深度学习技术来优化溺水检测模型,通过分析大量数据来提高模型的准确性和适应性。但在国内应用存在众多弊端。首先,价格非常昂贵。其次,需专人进行设备调试与安装。最后,在国内也没有取得销售资质。
3.课题的重要性
        随着溺水事件的发生引起社会广泛关注,政府和公众对游泳场所的安全要求势必日益严格。同时,游泳学习的热情高涨,现在学校防溺水教育的普及也使家长对孩子的游泳安全更加重视,提升的安全意识有助于推动课题探索检测方案在游泳场所的使用。
        结合国内实际情况,本课题计划探究性价比高的游泳馆溺水监测方案。首先,针对高昂的安装和维护成本,课题计划使用工业低精度高清摄像头作为设备主要检测设备,降低系统成本。此外,课题计划利用可在任何场景下使用的人体姿态识别与深度估计算法,适用范围广,提高方案的适应性。最后还开发了短信提醒功能与esp32提醒设备来进行双重提醒。
4.课题方法
        4.1课题总体方案
        本课题计划搭建方案如下图所示。首先,课题通过布置于泳池上下的高清摄像头检测人体是否出现溺水的可能性。然后,进一步通过深度估计算法去判断这个人距离摄像头的距离信息。当出现任何溺水可能性时,系统会启动救生员提醒装置。同时,系统还会向指定关键负责人或救生员发送预警短信。 本方案主要步骤与设备介绍如下:

        1)摄像头:由于场馆内都会安装多个监控摄像头,因此课题可直接利用这些摄像头进行画面检测。游泳池底部的摄像头需进行额外购置与设备的安装。
        2)人体位置:直接利用开源google的mediapipe对人体个数与位置进行定位。
        3)溺水检测:首先直接利用开源YOLO溺水检测模型对步骤2中的人体动态姿态进行溺水判断,输出风险预测。同时利用mediapipe输出的结果实时监测人体身体关键点的相对关系进行二次溺水风险预估。
        4)位置判断:在检测出溺水风险后,系统会利用开源Depth-Anything去估测溺水人员距离该摄像头的距离值。然后,根据多个摄像头的位置关系确定溺水人员在泳池的区域。
        5)提醒装置:系统在判别出现溺水风险后,会启动救生员装置预警。
        6)短信提示:救生员预警的同时,为了进行双重保险,系统会即刻发送预警短信给游泳馆相关负责人与救生员。
        4.2基于摄像头的溺水检测
        首先,可直接利用MediaPipe的Pose模型,获取视频流中各个人体的33个关键点。这些关键点涵盖头部、肩膀、手臂、躯干和腿部的位置,可帮助分析人体姿态。进行判断的依据是将溺水的姿态和动作定义为以下几种状态:
        危险状态1:溺水者会表现出肢体乱动、挥动手臂求救等不自然动作。为了简便计算,将计算简化为二维运算。系统通过计算每一帧中关键点的位移来获得手腕目标关键点运动的速率和加速度。 首先,通过每一帧间的位移计算速度。例如,对于手腕关键点(假设为 P_wrist),在相邻两帧间的速度可表示如下: 

        其中,P_wrist_x 和 P_wrist_y 分别为手腕关键点的x和y坐标,t_frame 是每一帧的时间间隔(通常以秒为单位)。在后续还继续计算了他们的加速度:

        其中,v_t 和 v_{t+1} 分别为相邻两帧的速度,a 表示加速度。
        危险状态2:溺水者可能处于不平衡状态,身体的直立度或倾斜度与正常游泳姿势明显不同。这是因为系统可通过肩膀和髋部的关键点位置,计算身体的倾斜角度。直接使用肩膀与髋部的相对位置坐标来计算,具体计算公式如下:

 同时,计算左右侧的平均值作为整体躯干的倾斜角度。其计算公式如下: 

        同时,根据个人建议,系统将正常游泳状态下的倾斜角度范围设置为0~30°。在正常游泳时,身体倾斜度一般不会超出这个范围。如果躯干的倾斜角度θ超出此范围,或身体的直立度(肩膀与髋部的垂直偏移)显著增加,可认为溺水者处于不平衡状态,需提醒救生员进行重点关注。    

  YOLO溺水判断算法示意图
        4.3基于depth-Anything模型的深度估计
        当系统检测到了溺水风险,会将这个人的区域在这张图片的坐标信息直接送入depth-Anything进行深度估计。首先,整张图片会被送入开源Depth-Anything API 获取深度图矩阵。然后,被发现发生溺水风险人员区域坐标和尺寸会被框线,系统只从深度图中提取该区域的深度值。最后,该区域的深度平均值作为这个溺水风险人员的距离值。其调用代码如下:
        import cv2
        import torch
        from depth_anything_v2.dpt import DepthAnythingV2
        model = DepthAnythingV2(encoder='vitl', features=256, out_channels=[256, 512, 1024, 1024])
        model.load_state_dict(torch.load('checkpoints/depth_anything_v2_vitl.pth',
        map_location='cpu'))
        model.eval()
        raw_img = cv2.imread('your/image/path')
        depth = model.infer_image(raw_img) # HxW raw depth map 
        
        4.4溺水人员游泳区域判断
        我们也建立了实施的电脑监测界面。首先,为了简化运算与增强实时性。将泳池划分为左右、上下的6个区域。为了实现这个功能,需要求泳池管理方在泳池周围布置多个摄像头,确保每个区域至少被一个摄像头完全覆盖,也就是说至少需要8个摄像头。通过这种方法,为每个摄像头建立视野与泳池区域的对应关系,即明确摄像头画面中的哪个部分对应泳池的哪个区域。界面如下所示:  

        由于数据可能出现各种各样的干扰,因此将提醒模式设置为“单独显示”模式。自制一个带有显示界面的esp32单片机提醒装置实时检测显示溺水风险的摄像头。同时在显示界面中,直接显示泳池的平面图或示意图,并在上面标注各个摄像头的监控范围。当某个摄像头预警时,对应区域会高亮或闪烁,直观提示溺水可能发生的位置。虽不进行精确定位,但每个摄像头的监控区域是已知的。救援人员可根据摄像头编号,快速前往对应的泳池区域。
        4.5 ESP32的提示装置
        与此同时也设计并开发了一款基于ESP32单片机的提示装置,用于在溺水监测系统检测到风险时及时提醒救援人员。该装置利用ESP32的Wi-Fi功能接收报警信号,并控制蜂鸣器发出尖锐提示音,危险指示灯发出炫彩光亮。与此同时,程序实现了ESP32连接指定Wi-Fi网络,每隔5秒向服务器发送HTTP GET请求检查溺水报警状态。当接收到报警信号(返回值为"1")时,ESP32通过控制GPIO口电平启动振动蜂鸣器与提示灯,以提示救援人员查看界面。其连接图如下所示:   

        4.6 ESP32显示屏提醒我们直接使用了简易的I2C(Inter-Integrated Circuit)集成电路总线装置进行危险相机的显示。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。其连接方式如下:

        4.7 阿里云短信提示发送
        本模块利用了开源的阿里云平台,并计划开发一个基于Python的短信发送系统,利用阿里云短信服务实现向指定手机号码发送溺水预警短信的功能。分别通过在阿里云控制台开通短信服务、完成实名认证,并申请审核通过短信签名和短信模板等步骤。然后,可直接利用在指定创建的Python环境中安装阿里云提供的SDK(如aliyun-python-sdk-core和aliyun-python-sdk-dysmsapi),使用获取的AccessKey ID和AccessKey Secret来向服务器进行发送请求。
        在得到上述算法计算得出溺水姿态与距离估计后,可判断出这个溺水人员,然后通过调用短信发送的API接口,设置签名、模板代码、接收手机号和模板变量等参数,即可实现短信的发送,满足验证码、通知和营销等多种业务需求。
        4.8 系统的总体布局
        由于系统的软件部分无法布置在游泳馆内,所以只进行了功能模拟验证。然后采用模型信号的方法与发出警报,进一步验证系统的可行性。硬件主要是由esp32主体进行控制,分别连接了一个LED显示屏、彩色灯珠与报警蜂鸣提示喇叭。系统的整体布局如下: 

5.课题创新性
        首先,我们开发了一些简便的溺水监控方法。在使用多个摄像头的情况下,没有采用复杂算法,而是直接提示哪个摄像头发现了溺水风险。因为摄像头已覆盖泳池的不同区域,所以能快速知道溺水者在哪个区域。这种方法让系统更简单,更容易实现。
        其次,开发了一个基于ESP32单片机的振动提示装置。这个装置通过Wi-Fi接收溺水报警信号,提醒救援人员。相比传统的报警方式,这个装置成本低、耗电少、反应快、安装方便,提高了系统的实用性。
        然后,充分利用开源MediaPipe和Depth-Anything API,把它们创新地用在溺水检测上,扩展了这些工具的应用范围。同时,结合开源硬件ESP32快速开发了物联网报警设备,加快了研发速度。
        同时,在系统设计中简化了算法流程,优化了检测机制,实现了溺水风险的实时检测和报警。这样既保证了系统的快速反应,又通过多种技术的结合,提高了检测的准确性,减少了误报和漏报的可能性。
        与此同时,整个系统从软件到硬件都采用了模块化设计,各部分既紧密结合又可以独立运行,方便维护和升级。系统有很好的可扩展性,可根据需要添加功能,比如视觉或声音提示、数据分析、远程管理和更新等。
        最后,这个课题专注于泳池溺水检测的具体应用场景,提出了从检测到报警的完整解决方案。通过把泳池划分为特定区域,再结合摄像头的布局能快速确定溺水者的位置,为实际救援提供了有效的技术支持。
责任编辑:李银慧