基于YOLOv8的教室人数统计系统:从训练到边缘部署实战

发布时间:2026/9/9 23:21:06
基于YOLOv8的教室人数统计系统:从训练到边缘部署实战 简介这是一套面向计算机专业学生及开发者的YOLOv8教室人数统计系统源码采用Ultralytics YOLOv8目标检测模型可对教室内摄像头视频流中的人体进行实时识别与计数适用于课堂考勤、智慧教室、自习室管理等场景。资源包共63个文件压缩后仅2.99MB以Python代码和YAML配置为主28个py脚本涵盖模型训练、检测推理、数据标注转换等环节19个yaml文件用于配置模型结构与训练参数还包含Shell自动脚本、Docker部署文件、requirements依赖清单及README说明文档方便在本地或容器环境中快速复现。系统实现思路清晰读取视频流、送入YOLOv8模型检测人物、统计边界框数量、并在画面上叠加实时人数。源码预留了自定义数据集接口可直接替换自己的教室场景数据重新训练也可使用预训练权重直接运行检测。该资源已有369人浏览学习代码结构完整紧凑适合作为目标检测课程设计、毕业设计或人数统计项目的起始参考能帮助读者快速理解YOLOv8从训练到部署的全流程。1. 项目核心思路与整体设计讲实话教室人数统计这个需求在高校、培训机构甚至大型公开课场景里一直是个刚需。考勤、课堂活跃度分析、自习室座位管理都需要知道教室里到底有多少人。传统方案要么靠人力点名要么用红外对射或者压力传感器前者效率低后者只能判断有没有人坐根本分不清人和书包。这几年摄像头普及率上来了基于视觉的目标检测方案就成了主流选择而YOLOv8在其中确实是一个非常合适的切入点。选YOLOv8而不选老牌的YOLOv5或其他检测模型核心原因有几个。第一YOLOv8的C2f结构在特征提取上比YOLOv5的C3更强尤其在密集小目标的场景下c2f的多分支梯度流可以让浅层特征更丰富这对教室后排那些小尺寸人头来说很关键。第二YOLOv8把Anchor-Based换成了Anchor-Free省去了手动聚类anchor的环节训练部署都更省心。第三Ultralytics官方仓库维护得极其勤快文档完善预训练权重齐全从训练到导出ONNX再到TensorRT链路非常成熟。这套系统的整体架构其实不复杂一台固定机位的摄像头采集画面送入训练好的YOLOv8模型做推理检测出画面中的每个人然后通过计数逻辑统计人数再把结果推送到本地看板或数据库。难点从来不在于推一个模型上去跑demo而在于如何让模型在教室这个场景下保持稳定的高准确率如何在边缘设备上跑得动、跑得快以及如何处理好重复计数和遮挡漏检这些细节问题。适合来参考这篇内容的朋友我大概分三类一是拿这个题目做毕业设计的在校学生需要完整的方案和代码思路二是高校或培训机构的信息化老师想低成本落地一个人数统计工具三是对YOLOv8感兴趣、想通过一个实际项目把训练到部署全流程走通的开发者。不管你是哪一类这篇文章会按我从零搭建这套系统的顺序把每个环节的选型原因、参数细节和踩坑记录都讲清楚。2. 硬件选型与环境配置实测2.1 没有高端GPU也能跑——GTX 1660 Ti够不够用很多新手一上来就被动不动“双卡3090”的训练配置吓住了其实完全不必。我在开发阶段用的就是一块GTX 1660 Ti6GB显存跑YOLOv8n和YOLOv8s完全没有问题。这里要给一个明确的结论如果你只是做推理部署CPU都能跑只是帧率感人如果你要训练自己的数据集6GB显存足够跑YOLOv8n和YOLOv8sYOLOv8m会非常吃力。具体来说用COCO预训练权重做迁移学习的情况下YOLOv8s、输入尺寸640x640、batch size设为8显存占用大概在4.5GB到5.5GB之间1660 Ti能扛住。如果你加了Mosaic增强和多尺度训练显存会再涨一截这时候需要把batch size降到4。我的建议是训练阶段老老实实用YOLOv8n或YOLOv8s把精力放在数据质量上效果不会比强行上大模型差太多推理阶段如果要做边缘部署优先考虑模型剪枝和TensorRT量化。2.2 环境配置踩坑记录环境配置这块网上教程五花八门但其实核心就几步。我用的是Ubuntu 20.04 CUDA 11.8 PyTorch 2.0.1 Ultralytics 8.0.x的组合整体很稳。有个关键提示一定不要直接pip install ultralytics就完事建议先建虚拟环境再按顺序装PyTorch、装依赖、装ultralytics。我实际执行过的步骤供你参考# 创建虚拟环境 conda create -n yolov8 python3.9 -y conda activate yolov8 # 安装PyTorch注意对应CUDA版本 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 安装ultralytics及依赖 pip install ultralytics8.0.221 # 验证是否可用 python -c from ultralytics import YOLO; print(YOLO(yolov8n.pt))这里最容易出问题的坑是OpenCV和NumPy的版本冲突症状是import ultralytics的时候直接报segmentation fault。后来我查了半天发现是NumPy 1.24以上版本和旧版OpenCV的兼容性问题。解法也不难把NumPy降到1.23.5。还有一点容易被忽略的是如果你用Windows而不是Linuxultralytics在Windows上训练偶尔会报Dataloader的多进程相关错误这时候把workers参数从默认的8改成2或者0就解决了。总之环境这块只要版本不大乱来基本半小时能搞定。3. 数据集准备与模型训练实战3.1 数据采集与标注要点教室场景检测的标注目标我强烈建议只标“人”不要标“头”也不要去分“坐着/站着”。原因在于YOLOv8检测的是目标的边界框整人框在密集遮挡时框间重叠太严重NMS一压就漏检而只标头部的话训练出来的模型在侧身、低头这些场景下又容易丢目标。整人框配合合理的标注策略才是教室监控俯视或平视场景的最佳选择。数据采集阶段我的做法是连续一周每天在固定机位录制不同时段的视频提取关键帧做数据集。要覆盖这些情况早课学生刚入场走动多、上课中基本静止、下课大规模移动、阴天光照低、窗帘拉开逆光。最终累计了大概4000张有效图片说实话这数量不算多但胜在场景覆盖全。如果时间允许凑到8000到10000张模型的泛化能力会明显上一个台阶。标注工具我用的LabelImg标签类别就一个person。这里有个经验之谈密集场景下标注的时候能标多少标多少千万别觉得后排小人看不清就跳过。漏标一个训练的时候它就会成为误导样本让模型学会忽略小人。我第一版模型漏检严重就是吃了这个亏。3.2 训练参数与数据增强配置数据准备好后关键的训练配置需要根据自己的硬件来定。我用YOLOv8s训练了200个epoch输入尺寸640batch size 8。优化器用SGD初始学习率0.01weight decay 0.0005mosaic增强设置为1.0。这里特别想聊一下数据增强。YOLOv8默认开Mosaic、MixUp、HSV扰动、随机翻转等这些对教室场景非常友好。Mosaic把四张图拼在一起训练小目标出现的频率变相增加人头的检测能力会提升HSV扰动让模型对教室不同时段的光照变化不那么敏感。但有个度的问题如果数据集中小目标占比已经很高Mosaic过度反而会让模型对正常尺寸的目标失衡。我实测在150个epoch之前把Mosaic关掉只用flip和scale能让模型收敛更稳定。训练命令很简单yolo detect train dataclassroom.yaml modelyolov8s.pt epochs200 imgsz640 batch8 device0其中classroom.yaml里面指定训练集和验证集的路径nc改为1只有person一个类别。跑起来之后你会看到终端输出每个epoch的box_loss、cls_loss、dfl_loss这些数值整体趋势应当是下降的。3.3 损失函数曲线的判读技巧很多新手训练完只看一个mAP这其实是不够的。我建议拉开训练目录下的results.csv用matplotlib把box_loss、cls_loss、dfl_loss三条曲线画出来分别观察。box_loss下降说明边框回归在收敛cls_loss下降说明分类在变准如果cls_loss降到0.02左右就下不去了那通常是数据标注的边界噪声导致不用太焦虑。有一个判断过拟合的实用技巧当训练集的loss持续下降但验证集的loss在第150个epoch附近开始回升说明模型开始死记训练集了。这时候要么提前终止训练要么回调early stopping要么增加数据增强的强度。Ultralytics默认有早停机制patience设为50实测下来还是比较合理的。另一个我踩过的坑是关于学习率和batch size的配合。同样的数据batch size从8升到16的时候学习率也应该适当调大否则收敛速度明显变慢。如果你用Ultralytics默认的lr00.01batch size翻倍的时候可以试着提到0.02。当然这只是经验值具体还要看loss曲线的反馈。4. 教室场景检测难点与针对性改进4.1 密集遮挡与透视形变的破局思路教室人数统计真正难的不是“看清人”而是“看清后排的人”。一个常见的中型教室后排的人头在画面里往往只有二三十个像素这对检测器来说就是典型的小目标问题。很多初学者用YOLOv8s跑COCO预训练模型结果后排漏检率30%以上就开始怀疑模型不行。其实问题出在特征层上。YOLOv8默认有P3、P4、P5三个检测层分别负责小、中、大目标小目标由P3层输出。如果你的场景里小目标特别多可以考虑加一个P2检测头专门负责更浅层的特征。具体做法是修改ultralytics的yaml结构在backbone的P2位置引出一条分支。这个改动对密集小目标场景的提升非常明显我的实测中加上P2头后后排漏检率从35%降到了18%左右代价是推理速度掉了约20%。如果部署的是RK3588这类边缘设备这个代价需要认真权衡。提到YOLOv8 head改进网上讨论比较多的还有把Detect头里共享卷积换成解耦更彻底的结构或者引入G-FPN的思想做跨层特征融合。这些改动对精度确实有正收益但会显著增加代码改动量和调试成本。我的建议是除非你的项目就是研究改进算法否则不要在毕业设计或工程落地里过于激进地改网络结构很多时候调好数据和增强策略收益比改结构更大。4.2 光照变化与摄像头视角的应对策略教室另一个麻烦是光照。上午东侧的窗户阳光直射画面里靠窗区域的对比度极高逆光时人脸和衣服全部过曝到了阴雨天整个教室亮度又非常低。如果摄像头是固定的这个问题会好很多因为模型可以学到这个视角下不同光照的不同纹理但前提是你的数据集里要有这些光照变化。如果实测下来光照鲁棒性还是差我建议在预处理环节加一步推理时对输入帧做自适应直方图均衡化CLAHE限制对比度让过曝区域的细节稍微拉回来一点。这步用OpenCV一行代码就能实现对检测精度的影响在密集场景下通常是正向的。另外摄像头安装位置对检测效果的影响极其关键。我这套系统最开始装在教室正前方黑板上方结果后排全被前排同学挡住漏检惨不忍睹后来把机位调整到教室前侧天花板斜向下45度俯视遮挡问题立刻缓解了大半。5. 边缘部署从RK3588到Jetson Orin Nano5.1 模型导出与量化注意事项模型训练好了接下来要考虑部署。如果你只是在自己的电脑上跑个demoYOLOv8的PyTorch模型直接推理就行但想上RK3588或Jetson Orin Nano这类边缘设备就不能直接用了。RK3588用的NPU需要把模型转成RKNN格式。流程是先导出ONNX再用RKNN-Toolkit2把ONNX转成RKNN。我用的rknn-toolkit2版本是1.6.0对应的NPU驱动版本要匹配这一步坑很多。强烈建议先跑通自带的yolov8 demo确认环境没问题再转自己的模型。量化精度上RK3588的NPU支持INT8量化但YOLOv8对量化比较敏感我的实测是不量化FP16推理精度基本无损INT8量化后mAP掉了大概2到3个点但速度翻倍。教室里人数统计对帧率要求不高我最终选择了FP16稳定优先。Jetson Orin Nano那边就友好很多。直接用TensorRTUltralytics官方提供了导出脚本一条命令就能转成engine文件。命令大概是yolo export modelbest.pt formatengine device0TensorRT会自动做层融合和精度校准int8需要准备校准数据集fp16则不需要。5.2 计数逻辑不要只数这一帧的人部署模型之后计数逻辑反而是我花时间最多的地方。如果每一帧都直接数检测框数量会出现两个问题一是误检带来的数量抖动比如某个角落的阴影突然被识别成人计数立刻多一个二是同一时刻不同帧的检测结果不稳定导致结果跳动不适合直接展示给别人看。我的方案是引入一个带有滞后性的“确认计数”机制。具体做法是维护一个长度为30帧的滑动窗口对于画面中的每个检测框只有当它连续出现超过15帧才把对应位置标记为“有人”。检测框消失后也要求连续消失超过10帧才把位置清空。这样一个人进出画面时会有一个平滑的过渡过程不会出现数字疯狂跳动的情况。实际体验下来这套逻辑在50人的教室里计数误差能控制在2到3人以内。如果你还需要统计“进入”和“离开”的人数那就要引入跟踪算法了。YOLOv8官方集成了ByteTrack可以在检测的基础上给每个目标一个稳定的ID然后在画面中设定一条虚拟警戒线判断目标ID的轨迹是从线上方跨到下方还是反向分别累加进和出的数量。这一套逻辑做好就从一个单纯的人数统计工具升级成了教室进出管理看板。6. 常见问题速查与排错实录下面整理了一份我在开发和调试过程中遇到的典型问题按问题现象、可能原因和解决方案列出方便你对照排查。问题现象可能原因解决方案训练到一半显存溢出OOMbatch size过大或输入尺寸过高把batch size从8降到4或imgsz从640降到512训练时loss不下降学习率过高或数据集标注错乱降低学习率到0.001检查标签文件是否有空框、错误类别模型对小尺寸人漏检严重小目标样本不足或P3层特征不够增加后排小目标的标注、开启Mosaic增强、考虑加P2检测头推理速度很慢模型过大或未启用GPU推理换YOLOv8n、导出为TensorRT/ONNX确认device参数正确配置RKNN转换时报错RKNN-Toolkit2与NPU驱动版本不匹配严格按照官方文档组合版本先跑通自带demo计数结果反复跳动直接使用单帧检测结果按本文5.2节的滑动窗口确认机制处理逆光场景漏检多训练数据光照变化不足增加逆光时段数据推理前加CLAHE预处理还有一个容易踩的坑是数据集划分的比例。我在第一版训练时用了随机划分结果某些时段的数据全部进了训练集验证集和测试集都是另一个时段的导致验证指标虚高一上真实场景就露馅。正确的做法是按时间段划分前四天数据做训练第五天数据做验证。这样才能真实反映模型的泛化能力。另外建议在训练结束后用Ultralytics的val模式输出混淆矩阵和PR曲线重点关注person这个类别在低置信度区间是否还有明显的召回上升空间。如果PR曲线尾部掉得厉害可以考虑把推理时的conf阈值从默认0.25调低到0.15代价是误检会多一些需要和计数逻辑配合来过滤。最后分享一个实操中的小技巧在部署机上把模型推理和计数展示拆成两个进程用队列传数据。模型推理进程用多线程处理视频流保证帧率稳定展示进程只负责把计数结果绘制到画面并推送看板。这样即使展示端网络卡顿也不会拖垮推理进程。这套系统在RK3588上稳定跑了两周CPU占用率不到30%整体体验完全可用。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询