基于YOLOv5与眼部状态识别的网课专注度检测系统实现

发布时间:2026/10/7 18:22:31
基于YOLOv5与眼部状态识别的网课专注度检测系统实现 简介这份基于YOLOv5的网课专注度检测系统融合目标检测与PyQt5桌面界面是经导师指导并认可、评审达99分的高分毕业设计项目。适合计算机相关专业毕业生完成毕设、课程设计或期末大作业也面向想练习完整项目流程的深度学习学习者。系统提供可直接运行的源码、已训练模型与可视化界面能对网课场景中的人脸/姿态等目标进行检测辅助判断专注状态。资源共122个文件约179.87MB其中39个py文件承载核心逻辑与界面集成18个yaml保存模型训练配置pt/onnx权重可直接加载推理pyc、pkl、dat等则为依赖缓存与关键点模型另含项目计划书、README和Dockerfile便于环境部署与二次开发。已有112人学习下载。对需要快速搭建高分离线项目的读者这套资料在代码完整性、界面交互和说明文档上都较省心尤其适合作为毕设演示与功能扩展的基础。1. 网课专注度检测系统到底在做什么先别急着写代码看到标题核心词“网课专注度检测”很多人的第一反应是“用yolov5检测学生有没有在听课”。真按这个思路做下去大概率会翻车——yolov5再强也只能告诉你“画面里有没有人”而“有没有在听课”是一个行为状态判断不是单纯的检测问题。这套系统能成立靠的是两条线yolov5负责把人脸、手机、书本这些物体从画面里抠出来后面的评分逻辑负责把这些检测结果换算成专注度百分比。适合的人群很明确正在做毕设的本科生、想快速落地一个CV demo的开发者以及需要一套带界面、带模型、能演示完整流程的参考工程。这篇文章把这个系统的原理、代码路径、训练过程和踩坑点拆开讲清楚让你拿到同类源码后能真正跑通、改得动、讲得明白。2. 专注度判定的核心逻辑yolov5检测、眼部状态识别、状态评分三段式2.1 为什么yolov5只能算前半段检测和行为判断是两回事yolov5是一个one-stage目标检测器输出的是边界框、类别和置信度。你让它检测人、手机、书本它能给出“某个区域有一个人置信度0.85”这样的结果。但它不会告诉你这个人是在看屏幕还是在看窗外更不会告诉你他此刻是在认真听课还是已经睡着了。所以网课专注度系统的关键不在yolov5本身而在你如何定义“专注”。常见的做法是把专注度拆成几个可观测的行为信号然后通过多路检测结果综合打分。我这里推荐的是一套三段式方案第一段yolov5检测人脸区域和干扰物手机、书本、手掌。第二段在人脸区域内用OpenCV或dlib做眼睛关键点提取算EAREye Aspect Ratio眼睛纵横比判断眼睛是睁开还是闭合。第三段根据闭眼时长、人脸偏移角度、干扰物是否出现用一个状态机或评分公式算出当前专注度。这三段各负责一个层面的问题检测负责“谁在哪”眼部识别负责“人的状态”评分负责“当前值多少分”。任何一段没做好整个系统的专注度数值都不可信。2.2 一个可复现的专注度评分公式与参数专注度评分不涉及高深理论核心是给不同的行为分配惩罚权重。我设计过一个简单但能用的方案供你参考# focus_score.py def compute_focus_score(face_detected, eye_open, facing_screen, phone_detected, duration_sec): 专注度评分以1秒为基本时间片返回0~100的分数 face_detected: bool 是否检测到人脸 eye_open: bool 眼睛是否睁开 facing_screen: bool 头部是否朝向屏幕 phone_detected: bool 是否有手机出现在画面 duration_sec: 该状态持续秒数 base_score 100.0 # 1. 人脸直接消失按整段扣分 if not face_detected: base_score - 40.0 # 2. 闭眼超过阈值算瞌睡每个时间片追加扣分 if not eye_open: base_score - 15.0 * (duration_sec / 3.0) # 3. 头部大角度偏移扣分 if not facing_screen: base_score - 10.0 # 4. 手机出现在检测框内扣分 if phone_detected: base_score - 25.0 return max(0.0, min(100.0, base_score))逻辑说明这个函数评估的是“某个状态持续期间里每一秒该给多少分”。face_detected是硬指标——人不在摄像头前通常默认走神。眼睛闭合的扣分和duration挂钩闭眼3秒和闭眼10秒性质不一样前者可能是眨眼后者基本是瞌睡。手机被检测到一次性扣25分是因为网课场景里低头看手机是最高频的走神动作。参数说明扣分数值可以根据实际场景调。如果你希望系统更宽容可以把“人脸消失”的扣分从40降到25如果把手机扣分提高系统会更容易把“手边放手机”判定为不专注。阈值设置建议在演示前用录好的视频试跑几轮看看及格线定在多少最自然。我一般把60分设为及格线低于60输出“走神”高于等于60输出“专注”。2.3 EAR眼部状态识别的实现要点EAR是最常用的睁眼/闭眼判定方法。它是dlib的68点人脸关键点里左右眼各自的6个关键点组成的几何比值。人眼睁开时EAR值稳定在0.25到0.35之间闭眼时急剧下降到0.1以下。判定的关键是阈值的选择选得太高会把“眯眼”误判成闭眼选得太低会漏判快速眨眼。# eye_blink_detector.py import cv2 import dlib detector dlib.get_frontal_face_detector() predictor dlib.shape_predictor(models/shape_predictor_68_face_landmarks.dat) def eye_aspect_ratio(eye_points): # 计算眼睛纵横比 A cv2.norm(eye_points[1] - eye_points[5]) B cv2.norm(eye_points[2] - eye_points[4]) C cv2.norm(eye_points[0] - eye_points[3]) return (A B) / (2.0 * C) def is_eye_closed(frame, ear_threshold0.18, frame_count_threshold2): # 返回当前帧是否判定为闭眼 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces detector(gray, 0) if len(faces) 0: return False # 没有人脸时交由focus_score处理 shape predictor(gray, faces[0]) left_eye [] right_eye [] # 68点关键点中左眼为36~41右眼为42~47 for i in range(36, 42): left_eye.append((shape.part(i).x, shape.part(i).y)) for i in range(42, 48): right_eye.append((shape.part(i).x, shape.part(i).y)) left_ear eye_aspect_ratio(left_eye) right_ear eye_aspect_ratio(right_eye) avg_ear (left_ear right_ear) / 2.0 return avg_ear ear_threshold逻辑说明这个函数的工作方式是从帧里提取人脸再用预训练关键点模型定位眼睛区域最后把左右眼的EAR平均值和阈值比较。frame_count_threshold这个参数不是在这里起作用的它是在主循环里配合连续多帧的判定结果来过滤噪声的——单帧低于阈值可能是眼睛半闭的中间态连续超过2帧才认为是真正的闭眼。参数说明ear_threshold是核心参数建议在0.15到0.25之间调试。dlib的人脸检测器比yolov5的人脸检测轻量但因为要跑68点关键点CPU上的计算开销不低。我在笔记本上实测dlib在720p视频流里单帧处理约80毫秒如果感觉卡顿就把检测帧率降到10帧/秒同时用yolov5的人脸框来限定dlib的搜索区域。3. 把源码跑起来Python环境、权重推理与PyQt5界面联动3.1 环境安装的稳妥顺序下载到源码包后最忌讳的事是直接“python app.py”对着报错看天。依赖冲突是这套系统最常见的翻车入口根源在于yolov5对torch版本要求、dlib对编译工具链要求都可能与你机器上现有的Python环境打架。我的建议是用独立的虚拟环境安装顺序固定为先torch再yolov5依赖再dlib最后PyQt5。# 创建虚拟环境并激活 conda create -n focus_env python3.8 conda activate focus_env # 先装torchcu118表示cuda 11.8没有NVIDIA显卡就去掉后面的参数 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装yolov5所需依赖注意requirements.txt里不要装opencv和torch pip install -r yolov5/requirements.txt # 单独安装dlibWindows用户建议下载预编译wheel避免cmake编译dlib时卡死 pip install dlib # 最后安装界面库 pip install pyqt5 pyqt5-tools逻辑说明把pip install拆成四步的目的是让每一步的安装结果都能被单独验证。torch单独装是因为yolov5对torch版本有硬性要求不同版本的torch对应的cuda版本不同混装容易造成“RuntimeError: CUDA error: no kernel image is available”这类玄学报错。把opencv放在requirements里一起装也行但如果你的环境里已经有一个opencv版本yolov5的要求可能会强制升级导致其它代码崩掉。参数说明conda环境指定python3.8是因为dlib的预编译wheel在3.9以上版本经常缺包。如果你用的是python 3.10或3.11在Windows上就等着走cmake全量编译吧耗时20分钟起步。yolov5对python 3.8的兼容性是经过最多人验证的组合毕设场景不要追新。3.2 模型推理的最小化验证在接界面之前先让yolov5单独跑通确认模型文件和推理代码没有问题。这是整套系统里最值得先做的验证因为PyQt5界面里如果嵌入了推理代码界面启动时的任何模型加载错误都会被包装成“界面卡死”排查起来麻烦得多。# minimal_detect.py import torch # 加载yolov5模型 model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt) # 用图片验证推理 img test_imgs/student_01.jpg results model(img) # 打印检测结果 results.print() results.show() # 提取检测框、类别、置信度 boxes results.xyxy[0].cpu().numpy() for box in boxes: x1, y1, x2, y2, conf, cls box print(f类别:{int(cls)} 置信度:{conf:.2f} 坐标:({x1:.0f},{y1:.0f},{x2:.0f},{y2:.0f}))逻辑说明这段代码做的是从本地路径加载权重文件对单张测试图片进行推理然后打印出每个检测框的参数。torch.hub.load会尝试从GitHub拉取yolov5仓库代码如果你的机器无法访问该仓库代码会卡在加载阶段。解决办法是把yolov5仓库从GitHub下载下来放进项目目录然后用模型加载方式指向本地仓库。参数说明custom参数指定的是你的自定义训练权重而不是yolov5官方预训练权重。如果源码包里给的是yolov5s.pt说明它是官方COCO模型只能检测人、手机等通用物体依然能用但效果比专门训练过的模型差不少。推理前确认best.pt和你的yolov5版本匹配yolov5不同大版本的权重格式不完全兼容最常见的问题是加载后输出维度对不上。3.3 PyQt5界面与推理线程的联动方式PyQt5界面卡死是毕设演示现场最尴尬的事故。根因是很多人把目标检测的推理循环直接写在了UI的槽函数里——detect函数在执行过程中事件循环被阻塞界面看起来就像死了一样。正确做法是界面只负责展示推理放独立线程。# camera_thread.py import threading import cv2 import torch from PyQt5.QtCore import QThread, pyqtSignal class DetectThread(QThread): # 定义信号把处理后的帧和专注度传给主界面 frame_ready pyqtSignal(object, int) def __init__(self, model_path, source0): super().__init__() self.model torch.hub.load(ultralytics/yolov5, custom, pathmodel_path) self.cap cv2.VideoCapture(source) self.running True def run(self): while self.running: ret, frame self.cap.read() if not ret: continue # 推理当前帧 results self.model(frame) # 从结果中提取人脸框、手机框 boxes results.xyxy[0].cpu().numpy() # 把检测框画到帧上 annotated results.render()[0] # 根据检测结果计算专注度调用2.2节的评分函数 score 90 self.frame_ready.emit(annotated, score) # 降低循环频率避免占用过多CPU self.msleep(30) def stop(self): self.running False self.cap.release()逻辑说明QThread的生命周期里run方法里不能做任何耗时阻塞操作否则线程信号无法及时发给主界面。这里把检测和评分都放在线程内部通过frame_ready信号把结果回传给界面更新。界面上只需要连接这个信号把帧显示在QLabel上即可。msleep(30)把推理频率限制在30帧左右实际帧率还要看硬件。参数说明source0表示读取默认摄像头。如果你在测试时用视频文件代替摄像头把这个参数改成视频文件路径即可。注意视频文件路径不能带中文否则OpenCV的VideoCapture在Windows上会静默失败——不报错但每次read都返回False。如果你要判断的是录播课视频而不是实时摄像也可以把source换成RTSP流地址。3.4 界面与结果绑定的最小演示# main_window.py import sys from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget from PyQt5.QtGui import QImage, QPixmap from camera_thread import DetectThread class FocusWindow(QWidget): def __init__(self): super().__init__() self.video_label QLabel(self) self.score_label QLabel(专注度: --, self) layout QVBoxLayout(self) layout.addWidget(self.video_label) layout.addWidget(self.score_label) self.setLayout(layout) self.thread DetectThread(best.pt, 0) self.thread.frame_ready.connect(self.update_frame) self.thread.start() def update_frame(self, frame, score): # 将BGR格式转换为RGB并显示 rgb_image cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch rgb_image.shape qt_image QImage(rgb_image.data, w, h, ch * w, QImage.Format_RGB888) self.video_label.setPixmap(QPixmap.fromImage(qt_image)) self.score_label.setText(f专注度: {score}) if __name__ __main__: app QApplication(sys.argv) window FocusWindow() window.show() sys.exit(app.exec_())逻辑说明主界面两个控件——上面的QLabel显示视频帧下面的QLabel显示专注度数值。DetectThread在后台跑推理每处理完一帧就通过信号把画面和分数推送到update_frame方法里。窗体不需要自己调用任何检测代码这是保持界面流程顺畅的关键。参数说明QImage的构造参数里ch * w是指每行字节数。如果图像转换后颜色异常检查这一步是否正确。有的源码会省略这个参数导致显示出来的图像颠倒或撕裂。如果你的摄像头是竖屏或者画面有黑边不要在这里做裁剪直接在DetectThread里设置推理分辨率更合适。4. 训练自己的专注度检测模型数据集标注、训练命令与必调超参数4.1 数据集从哪里来三类物体足够网课专注度检测里yolov5需要检测的物体类别不需要太多。我在实际项目中只用了三类person学生本体、phone手机、book书本。物体的检测框不需要覆盖全身手机的框需要覆盖到屏幕区域——因为手机是否被使用关键看屏幕是否朝向学生面部。数据集构建上最省力的方式是录10段左右30秒的课堂视频包含不同坐姿、不同光照条件然后逐帧抽图。每秒抽1帧10段视频约300张图。这个量级对yolov5来说略少但配合在线数据增强可以训练出一个能用的模型。标注工具推荐LabelImg标注格式选择YOLO格式输出为同名的txt文件。每个txt文件里的行格式为类别id、中心x、中心y、宽、高。注意是归一化后的坐标。标注时有一个容易忽视的细节——手机只标屏幕正面反扣在桌面上、锁屏放在手边的手机不标。语义上我们要检测的是“学生正在使用手机”而不是“桌面上有手机”。4.2 数据目录结构与训练命令yolov5要求的数据目录有固定结构用如下命令创建并开始训练。如果源码包里已有训练脚本也要先确认数据目录结构和这个一致。# 以项目根目录创建数据目录 mkdir -p dataset/images/train dataset/images/val mkdir -p dataset/labels/train dataset/labels/val # 把标注好的图片和标签放到对应目录后直接启动训练 python train.py --data focus.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 100 \ --device 0逻辑说明yolov5的train.py从focus.yaml读取数据集路径、类别数量和类别名然后加载yolov5s.pt预训练权重开始训练。预训练权重的作用是迁移学习——既然我们标注的数据量只有几百张从头训肯定欠拟合但用COCO上训好的s级权重做起点收敛速度会快很多。参数说明img 640是输入图片的边长yolov5会把图片resize到640x640再推理。如果你需要检测的物体很小比如距离摄像头3米开外的手机可以考虑把img改成800或960检测精度会上升但训练时间几乎翻倍。batch-size 16在显存低于6GB的显卡上大概率爆显存改成8更稳妥。epochs 100是最低建议值我训练时用的是150轮。device 0表示用第一个GPU如果你没有NVIDIA显卡就改成device cpu训练时间会让人崩溃建议直接用官方Colab笔记或者租云GPU。4.3 三个影响检测效果的必调超参数超参数在yolov5里是玄学程度比较高的东西但有三项直接决定专注度系统的检测质量值得单独讲。第一项是hyp参数里的hsv_h和hsv_s它们控制数据增强时色调和饱和度的随机变动幅度。网课场景的光照条件不稳定早上的自然光和晚上的灯光色温差异大如果hsv增强幅度太小训练出来的模型在灯光偏黄的场景里容易漏检。我习惯把hsv_h从默认的0.015调大到0.03hsv_s从0.7调大到0.9。第二项是fliplr控制随机水平翻转。人脸检测上水平翻转不会改变语义所以这个参数可以保持默认0.5。但你如果同时检测手机的屏幕方向翻转会让左右手使用手机的习惯混淆可能造成误检建议调成0。第三项是epochs的早停策略。yolov5默认会在训练后期判断mAP是否还在提升如果长时间无改善会自动停止。对几百张数据的小数据集早停阈值不要动反而要把patience参数增加因为小数据集过拟合速度快patience默认50太低的话模型可能在还没稳定时就被提前停了。4.4 训练后如何验证模型可用训练完成后yolov5会在run/train/exp目录下生成best.pt和last.pt。验证模型能不能用于专注度检测不要只看mAP指标而是直接用一张“假装走神”的测试图看检测效果。# 验证模型检测效果 python detect.py --weights runs/train/exp/best.pt \ --source test_imgs/phone_in_hand.jpg \ --conf-thres 0.25 \ --iou-thres 0.45 \ --save-txt逻辑说明detect.py会把推理结果保存在runs/detect/exp目录下同时生成标注了检测框的图片。重点看两个地方手机是否被框出且置信度高于0.5人脸与手机框是否重叠——在做专注度判断时人脸框和手机框的IoU可以作为一个强特征如果重叠度高说明手机举在学生脸前走神概率极大。参数说明conf-thres是置信度阈值。低于该阈值的检测框会被丢弃。0.25是yolov5惯用的默认值如果验证图上出现大量漏检把conf调低到0.15试试如果误检多调到0.4。iou-thres是NMS时的交并比阈值多人重叠场景下不用动0.45比较常规。5. 毕设翻车高频点依赖冲突、摄像头掉线、检测跳变排查5.1 摄像头间歇性掉线导致画面黑屏现象程序启动正常运行一两分钟后界面画面突然冻结再过几秒直接黑屏。程序不崩溃但摄像头无法重连。原因OpenCV的VideoCapture线程在摄像头设备响应超时时不会自动恢复读取导致read()长期阻塞或返回空帧。笔记本摄像头出现这个问题的概率最高摄像头驱动的电源管理会在画面长时间无变化时自动休眠设备。解决在DetectThread的run循环里加入重连机制。# 摄像头重连逻辑加在run方法的循环里 ret, frame self.cap.read() if not ret: # 尝试释放并重新打开摄像头 self.cap.release() self.cap cv2.VideoCapture(self.source) if not self.cap.isOpened(): self.msleep(1000) # 重连失败等待1秒再试 continue这么处理后掉线能自动恢复不会卡死在黑屏状态。另外一个更省事的处理是在Windows设备管理器里把摄像头驱动的“允许计算机关闭此设备以节约电源”关掉能从根本上减少掉线频率。5.2 专注度数值来回跳变坐得端端正正也显示50分现象学生明明在看屏幕专注度分数却在40到90之间反复横跳完全无法作为结论展示。原因评分公式对“头部偏移”和“闭眼”的判断过于敏感单帧的误检直接造成大分差。EAR虽然能分辨睁眼闭眼但如果学生戴眼镜镜片反光会干扰关键点定位偶尔把睁眼识别成闭眼。同样yolov5检测人脸框抖动时dlib关键点的坐标也会跟着波动。解决在评分之前加状态滤波让专注度数值不因单帧异常而突然变化。常见做法是维护一个“最近5帧”的滑动窗口窗口内超过3帧判定为闭眼才真正按闭眼扣分人脸检测也是同理窗口内超过2帧未检测到人脸才视为离开座位。# state_filter.py class StateFilter: def __init__(self, window_size5, threshold3): self.window [] self.window_size window_size self.threshold threshold def update(self, state): # 输入单帧的布尔状态输出稳定后的状态 self.window.append(state) if len(self.window) self.window_size: self.window.pop(0) true_count sum(self.window) return true_count self.threshold5.3 运行检测后CPU占满笔记本噪音起飞现象界面正常摄像头画面流畅但风扇狂转CPU使用率稳定在90%以上。原因DetectThread的run循环没有任何帧率限制推理速度完全取决于模型推理耗时。如果推理本身要60ms一帧while循环就跑在16帧左右如果推理做了缓存优化跑到了50帧以上CPU就被吃满了。解决固定推理帧率不需要额外复杂机制在循环末尾加一个可调的延时即可。msleep(50)对应20帧msleep(100)对应10帧。网课专注度检测并不需要高帧率每秒8到10帧足够捕捉闭眼和玩手机行为。你也可以在评分逻辑里直接按时间戳累计不依赖帧率恒定。5.4 模型加载报错“RuntimeError: Attempting to deserialize object on a CUDA device”现象在别人的电脑上训练的best.pt,换一台机器加载时报CUDA device错误。原因训练时模型参数保存在GPU上权重文件里记录了设备信息推理时如果机器没有GPU就会报这个错。解决加载模型前强制映射到CPU:torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, force_reloadFalse) # 如果报错加上设备映射参数 model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, _devicecpu, force_reloadFalse)这不算大坑但发生在答辩前夜就很折磨人。建议在训练的机器上就把权重转成纯CPU可加载的形式用torch.load配合map_locationcpu重新保存一次再分发到别的机器上。5.5 PyQt5界面启动后白屏无响应现象运行main_window.py后出现一个小白框点击后系统提示“未响应”。原因最常见的是DetectThread里加载模型卡住了。torch.hub.load在初始化时要联网或者做哈希校验这个过程如果网络不通会持续阻塞导致界面启动消息无法处理。解决把DetectThread的model加载放到独立初始化方法里并设置一个加载完成信号。初始化期间界面可以先显示“正在加载模型”而不是直接卡住。另外优先使用本地仓库的yolov5源码而不是hub联网加载详见3.2节中的说明。6. 从“能跑”到“能答辩”专注度曲线导出与结果验证6.1 给系统加一个会话记录功能演示时只显示实时检测画面和分数说服力不够。最有效的改进是把每次网课会话的专注度按秒记录结束时生成一条曲线并导出报表。这一功能实现难度低但答辩时展示效果极好——评委会看到分数随时间变化的曲线比如前10分钟稳定在90分以上从第15分钟开始因低头看手机跌到55分区间这说明你的系统真的捕捉到了行为变化。实现方式用一个CSV文件记录时间戳、专注度分数、当前状态标签专注/走神/离席。结束后用matplotlib画曲线图并保存为PNG插入答辩PPT里。导出报表的意义不只是好看它还让系统从“一个实时检测demo”升级成“一个有数据产出的系统”这是高分毕设最看重的一点。6.2 你该用哪些指标向评委解释检测效果答辩或报告里至少要有三张图支撑你的结论一是yolov5训练过程的loss曲线和mAP曲线——它们证明你的模型是训练出来的而不是套用了开箱即用的预训练权重二是实际运行时的检测效果截图至少包含专注和走神两类场景比如闭眼打瞌睡、低头玩手机、正对屏幕听讲三个状态三是专注度曲线图展示系统能区分专注和走神时段。评审可能会问你“怎么验证专注度评分是准的”这个问题不要用理论去硬答直接说你的验证方法录一段模拟网课视频人工标定哪些时间段是专注、哪些是走神然后用系统跑一遍对比自动评分与人工标注的重合率。重合率在80%以上就能说明有效。这个验证方法不需要额外的代码库两三段视频加一个标定表格就能完成。6.3 内存泄漏与长时间运行的稳定性检查毕设现场演示一般只跑几分钟看不出内存问题。但如果你要用这个系统做一次完整的45分钟网课记录帧缓存和信号队列可能就是隐患。一个Qt界面里最常见的泄漏是frame_ready信号发射的QImage对象没有被释放旧帧堆积在事件队列里。解决方法是每次更新界面时主动用deleteLater清理旧图像对象。另一个稳定性技巧是开场白式的防御摄像头打开前先检查文件路径不能是中文、检查模型文件存在且超过一定大小、检查GPU显存是否足够。把这些检查写在一起任何一步失败都弹出明确的中文提示而不是在后台抛异常。我在做自己的项目时就把这组检查写成了一个pre_flight函数后来每次跑新环境都先执行它一遍基本能杜绝答辩现场启动失败的尴尬。我在这些项目上的习惯是先让摄像头画面稳定显示再加检测逻辑先跑通单帧推理再接评分先导出CSV再画曲线图。每一步都可在5分钟内验证出错时也知道该回头查哪一层。这套系统的全部难点不是yolov5本身的精度而是行为判定和界面交互的稳态配合——希望你跑起来的时候比我省掉几个晚上的排查过程希望帮到你。本文还有配套的精品资源点击获取