课程专注度分析系统文档

发布于:2025-06-24 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、项目概述

本项目基于 Flask 框架开发,结合计算机视觉技术(利用 YOLOv10 等模型 ),实现对课堂视频的智能分析。可检测视频中学生手机使用情况、面部表情(专注、分心等 ),统计专注度、手机使用率等指标,生成可视化图表,辅助教师了解课堂状态。

二、功能架构

(一)核心功能模块

  1. 视频上传与管理:支持上传常见视频格式(mp4、avi、mov ),安全存储至服务器指定目录。
  2. 模型加载与推理:加载手机检测、面部表情识别模型,对视频帧进行分析,输出检测结果(如手机位置、表情分类 )。
  3. 数据分析与统计:统计视频中总学生数、专注度分数、手机使用比例、表情分布等,支持平滑处理优化数据。
  4. 可视化图表生成:生成专注度随时间变化曲线、表情分布饼图、手机使用频率柱状图,直观展示分析结果。

(二)流程逻辑

  1. 用户上传视频 → 系统校验文件 → 保存文件 → 加载模型 → 逐帧分析视频 → 统计与处理数据 → 生成图表 → 返回结果给前端展示。

三、技术实现

(一)环境依赖

  • 基础环境:Python(建议 3.8+ )、Flask 框架。
  • 计算机视觉:OpenCV(视频处理 )、PyTorch(模型推理 )、YOLOv10(目标检测 )。
  • 数据处理:Pandas(数据统计 )、Matplotlib(图表生成 )。
  • 其他:Werkzeug(文件上传 )、logging(日志记录 )等。

(二)关键代码解析

1. 模型加载(load_models 函数 )

python

运行

def load_models():
    models_loaded = True
    phone_model = None
    face_model = None
    try:
        # 加载手机检测模型,配置置信度、IOU 阈值,指定设备(CPU/GPU )
        phone_model = torch.hub.load('yolov10s.pt', 'custom', path='yolov10s.pt', force_reload=False)
        phone_model.conf = 0.45  
        phone_model.iou = 0.4   
        phone_model.to(DEVICE)  
        logger.info("手机检测模型加载成功")
    except Exception as e:
        logger.error(f"手机检测模型加载失败: {e}")
        phone_model = None
        models_loaded = False
    # 面部表情识别模型加载逻辑类似...
    return phone_model, face_model, models_loaded

  • 作用:初始化并加载目标检测模型,为视频分析提供推理能力;通过 try - except 捕获加载异常,确保系统鲁棒性。
2. 视频分析(analyze_video 函数 )

python

运行

def analyze_video(video_path, phone_model, face_model, models_loaded):
    cap = cv2.VideoCapture(video_path)  # 打开视频流
    # 初始化结果存储字典,包含学生数、手机使用帧数、表情统计等
    results = {
        'total_students': 0,
        'phone_usage_frames': 0,
        'emotion_frames': defaultdict(int),
        'frame_analysis': [],
        'detected_students': set()
    }
    while True:
        ret, frame = cap.read()  # 逐帧读取视频
        if not ret:
            break
        # 每隔一定帧数(analyze_every )执行分析,平衡精度与速度
        if frame_count % analyze_every == 0:  
            # 模型推理:检测人脸、表情、手机,统计结果
            face_results = face_model(frame)  
            phone_results = phone_model(frame)  
            # 数据统计与平滑处理...
            results['frame_analysis'].append(analysis_result)  # 保存帧分析结果
    # 计算平均专注度、手机使用率等指标,生成报告
    report = {
        'video_path': video_path,
        'analysis_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
        # 其他报告字段...
    }
    return report

  • 核心逻辑:通过 OpenCV 读取视频帧,调用加载好的模型进行目标检测;对检测结果统计、平滑,最终生成包含多维度指标的分析报告。
3. 图表生成(generate_charts 函数 )

python

运行

def generate_charts(report):
    charts = {}
    # 专注度随时间变化图表
    fig, ax = plt.subplots(figsize=(10, 4))
    timestamps = [frame['timestamp'] for frame in report['frame_analysis']]
    focus_scores = [frame['focus_score'] for frame in report['frame_analysis']]
    # 绘制折线图(含平滑处理 ),保存为 Base64 编码(方便前端展示 )
    ax.plot(timestamps, focus_scores, color='blue', linewidth=2)  
    canvas = FigureCanvas(fig)
    img = BytesIO()
    fig.savefig(img, format='png', bbox_inches='tight')
    img.seek(0)
    charts['focus_over_time'] = base64.b64encode(img.getvalue()).decode()
    # 表情分布饼图、手机使用频率柱状图逻辑类似...
    return charts

  • 实现思路:利用 Matplotlib 绘制可视化图表,将图表转换为 Base64 编码,便于通过 JSON 接口传递给前端页面展示。
4. Flask 路由与交互(app.route 装饰器 )

python

运行

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return jsonify({'error': '没有文件上传'}), 400
    file = request.files['file']
    # 校验文件、保存文件
    filename = secure_filename(file.filename)  
    file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)  
    file.save(file_path)  
    # 调用模型加载、视频分析、图表生成函数
    phone_model, face_model, models_loaded = load_models()  
    report = analyze_video(file_path, phone_model, face_model, models_loaded)  
    charts = generate_charts(report)  
    # 构造响应结果,返回给前端
    result = {
        'success': True,
        'filename': filename,
        'report': { ... },  # 分析报告关键指标
        'charts': charts,   # 可视化图表 Base64 数据
        # 其他字段...
    }
    return jsonify(result)

  • 交互流程:接收前端上传的视频文件,完成校验、存储后,调用核心分析逻辑,最终将分析报告、可视化图表通过 JSON 响应返回,支撑前端页面展示。

四、部署与运行

(一)环境搭建步骤

  1. 安装依赖

    • 确保安装 Python 环境,执行 pip install -r requirements.txt(需提前准备包含 Flask、OpenCV、PyTorch 等依赖的 requirements.txt 文件 )。
    • 若使用 GPU 加速,需额外配置 CUDA、cuDNN,确保 PyTorch 成功调用 GPU。
  2. 模型准备

    • 准备手机检测模型文件(yolov10s.pt )、面部表情识别模型文件(best.pt ),放置于项目目录。
  3. 启动服务

    • 执行 python app.py 启动 Flask 应用,默认监听 0.0.0.0:5000,可通过浏览器 / 前端请求访问接口。

(二)目录结构建议

plaintext

project/
├── app.py               # 主程序,包含 Flask 路由、核心逻辑
├── requirements.txt     # 依赖清单
├── uploads/             # 上传视频存储目录(自动创建 )
├── yolov10s.pt          # 手机检测模型文件
├── best.pt              # 面部表情识别模型文件
└── templates/           # 前端页面(如 face.html )

五、注意事项

  1. 模型依赖:模型文件(yolov10s.ptbest.pt )需与代码中加载路径一致,若路径变更,需修改 load_models 函数内 torch.hub.load 的 path 参数。
  2. 性能优化:视频分析耗时与视频长度、模型复杂度相关,可通过调整 analyze_every(分析间隔帧数 )平衡速度与精度;GPU 环境可显著提升模型推理速度。
  3. 错误处理:代码中通过 try - except 捕获部分异常,但实际部署需关注日志(logging 输出 ),及时排查模型加载失败、视频无法解析等问题。
  4. 前端适配:返回的图表为 Base64 编码,前端需通过 <img src="data:image/png;base64,{{ charts.focus_over_time }}"> 等方式渲染展示。

网站公告

今日签到

点亮在社区的每一天
去签到