使用YoloV5和Mediapipe实现——上课玩手机检测(附完整源码)

 

目录

效果展示

应用场景举例

1. 课堂或考试监控(看到这个学生党还会爱我吗)

2. 驾驶安全监控(防止开车玩手机)

3. 企业办公管理(防止工作时间玩手机)

4. 监狱、戒毒所、特殊场所安保

5. 家长监管(防止孩子沉迷手机)

6. 公共场所提醒(图书馆、博物馆等)

7. 体育馆或健身房监督

实现模块

YOLO(You Only Look Once)

MediaPipe Hands

两者之间的合作使用

实现思路

1. 模块初始化

2. 视频流读取

3. 手机检测

4. 手部检测

5. 距离计算与判断

6. 显示与退出

完整源码

总结


效果展示

玩手机检测


应用场景举例

1. 课堂或考试监控(看到这个学生党还会爱我吗

应用场景:

  • 在学校的 考试或课堂 过程中,自动检测学生是否在使用手机,防止考试作弊或上课玩手机。

  • 教师可以使用该系统来提醒学生保持专注,提高课堂纪律。

优势:
非侵入式检测,无需学生主动上交手机。
实时监控,可以及时发现违规行为。
低成本部署,普通摄像头+计算机即可运行。


2. 驾驶安全监控(防止开车玩手机)

应用场景:

  • 安装在 驾驶室 内部,用来检测司机是否在驾驶过程中使用手机。

  • 适用于 出租车、货车、公交车 及私家车,提高行车安全。

优势:
预防分心驾驶,减少因玩手机导致的事故。
可以集成到ADAS(高级驾驶辅助系统),增强智能安全功能。
提供语音或视觉警告,提醒司机停止使用手机。


3. 企业办公管理(防止工作时间玩手机)

应用场景:

  • 在企业办公区域监测 员工是否频繁使用手机,提高工作效率。

  • 可用于 工厂流水线、客服中心、银行等,防止员工因使用手机影响工作。

优势:
自动检测,不影响正常工作
可生成日志,统计员工的手机使用情况
适用于不同工作环境,如流水线、办公室等。


4. 监狱、戒毒所、特殊场所安保

应用场景:

  • 监狱、戒毒所、机密单位 监测是否有人私自使用手机,防止信息泄露或违规通信。

  • 可安装在 监控摄像头系统 中,自动检测并报警。

优势:
防止非法通信,提升安保等级
24小时自动监控,无需人工干预
可结合人脸识别,锁定违规人员


5. 家长监管(防止孩子沉迷手机)

应用场景:

  • 家长可以在家中 设置摄像头,检测孩子是否长时间使用手机。

  • 适用于 儿童学习、睡前管理、写作业时的监督

优势:
自动提醒,减少孩子玩手机时间
保护视力,防止长时间使用手机影响健康
可设置提醒时间,比如晚上9点后检测到手机就提醒休息


6. 公共场所提醒(图书馆、博物馆等)

应用场景:

  • 图书馆、博物馆、会议室、电影院等 需要安静的环境下,提醒人们不要使用手机。

  • 检测到使用手机后,系统可以 弹出提示播放音频提醒

优势:
提升公共场所秩序,减少干扰。
可以结合AI语音助手,自动发出提醒
适用于不同场所,无需额外硬件成本


7. 体育馆或健身房监督

应用场景:

  • 健身房、体育馆 监督运动者是否在运动时过度使用手机。

  • 适用于 健身房、瑜伽馆、篮球馆等,提高训练专注度。

优势:
帮助用户减少手机依赖,提升训练效果
适用于健身教练管理学员训练状态
可以结合数据分析,提供用户的运动专注度统计


实现模块

YOLO(You Only Look Once)

  • 主要作用:
    YOLO是一种目标检测算法,它用于在图像中快速识别和定位特定类别的对象(例如手机)。在这段代码中,YOLO负责检测视频帧中的手机,并返回手机的边界框(即目标在图像中的位置和大小)。

  • 实现原理:

    • 单次前向传播: YOLO将整个图像一次性输入神经网络,网络会将图像划分成网格,并对每个网格预测多个边界框及其对应的类别概率。

    • 实时检测: 由于只需要单次前向传播,因此速度非常快,适合实时应用。

    • 输出信息: 模型输出包括边界框坐标、置信度得分以及预测类别,进而通过后处理筛选出满足条件的检测结果。


MediaPipe Hands

  • 主要作用:
    MediaPipe Hands是Google推出的手部关键点检测模块,专注于检测手部并提取关键点信息(例如手指、手掌的特定位置)。在这段代码中,MediaPipe主要用于检测手部,并提取食指指尖(关键点编号8)的坐标。

  • 实现原理:

    • 检测和追踪: MediaPipe使用经过训练的神经网络模型先检测手部,再对检测到的手部进行关键点定位。

    • 高精度关键点提取: 模型能够输出手部各个关节点的精确坐标,使得后续能够计算手部各部分之间的相对位置和运动。

    • 优化和实时性: 该模块经过高度优化,可以在移动设备和PC上实时运行,适用于视频流处理。


两者之间的合作使用

  • 独立处理,同步运行:
    同一帧图像中,YOLO和MediaPipe分别对不同目标进行检测——YOLO检测手机,MediaPipe检测手部。两者互不干扰,各自独立完成自己的任务。

  • 二者的信息整合:

    • 目标定位: YOLO输出手机在图像中的边界框及中心点,而MediaPipe输出手部关键点(例如食指指尖)的位置。

    • 行为判断: 后续代码将YOLO得到的手机中心点与MediaPipe检测到的手部关键点进行距离计算(欧氏距离),通过预设的距离阈值来判断用户是否在使用手机。

    • 反馈结果: 根据距离的比较,程序在视频画面上显示不同的提示信息,实时反映用户是否可能在使用手机。


实现思路

        YOLO物体检测和MediaPipe手部关键点检测,判断用户是否在使用手机。下面是详细的实现思路:

1. 模块初始化

  • YOLO模型

    • 加载预训练的YOLO模型(此处使用的是YOLOv5su变体),用于在视频帧中检测手机。模型输出包含检测框的坐标、置信度以及类别信息(通过手机的中心点坐标来匹配)

  • MediaPipe Hands

    • 初始化MediaPipe的手部检测模块,配置检测模式、最大手数、检测和追踪的置信度。

    • MediaPipe会返回每只手的多个关键点坐标(例如食指指尖对应关键点编号8)。

2. 视频流读取

  • 使用OpenCV打开默认摄像头,并循环读取每一帧图像。

3. 手机检测

  • 图像预处理

    • 将BGR图像转换为RGB(BGR代表蓝色、绿色和红色,而RGB代表红色、绿色和蓝色。这两种颜色空间的主要区别在于颜色通道的顺序。),因为MediaPipe要求输入RGB图像。

  • YOLO检测

    • 使用YOLO模型对当前帧进行检测,遍历检测结果,筛选出类别为手机的目标。

    • YOLO 训练的数据集通常是 COCO,它包含 80 种常见物体的类别,每个类别都有一个 唯一的索引号

      在 COCO 数据集中:

      "cell phone"(手机)类别的索引是 67

      人(person)        → 类别索引 0

      自行车(bicycle) → 类别索引 1

      汽车(car)           → 类别索引 2

      书本(book)        → 类别索引 73

    • 对每个检测到的手机,提取边界框坐标并在图像上绘制矩形框和标签。

4. 手部检测

  • 使用MediaPipe对RGB图像进行手部检测。

  • 遍历检测到的手部,提取每只手中食指指尖(关键点8)的坐标。

  • 在图像上绘制手部关键点和连接线,并在食指指尖处绘制一个圆点和文字标识。

5. 距离计算与判断

  • 手机中心点计算

    • 对于每个手机检测框,计算其中心点坐标。

  • 欧氏距离计算

    • 对于每个手部食指指尖坐标,计算其与手机中心点之间的欧氏距离。

    • 在图像上显示每对点之间的距离数值,并根据距离绘制不同颜色的连线:

      • 如果距离小于预设的阈值(50像素),认为用户可能正在使用手机,用红色标记;否则用蓝色标记。

  • 状态判断

    • 根据所有手与手机的距离判断,如果至少有一对距离小于阈值(我们这里的阈值为50个像素,可以根据不同的情况实施修改),则显示“Using Phone!!!Stop!!!”,否则显示“Not Using Phone”。

6. 显示与退出

  • 将处理后的图像帧显示在窗口中。

  • 通过监听键盘事件(ESC键)来实现退出循环和释放资源。


完整源码

import cv2
import mediapipe as mp
import numpy as np
from ultralytics import YOLO# 初始化YOLO模型(预训练YOLOv5s模型)
model = YOLO("./yolov5spt/yolov5su.pt")  # 确保当前目录有该模型文件或使用绝对路径# 初始化MediaPipe Hands
mp_hands = mp.solutions.hands
hands_detector = mp_hands.Hands(static_image_mode=False,max_num_hands=2,min_detection_confidence=0.5,min_tracking_confidence=0.5
)
mp_drawing = mp.solutions.drawing_utils# 距离阈值(单位:像素),需要根据实际情况调整
DISTANCE_THRESHOLD = 50# 打开摄像头,这里的0就是默认的第一个摄像头
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()if not ret:break# 将图像转换为RGB供MediaPipe使用frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# YOLO检测手机,注意模型可能会检测出多个类别# 得到 detections 结果为列表,包含检测框、置信度及类别信息results = model(frame)phone_boxes = []for result in results:# 解析检测结果(model返回的数据结构可能会变化,请参考ultralytics文档)# 此处假设每个result.boxes对象内有xyxy, conf, cls属性for box in result.boxes:cls = int(box.cls[0])# COCO数据集中,手机(cell phone)的类别大约为 67# 这里根据具体模型类别索引进行调整if cls == 67:# 获取边界框坐标并转换为整型x1, y1, x2, y2 = map(int, box.xyxy[0])phone_boxes.append((x1, y1, x2, y2))# 在图像上绘制手机检测框cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.putText(frame, "Phone", (x1, y1 - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)# 使用MediaPipe检测手部results_hands = hands_detector.process(frame_rgb)hand_points = []  # 存放检测到的手部关键点(以食指指尖为例)if results_hands.multi_hand_landmarks:for hand_landmarks in results_hands.multi_hand_landmarks:# 获取食指指尖 landmark,编号8(MediaPipe Hands的关键点编号)h, w, _ = frame.shapelandmark = hand_landmarks.landmark[8]cx, cy = int(landmark.x * w), int(landmark.y * h)hand_points.append((cx, cy))# 在图像上绘制手部关键点和连线mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)cv2.circle(frame, (cx, cy), 5, (0, 0, 255), -1)cv2.putText(frame, "Index Tip", (cx, cy - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)# 检查每个手机框与手部关键点之间的距离using_phone = Falsefor (x1, y1, x2, y2) in phone_boxes:# 计算手机检测框中心点phone_cx = (x1 + x2) // 2phone_cy = (y1 + y2) // 2cv2.circle(frame, (phone_cx, phone_cy), 5, (255, 0, 0), -1)for (hx, hy) in hand_points:# 计算欧氏距离dist = np.sqrt((phone_cx - hx)**2 + (phone_cy - hy)**2)# 在图像上显示距离值cv2.putText(frame, f"{int(dist)}", ((phone_cx+hx)//2, (phone_cy+hy)//2),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 0), 2)if dist < DISTANCE_THRESHOLD:using_phone = True# 用红色标记距离过近的情况cv2.line(frame, (phone_cx, phone_cy), (hx, hy), (0, 0, 255), 2)else:cv2.line(frame, (phone_cx, phone_cy), (hx, hy), (255, 0, 0), 1)# 显示结果if using_phone:cv2.putText(frame, "Using Phone!!!Stop!!!", (50, 50),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)else:cv2.putText(frame, "Not Using Phone", (50, 50),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)cv2.imshow("Phone and Hand Detection", frame)# 按ESC退出if cv2.waitKey(1) & 0xFF == 27:breakcap.release()
cv2.destroyAllWindows()

总结

        通过YOLO模型实时检测手机位置,再通过MediaPipe检测手部关键点,利用计算出的距离判断用户是否在使用手机,并将结果实时显示在视频画面上。这种方法融合了目标检测和关键点检测技术,适用于监控、驾驶安全提醒等场景。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT-4o从语义分割到深度图生成,大模型狂潮下的计算机视觉:技术进步≠替代危机

随着上周&#xff0c;GPT-4o原生多模态图像生成功能的推出&#xff0c;更多玩法也被开发出来。一夜之间&#xff0c;GPT-4o原生多模态能力的释放&#xff0c;让图像生成、语义分割、深度图构建这些曾需要专业工具链支持的复杂任务&#xff0c;变成了普通人输入一句话就能实现的…

Pytorch 张量操作

在深度学习中&#xff0c;数据的表示和处理是至关重要的。PyTorch 作为一个强大的深度学习框架&#xff0c;其核心数据结构是张量&#xff08;Tensor&#xff09;。张量是一个多维数组&#xff0c;类似于 NumPy 的数组&#xff0c;但具有更强大的功能&#xff0c;尤其是在 GPU …

小程序中跨页面组件共享数据的实现方法与对比

小程序中跨页面/组件共享数据的实现方法与对比 在小程序开发中&#xff0c;实现不同页面或组件之间的数据共享是常见需求。以下是几种主要实现方式的详细总结与对比分析&#xff1a; 一、常用数据共享方法 全局变量&#xff08;getApp()&#xff09;、本地缓存&#xff08;w…

vue中的 拖拽

拖拽总结 实现方式特点适用场景HTML5 原生拖拽 API✅ 直接使用 dataTransfer 进行数据传输 ✅ 兼容性好&#xff08;大部分浏览器支持&#xff09; ✅ 适合简单的拖拽场景低代码平台、表单生成器、组件拖拽Vue/React 组件库&#xff08;如 Vue Draggable、SortableJS&#xff…

MySQL 函数(入门版)

目录 一、字符串函数 1、常用的字符串函数 2、函数演示 3、具体案例 二、数值函数 1、常用的数值函数 2、函数演示 3、具体案例 三、日期函数 1、常用的日期函数 2、函数演示 3、具体案例 四、流程函数 1、常用的流程函数 2、函数演示 3、具体案例 在MySQL中&a…

基于快速开发平台与智能手表的区域心电监测与AI预警系统(源码+论文+部署讲解等)

需要源代码&#xff0c;演示视频&#xff0c;ppt设计原稿资料&#xff0c;请文末卡片联系 !](https://i-blog.csdnimg.cn/direct/242d53cd069940b5b7a6db2bb031d406.png#pic_center)

【神经网络】python实现神经网络(三)——正向学习的模拟演练

有了之前的经验(【神经网络】python实现神经网络(二)——正向推理的模拟演练),我们继续来介绍如何正向训练神经网络中的超参(包含权重以及偏置),本章大致的流程图如下: 一.损失函数 神经网络以某个指标为基准寻求最优权重参数,而这个指标即可称之为 “损失函数” 。(…

分区格式变RAW故障深度解析与数据恢复实战指南‌

分区格式变RAW的本质‌ 当存储设备&#xff08;如硬盘、U盘或移动硬盘&#xff09;的分区突然显示为RAW格式时&#xff0c;意味着操作系统无法识别其原有的文件系统结构&#xff08;如NTFS、FAT32等&#xff09;。此时&#xff0c;用户访问该分区会提示“需要格式化”或直接显示…

【QT】Qt5 QtWebEngine使用教程

目录 1、QtWebEngine相比于QtWebKit的优势2、项目配置2.1 确认 Qt 版本2.2 在.pro 文件中添加依赖3、显示网页4、实现Qt和网页JavaScript之间的交互4.1 Qt执行网页的JavaScript代码4.2 JavaScript调用Qt对象的函数QtWebEngine 是 Qt 框架中用于在应用程序中嵌入 Web 内容的模块…

网络安全-等级保护(等保) 1-0 等级保护制度公安部前期发文总结

################################################################################ 等级保护从1994年开始已经有相关文件下发&#xff0c;进行建设&#xff0c;后续今年多年制度完善&#xff0c;现在已进入等保2.0时代&#xff0c;相关政策已运行多年。 前期等保相关发文&…

视图函数的应用

1.实现将当前日期和时间编码为HTML文档并返回的简单视图函数 文章目录 1.实现将当前日期和时间编码为HTML文档并返回的简单视图函数1.1打开visualcode 按图示点击 创建新的终端1.2然后定义ViewDjango项目根目录下的路由文件urls.py&#xff0c;实现到SimpleView应用的路由路径1…

解锁 C 语言安全新姿势:C11 安全函数全解析

一、开篇:C 语言安全的新护盾 在 C 语言的编程世界里,缓冲区溢出等安全问题犹如潜藏的暗礁,时刻威胁着程序的稳定与安全。为了有效应对这些挑战,C11 标准引入了一系列安全函数,也被称为 “Annex K” 标准库函数。这些函数为字符串和内存操作函数注入了新的活力,通过增加…

BGP路由协议之属性2

Orgin 起源 公认必遵属性 起源名称标记描述IGPi如果路由是由始发的 BGP 路由器使用 network 命令注入到 BGP 的&#xff0c;那么该 BGP 路由的 origin 属性为 IGPEGPe如果路由是通过 EGP 学习到的&#xff0c;那么该 BGP 路由的 Origin 属性为 EGPIncomplete?如果路由是通过…

C#实现HiveQL建表语句中特殊数据类型的包裹

用C#实现搜索字符串中用’(‘和’)‘包裹的最外层的里面里面的字符串&#xff0c;将里面的记录按一个或多个空格、换行或tab&#xff0c;或者是它的在一起的组合作为分隔&#xff0c;分隔出多个字符串组&#xff0c;如果组中有字符串中同时包含’<‘和’>’&#xff0c;则…

脑电学习笔记

一&#xff0c;原理简介 使用eprime或者matlab给被试呈现刺激&#xff0c;并在某个时间发送Mark&#xff0c;脑电帽会同步采集被试的脑电信号&#xff0c;经放大器放大后&#xff0c;控制盒会把脑电信号和mark 信号同步到一起&#xff0c;通过usb线传入到采集系统&#xff08;比…

宏碁笔记本电脑擎7PRO搭载的 NVIDIA RTX 5080 显卡安装pytorch

宏碁笔记本电脑擎7PRO搭载的 NVIDIA RTX 5080 显卡是一款高性能移动 GPU&#xff0c;基于 NVIDIA 最新的 Blackwell 架构设计&#xff0c;通过修正架构&#xff08;Blackwell&#xff09;、显存类型与带宽&#xff08;GDDR7、960GB/s&#xff09;、Tensor Core 与 RT Core 全面…

ES6中增强对象

在 ES6 中&#xff0c;对象的使用变得更加方便了&#xff0c;可以在定义对象时通过属性简写、遍历作为属性名或省略对象函数属性的书写等方式来提高编码的效率&#xff1a; 其实就这么简单&#xff0c;大家可以好好看下上面的代码&#xff0c;有问题欢迎留言一起探讨&#xff0…

XSLFO XSLT:深入解析两种强大的XML转换技术

XSLFO & XSLT:深入解析两种强大的XML转换技术 引言 在XML(可扩展标记语言)的生态系统中,XSLFO(可扩展样式表语言格式化对象)和XSLT(可扩展样式表转换语言)是两种非常强大的技术。它们分别负责将XML文档转换为其他格式以及进行XML文档的转换。本文将深入探讨这两种…

Django4.0的快速查询以及分页

1. filter 方法 filter 是 Django ORM 中最常用的查询方法之一。它用来根据给定的条件过滤查询集并返回满足条件的对象。 articles Article.objects.all() # 使用 SearchFilter 进行搜索 search_param request.query_params.get(search, None) author_id request.query_pa…

在Vue3中格式化后端返回的Java Date类型数据为指定格式

在前端Vue3项目中&#xff0c;格式化后端返回的java.util.Date类型时间到yyyy-MM-dd HH:mm:ss格式&#xff0c;有几种常用方法&#xff1a; 方法一&#xff1a;使用JavaScript内置方法 <JAVASCRIPT> // 假设后端返回的数据结构为 { createTime: 2023-05-15T08:30:00.0…