1. 项目概述与背景
在传统课堂管理场景中,教师往往需要同时兼顾教学内容和学生状态,这种"一心二用"的模式容易导致教学效果打折扣。我们团队基于YOLOv5开发了一套课堂行为检测系统,能够自动识别六种典型课堂行为:举手(hand-raising)、阅读(reading)、书写(writing)、使用手机(using phone)、低头(bowing the head)和趴在桌上(leaning over the table)。
这个项目的技术价值在于将目标检测技术精准适配教育场景。相比通用目标检测,课堂行为识别面临三大特殊挑战:1) 行为间的相似性(如阅读和书写时的手臂姿态);2) 遮挡问题(课桌对学生身体的遮挡);3) 多角度拍摄带来的形变。我们通过改进YOLOv5的锚框设计和数据增强策略,使模型在教室复杂环境下仍能保持85%以上的mAP。
2. 数据集构建与处理
2.1 数据采集方案
我们采用"真实场景+模拟场景"双轨采集策略:
- 真实课堂拍摄:在3所中学的20个班级采集200小时视频,涵盖不同座位角度、光照条件
- 模拟场景搭建:在实验室复现典型课堂场景,补足罕见角度样本
特别注意:所有采集均获得校方和家长委员会书面授权,人脸区域在标注时进行模糊处理,符合隐私保护规范。
2.2 标注规范设计
采用YOLO格式标注,但针对行为检测特点做了以下优化:
- 对于连续性行为(如举手过程),标注动作峰值帧
- 遮挡处理:被课桌遮挡超过50%的身体部位用虚线框标注
- 复合行为标注:同时出现多个行为时(如边写字边低头),标注所有可见行为
标注文件示例(000001.txt):
code复制0 0.45 0.32 0.12 0.23 # hand-raising
3 0.67 0.81 0.08 0.11 # using phone
2.3 数据增强策略
针对课堂场景的特殊性,我们设计了分层增强方案:
| 增强类型 | 具体操作 | 解决什么问题 |
|---|---|---|
| 基础增强 | 色彩抖动、旋转15°内 | 光照条件变化 |
| 中级增强 | 模拟课桌遮挡、投影仪反光 | 真实场景干扰 |
| 高级增强 | 多人姿态合成、视角变换 | 罕见角度样本 |
特别有效的trick:在HSV色彩空间随机调整饱和度(0.5-1.5倍),能显著提升模型对投影仪光斑的鲁棒性。
3. 模型训练与优化
3.1 YOLOv5模型选型
对比不同规模的YOLOv5模型后,我们选择YOLOv5s作为基础架构,因其:
- 参数量仅7.2M,可在Jetson Nano等边缘设备部署
- 640×640输入分辨率兼顾精度和速度
- 通过深度可分离卷积优化计算量
模型结构改进点:
- 在Backbone末端添加SE注意力模块
- 将CIoU Loss改为α-IoU(α=3)
- 自适应锚框计算(每轮训练前重新聚类)
3.2 训练参数配置
关键训练参数(train.py):
python复制hyp = {
'lr0': 0.01, # 初始学习率
'momentum': 0.937, # SGD动量
'weight_decay': 0.0005, # 权重衰减
'warmup_epochs': 3, # 热身训练轮次
'box': 0.05, # 框损失权重
'cls': 0.5, # 分类损失权重
'fl_gamma': 1.5 # Focal Loss gamma
}
实际训练中发现两个重要现象:
- 使用AdamW优化器比SGD收敛更快,但最终mAP低0.3-0.5%
- 当batch_size>32时,模型对"低头"行为的识别率明显下降
3.3 模型评估指标
在验证集上获得的关键指标:
| 行为类别 | 准确率 | 召回率 | AP@0.5 |
|---|---|---|---|
| hand-raising | 89.2% | 85.7% | 0.872 |
| reading | 83.1% | 81.5% | 0.826 |
| writing | 84.6% | 83.9% | 0.841 |
| using phone | 91.3% | 90.1% | 0.902 |
| bowing the head | 78.5% | 76.2% | 0.781 |
| leaning over | 80.9% | 79.4% | 0.803 |
注:测试环境为RTX 3060显卡,输入尺寸640×640,Batch Size=16
4. 部署与优化技巧
4.1 推理加速方案
通过TensorRT优化使模型在Jetson Nano上的推理速度从15FPS提升到28FPS:
bash复制python export.py --weights best.pt --include engine --device 0 --half
关键优化点:
- 使用FP16精度推理
- 启用CUDA Graph
- 合并BN层与卷积层
4.2 实际部署问题排查
我们整理了常见问题及解决方案:
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 误检投影区域为手机 | 高光反射干扰 | 添加动态阈值分割预处理 |
| 后排学生检测率低 | 分辨率不足 | 采用ROI聚焦前排和后排区域 |
| 连续帧检测抖动 | 未使用时序信息 | 添加简单卡尔曼滤波 |
4.3 系统集成方案
整体架构采用"边缘计算+云端管理"模式:
- 边缘端:Jetson Nano运行检测模型
- 通信层:RTMP协议传输检测结果
- 云端:Flask服务提供行为分析API
核心接口示例(app.py):
python复制@app.route('/analyze', methods=['POST'])
def analyze():
video = request.files['video']
results = model(video.stream)
return jsonify({
'abnormal_behavior': results['using phone'].mean() > 0.1,
'engagement_score': calculate_engagement(results)
})
5. 实际应用案例
在某重点中学的三个月试运行期间,系统展现出以下价值:
- 课堂参与度量化:通过"举手次数/时长"指标,教师能精准识别需要关注的学生
- 教学效果优化:教师可根据"低头率"调整教学节奏
- 设备管理:手机使用检测准确率达到91%,有效减少违规现象
一个典型的使用场景是:当系统检测到连续5分钟"低头率"超过30%时,自动向教师终端发送提醒,教师随即发起课堂互动,使抬头率提升40-60%。
6. 常见问题与解决
6.1 标注相关问题
Q:如何处理部分遮挡的行为?
A:遵循"可见即标注"原则,如:
- 只看到手臂上举:标注为hand-raising
- 手机只露出边缘:不标注为using phone
6.2 模型训练问题
Q:为什么"低头"行为识别率偏低?
A:可通过以下方法改善:
- 增加俯拍角度训练数据
- 使用关键点辅助检测(鼻尖-下巴连线角度)
- 调整loss权重,增加该类别的分类损失系数
6.3 部署相关问题
Q:边缘设备上内存不足怎么办?
A:推荐三步优化:
- 使用--dynamic参数导出模型
- 减小输入尺寸到480×480
- 启用GPU内存池共享
经过实际项目验证,这套系统在保持85%以上准确率的同时,能在2000元以内的边缘设备上稳定运行。未来我们计划加入更多细粒度行为识别,如"记笔记"与"涂鸦"的区分,这需要设计更精细的局部特征提取模块。
