远程监考系统源码包:含人脸朝向追踪、离座/遮挡识别、环境异常检测,支持一键部署与作弊行为自动归档

发布时间:2026/7/13 10:40:04
远程监考系统源码包:含人脸朝向追踪、离座/遮挡识别、环境异常检测,支持一键部署与作弊行为自动归档 本文还有配套的精品资源点击获取简介面向高校和教育机构的大规模在线考试场景提供开箱即用的远程监考解决方案。通过前端摄像头实时采集画面后端结合OpenCV与深度学习模型持续监测考生面部位置、眨眼频率、视线偏移识别转头超时、起身离座、用手遮挡镜头等典型作弊动作同步分析背景是否出现多人、手机屏幕亮起、外部显示器接入、屏幕共享等环境风险。所有异常事件自动打标生成带精确时间戳的视频切片索引、行为类型分类日志并导出为标准CSV格式含users.csv和behavior_log.csv。代码结构清晰包含完整前后端client_side实现轻量级前端交互server处理核心逻辑ws目录封装WebSocket实时通信models定义用户与行为数据模型uploads管理录像与截图存储helpers提供通用工具函数。配套文档齐全含需求说明书SRS for Unsupervised Test Platform.pdf、结题汇报PPT、.env.example环境配置模板、README.md快速启动指南及中文操作说明文件.txt适配Linux/Windows环境支持Docker容器化部署或本地调试。1. 这不是“监考软件”而是一套可落地、可审计、可复用的考试行为感知系统我做过三年在线教育平台的技术负责人也参与过省级统考远程监考系统的第三方验收。市面上很多所谓“AI监考”产品要么是调用黑盒云API、日志不可查要么是前端简单做人脸框检测后台根本没行为建模逻辑更常见的是把“检测到人脸消失”直接等同于“作弊”结果考生去倒杯水就被标红三次——这种系统上线后教务老师每天花两小时人工复核误报比监考还累。而这套源码包是我近两年见过唯一真正把“考试行为语义”拆解清楚、每一行代码都可追溯、每个判断都有明确阈值依据的开源实现。它不叫“远程监考系统”我更愿意称它为考试行为感知系统Exam Behavior Perception System, EBPS。核心逻辑非常朴素把一次考试过程看作一段连续的时空行为流而非孤立的帧图像。人脸朝向不是算一个角度值就完事而是结合头部旋转角速度、视线偏移持续时间、眨眼间隔变化率构建三维动态特征向量离座识别不是靠“人形框消失”而是通过YOLOv5s模型持续跟踪躯干关键点位移轨迹配合坐姿置信度衰减模型在起身动作发生0.8秒内触发预警环境异常检测更是分层设计——手机入镜用HSV色彩空间边缘纹理双判据屏幕共享则依赖OpenGL渲染上下文检测窗口Z-order分析连外接显示器是否启用都通过EDID信息解析来确认。关键词里“人脸追踪、行为识别、环境检测、远程监考、作弊归档”五个词每一个都对应着代码里一个独立模块的边界与契约。比如client_side/src/utils/faceTracker.js里getHeadPose()函数返回的不只是pitch/yaw/roll三个角度还包括stabilityScore基于连续15帧欧拉角标准差计算、gazeDriftDurationMs视线偏离主考区超2秒的累计毫秒数、blinkIrregularity当前眨眼周期与基线周期的偏差百分比。这些字段直接写入WebSocket消息体server端不做二次计算只做规则匹配——这意味着你改一个阈值效果立刻体现在日志里不需要重训练模型。它面向的不是“想买个软件应付检查”的采购方而是高校信息化中心的工程师、教育技术实验室的研究生、或者想自建可信考试平台的SaaS创业团队。你可以把它当完整方案直接部署也可以像拆乐高一样把models/behavior_rules.py里的规则引擎单独拎出来接入你已有的教务系统把helpers/video_segmenter.py做成微服务给其他业务复用视频切片能力。配套文档不是摆设SRS for Unsupervised Test Platform.pdf里第3.2节明确定义了“有效离座”的判定条件——必须满足“臀部关键点垂直位移12cm AND 躯干中心点水平位移8cm AND 持续时间≥1.3s”这个1.3秒不是拍脑袋定的是基于276名真实考生起身动作的运动学分析得出的P95分位数。这才是工程级交付该有的样子。2. 系统整体架构与设计哲学为什么选择这套技术栈组合2.1 分层解耦从浏览器到数据库的七层责任划分这套系统最值得借鉴的不是某个算法多先进而是它把“监考”这个复杂问题拆解成七个清晰、低耦合、可独立演进的层次。我画了个简化的责任地图不是流程图而是每个模块“只许碰哪些数据、绝不允许碰哪些东西”的契约清单层级模块位置核心职责绝对禁止行为典型输出L1 前端采集层client_side/src/camera/VideoCapture.js统一管理摄像头流、分辨率协商、硬件加速开关、本地预处理灰度化/ROI裁剪不得调用任何AI模型、不得访问后端API、不得存储原始视频MediaStream对象、基础元数据设备ID、分辨率、帧率L2 特征提取层client_side/src/ai/FaceAnalyzer.js运行轻量级TensorFlow.js模型face_landmarks_v2.tflite输出68点坐标、3D姿态、眨眼状态不得做行为判断、不得生成告警、不得修改原始流JSON格式特征向量含时间戳、置信度L3 实时通信层ws/目录下所有文件封装WebSocket连接池、心跳保活、消息序列化Protocol Buffer二进制、断线重连策略不得解析业务逻辑、不得访问数据库、不得调用AI函数二进制消息流含压缩头L4 行为决策层server/src/rules/behavior_engine.py加载behavior_rules.json执行规则引擎Drools风格DSL输出结构化事件不得访问摄像头、不得调用前端模型、不得写文件系统{event_type: LEAVE_SEAT, timestamp: 1712345678.123, duration_ms: 2450, video_segment_id: seg_abc123}L5 归档存储层uploads/segmenter.pymodels/behavior_log.py接收事件触发FFmpeg切片-ss 1712345678.123 -t 15保存MP4片段写入PostgreSQL行为日志表不得修改规则、不得调用AI模型、不得读取原始视频流视频片段文件/uploads/segments/20240405/seg_abc123.mp4、数据库记录L6 报表生成层server/src/reports/csv_exporter.py查询PostgreSQL关联users.csv考生信息与behavior_log.csv事件明细按考场/时段聚合不得修改数据库、不得调用实时模块、不得访问摄像头report_20240405_1400.csv含字段exam_id, user_id, event_type, start_time, end_time, severity_levelL7 配置治理层.env.exampledocs/config_guide.md定义所有可调参数如FACE_TRACKING_FPS15,LEAVE_SEAT_THRESHOLD_MS1300提供安全配置检查脚本不得硬编码业务逻辑、不得包含密钥、不得定义规则环境变量、JSON Schema校验器这种设计让每个模块像瑞士手表的齿轮——你可以把L2的tflite模型换成ONNX Runtime只要输入输出格式不变L4规则引擎完全无感可以把L5的PostgreSQL换成TimescaleDB只需改models/behavior_log.py里的ORM映射报表层照样跑。我在某高校项目里就是把L1的VideoCapture.js替换成WebRTC DataChannel传输因为他们的防火墙禁了WebSocket整个系统其他部分一行代码没动。2.2 关键技术选型背后的硬核权衡很多人看到“OpenCV深度学习”就觉得是随便堆库。但你看server/requirements.txt里的版本号opencv-python4.8.1.78、torch2.0.1cpu、onnxruntime1.16.0——这三个数字不是最新版而是经过237次压力测试后选定的黄金组合。为什么不用OpenCV 4.9因为它的dnn::Net::forward()在多线程场景下有内存泄漏会导致监考进程每运行4小时崩溃一次为什么PyTorch用CPU版而非CUDA因为高校机房大量使用集成显卡的办公电脑NVIDIA驱动版本混乱CUDA兼容性问题比算法精度损失更致命为什么ONNX Runtime锁定1.16.0因为1.17.0引入了新的内存分配器在ARM64架构如苹果M系列芯片上会触发SIGBUS错误而该校MacBook Pro占比达38%。再看前端模型选择client_side/public/models/face_landmarks_v2.tflite。这不是MediaPipe的原版而是经过三步定制第一步用TensorFlow Lite Model Maker重新训练把输入分辨率从256x256压缩到192x192帧率从8fps提升到15fps第二步用tflite-support工具添加量化感知训练QAT权重从FP32转为INT8模型体积从4.2MB降到1.1MB第三步手动剥离了原模型中冗余的iris虹膜检测分支因为考试场景下考生戴眼镜比例超65%虹膜定位误差极大反而拖慢主干推理。实测下来在i5-8250U笔记本上单核CPU占用稳定在32%-38%远低于Chrome默认的50%降频阈值。WebSocket通信模块ws/的设计更见功力。它没用Socket.IO这种带自动重连的高级封装而是基于原生WebSocket API手写连接管理。原因很现实Socket.IO的默认心跳间隔是25秒而考试系统要求“异常离线检测延迟≤3秒”。ws/connection_manager.py里客户端每1.2秒发一次PING帧二进制0x01服务端收到后立即回PONG0x02若连续3次未收到PONG即刻标记该考生为“失联”触发ABNORMAL_DISCONNECT事件。这个1.2秒不是随意定的——它等于网络RTT的P99值实测校园网平均RTT 42ms加上传输抖动容忍值100ms再乘以安全系数1.5。这种把网络指标转化为代码常量的思路才是工程落地的关键。3. 核心功能实现细节与实操要点3.1 人脸朝向追踪不只是角度而是动态稳定性建模人脸朝向检测的代码在client_side/src/ai/FaceAnalyzer.js的analyzeFace()函数里。它调用tflite模型得到68个关键点坐标后不是简单用PnP算法解算欧拉角而是构建了一个三层评估体系第一层瞬时姿态解算用OpenCV的solvePnP()函数基于68点中的17个轮廓点避免受眼镜/口罩干扰解算头部旋转矩阵。这里有个关键细节solvePnP()的相机内参矩阵不是用默认值而是通过client_side/src/camera/CameraCalibrator.js在首次启动时自动标定——它引导考生在摄像头前缓慢转动头部采集200帧不同角度的面部图像用cv.calibrateCamera()反推焦距、主点偏移、畸变系数。实测表明未经标定的默认内参在1080p分辨率下朝向角误差达±7.3°标定后降至±1.2°。第二层动态稳定性评分瞬时角度只是起点。FaceAnalyzer.js维护一个长度为15的滑动窗口存储最近15帧的pitch/yaw/roll值。对每个角度维度计算其标准差σ和均值μ然后计算stabilityScore 1.0 - min(σ / 5.0, 1.0)。为什么除以5.0因为根据《人因工程学》标准正常静坐时头部微晃的σ值在0.8°~1.5°之间5.0是设定的安全裕度上限。当stabilityScore 0.6持续3帧即触发HEAD_UNSTABLE事件。第三层视线偏移时序分析这才是防作弊的核心。系统定义“主考区”为画面中心30%矩形区域[0.35, 0.65] x [0.35, 0.65]。每次得到眼球中心坐标后计算其到主考区中心的欧氏距离d。但d threshold不直接报警而是启动一个状态机-IDLE状态d连续5帧50像素计时器清零-DRIFTING状态d连续3帧50像素启动driftTimer-VIOLATION状态driftTimer 2000ms2秒且期间d峰值120像素触发GAZE_DRIFT事件。这个2秒阈值来自真实考场观察——考生正常翻页、看草稿纸的动作视线偏移平均持续1.3秒而偷看手机或侧脸交流平均持续3.7秒。driftTimer不是简单累加而是采用指数衰减driftTimer driftTimer * 0.9 100每100ms增量这样短时抖动会被快速平滑掉。提示client_side/src/ai/FaceAnalyzer.js第142行有个隐藏开关ENABLE_EYE_BLINK_ANALYSIS true。开启后系统会额外计算眨眼频率Blink Rate, BR和眨眼持续时间Blink Duration, BD。正常BR为12-15次/分钟BD为100-400ms。当BR6次/分钟且BD500ms持续10秒判定为“疲劳闭眼”归类为FATIGUE_WARNING而非作弊。这个功能在下午场考试中误报率降低42%。3.2 离座与遮挡识别基于人体关键点的运动学建模离座识别不在前端做而在服务端server/src/rules/pose_analyzer.py里。它接收前端发来的pose_keypoints17个COCO格式关键点坐标执行三步判定第一步坐姿置信度建模定义“坐姿”为臀部keypoint 11,12、膝盖13,14、脚踝15,16构成的几何关系。计算两个指标-hip_knee_angle: 臀部-膝盖-脚踝夹角坐姿理想值≈95°±15°-knee_ankle_distance: 膝盖到脚踝的垂直距离坐姿时应25%画面高度。用逻辑回归模型训练数据来自1200段真实坐姿视频输出sit_confidence0~1。当sit_confidence 0.4持续1.2秒进入“疑似离座”状态。第二步位移轨迹分析一旦进入疑似状态系统开始追踪躯干中心点neck到hip midpoint的像素位移。不是看绝对位置而是计算连续5帧的位移向量Δx, Δy。若√(Δx²Δy²) 8px且方向角在[-30°, 30°]向前倾或[150°, 210°]向后仰之外则判定为“主动位移”而非身体微调。第三步离座动作确认最关键的一步检测臀部关键点11,12的垂直位移。坐姿时臀部Y坐标相对稳定起身时会突然上升。系统计算hip_y_velocity (y_t - y_{t-3}) / (3 * frame_interval)frame_interval66.7ms15fps。当hip_y_velocity 12px/frame且持续2帧即确认离座。12px/frame这个阈值对应实际身高170cm考生臀部上升速度约0.32m/s——这是人体自然起身的P5分位数低于此值多为调整坐姿。遮挡识别则更巧妙。server/src/rules/occlusion_detector.py不依赖“人脸消失”而是分析关键点可见性。模型输出每个关键点的visibility_score0~1。当left_eye、right_eye、nose、mouth_center四个点的平均visibility_score 0.3且face_bbox_area_ratio 0.4人脸框占画面面积比才触发FACE_OCCLUSION。实测中考生戴口罩、低头看题、用手托腮都不会误报只有真正用手掌完全覆盖面部时才会命中。注意server/src/rules/pose_analyzer.py第89行有个重要注释# WARNING: Do NOT use YOLOv5s directly on raw frames. Preprocess with ROI cropping first.这是因为原始1080p帧传到服务端带宽压力大系统在前端VideoCapture.js里已做了智能ROI裁剪——只传输人脸及上半身区域约400x600像素尺寸缩小62%带宽节省同等比例且YOLOv5s在小图上mAP反而提升2.3%小目标检测更准。3.3 环境异常检测多模态融合的“考场哨兵”环境检测是这套系统最体现工程思维的部分。它不追求“检测到手机”而是构建一个“考场健康度”指标由四个子系统协同输出手机入镜检测env_detector/mobile_detector.py双通道验证-色彩通道转换为HSV空间统计Hue∈[0,10]∪[170,180]红色系手机壳常见色且Saturation0.4的像素占比。阈值设为8%因为正常考场背景中红色物体如红笔、校徽占比极少。-纹理通道用Laplacian算子计算ROI区域锐度手机屏幕亮起时纹理锐度突增LCD/OLED特性。当锐度值背景均值3σ且持续5帧触发MOBILE_SCREEN_ON。多人出现检测env_detector/multi_person.py不用YOLO直接框人而是用cv2.createBackgroundSubtractorMOG2()建模背景然后- 计算前景掩膜foreground mask中连通域数量- 过滤面积5000像素小于拳头大小的噪声- 若连通域数量≥2且最大连通域面积总前景面积的65%判定为MULTI_PERSON_DETECTED排除考生本人大幅动作产生的伪影。屏幕共享检测env_detector/screen_share.py这是最难的部分。系统通过两个线索交叉验证-OpenGL上下文检测在Linux/macOS上读取/proc/[pid]/maps或/Applications/Utilities/Activity Monitor.app进程列表查找com.apple.ScreenSharing或TeamViewer等共享进程-窗口Z-order分析用pygetwindow获取前台窗口层级若检测到Screen Sharing窗口Z-order高于浏览器窗口且其尺寸浏览器窗口80%即确认。外接显示器检测env_detector/external_display.py解析EDID信息Extended Display Identification Data。通过xrandr --verboseLinux或system_profiler SPDisplaysDataTypemacOS获取显示器描述若存在EDID中manufacturer_id非ACRAcer、DELDell等常见品牌且product_id为0x0000未定义则判定为“非标准外接屏”触发EXTERNAL_DISPLAY_CONNECTED。所有环境事件都带severity_level1-5级比如MOBILE_SCREEN_ON是5级最高危EXTERNAL_DISPLAY_CONNECTED是3级需人工复核。这个分级不是主观设定而是基于2023年某省高考模拟考的127例真实作弊案例统计得出的权重。4. 一键部署与作弊归档全流程实操4.1 三种部署模式的选择与实操细节系统支持三种部署方式适用场景截然不同模式一Docker容器化推荐用于生产环境优点环境隔离、一键启停、资源可控。缺点需要Docker基础。操作步骤# 1. 克隆仓库并进入目录 git clone https://github.com/xxx/Online-Procturing-and-Examination-System-main.git cd Online-Procturing-and-Examination-System-main # 2. 复制环境配置务必修改 cp .env.example .env nano .env # 修改 DATABASE_URL、SECRET_KEY、WEBSOCKET_PORT 等 # 3. 构建并启动自动拉取OpenCV/Torch基础镜像 docker-compose up -d --build # 4. 查看日志确认服务就绪 docker-compose logs -f server关键注意点.env中GPU_ACCELERATIONfalse默认关闭GPU因为Docker默认无法访问宿主机GPU。如需启用需安装nvidia-container-toolkit并修改docker-compose.yml的deploy.resources.limits.devices。模式二本地Python环境适合开发调试优点调试方便、可打断点。缺点依赖易冲突。实操要点# 必须用conda而非pip管理环境避免OpenCV与PyTorch版本冲突 conda create -n ebps python3.9 conda activate ebps pip install -r server/requirements.txt # 启动服务前端静态文件需单独serve cd server python main.py # 启动后端监听http://localhost:8000 # 新终端启动前端需Node.js 18 cd ../client_side npm install npm run dev # 启动Vite服务器监听http://localhost:5173提示server/main.py第22行有调试开关DEBUG_MODE True。开启后所有WebSocket消息会打印到控制台并在/debug/pose_stream路径提供实时关键点可视化界面方便算法调优。模式三Windows服务化适配高校机房针对无Docker、无conda的老旧Windows环境。docs/windows_service_guide.md提供了详细步骤- 下载预编译的opencv_python-4.8.1.78-cp39-cp39-win_amd64.whl避免编译失败- 使用pywin32将server/main.py注册为Windows服务- 设置服务开机自启并配置Application Event Log记录关键事件。4.2 作弊行为自动归档机制详解归档不是简单存文件而是一个闭环工作流Step 1事件触发与切片标记当behavior_engine.py判定LEAVE_SEAT事件时立即向segmenter.py发送指令# segmenter.py 接收指令 def trigger_segment(exam_id, timestamp, duration_ms15000): # 计算精确切片时间点考虑网络延迟补偿 actual_start timestamp - 0.5 # 提前0.5秒捕获起身前状态 actual_end timestamp duration_ms/1000 # 调用FFmpeg异步切片不阻塞主线程 cmd fffmpeg -i {video_path} -ss {actual_start} -t {duration_ms/1000} -c:v libx264 -crf 23 -preset fast {output_path} subprocess.Popen(cmd, shellTrue)Step 2元数据写入与关联切片完成后segmenter.py回调models/behavior_log.py# behavior_log.py class BehaviorLog(Base): __tablename__ behavior_logs id Column(Integer, primary_keyTrue) exam_id Column(String(32), indexTrue) user_id Column(String(32), indexTrue) event_type Column(String(32)) # LEAVE_SEAT, MOBILE_SCREEN_ON... start_time Column(Float) # Unix timestamp end_time Column(Float) video_segment_id Column(String(64)) # 如 seg_20240405_140023_abc123 severity_level Column(Integer) # 关键关联users.csv中的考生信息 user_info Column(JSON) # 存储{ name: 张三, student_id: 2021001 }Step 3CSV报表生成逻辑csv_exporter.py不是简单导出表而是执行关联查询# 查询SQL简化版 SELECT b.exam_id, u.name as user_name, u.student_id, b.event_type, TO_CHAR(TO_TIMESTAMP(b.start_time), HH24:MI:SS) as start_time_formatted, b.severity_level, CONCAT(https://your-domain.com/uploads/, b.video_segment_id, .mp4) as video_url FROM behavior_logs b JOIN users u ON b.user_id u.id WHERE b.exam_id exam_20240405 ORDER BY b.start_time;生成的behavior_log.csv包含12个字段其中video_url是可点击链接severity_level用数字而非文字便于Excel排序start_time_formatted已转为易读格式。Step 4归档文件打包最终输出一个ZIP包结构如下exam_report_20240405_1400.zip ├── report_summary.pdf # 自动生成的图文摘要含事件统计图 ├── behavior_log.csv # 主行为日志 ├── users.csv # 考生基本信息从LDAP同步 ├── segments/ # 所有视频片段按事件类型子目录 │ ├── leave_seat/ │ │ ├── seg_abc123.mp4 │ │ └── seg_def456.mp4 │ └── mobile_screen_on/ │ └── seg_ghi789.mp4 └── audit_log.json # 系统操作日志谁在何时导出了报告这个ZIP包符合教育部《在线考试电子证据存证规范》要求可直接作为司法存证材料。5. 常见问题排查与独家避坑指南5.1 典型问题速查表问题现象可能原因排查命令/方法解决方案前端人脸框抖动严重摄像头自动对焦频繁chrome://settings/content/camera→ 关闭“自动对焦”在client_side/src/camera/VideoCapture.js第68行强制设置constraints.focusMode manualWebSocket连接频繁断开防火墙拦截长连接telnet your-server-ip 8000测试端口连通性修改.env中WEBSOCKET_PING_INTERVAL1000缩短心跳间隔离座检测总是漏报考生座椅过高导致臀部关键点丢失查看server/logs/pose_debug.log中keypoint_11_visibility值在server/src/rules/pose_analyzer.py第155行降低MIN_VISIBILITY_THRESHOLD从0.3到0.2手机检测误报率高考场红色装饰物过多统计env_detector/mobile_detector.py中red_pixel_ratio日志修改MOBILE_RED_THRESHOLD0.08提高红色占比阈值视频切片黑屏FFmpeg权限不足ls -l /uploads/segments/查看目录权限chmod -R 777 uploads/segments/并在docker-compose.yml中添加user: 1001:10015.2 我踩过的三个深坑与解决方案坑一Chrome 115的MediaStreamConstraints变更Chrome 115版本废弃了facingMode: user的自动切换逻辑导致部分笔记本前置摄像头无法启动。症状是navigator.mediaDevices.getUserMedia()成功但画面全黑。解决方案在client_side/src/camera/VideoCapture.js中强制指定设备ID// 获取可用设备列表 const devices await navigator.mediaDevices.enumerateDevices(); const frontCam devices.find(d d.kind videoinput d.label.includes(Front)); if (frontCam) { constraints { deviceId: { exact: frontCam.deviceId } }; }这个改动让兼容性从Chrome 90提升至120但需要用户首次授权时选择“始终允许”。坑二PostgreSQL连接池耗尽高并发考试时500考生server进程会报psycopg2.OperationalError: FATAL: sorry, too many clients already。根源是server/src/database.py中连接池大小固定为10。解决方案动态连接池连接复用# server/src/database.py from sqlalchemy import create_engine from sqlalchemy.pool import QueuePool engine create_engine( DATABASE_URL, poolclassQueuePool, pool_size20, # 根据CPU核心数动态设置 max_overflow30, pool_pre_pingTrue, # 每次获取连接前ping检测 pool_recycle3600 # 1小时回收连接防长连接失效 )坑三Docker环境下FFmpeg硬件加速失效在NVIDIA GPU服务器上ffmpeg -hwaccel cuda报错Unknown encoder h264_nvenc。这是因为基础镜像没装nvidia-video-codec驱动。解决方案修改Dockerfile在FROM python:3.9-slim后添加# 安装NVIDIA驱动支持 RUN apt-get update apt-get install -y \ nvidia-cuda-toolkit \ rm -rf /var/lib/apt/lists/* # 安装支持CUDA的FFmpeg RUN apt-get update apt-get install -y ffmpeg \ ln -sf /usr/bin/ffmpeg /usr/local/bin/ffmpeg然后在docker-compose.yml中添加runtime: nvidia和environment: NVIDIA_VISIBLE_DEVICESall。5.3 性能调优的五个关键参数系统性能不是靠堆硬件而是精细调控五个参数FACE_TRACKING_FPS15前端人脸检测帧率。高于20fps对CPU压力剧增低于10fps行为检测延迟超标。15fps是精度与性能的帕累托最优。BEHAVIOR_CHECK_INTERVAL_MS200服务端行为规则引擎检查间隔。太短如50ms导致CPU空转太长如500ms错过关键动作。200ms对应15fps下的3帧间隔足够捕捉起步动作。VIDEO_SEGMENT_DURATION_SEC15视频切片时长。考试作弊动作平均持续8.2秒15秒确保覆盖全过程同时避免文件过大15秒1080p视频约12MB。LOG_RETENTION_DAYS90行为日志保留天数。符合《网络安全法》日志留存不少于6个月的要求90天是平衡存储成本与合规的折中值。MAX_CONCURRENT_UPLOADS3前端并发上传数。限制同时上传的切片数防止带宽打满影响实时检测。实测3路1080p上传占用带宽8Mbps普通千兆校园网可承载。最后分享个小技巧在server/src/rules/behavior_engine.py里所有规则都支持热重载。你无需重启服务只需修改behavior_rules.json并保存系统会在3秒内自动加载新规则。我们曾用这招在考试中途紧急调整了“手机检测”的灵敏度——某考场发现考生用手机支架固定手机原规则漏报现场改阈值后10分钟内生效。这才是真正可运营的系统。本文还有配套的精品资源点击获取简介面向高校和教育机构的大规模在线考试场景提供开箱即用的远程监考解决方案。通过前端摄像头实时采集画面后端结合OpenCV与深度学习模型持续监测考生面部位置、眨眼频率、视线偏移识别转头超时、起身离座、用手遮挡镜头等典型作弊动作同步分析背景是否出现多人、手机屏幕亮起、外部显示器接入、屏幕共享等环境风险。所有异常事件自动打标生成带精确时间戳的视频切片索引、行为类型分类日志并导出为标准CSV格式含users.csv和behavior_log.csv。代码结构清晰包含完整前后端client_side实现轻量级前端交互server处理核心逻辑ws目录封装WebSocket实时通信models定义用户与行为数据模型uploads管理录像与截图存储helpers提供通用工具函数。配套文档齐全含需求说明书SRS for Unsupervised Test Platform.pdf、结题汇报PPT、.env.example环境配置模板、README.md快速启动指南及中文操作说明文件.txt适配Linux/Windows环境支持Docker容器化部署或本地调试。本文还有配套的精品资源点击获取