航拍视角下的人体检测实战:YOLOv8数据集构建与调参全记录

发布时间:2026/10/2 9:54:45
航拍视角下的人体检测实战:YOLOv8数据集构建与调参全记录 说实话看到这个标题的时候我第一反应是这哥们儿终于动手了。航拍校园操场的人体检测听起来就是用无人机往下拍、再用YOLO框人这么简单但真做起来你会发现从采集到标注再到训练每一步都是坑。我前后折腾了三个多月中间推倒重来了一次才把一套能用的数据集和模型跑通。这篇东西不整虚的把我踩过的坑、试出来的参数、改过的标注策略全写出来给后面想搞航拍视角目标检测的朋友当个参考。先交代一下背景。我做这个项目的直接动机是帮学校保卫处做一个操场人流密度预警的试点——用无人机在校园活动时段巡航实时统计操场上有多少人、人群有没有在局部区域过度聚集。这就涉及两个核心问题第一我要有一批符合航拍俯视视角的人体检测数据集第二我得基于这批数据训练出一个能在边缘设备上实时跑的检测模型。当时搜遍了网上公开的数据集VisDrone有俯视人群但场景太杂CrowdHuman全是平视视角COCO里的人物目标太大且背景是日常场景。拿这些模型直接往操场航拍画面上一跑效果惨不忍睹——漏检、误检、小目标糊成一团。所以结论只有一个自己搞数据集。1. 航拍人体检测和普通行人检测到底差在哪先说个反直觉的事航拍视角下的人体检测难度不在能不能检测到人而在怎么从一堆乱七八糟的俯视目标里把人挑出来。操场上有足球、篮球、白线、看台台阶、树的影子这些东西在俯视画面里跟人的特征很接近——都是深色团块带点轮廓边缘。YOLO不是人眼它学的是特征分布如果你的数据集里没有足够多难负样本模型就会把白线拐角、球门阴影当成人。另外一个关键差异是尺度。无人机在80米高度拍操场视野里一个成年人的身高也就占30到60个像素。这个尺度在YOLO的目标尺度体系里属于小目标小于32x32像素是极小目标32x32到96x96算小目标。而标签里如果全是这种小目标模型训练时很容易学不动因为下采样倍数高的特征图根本看不清这些目标。YOLO的检测头虽然分了P3/P4/P5三个尺度但默认配置对极小目标的召回率就是不行这个后面我会讲到怎么调。还有视角问题。平视行人检测数据集里人的头肩比、四肢展开角度是有规律可循的模型学到的其实是侧面/正面站立的人。航拍俯视看下去人体特征基本只剩头部圆斑 肩部椭圆 手脚运动产生的剪影变化而且互相遮挡严重——密度稍微一高一个人只露出半个头和一截肩膀。你拿CrowdHuman训练出来的模型去跑俯视画面它甚至会认为没有腿的人不是人。所以我当时定了一个原则数据集必须自采自标绝不混入平视视角的场景图。混用数据确实能提高泛化性但对于这种视角约束极强的场景混用反而会让模型内部特征冲突。2. 采集环节无人机选型、飞行参数和数据筛选2.1 飞行平台和相机的基本要求我手上有一台大疆Mini 4 Pro和一台Mavic 3 Enterprise实际测试下来搞数据集用Mini 4 Pro就够了核心参数是这三样有效像素4800万照片模式视频是4K/60帧。照片模式用于构建静态训练集完全够用视频模式用于后续抽取连续帧做时序增强。云台稳定性三轴机械云台悬停时画面几乎不抖这对小目标清晰度至关重要。RTK/GPS定位非必须但如果有可以在标注后按地理坐标做区域信息统计后面能关联到哪个区域人群密度高这类业务分析。飞行高度我测试了一下40米到60米是最佳区间。低于30米视野内只能覆盖半个操场模型学不到人群整体分布的上下文高于80米人的像素太小标注时边界框都不好打。我最终把主力采集高度定在50米镜头垂直向下90度这样人和人的间隔在图上大约30到50像素标注起来既准确又不过分难。2.2 拍摄时间窗口和光照策略这一点很多人会忽略你采集的数据如果全是晴天中午拍的模型遇到阴天或傍晚就直接崩。我的做法是分三个时段采集上午8:30到10:00顺光影子短人体轮廓清晰适合标注。下午15:00到16:30斜射光影子拉长模型需要学会区分人的影子和人本体。傍晚17:30到18:30光线偏暗色彩饱和度低人体与跑道颜色接近这是最难样本。三种光照下的图像按照大约6:2:2的比例混入训练集。实话说傍晚的样本只有两成但模型在傍晚场景下的检测能力提升是显著的——因为这批样本强制模型去学边缘纹理而不只是颜色块。2.3 连续帧抽帧策略无人机视频是30帧每秒你不能把每帧都拿去标注一是工作量爆炸二是相邻帧高度相似会让训练集产生严重冗余模型在验证集上指标虚高实际一跑视频就露馅。我的抽帧策略是这样的悬停拍摄时不抽帧只在无人机缓慢移动时按每秒1帧抽取。缓慢平移会让每帧画面里的目标位置、相互遮挡关系发生变化但又不会变化得太剧烈——这正好模拟了实际巡航时的画面变化节奏。抽完之后再去掉那些有明显运动模糊的帧这个可以用人工扫一遍也可以写个简单脚本用Laplacian算子算图像清晰度低于阈值的直接删。2.4 覆盖可能遇到的所有角度很多数据集翻车就翻在场景单一。同样是航拍操场你从正上方看和从45度斜上方看人体外观差异巨大。我用的是垂直90度拍摄为主辅以60度和120度云台角度保证数据集里既有标准的俯视图又有斜俯视图。比例大约7:2:1就够了斜视角只是用来提升鲁棒性不要喧宾夺主。此外还要覆盖不同时间段的操场状态——课间操、体育课、运动会、散场后三三两两的人这些分布密度差异大的场景都要有。3. 标注规范俯视视角下人的边界到底怎么框标注是数据集质量的关键环节也是最有学问的地方。航拍俯视图里人到底按什么框我当时反复试了几种方案最后定了一个自己的标注规范实践证明训练效果好很多。3.1 三种标注方式的对比紧贴外接矩形框tight bbox边界框完全贴合人体像素边缘。优点是定位精确但小目标容易因标注偏差引入噪声且密集人群互相靠近时框会相互重叠、裁切。扩大半身框loose bbox从头部中心往四周多扩几个像素框住头 肩 上肢摆动区域。这种框天然包含了一点背景但在俯视小目标场景下能显著减少目标边缘像素抖动导致的误检。躯干核心框只框头部和肩部忽略四肢。这种框在极低分辨率下最稳定但模型学不到人的整体形状对运动姿态变化的适应性差。我实测下来松紧适度、以头部为核心外扩的loose bbox效果最好。具体规则以头顶中心为锚点框宽头部宽的2.2倍框高头部高的2.8倍保证框住头部和肩部但不刻意去包四肢。原因是航拍画面里四肢运动幅度大、频繁变形标注时跟着四肢跑会让同一个人的标注框大小不断跳变模型训练时mAP和PR曲线都飘。把肢体运动当作噪声反而让模型专注于学习头肩结构的稳定性。3.2 遮挡目标的标注策略遮挡是航拍人体检测里逃不掉的问题。操场密度一高后面的人被前面的人挡掉一半这时怎么标很多教程说只标可见部分但我在实际对比中发现这个策略对俯视小目标场景并不好。我的做法是可见面积超过50%的目标按完整身体的外接框标用周边行人位置和操场尺度推测被遮挡部分的边界可见面积小于50%的目标直接不标作为难负样本。这样模型学到的是哪怕只能看到头肩也认为这是一个完整的人而不是学到只框可见的头——后者会导致模型对遮挡目标输出不稳定的小框给下游密度统计带来巨大误差。3.3 标注工具和质检流程标注工具我推荐X-AnyLabeling支持自动检测辅助标注。先用一个已经在VisDrone上预训练过的YOLOv8模型做自动预标注然后人工修正。注意预标注只是起个稿人工修正必不可少尤其是密集区域、遮挡区域和光照异常区域。质量检查的硬性要求有四个框的IoU与目标实际位置误差不超过5个像素小目标标准。漏标率低于2%复检时逐帧扫一遍尤其是人群密集区。禁止出现“一个目标标两遍”相邻框的IoU大于0.6且中心距小于10像素的人工确认。长宽比异常框比如框宽大于框高3倍的拿出来确认是否为误框操场白线或树影。我第一版数据集就是漏检了树荫下的人——那个区域人不仔细看根本发现不了标注人员全漏了结果模型在树荫区域的表现急剧下降。后来我把阴影区域强制二次检查写进了质检流程问题才解决。4. 数据增强让YOLO学会在难样本上不自暴自弃数据增强在航拍小目标检测里的作用比在大目标检测里重要得多。原因很简单小目标的特征本身就弱你不多给它一点变化中的正样本它就很难学到鲁棒的特征表达。4.1 常规增强和专项增强的组合我的训练管线里基础的增强手段包括随机旋转90度倍率任意角度航拍画面没有固定的上下方向旋转增强是必须的。水平/垂直翻转对称翻转简单有效。色域扰动HSV微调模拟不同天气和光照下的色彩偏移。随机缩放和裁剪YOLO自己带Mosaic增强把4张图拼成一张这个对小目标效果不错。但真正让精度拉高的是两个专项增强第一个是Copy-Paste贴片增强。我从标注好的小目标样本里把人的切片抠出来随机旋转缩放后贴到另一些没有人的操场背景图上同时生成对应的标注框。这个策略直接把稀疏场景变成密集场景模型被迫学习在拥挤中区分个体。我第一版模型在密集场景的召回率只有68%再加上贴片增强后直接跳到83%。第二个是随机遮挡模拟。训练时随机用一块与背景纹理相近的色块遮住目标的一角强制模型不要依赖完整的头肩轮廓而是学会用局部特征判断。这个对航拍场景的遮挡问题特别对症。4.2 针对极小目标的Slicing策略如果你的训练目标很多是小于32x32像素的YOLO默认的训练图尺度imgsz640会浪费大量计算能力。我的实测经验是开Slicing Inference切片推理训练和推理阶段都把大图切成512x512的重叠小块重叠率设为20%每个小块独立检测后再合并结果。这样做有个明显收益原来在整图中只有25像素高的人切片后在图块中能占到50到80像素特征表达清晰了检测精度自然上来。代价是推理耗时翻倍——但换回来的是mAP从72%涨到81%这笔账我觉得是值的。部署阶段我用TensorRT做加速能把耗时控制回可接受范围。后面部署节我再详细说。5. YOLO模型选型和训练调参的实测对比5.1 版本选型为什么没选最新版我试过YOLOv5、YOLOv8、YOLOv9和YOLOv11也用过带有Efficient Head改进的变体。结论可能和你想的不一样版本越新未必越好关键是任务适配。YOLOv5训练稳定生态成熟对自定义数据集的容错率最高小目标检测性能中规中矩。YOLOv8Anchor-Free检测头对小目标的定位精度比v5好但训练时对标签噪声更敏感标注稍微不齐mAP就会抖动。YOLOv9用了可编程梯度信息理论上信息保留更好但我实测训练速度比v8慢了约30%对硬件有要求收益在航拍场景不显著。YOLOv11最新版推理速度快但训练时对数据集分布要求更严格我的标注规范里loose bbox策略在v11上反而容易产生偏差。最终我的主力模型定在YOLOv8m 修改后的检测头结构。改动点是把P5检测层针对大目标的换成一层额外的P2检测层针对极小目标的也就是让模型在一个更低尺度的特征图上多输出一个检测头。这个改动来自小目标检测需要用浅层高分辨率特征图这个经典思路。YOLOv8自带的三个检测头基于P3/P4/P5最适合中等偏大目标而我的操场上绝大多数目标小于32像素放在P3层上只占8x8个像素特征根本不够。加了P2检测头之后小目标召回率肉眼可见提升。5.2 关键训练参数我的最终配置不说废话直接给参数python train.py --data campus_people.yaml \ --weights yolov8m.pt \ --model yolov8m.yaml \ --epochs 200 \ --batch-size 32 \ --imgsz 640 \ --device 0 \ --optimizer SGD \ --lr0 0.01 \ --lrf 0.01 \ --momentum 0.937 \ --weight_decay 0.0005 \ --warmup_epochs 3 \ --mosaic 1.0 \ --close_mosaic 10几个容易被忽略但至关重要的细节close_mosaic 10最后10个epoch关闭Mosaic增强。Mosaic虽然能丰富场景但它生成的是拼接感很强的图像如果一直用到底模型会对这种人工拼接产生过拟合推理时遇到真实连续画面反而发懵。最后关掉Mosaic让模型在正常照片上微调这个操作我对比过mAP能稳定提升1到2个点。imgsz别盲目拉大我试过640、768、960在同等epoch下640的收敛速度和最终精度反而最好。因为我的目标尺度本来就小imgsz拉大并不会给每个目标增加多少像素——那是切片推理的活不是训练尺度的活。你真正应该做的就是640训练切片推理。batch size在32附近比较合适我自己那块RTX 4090上跑32没压力。batch太小BatchNorm统计不稳定小目标检测尤其敏感batch太大显存不够的话梯度累积会让训练时间翻倍不划算。5.3 损失函数和训练过程观察点YOLOv8默认的损失函数是CIoU 分类BCE DFL的组合这套组合在航拍小目标上效果不错我没有做大的改动。但有一个点必须提醒训练曲线里val/box_loss和val/cls_loss会出现锯齿波动这在小目标数据集上非常正常不要因此就early stop。小目标本身的定位噪声大损失曲线天然不平滑。我判断收敛的标准是两个验证集mAP50连续30个epoch不再上升且PR曲线的拐点稳定。另外我在训练中试过一次NWDNormalized Wasserstein Distance替代IoU损失。NWD对小目标的定位误差更宽容在极小目标检测里论文说是有效的。实测确实有提升但提升更多体现在目标间的重合度判断上对目标的分类精度帮助不大。如果你的目标是数人而不是精确框人NWD可以加如果你的下游任务需要精准空间定位还是老实保留CIoU。5.4 处理类别不平衡就一个类的数据集也有坑我的数据集就只有person这一类别你可能会觉得不存在类别不平衡问题。但实际不然——存在的是尺度不平衡大目标近处的、画面下方的人和极小目标远处操场边缘的人数量差距悬殊。YOLO默认按图片分配采样权重不会刻意照顾小目标。我的解决办法是在数据加载层面做了按目标尺度分桶采样把标注框面积从小到大分成5个桶每个batch里保证从不同桶里都能抽到样本。这个策略相当于人为干预了模型对小目标的学习权重训练20个epoch后小目标的recall从74%提升到了81%。这是我自己写了个自定义Dataset去实现的如果你的框架支持自定义采样器强烈建议试一下。6. 评估、部署和数人业务落地6.1 评估指标的选取航拍人体检测数据集最忌讳只盯着mAP看。我的评估体系分三层检测精度层mAP50、mAP50-95、precision、recall。重点关注recall因为我的业务是数人漏检一个人比误检一个人代价更大。计数误差层计算每帧画面中人工标注的人数和模型检出人数之差用MAE平均绝对误差衡量。这是我的核心指标比mAP更贴近业务。部署性能层单帧推理耗时、显存占用、多路并发时的帧率稳定性。实话说mAP50我训练到0.86左右看着还行。但你要知道mAP50的阈值是IoU0.5对小目标来说只要框大概位置对就算对了这个指标有虚高成分。真正能反映框得准不准的是mAP50-95我的模型只有0.51——这就是小目标检测的残酷现实但业务上够用。6.2 TensorRT加速和DeepStream多路接入训练完成后我先把权重导出成TorchScript再转成TensorRT的engine文件。用的是FP16精度在RTX 4090上单帧推理耗时大约9毫秒640x640输入含切片推理后的合并。如果不上TensorRT原版PyTorch推理要28毫秒差距三倍。对需要实时巡航的无人机来说这个加速是必须的。很多做部署的朋友会忽略一个问题TensorRT的engine文件是和输入分辨率、硬件型号绑死的。我一开始在开发机上生成engine拷到部署机上直接报错后来在部署机上重新用相同的trtexec命令生成了一次才跑通。所以别偷懒engine一定在目标机器上现场转换。如果你要做多路视频流实时处理可以考虑DeepStream框架。它的设计思路是把视频解码、缩放、推理、跟踪、目标计数拆成流水线插件GPU利用率远高于每路视频起一个进程的土办法。我用DeepStream同时接了4路无人机画面每路720p/25fpsRTX 4090的负载只到40%左右。这个架构对一个监控室同时看多个操场的场景非常友好。6.3 数人逻辑从检测框到密度统计检测框本身不是业务结果业务要的是这个操场目前有多少人。我的统计逻辑是对每帧的检测框做按区域划分先把操场用透视变换映射成俯视平面图然后划分成若干区域格子比如每个篮球场、每个跑道段各一个区域。对每个区域做人数累计航拍画面存在遮挡单帧检测人数必然偏少。我的做法是对连续30帧取检测人数的中位数而不是平均值——中位数对偶发的单帧漏检更鲁棒。针对边缘目标被裁切的问题如果目标的中心点在画面边界外这个框不计入统计避免一个人被两帧重复计数。这套逻辑跑下来与人工数数的对照测试结果是人数在50人以下时误差在±2人人数在200人以上时误差在±8人左右。说实话做不到精确到个位但对预警操场是否过度拥挤这个管理需求来说完全够用了。6.4 误检的顽固来源我的血泪排查最后说一个我调试了最久的问题操场白线拐角和球门的误检居然杀不掉。无论怎么加负样本模型对特定区域的白线阴影交叉点始终有稳定的误检。我一度怀疑是标注问题结果查下来发现是数据增强里随机旋转90度带来的偏差——旋转后跑道的白色边线在某些角度下会形成类似人体肩部曲线的弧度。解决方案不是继续删误检样本而是在部署端加了一个简单的空间先验过滤用操场的地理信息标出不会有人出现的区域比如跑道外侧的草坪边界把检测框中心落在这些区域的直接滤掉。这个处理很聪明的一点是它不依赖模型而是利用场景的固定结构信息把模型学不会的由规则来处理。7. 个人对这套数据扩展方向的一些参考思路这套流程跑通之后其实可以顺带解决好几个衍生问题。一个是多模态数据融合如果飞机上带红外相机可以把红外图和可见光图做对齐给模型加一个红外通道夜间场景也能检测。另一个是轨迹预测在检测基础上加一个ByteTrack目标跟踪再对每个人的轨迹做短时预测就能提前预警人群朝某个出入口涌去的趋势。这个对运动会散场、紧急疏散的场景很有价值。还有一个很实际的方向是跨场景泛化。我目前只在两所学校的操场上采集过数据换一所跑道颜色不同的学校模型效果就会掉一点。如果后续要做一个通用航拍人体检测数据集建议在采集时就把跑道颜色红、蓝、绿、操场周围建筑、植被覆盖率这些变量拆开记录形成类似domain label的属性字段训练时按domain做平衡采样泛化能力能明显提升。说实话做数据集这件事投入产出比最高的部分永远在前期——标注规范、场景覆盖、数据清洗这些做扎实了后面调模型只是时间问题。我还记得第一版模型在夜晚照片上把路灯杆全部识别成人的时候整个项目组都在笑。后来我把路灯杆所在的固定区域全部加进难负样本包这类误检才算压住。所以做这类项目心态很重要你的模型不可能一次就完美数据集的迭代和模型的迭代是同步进行的急不得。

关于本文作者

来自尧图内容编辑团队

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

尧图内容编辑团队

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

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

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

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

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

网站改版的5个关键决策

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

获取专属建站方案

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

立即免费咨询