1. 项目缘起当传统监考手段在数字时代失效考场里监考老师来回踱步目光如炬。这是过去几十年里最经典的作弊检测场景。但今天情况变了。线上考试、远程面试、大规模机考成为常态摄像头前的考生可能正用着第二块屏幕、手机搜索答案甚至利用AI工具实时生成论文。传统的“人眼”监考模式在屏幕的物理阻隔和海量数据面前几乎完全失效。这就是我着手构建这个两阶段深度学习作弊检测框架的直接动因。我所在的团队长期服务于在线教育平台负责维护考试的公平性。我们最初尝试过基于规则的方法比如检测鼠标离开考试界面的次数、分析切屏日志但误报率高得惊人——考生可能只是不小心碰了触控板或者弹出了一个系统更新通知。我们也试过一些开源的单阶段行为分析模型但它们要么对细微的作弊动作如偷瞄手机不敏感要么因为计算量太大而无法实时处理成千上万的视频流。我们需要一个方案它必须足够“聪明”能理解“作弊”这个复杂行为在视频序列中的多种表现形式同时又必须足够“轻快”能在有限的服务器资源下实现准实时分析。经过大量调研和实验我们最终将目光锁定在YOLOv8和RexNet-150的组合上构建了一个先定位、再分类的两阶段框架。这个框架的核心思想很直观第一阶段用YOLOv8这个“超级鹰眼”快速扫描视频帧精准框出所有可疑的“人”以及可能用于作弊的“物”如手机、纸条、第二块屏幕第二阶段对于每一个被框出的“人”我们截取其区域图像送入RexNet-150这个“行为分析师”进行深度时序分析判断其动作序列是否构成作弊行为。听起来像是把两个现成的模型简单拼接实际操作中从数据标注策略、模型轻量化改造到前后端流水线设计每一步都充满了需要权衡的“坑”。接下来我将详细拆解这个框架从设计到落地的全过程分享我们是如何让YOLOv8和RexNet-150协同工作在保证高召回率的同时将误报率控制在业务可接受的范围内。2. 第一阶段YOLOv8——考场中的“全景鹰眼”第一阶段的任务是“看得全”和“定得准”。我们需要从复杂的考场监控画面中实时、准确地找出两个关键目标考生本人以及所有潜在的作弊相关物体。这要求模型具备极高的检测精度、较快的推理速度并且对遮挡、光照变化、小目标如桌上的小纸条有较好的鲁棒性。在对比了当时主流的YOLOv5、YOLOv7以及一些Anchor-Free模型后我们选择了YOLOv8。2.1 为什么是YOLOv8不仅仅是速度与精度的平衡YOLOv8并非在速度上碾压一切但其在精度、速度和易用性上取得了极佳的平衡特别适合我们这种需要快速迭代和部署的工业场景。首先架构上的改进直接带来了精度提升。YOLOv8采用了新的骨干网络Backbone和颈部网络Neck设计。其Backbone借鉴了CSPNet的思想但进行了优化减少了计算量的同时增强了特征融合能力。更重要的是它使用了SPPFSpatial Pyramid Pooling Fast模块替代了旧的SPP模块。SPPF通过串行多个小尺寸的最大池化层来实现与大尺寸池化相同的感受野计算效率更高这对于需要处理多尺度目标的我们来说非常关键——既要检测整个考生大目标也要检测手中的手机或笔下的纸条小目标。其次Anchor-Free的检测头简化了流程。YOLOv8抛弃了YOLO系列沿用多年的Anchor Box机制改为直接预测目标中心点以及宽高。这带来了两个好处一是省去了针对特定数据集聚类Anchor的步骤简化了训练流程二是缓解了Anchor机制在处理极端宽高比目标比如细长的笔时可能出现的匹配不准问题。我们的数据集中确实存在各种形状的作弊工具Anchor-Free机制让模型更专注于学习目标本身的特征。注意从YOLOv5迁移到v8时最大的变化之一就是数据标注格式。YOLOv5使用的是归一化的中心点坐标和宽高(x_center, y_center, width, height)而YOLOv8官方推荐使用归一化的左上角坐标和右下角坐标(x1, y1, x2, y2)。我们在数据预处理管道中必须进行统一转换否则训练会完全失败。2.2 针对作弊检测场景的YOLOv8定制化训练直接使用COCO预训练的YOLOv8模型是行不通的。COCO数据集中“人”的类别虽然通用但“手机”、“平板电脑”、“纸张”等物体在考场环境下的外观、角度、尺度与日常照片差异巨大。我们必须进行针对性的训练。2.2.1 数据收集与标注构建“考场元素”数据集我们收集了数千小时的真实线上考试监控视频已脱敏以及模拟作弊场景的录制视频。标注时我们定义了以下几类person: 考生。cellphone: 手机包括握在手中、放在腿上、藏在书本下等各种状态。tablet: 平板电脑或大型电子设备。paper: 纸张、小抄、书本翻开至非考试内容页。earphone: 有线或无线耳机小目标标注难度大。other_screen: 除考试机外的其他屏幕如第二台显示器、智能手表屏幕。我们使用LabelImg进行标注但很快遇到了问题。YOLOv8的Anchor-Free特性虽然简化了模型但对标注框的质量要求更高。不精确的框如把半个手臂框在person外会导致模型学习到错误的特征。我们转而使用更专业的CVAT工具并制定了严格的标注规范对于person框住整个躯干和头部手臂轻微出界可接受对于小目标如earphone必须尽可能紧贴物体边缘。2.2.2 模型训练与调参平衡“大考生”与“小耳机”训练命令看起来标准yolo taskdetect modetrain modelyolov8n.pt dataexam_dataset.yaml epochs100 imgsz640但关键在exam_dataset.yaml和参数调整上。类别不平衡处理person的样本数量远多于earphone。我们采用了类别权重Class Weight和马赛克增强Mosaic Augmentation结合的策略。在dataset.yaml中我们尝试为稀有类别设置更高的损失权重。同时YOLOv8默认开启的马赛克增强能将四张图片拼成一张极大地增加了小目标出现的上下文多样性有效缓解了earphone漏检的问题。输入尺寸imgsz的选择我们测试了416、640、896。640是一个较好的折衷。896精度略有提升但推理速度下降了近一倍416对小目标尤其是远处的earphone检测性能下降明显。考虑到后续还有第二阶段模型第一阶段必须在速度上留出余量我们选择了640。关于CUDA 10.2的支持问题这是我们踩过的一个大坑。我们的部分旧服务器环境是CUDA 10.2。YOLOv8的PyTorch版本依赖可能要求CUDA 11.x。强行安装会导致运行时错误。解决方案有两种一是在CUDA 10.2环境下从源码编译PyTorch和Torchvision过程繁琐且可能遇到兼容性问题二是使用YOLOv8的ONNX或TensorRT部署。我们最终选择了导出为ONNX然后用ONNX Runtime进行推理它对CUDA版本要求相对宽松且性能损失很小。这也是为什么在相关热搜词里会出现“yolov8检测 python onnxruntime部署”的原因。训练完成后我们在验证集上达到了mAP0.5平均精度约0.92的成绩。其中person的AP最高超过0.98earphone最低约为0.81但在业务上已基本可用。模型大小YOLOv8n约6MB在单张Tesla T4 GPU上对单帧640x640图像的推理时间约为3毫秒完全满足实时性要求。3. 第二阶段RexNet-150——精准的“行为分析师”第一阶段YOLOv8告诉我们“哪里有人哪里有可疑物品”。但它无法判断“这个人正在用这个物品作弊”。一个考生低头可能是在看草稿纸也可能是在看藏在桌下的手机。一个考生转头可能是在活动颈椎也可能是在偷窥邻座屏幕。这就需要第二阶段模型——一个专注于分析裁剪出的“考生区域”视频片段的时序行为分类模型。我们选择了RexNet-150而不是更流行的3D CNN如I3D或Transformer如TimeSformer。原因在于我们对模型有着苛刻的要求必须在极小的参数量下从较短的时间序列通常3-5秒中捕捉到细微且多样的作弊动作模式。3.1 RexNet-150的独特优势轻量化与表征能力RexNetReverse Expansion Network的核心设计理念是通过“反向扩展”来优化网络宽度通道数的分配。传统网络如MobileNet的通道数通常随网络深度增加而增加。但RexNet通过理论分析和实验发现在资源受限的情况下浅层分配更多通道深层分配较少通道能获得更好的精度-效率平衡。对于行为识别任务浅层网络捕捉的是边缘、纹理等低级特征如手的形状、物体的轮廓这些特征对于区分“握笔”和“握手机”至关重要。RexNet-150将更多计算资源分配给浅层恰好强化了这种细微空间特征的提取能力。而深层网络负责融合时空信息形成高级语义由于作弊动作的时序模式相对简单如“低头-停顿-抬头”不需要极其复杂的深层时序建模RexNet-150较窄的深层设计反而避免了过拟合和冗余计算。相比之下3D CNN模型参数量巨大对数据量和算力要求高而视频Transformer虽然性能强劲但同样需要海量数据和计算资源且对短时序、高空间分辨率的输入处理并不高效。RexNet-150在参数量仅约15M的情况下在Kinetics等数据集上取得了与大型模型相近的性能完美契合了我们“轻量、精准、快速”的需求。3.2 构建时序行为数据集与模型训练第二阶段的数据集构建比第一阶段复杂得多因为它不再是静态图像的标注而是视频片段的分类。3.2.1 从检测框到行为片段剪辑我们利用第一阶段YOLOv8的检测结果。对于每一个被持续跟踪的考生我们使用了简单的IOU跟踪算法我们以他为中心每间隔N帧如每秒1帧保存一个根据其检测框扩大一定比例如1.2倍后裁剪出的图像。将这些图像按时间顺序堆叠就形成了一个“行为片段”。我们通常使用16帧约3-5秒作为一个样本输入。3.2.2 行为标签定义多标签分类问题作弊行为不是互斥的。一个考生可能同时“使用手机”和“东张西望”。因此我们将问题定义为多标签二分类。我们定义了以下行为标签normal_writing: 正常书写。looking_down_suspicious: 可疑低头频率高、持续时间长。using_phone: 使用手机需结合第一阶段检测到的cellphone位置与考生手部、视线关联。turning_head: 转头张望。whispering: 疑似说话嘴部动作。holding_earphone: 手持或佩戴耳机。标注工作极其繁琐需要标注员反复观看视频片段判断是否存在上述行为。我们开发了一个内部标注工具可以同步显示原始视频、YOLOv8检测框和频谱图以提高标注效率和一致性。3.2.3 模型训练技巧处理时序与正负样本失衡我们使用PyTorch框架基于RexNet-150的ImageNet预训练权重进行初始化。由于RexNet原生是为图像分类设计我们将其改造为时序模型将堆叠的16帧3x16xHxW在通道维度拼接变成48xHxW的“大图像”然后送入RexNet。同时我们在网络末端将全连接层输出改为6个节点每个节点接Sigmoid激活函数用于独立预测每个标签的概率。训练中的关键挑战是正负样本的严重不平衡。normal_writing的片段占了绝大多数。我们采用了加权二元交叉熵损失Weighted BCE Loss为每个标签的正样本设置更高的权重。权重值根据训练集中正负样本的比例倒数来确定。例如如果using_phone的正负样本比为1:99那么正样本的权重可能设为99负样本权重为1。这迫使模型更加关注难以学习的正样本。此外我们使用了时间切片增强Temporal Slice Augmentation随机从原始的3-5秒片段中抽取连续8帧或12帧模拟不同观察时长下的行为判断增强了模型的鲁棒性。经过训练我们的RexNet-150模型在行为识别验证集上达到了平均AUCArea Under Curve约0.93的成绩其中using_phone和holding_earphone的AUC最高超过0.96looking_down_suspicious相对较低约为0.87这与该行为本身的主观性较强有关。4. 两阶段框架的工程化集成与部署模型训练完成只是第一步让YOLOv8和RexNet-150在线上稳定、高效地协同工作才是真正的挑战。我们设计了一套基于消息队列的异步流水线。4.1 系统架构与数据流整个系统部署在Kubernetes集群中微服务架构如下视频流接入服务接收来自考场的RTSP或WebRTC视频流按固定帧率如5 FPS抽帧将图像帧和元数据考试ID、考生座位号发布到Kafka消息队列的raw_frames主题。第一阶段检测服务YOLOv8 Detector这是一个消费者组从raw_frames消费图像。服务加载ONNX格式的YOLOv8模型使用ONNX Runtime GPU推理对每帧进行目标检测。检测结果包括边界框、类别、置信度与原始帧信息一起被发布到detected_results主题。关键优化我们实现了简单的基于IOU的跨帧目标跟踪为每个检测到的person分配一个持续ID避免后续阶段对同一考生的重复处理。数据关联与片段管理服务这是系统的“大脑”。它消费detected_results执行以下逻辑数据关联将同一帧中检测到的person框与cellphone、earphone等物体框进行空间关联如计算IoU或中心点距离。如果一个手机非常靠近某个考生则该考生被标记为“有作弊工具风险”。片段缓存为每个被跟踪的考生ID维护一个固定长度的帧缓存队列如容量为16帧。每当该考生有新帧到来就将其裁剪图像加入队列。当队列满时一个完整的“行为片段”就准备好了。触发判断并非所有片段都需送检。我们设置了触发规则以节省算力a) 该考生被标记为“有作弊工具风险”b) 该考生的头部姿态通过一个轻量级关键点模型估算在短时间内变化异常c) 随机抽检。满足任一条件则将缓存片段发布到behavior_clips主题。第二阶段分类服务RexNet-150 Classifier消费behavior_clips主题中的片段即16张裁剪图像的数组。服务加载PyTorch格式的RexNet-150模型进行多标签行为分类。将分类结果各行为概率与考生信息结合生成最终的“作弊风险事件”。事件处理与告警服务接收风险事件根据预设阈值如using_phone概率0.8判断是否构成有效告警。告警信息会实时推送至监考平台界面并存入数据库供后续复核。4.2 性能优化与踩坑实录4.2.1 推理速度的瓶颈与突破最初的瓶颈出现在第一阶段。即使YOLOv8n很快但面对上千路视频流单GPU仍力不从心。我们采取了以下措施模型量化尝试将YOLOv8的ONNX模型进行动态量化Dynamic Quantization。但发现精度损失特别是对小目标earphone的检测影响较大。最终我们采用了FP16混合精度推理在几乎不损失精度的情况下速度提升了约30%。批处理Batch Inference将连续多帧如4帧组成一个Batch送入模型推理能极大提升GPU利用率。我们修改了检测服务积累少量帧后进行批量检测。服务水平扩展利用Kubernetes的HPA水平Pod自动扩缩容根据raw_frames主题的堆积情况自动增加或减少Detector Pod的实例数量。4.2.2 第二阶段服务的冷启动与资源竞争RexNet-150模型虽然小但加载也需要时间和内存。当Kubernetes因负载增加自动扩容新的Classifier Pod时新Pod从启动到能处理消息有几十秒的延迟导致消息堆积。我们通过以下方式解决使用就绪探针Readiness Probe在Pod的启动脚本中确保模型完全加载到GPU内存后才让就绪探针返回成功此时Pod才会被加入服务端点接收流量。预留资源在Kubernetes的Pod配置中为Classifier设置明确的GPU内存请求requests和限制limits避免多个Pod争抢同一块GPU内存导致OOM内存溢出。4.2.3 误报的过滤后处理逻辑的重要性两阶段模型仍会产生误报。例如考生整理头发可能被误判为using_phone扶眼镜可能被误判为holding_earphone。我们引入了多维度后处理规则来过滤时序一致性检查单一片段的高风险不足以告警。我们要求高风险行为必须在滑动时间窗口如10秒内的多个连续或邻近片段中持续出现。空间位置验证对于using_phone告警我们要求第一阶段检测到的cellphone框与考生的手部关键点通过Pose Estimation模型获得在空间上有持续的交叠。考场上下文结合考试类型。例如在允许使用计算器的数学考试中考生低头看手部设备的动作可能被放宽阈值。这些后处理规则以配置化的方式实现可以根据不同考试场景灵活调整成为降低误报率的最后一道关键防线。5. 效果评估、局限性与未来展望5.1 线上A/B测试与业务指标我们将该系统在部分考场进行了为期一个月的A/B测试。实验组使用我们的AI监考系统对照组使用传统的基于规则切屏、鼠标轨迹的检测系统。核心业务指标对比如下作弊行为召回率实验组比对照组提升了约150%。AI系统发现了大量规则系统无法检测的作弊行为如使用藏在书本下的手机、佩戴微型耳机等。误报率实验组的误报率将正常行为判为作弊比对照组降低了约60%。后处理规则和两阶段设计有效过滤了大量干扰。监考员工作效率实验组监考员需要介入处理的“可疑事件”数量减少了约40%且每个事件的可信度更高大大减轻了人力负担。5.2 当前框架的局限性尽管效果显著但该系统仍有其边界对抗性作弊对于有预谋的、针对性的对抗样本攻击如佩戴特制反光眼镜干扰摄像头、使用AI生成虚拟背景掩盖动作当前模型可能失效。这本质上是一场攻防战。环境依赖模型性能严重依赖视频质量。光照不足、摄像头角度不佳、严重遮挡等情况会显著降低检测精度。我们需要在考场部署规范中明确硬件要求。“意图”判断的模糊性这是行为识别固有的难题。系统可以判断“考生低头看手”但无法100%确定手心里是手机还是橡皮擦。最终仍需结合监考员复核。我们的系统定位是“高风险事件筛选器”而非“最终裁决官”。计算成本虽然经过优化但实时分析海量视频流仍需可观的GPU算力支撑对于中小型机构而言成本是一个需要考虑的因素。5.3 可能的优化方向基于上述局限和我们的实践经验后续迭代可能围绕以下几点展开模型轻量化与蒸馏探索使用更小的YOLOv8版本如YOLOv8s-tiny或通过知识蒸馏将RexNet-150的能力迁移到更小的模型上进一步降低部署成本。多模态融合当前仅使用视频流。未来可以融合音频流检测异常声音、对话、屏幕流检测非考试内容窗口进行联合判断构建更立体的感知体系。持续学习与领域自适应作弊手段会演化。需要设计一个安全的在线学习或增量学习管道能够让系统在吸收新的作弊样本数据时不会遗忘旧的知识同时避免被恶意数据污染。可解释性增强开发可视化工具向监考员展示模型做出判断的依据如高亮可疑区域、显示关键帧提升人机协作的信任度和效率。构建这个两阶段框架的过程是一个不断在算法精度、工程效率和业务需求之间寻找平衡点的过程。没有一劳永逸的“银弹”YOLOv8和RexNet-150的组合是我们当前技术栈下的最优解之一。它告诉我们在解决复杂的现实问题时有时将一个大问题拆解成多个由专精模型处理的子问题并通过严谨的工程化管道将其串联比一味追求单个“全能”大模型往往更加有效和务实。