ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

航拍校园操场人体检测数据集构建与YOLO训练调优实战

航拍校园操场人体检测数据集构建与YOLO训练调优实战 先聊点实际的。航拍视角下做人体检测跟咱们平时地平线视角跑监控、拍街景完全是两回事。摄像头朝下俯视之后人的外形比例、互相遮挡关系、尺度大小全变了普通数据集训出来的模型拿到无人机画面上基本是“睁眼瞎”漏检漏到怀疑人生。我为了做校园操场这类场景的智能巡检和人流统计前前后后跑了大半年攒了一套专门针对航拍校园操场的人体检测数据集又用YOLO系列模型反复调参训练总算把整个流程跑通也踩了不少坑。这篇文章就把数据集的构建思路、标注细节、YOLO训练调优过程和排查心得一次说清楚给准备做航拍目标检测的朋友们一个可以直接参考的完整方案。1. 场景定位与需求拆解1.1 校园操场为什么值得单独做一套数据先说说我做这个数据集的出发点。校园操场是个很特殊的场景空间开阔但是人员密度浮动极大——课间操、运动会、体育课的时候几百号人挤在一起平时可能只有零星几个人在跑步踢球。这种极端的密度变化加上操场地面上的跑道线、足球场边线、篮球场标线给检测模型制造了大量“高级干扰”。我一开始偷懒直接拿COCO预训练模型去跑航拍画面结果误检一堆白线、树影和球门框架真实人员反而漏掉不少。这套航拍校园操场人体检测数据集的价值就在于把“俯视视角 操场环境 人体目标”绑定在一起让模型专门学习这类画面的特征。它的应用场景其实很明确校园安防巡逻、体育课学生数量统计、运动会人流密度分析、课间操出勤检测甚至还能接进注意力监测或者应急救援的辅助系统。如果你也在做类似的高空巡检、园区监测、体育场景分析这个数据集的构建思路和训练方案可以直接抄作业。1.2 航拍视角下的检测难点拆解航拍人体检测的难点跟地面视角完全不同我总结起来是四座大山。第一是目标尺度太小。无人机在30米以上高度拍摄时一个成年人只占画面几十个像素跟背景纹理差别不大传统检测头很容易直接忽略。第二是俯视视角带来的外观变化。地面视角下人体特征以“头肩轮廓”为主但航拍俯视时看到的是头顶、肩膀和背部的组合身体比例被压缩模型如果没有见过这种视角特征提取根本对不上。第三是密集遮挡。操场人多的时候前后左右互相遮挡严重目标之间边界模糊漏检和误检经常同时出现。第四是环境光变化。早中晚的太阳角度不一样影子长度完全不同操场的橡胶跑道反光程度也是变化剧烈如果数据集没有覆盖这些光照条件模型在换时段测试时性能会明显掉下来。这四座大山就是我在数据采集和标注阶段要重点解决的事情。2. 数据采集与标注工程2.1 采集方案无人机选型与飞行参数数据采集是数据集质量的地基这块偷不得懒。我用的是大疆Mavic系列无人机Air 2S和Mini 3 Pro都试过传感器尺寸足够大画质对目标检测来说绰绰有余。采集时重点控制三个参数飞行高度、云台角度和拍摄间隔。飞行高度我控制在20到40米之间。低于20米人物轮廓清晰但单张覆盖范围小飞行效率低高于40米人物像素太小标注和检测难度都会增大。云台角度是核心必须让镜头近乎垂直向下我通常设置在-80度到-90度之间。稍微带点倾斜角度会让目标外观变得奇奇怪怪训练出来的模型对视角过于敏感一点点角度变化就检测不准了。拍摄间隔我设为1秒一张无人机以约5米每秒的速度巡航确保画面之间至少有60%以上的重叠区域这样同一个目标能出现在多张图片里数据增强效果更好。光照覆盖方面我做了四个时段的采集上午7到9点影子长光线柔和、上午10点到下午2点顶光影子短反光强、下午3到5点侧光影子再次拉长、傍晚6点后光线变暗色彩偏暖。每种光照条件下都采集了足够多的素材模型对不同光线的适应能力才能拉满。注意如果飞行途中遭遇大风或者光线突然变化宁可后续重新补采也不要硬着头皮把一批画质不一致的素材混进训练集。模型对画面质量的敏感程度远比你想象的高。2.2 标注工具选型与类别定义标注工具我用的是CVAT在线版和LabelImg本地版。CVAT的AI辅助标注功能能省不少力气但校园操场上的人太密集AI辅助框经常给得不准确最后还得手动精修。LabelImg胜在轻量、单机离线可用不会有数据上传的隐私顾虑我最终大部分标注工作都是用LabelImg完成。类别定义上我坚持只标一个“person”类。一开始我也想过把“站着的人”“跑步的人”“躺着的人”分开标后来发现这些差异本质上是姿态变化同一个行人类别内YOLO模型完全能自己学到强行拆类反而会增加标注成本还会让每类的样本量不均衡。单一的“person”类让标注统一、训练集中、评估清晰。标注框的规范细节是容易忽略但影响极大的地方。我的标注规范是这样的框要紧紧贴合人体整体的可见范围如果人被部分遮挡按完整人体的外轮廓去标哪怕有一部分被挡住了也要框出来方便模型学习遮挡情况下的边界推断。图像中尺寸小于8像素的人形目标不标注。这种目标连人眼都只能凭经验推测强行标注只会给模型注入噪声让训练过程震荡。画面边缘被截断一半以上的人不标注否则框的形状和完整目标差异太大模型容易在边缘区域产生错误的检测偏好。2.3 数据集组织与划分策略数据标注完成后目录结构我是按照YOLO训练标准来组织的这套结构可以直接被Ultralytics框架读取dataset/ ├── images/ │ ├── train/ # 4200张 │ ├── val/ # 1200张 │ └── test/ # 800张 ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── data.yaml # 配置文件原始素材我采集了差不多8000多张筛选掉模糊、过度曝光、严重遮挡的无效画面后最终留下6200张有效图片。筛选标准很朴素画面中90%以上的目标人眼能确认且整体曝光正常、焦点清晰。标注出来的目标总数大约8.5万个平均每张图13人左右。单人场景和超密集场景50人以上的图片都保留了一定比例保证模型对极端密度都有感知。划分比例我采用了常规的70%训练、20%验证、10%测试。但这里有个关键的操作划分时务必保证同一批目标尽量只出现在一个集合里。无人机连续拍摄时相邻帧会拍到几乎相同的人群如果不打乱后随机划分训练集和验证集就会出现“近亲数据”验证分数虚高真正换一个新场景就露馅。按我说的划分方式做测试集上的指标才真实反映模型泛化能力。3. YOLO模型训练与调优3.1 环境搭建与预训练权重选择训练环境我用了PyTorch搭配Ultralytics YOLOv8框架这套组合目前生态最成熟、文档最全、踩坑的人最多也最好问。硬件是一张RTX 4090 24G显卡训练过程中显存基本吃满但性价比很高单卡就能完成整个数据集的训练任务。预训练权重直接从Ultralytics官方仓库下载yolov8m.pt就行不需要自己从头训练这能节省大量时间。模型选型上我在YOLOv8n、YOLOv8s、YOLOv8m之间都做过对比测试模型参数量mAP50mAP50-95推理耗时(TensorRT)YOLOv8n3.2M0.860.681.2msYOLOv8s11.2M0.900.732.0msYOLOv8m25.9M0.930.793.1ms在校园操场这种环境复杂度中等、目标尺度偏小的场景下YOLOv8m的精度提升很值推理耗时增加也不算多。如果你的部署平台是Jetson或者其他边缘设备可以考虑v8s做速度与精度的折中。3.2 data.yaml与训练参数配置解析data.yaml是整个训练流程的“总开关”配置非常简单但必须小心路径不能出错path: /path/to/dataset train: images/train val: images/val test: images/test names: 0: person关键信息是类别数量我这里只有一个类别所以nc参数在YOLOv8的模型配置里自动读取names长度就行不需要手动改模型文件。训练参数是我反复试出来的组合核心配置如下yolo train \ modelyolov8m.pt \ datadata.yaml \ epochs300 \ batch16 \ imgsz1280 \ patience50 \ optimizerAdamW \ lr00.001 \ lrf0.01 \ augmentTrue \ mosaic1.0这里面最值得强调的是imgsz输入图像尺寸的选择。航拍人体目标通常只有几十像素用默认的640尺寸训练时小目标被压缩得更小特征几乎丢失。我实测把输入尺寸从640提到1280后mAP50提升了接近8个百分点代价是显存和训练时间大幅增加。如果你的显卡显存低于16G建议用YOLOv8n或v8s配960的输入尺寸效果也比640强不少。batch size我选了16在24G显存上跑1280分辨率刚好是上限。如果显存不够梯度累积gradient_accumulation参数可以模拟更大的batch但要注意BN层的统计量可能受影响。optimizer上我最终选了AdamW而不是默认的SGD。航拍数据集相对垂直损失曲面复杂AdamW收敛更稳定特别是训练前期不会出现loss猛跳的情况。训练轮数设置了300轮配合patience50的早停机制。这个机制会在验证集指标连续50轮不再提升时自动终止训练避免过拟合也节省算力。3.3 训练过程监控与结果分析训练过程中要盯的关键指标是cls_loss分类损失、box_loss框回归损失和dfl_loss分布焦点损失。正常的曲线应该在训练初期快速下降大概50轮后进入平缓阶段。如果你发现loss曲线在100轮之后还在大幅震荡那通常是学习率过大或者数据里有标注错误需要停下来排查。模型训练完之后我习惯先看验证集上的PR曲线和混淆矩阵。PR曲线越贴近右上角说明模型在precision和recall之间平衡得越好。以下是我在测试集上得到的最终评估结果Precision: 0.95Recall: 0.91mAP50: 0.93mAP50-95: 0.79这个性能对于航拍校园操场场景已经相当能打。内存消耗上YOLOv8m全程训练大约需要11GB显存最高占用接近14GB实测单卡完成200轮训练约7小时速度完全可以接受。下载训练完的权重我习惯同时导出ONNX和TensorRT格式方便后面部署到边缘设备。导出命令很简单yolo export modelruns/train/exp/weights/best.pt formatonnx opset12 yolo export modelruns/train/exp/weights/best.pt formatengine device0导出TensorRT引擎时需要注意输入尺寸要和训练时保持一致否则推理时会重新预处理影响精度。4. 常见问题与排查实录4.1 小目标漏检从分辨率到模型结构航拍人体检测遇到最多的就是小目标漏检问题。我最初的模型在20米高度拍摄的画面中表现还行提高到30米后漏检率明显上升很多目标连框都没有。排查下来原因有两点一是输入分辨率不足640的默认尺寸让目标尺度缩小一半二是模型高层的特征图对细小目标不够敏感。我用的解法是分层递进。第一步把imgsz提高到1280这一步效果立竿见影漏检率直接下降了六成。第二步是优化推理时的预处理策略关闭测试时的letterbox缩放到训练尺寸的做法改用自适应缩放保留原始比例。第三步更费力就是把原始大图切成小块再分别推理最后合并结果。比如4000×3000的航拍图切成800×800的块均匀重叠100像素各自推理后按坐标映射回原图用NMS合并重复框。这个方法能显著捡回小目标的检测结果但推理总耗时增加了约4倍适合离线处理任务。如果切图后小目标还是漏检检查一下图片里目标的最小像素数是不是低于模型的下限。YOLOv8默认的检测头对小目标的锚点设计很不友好可以考虑加P2检测层或者改用专门的小目标改进版本。4.2 误检与背景干扰负样本和阈值调节误检问题主要集中在操场外的树影、跑道上的白色标线、以及看台区域的座椅纹理。我一开始看到模型把白线当成人的连续框哭笑不得。排查思路其实很清晰模型没有见过足够多的“操场背景没有人”的画面它不知道这些纹理长什么样应该被忽略。修复办法是往训练集里加大约10%的纯背景图这些图不包含任何目标标注文件为空。这个操作能让模型学到“这些场景里应该什么都没有”负样本学习是抑制误检最有效的手段。另外调整检测置信度阈值也能应急我把conf_thres从默认的0.25提高到0.35误检数量明显下降但代价是部分真目标也被过滤掉了适合快速上线但不宜长期依赖。4.3 训练稳定性问题BN崩溃与过拟合我在调试过程中遇到过两次训练直接崩掉的情况症状很有代表性。第一次是BNBatch Normalization参数崩溃特征是loss突然变成NaN或者inf曲线直接断裂。排查原因是学习率设置过高加上batch太小BN层的滑动统计量失衡。解决办法是把lr0从0.01降到0.001batch从8提到16问题立刻缓解。如果你用的是小显存显卡只能跑batch4那建议把模型换成更小的版本或者使用冻结前几层的方法减小显存压力。第二次是过拟合问题验证集loss和mAP在训练后期开始翻升。原因是我数据集里同一场景连续帧太多模型把“背景记忆”背下来了而不是学习到“人”这个抽象概念。解决办法是重新进行了数据清洗把连续帧抽取间隔拉大保证训练集中同一批人的画面不超过3帧。经过处理后的训练曲线明显更平滑最终mAP也提升了不少。4.4 混淆矩阵的“百分比总和不为1”迷思还有一个很常见的困惑很多人看完YOLO输出的混淆矩阵后发现所有格子加起来不等于100%就开始怀疑是不是模型出了问题。实际上YOLOv8生成的混淆矩阵默认是按“真实类别”进行归一化的每一行单独计算百分比而不是所有类别总数归一化。所以矩阵的每一行理论上加起来接近100%但整张表的总和自然超过100%。这个细节经常把人绕进去但它跟模型好坏没关系读的时候盯着每一行的数值就行。5. 后续扩展方向与个人体会数据集跑通之后我开始琢磨它的扩展性。目前的版本是单类别、单场景静态采集的下一步我想引入多机位交叠区域的再标注利用无人机重叠拍摄的部分做目标跨帧关联这样就能从检测升级到跟踪。再往后可以接一个轻量级的分类头把“站立”“跑步”“聚集”“跌倒”之类的行为标签加进去对校园安防来说价值会更大。以我个人实际操作中的体会来收尾航拍人体检测数据集的价值很大程度取决于你对场景细节的把控程度同样的目标数量标注规范性差10%最终模型精度就能拉开5个百分点以上。如果你想在这个方向做出真正能上线用的模型不要急着堆图片数量先把采集视角、标注复现性和场景光照多样性这三件事打磨好。另外训练阶段把输入尺寸给足用1280而不是640这是性价比最高的一步。把这个数据集方案复现一遍之后你再看普通航拍画面做检测就会觉得顺手很多。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进