ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

构建监控视角行人排队检测数据集:从采集到YOLOv8实战

构建监控视角行人排队检测数据集:从采集到YOLOv8实战 简介这套由三七团队制作的行人排队检测数据集专为国内监控视角下的行人检测任务设计面向目标检测算法开发者和智能安防研究者适合用于Yolo等主流检测网络的训练与验证。压缩包共9864个文件包含4932张JPEG原始帧和4932个XML标注文件图像与标注一一对应Annotations目录存放行人边界框信息JPEGImages目录存放未处理的监控截图整体大小约947MB。素材采集自某高铁站监控场景覆盖密集排队、局部遮挡、不同光照等真实状况并附有拍摄原视频便于分析行人动态连续性及进行跟踪评估。标注工具采用labelimg标签统一为“行人”标注规范清晰方便二次筛选或迁移学习。目前已有703人学习下载适合需要真实场景数据支撑行人检测、人数统计或行为分析项目的开发人员使用。 在去年做的一个商超客流分析项目里我遇到一个特别尴尬的情况客户需要一个排队检测模块用来统计收银台和出入口的排队长度。我一开始理所当然地选了公开数据集来训练结果模型在测试集上跑得挺漂亮一到现场部署就露馅——俯视角度下大量小目标漏检、密集人群互相遮挡、玻璃反光和灯光变化直接把模型搞懵。问题根源不在模型结构而在训练数据跟国内实际监控场景差太远。找了一圈公开数据集不是跨视角行人检测就是自动驾驶场景的平视画面几乎没有专门针对国内监控视角排队场景的现成数据集。于是就有了这篇文章的主角一个自制行人排队检测数据集专门服务于这类落地需求。这篇文章会把我从零构建这个数据集的过程完整拆开包含场景怎么设计、监控视角怎么模拟、标注规范怎么定、数据怎么划分、以及用YOLOv8做基准训练时踩过的坑。无论你是要做行人排队检测还是想给自己项目做一个能用的垂直数据集这篇文章都值得看完因为掉过的坑我都替你踩了一遍。1. 为什么公开数据集解决不了排队检测的落地问题先聊一个我踩过最痛的坑公开数据集和真实监控场景之间存在严重的分布鸿沟。这里的分布不是说地域或人种而是摄像头成像物理条件带来的数据特征差异。先看一个最直观的差异——视角。最常用的行人检测数据集COCO和VOC绝大多数图像是手持设备或车载摄像头拍摄的平视画面行人大约占画面高度的一半以上。而真实监控摄像头的安装高度普遍在3米以上在排队场景中往往是侧上方或正上方俯拍一个1.7米的成年人投影到画面里可能只有几十像素高。模型在训练时根本没看过这种尺度和形变模式推理时漏检几乎是必然的。再一个是场景语义。公开数据集的背景通常是街道、广场、停车场而排队场景的背景是收银台、取餐口、安检机、医院窗口。这些场景里存在大量与行人外观相似或局部遮挡的物体购物车、行李箱、排队围栏、玻璃门反射的人影。没有这类负样本参与训练模型学到的特征就很容易被干扰物误导。还有一个被严重低估的问题——光照和画质。国内不少室内监控摄像头是模拟信号升级上来的分辨率只有720P甚至更低而且存在强背光、荧光灯频闪、夜间红外模式等复杂光照条件。COCO数据集里那种光线均匀、成像通透的图片在真实场景中占比非常低。我这么说不是在否定公开数据集的价值。公共数据集适合做预训练和算法选型但要做垂直场景的精准检测必须有一个贴近目标分布的自制数据集。这也正是我这个项目的出发点。维度COCO行人数据监控队列场景需求差距影响视角平视为主俯视30~60度目标形变差异大模型难以泛化目标尺度占画面比例大小目标占比高小目标漏检严重背景语义街道/广场收银台/闸口/窗口干扰误检成群出现光照条件均匀自然光室内灯光/背光/红外对比度低特征不稳定密度稀疏为主密集排队重叠遮挡导致漏检2. 数据采集用三脚架和手机模拟监控视角真实感怎样拉满既然目标是国内监控视角理论上最理想的做法是直接找监控合作单位拿录像但实际操作中涉及隐私和合规问题数据很难拿到。比较务实的方案是低成本模拟监控视角——用三脚架把手机或相机架到2.8~3.5米高度以俯视角度拍排队画面。设备清单很普通一台支持4K拍摄的手机或微单、一个最高能升到3米的三脚架、以及一个能控制快门线的蓝牙遥控器。为什么要4K因为4K素材下采样到1080P后边缘更干净而且可以裁出不同焦距的等效画面等于一份素材多份用。高度选择上3米左右是经过实测的折中值低于2.5米视角太平和公开数据集差距不显著高于3.5米在室内场所很难找到足够开阔的架设位置而且目标会小到失去标注意义。采集场景我覆盖了六个典型排队位置银行服务窗口、医院药房窗口、食堂打餐口、超市收银台、奶茶店出餐口、地铁站闸机口。每个场景至少拍摄3段不同时段的视频每段10~15分钟。重点拍摄早晚高峰时段因为排队检测的核心场景就是人流聚集。有个很多人忽略的细节镜头角度不能只固定在一种姿态。我特意在采集时把三脚架云台调节了3~5度让画面模拟不同安装工艺下摄像头的微小偏差。另外镜头尽量保持正对队列方向同时保留侧面斜对队列的画面这样模型能学到不同投影方向下的形态变化。隐私处理这块必须唠叨两句。我全程在自有场地、由朋友扮演排队人员没有拍摄任何真实顾客的清晰面部特征。这个操作既符合隐私合规要求也让后期开源分发少了很多麻烦。如果你要自己采集务必注意这一点不要直接采集公共场所的实时监控画面。3. 标注规范从person框到队列语义排队关系怎么标标注是自制数据集里最费时间也最决定上限的环节。排队检测如果只标人那和通用行人检测没有任何区别无法体现排队这一高级语义。因此我的标注体系分两层第一层是常规的person检测框第二层是队列分组标签用于后续行为分析与排队长度计算。我用的交互式标注工具是X-AnyLabeling它内置了YOLO和SAM模型可以先用预训练模型做自动预标注再人工修正。这个流程能让单人标注速度提升至少3倍。标注规范我拆成三条硬性规则一、遮挡目标处理。队列场景中人与人、人与护栏的遮挡非常常见。我的规则是目标可见面积若大于完整面积的40%就必须标注低于这个阈值但属于队列头部或尾部、对计算排队长度有意义的标注为person_occluded其他部分被严重遮挡且无分析价值的直接跳过。这样可以控制标注噪声同时不丢关键目标。二、排队关系表达。我定义了一个独立的属性通道用queue_id字段标注同一队列的人员分组。同一个窗口前纵向排列的连续人员属于同一个queue_id换取到另一条队伍的人启动新的queue_id。这个字段的存在让后续可以基于检测结果直接聚合出第几条队在排队、排了多长。这是公开数据集绝对给不了你的增量信息。三、边界目标。画面边缘出现半个身体的情况规则是头部或躯干中心在画面内就标注并且用truncated: 1标记这样训练时模型能学会对边缘目标给出不完整框的置信度处理。还有个实操细节标注时要把ignore区域也用起来。玻璃门反射的人影、海报上的人像、排队围栏上的人形图案都放进ignore区域。这些负样本不参与loss计算但能显著降低推理时的误检率。整个数据集最终标了12680张有效图像每张图像平均2~4人密度最高的收银台场景单张达到17人。标注总耗时约两周验证集显示标注框的回归误差控制在2.5像素以内满足训练要求。4. 数据划分与增强怎样减少相邻帧样本泄漏标注完成后数据划分是一个容易被做坏但又极其关键的步骤。尤其是从视频抽帧得到的数据集存在相邻帧高度相似的问题如果随机划分训练集和验证集会导致验证集分数虚高。在处理时我先把视频按时间窗口切成片段确保同一个队列状态的时间段落在同一个分片中然后以分片为单位划分。具体比例按场景维度做分层抽样每个场景分别分出训练80%、验证10%、测试10%避免某个场景在某个集合里缺席。这样测试集才能真实反映没见过的场景能检测成什么样。场景训练验证测试合计银行窗口21082632642635医院药房18122262272265食堂打餐口19562442452445超市收银台18962372372370奶茶店出餐口12081511511510地铁闸机口10911371361364增强策略上我刻意没有做夸张的仿射变换。因为监控视角属于固定视角场景目标姿态变化来自人的移动而不是相机运动过度旋转和缩放反而会引入训练分布外的样本。我实际采用的增强主要围绕弱光适应和分辨率鲁棒性随机亮度抖动、高斯噪声、JPEG压缩模拟、随机裁剪缩放。另外我做了少量MixUp增强对密集遮挡场景效果明显。数据增强后等效训练样本约25000张。5. YOLOv8基准训练与结果复盘密集场景mAP50接近0.95但小目标仍然拉胯数据集的终极检验是训练效果。我用YOLOv8m作为基准模型从COCO预训练权重开始微调。输入分辨率定在1280×1280而不是默认的640原因很简单排队场景中小目标占比高更高分辨率对召回率有直接帮助。对应代价是显存需求上升我在单张RTX 4090上把batch size设为16训练100个epoch大约6小时。关键训练参数记录一下初始学习率0.001使用余弦退火调度器weight decay设为0.0005防止小数据集过拟合mosaic增强在前10个epoch关闭避免小目标被Mosaic操作切碎导致训练不稳定。这些参数不是凭空来的是跑了三轮对比实验后的最优组合。测试集结果如下指标值mAP500.941mAP50-950.682小目标(≤32px)mAP500.873中目标(32~96px)mAP500.952大目标(≥96px)mAP500.977FPS(单卡4090, batch1)62mAP50接近0.95说明主流场景下模型表现已经具备实用价值。但注意看小目标mAP50只有0.873——结合真实应用场景这仍然意味着平均每100个排队人员里会有约12~13个漏检在密度极高的入口闸机场景还会更差。这个数字坐实了一个判断监控视角下算法的主要矛盾就是小目标模型结构和训练策略都必须为此服务。6. 小目标、密集遮挡和跨时段泛化部署时的三个必修课结果漂亮不代表能直接落地。我把测试集按特定维度拆开看发现了三个必须在部署前解决的问题。第一个是小目标漏检。阈值拉高到0.5置信度时漏检主要集中在距离摄像头较远的队尾人员这些目标实际高度只有15~25像素。解决思路有几个方向最简单的是切片推理——把原图切成四块分别推理再合并结果配合NMS去重。这个方案不改变模型但能把小目标的有效分辨率放大一倍实测mAP50提升到0.912。缺点是推理时间增加约2.5倍对实时性要求高的场景需要权衡。另一个方向是用P2层高分辨率特征图做检测头YOLOv8在P5层起跳对极小目标天生有缺陷可以尝试P2版本的改进结构。第二个是密集遮挡。排队场景中两个人前后重叠是常态单纯增大NMS的IoU阈值会把重叠目标合并降低又会导致同一目标产生大量重复框。我测试下来把YOLOv8的NMS IoU阈值设定为0.6~0.65比较合理。如果项目里对精确排队人数要求更高建议在检测后加一个人头关键点分支做二次校验因为排队场景中头部的遮挡模式比全身更可预测。第三个是跨时段泛化这个是我特别想提醒的。模型在白天正常光照下mAP50约0.95但只在夜景红外模式下测试mAP50直接掉到0.84。差距主要来自红外画面丢掉颜色特征以及灯箱高光区域产生误检。缓解手段是训练集中加入至少15%的红外或弱光样本。我目前的数据集在白天素材上偏多如果你要复刻记得压缩白天素材占比给夜间和黄昏段腾位置。部署方面顺手给个经验用TensorRT FP16做加速在Jetson Orin上整套推理能跑到28FPS左右配合按队列区域设置ROI可以过滤掉大量非排队区域误检。当然这是后话训练出合格模型才是第一步。7. 后续扩展从排队检测到排队时序分析既然数据集标注了队列分组信息下一步我计划把目标从框到人升级为理解队。一个比较自然的演进路径是把YOLOv8的检测结果按队列ID聚合结合ByteTrack做跨帧追踪这样就能得到每个队列的进入人数、平均等待时间、队列长度变化曲线。这些指标对商超和银行的运营调度决策非常有用。如果你打算沿用这个思路强烈建议在数据采集时保留原始视频的时间戳和帧率信息我因为部分素材没保留帧率导致后期做时序分析时需要对帧对齐额外花了不少功夫。最后给一个做数据集的老经验数据集的版本管理别用普通网盘扔一版就完事。我目前把标注文件、视频分片清单、训练脚本全部放在一起打标签管理每次修改标注规范就升一个版本后端配合Git LFS。这个习惯未来能帮你省下大量重训之前的排查时间。本文还有配套的精品资源点击获取
返回列表