
简介电梯内人车识别目标检测数据集面向计算机视觉入门者与工业安防场景开发者聚焦电梯内人、摩托车、自行车的多类别检测任务。压缩包共两千个文件包含一千九百九十九个文本标注文件和一个类别配置文件打包体积约一百九十三兆字节所有标注文件均采用归一化的YOLO格式。每个文本文件对应一个电梯监控样本逐行记录目标类别ID与边界框坐标配置文件则定义了person、motorcycle、bicycle三个类别可直接接入YOLOv5至YOLOv10等系列训练框架。标注文件名内含电梯摄像头编号与采集时间戳便于按不同场景拆分数据、追踪样本来源也可用于Faster RCNN、SSD等模型的对比训练。该数据集已有201人浏览学习适合作为电梯环境目标检测的快速起步基准与辅助训练资源。1. 电梯内人车识别数据集专门治“人推着电动车进电梯”这类漏检做过电梯内非机动车治理项目的人几乎都遇到过同一个翻车场景摄像头确实拍到了人推着电动车进电梯但模型只框出了人把身后的摩托车当成了背景。这个“电梯内人车识别数据集”就是直接冲着这个场景去的。97张精标图片类别收敛成 person、motorcycle、bicycle 三类YOLO txt 标签配 yaml 配置文件Roboflow 导出结构拿过来可以喂给 YOLOv5 到 YOLOv10 任意版本的训练管线。适合正在做电梯监控、小区电动车禁入、园区安防等方向的目标检测从业者也适合想拿小数据集快速练手 YOLOv8 训练流程的新手。2. 数据长什么样从文件名反推采集现场与标注结构2.1 文件名里的信息摄像头编号、时间戳与样本来源拿到压缩包先别急着解压训练先把文件名读一遍这里面的信息比想象中多。从这批文件名能清晰看到两条采集线索文件名模式含义推断信息person_in_elevator_3_dat_07-22-2022_time_19-39-09_png.rf.64f6...txt电梯内人车样本拍摄于2022-07-22 19:39有多个点位编号2、3、4带有明确的人/车语义osmd_Camera12_osmd_20220626195116_3079981_jpg.rf.99d9...txt来自 Camera12 的监控帧拍摄于2022-06-26 19:51摄像头点位系统命名可能是独立监控系统导出.rf.这一串是 Roboflow 平台导出的标记说明这批数据可能经过 Roboflow 的预处理或格式整理。扩展名有 png 也有 jpg说明原始采集规格不统一后面做数据加载时要把图片格式统一成 RGB 三通道避免出现 Alpha 通道问题。文件名里的时间戳集中在 2022 年 6 月到 8 月夏季室内外光线差异大这个时间段采集的样本天然带上了光照变化对模型泛化反而是好事。2.2 标签格式剖析YOLO txt 标注的实际内容每个 txt 文件和同名图片一一对应里面存的是 YOLO 格式的归一化标注。用任意文本编辑器打开一个标签文件你会看到类似下面的内容0 0.423828 0.515625 0.214844 0.423611 1 0.731445 0.578125 0.117188 0.256944 2 0.853516 0.462153 0.076172 0.208333每行五个值含义固定第一个是类别索引后面依次是目标中心点的 x、y 坐标以及目标宽度、高度全部除以图片宽高做了归一化。比如第一行0 0.423828 0.515625表示类别 0 的目标中心在图片约 42.4% 宽、51.6% 高的位置宽约占 21.5%高约占 42.4%。需要特别留意的是0这个索引对应哪个类别。它取决于 yaml 文件里 names 列表的排列顺序不一定从 person 开始。我一般会先写个三行脚本扫一遍所有 txt 的类别索引分布确认没有出现索引越界或空标签文件再进训练环节。对于想转 VOC 格式跑 Faster RCNN 或 SSD 的情况常见做法是按归一化坐标乘回原图尺寸再转成左上角右下角的 xyxy 表示写入 XML这个转换逻辑很简单但坐标乘回宽高时一定要用原图的实际尺寸不是缩放后的尺寸。2.3 类别定义与 yamlperson、motorcycle、bicycle 三类的边界摘要里明确写了类别为 person、motorcycle、bicycle对应 yaml 文件里nc: 3。需要注意的是 motorcycle 和 bicycle 这两类在电梯内视角下容易混淆尤其当自行车车身被人物遮挡一半时标注员可能凭车轮粗细和踏板位置区分但这恰恰是模型最难学的特征。数据集配套的 yaml 文件结构大致长这样train: ../images/train val: ../images/val nc: 3 names: [person, motorcycle, bicycle]这里最容易踩的坑是 names 顺序。YOLO 训练时读取的类别索引是严格按照 yaml 里 names 的顺序对齐的如果你把数据集原有的 txt 标签直接套到一个顺序不同的 yaml 上person 可能变成 motorcycle训练出来的模型预测结果会整体错位。拿到数据集第一件事就是核对 txt 首个数字的实际含义和 yaml 的 names 顺序是否一致。3. 把数据集喂给 YOLOv8目录归拢、yaml 配置与训练参数3.1 目录组织把散落文件归拢成 images 与 labels 两棵目录树Roboflow 导出的数据集文件通常是扁平存放的图片和 txt 混在一起直接用 ultralytics 训练会报找不到标签文件。动手训练前先把目录结构规整成 YOLO 标准布局mkdir -p dataset/images/train dataset/images/val dataset/images/test mkdir -p dataset/labels/train dataset/labels/val dataset/labels/test # 按 Roboflow 导出时的划分前缀归类常见前缀为 train/ valid/ test # 这里以实际文件名模式举例请根据你解压后的目录结构调整 find . -path *train* -name *.jpg -exec mv {} dataset/images/train/ \; find . -path *train* -name *.png -exec mv {} dataset/images/train/ \; find . -path *train* -name *.txt -exec mv {} dataset/labels/train/ \;这个脚本的逻辑是先创建 images 和 labels 两套平行目录再按目录名前缀批量移动文件。执行完后images/train里每张图都要能在labels/train里找到同名同前缀的 txt否则训练时会被跳过。用ls dataset/images/train | wc -l和ls dataset/labels/train | wc -l对比一下数量两边不一致就先别急着进下一步。3.2 data.yaml 配置与路径边界YOLOv8 官方推荐把 data.yaml 放到数据集根目录下路径写相对路径。参照上面提到的 yaml 结构重点确认三件事train 和 val 路径指向实际目录nc: 3与 names 列表长度一致names 顺序与 txt 类别索引对应。# dataset/data.yaml path: ../dataset train: images/train val: images/val test: images/test nc: 3 names: 0: person 1: motorcycle 2: bicycle这里有一个常见的路径误区path是相对你执行训练命令的工作目录写的不是相对 yaml 文件位置。如果你从项目根目录执行yolo train那么path: ../dataset表示数据集位于上一级目录如果你把 yaml 放进 dataset 里然后从 dataset 目录执行那path应该改成.。遇到报错Images not found时先检查这个字段而不是数据集本身。3.3 训练参数小数据集的 batch、epochs、imgsz 怎么设97 张图的规模属于典型小样本训练参数不能照搬公开数据集的标准配置。我一般用 YOLOv8n 起步控制显存占用同时开启早停yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs150 \ batch8 \ imgsz640 \ patience30 \ workers4 \ seed42 \ projectruns/train \ nameelevator_yolov8n几个参数的落地逻辑epochs150配合patience30模型超过 30 轮验证集指标不再提升就自动停小数据集通常 60 到 90 轮就能收敛不用傻等 150 轮。batch8在 6GB 显存的卡上跑 640 分辨率没问题如果显存紧张降到 4。seed42这个参数很多人忽略但对小数据集极其重要固定随机种子才能复现划分和增强结果也避免高随机性带来的“这次 mAP 0.8、下次 0.6”的假象。如果你的样本里摩托车和自行车都是侧后方视角想让模型重点学车轮特征而不是背景可以在命令里追加增强参数比如将 hsv 扰动适度调低yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs150 \ batch8 \ imgsz640 \ hsv_h0.01 \ hsv_s0.4 \ hsv_v0.3 \ degrees10hsv_h是色调扰动幅度默认 0.015对电梯内金属反光严重的画面色调扰动太大会把暖色灯光下的电动车颜色学跑偏我习惯压到 0.01。degrees10给一个 10 度以内的随机旋转模拟电梯内摄像头安装角度不一致的情况。4. 增强策略与评估指标97 张图也要有章法4.1 小样本过拟合的三个典型信号数据集小到 97 张时过拟合不是“会不会发生”的问题而是“第几个 epoch 开始发生”的问题。典型信号有三个训练 loss 持续下降但验证 loss 在某个 epoch 后掉头向上mAP50 在训练集上接近 1.0 但验证集上始终在低位徘徊可视化预测结果时检测框总是框在电梯门边缘或反光区域而不是目标本身。要定位过拟合比看曲线更快的方法是直接看预测图。训练结束后随机抽 20 张验证集图片把预测结果画出来看框的位置是否贴着目标轮廓。如果框总是比别人大一圈或者偏到一侧大概率是学到了目标周围的固定背景结构。电梯场景里金属门框、楼层显示屏、摄像头支架都是极强的背景特征模型很容易拿它们当锚点。4.2 增强参数怎么配不是越大越好Ultralytics 从 YOLOv8 开始把增强参数以命令行方式暴露mosaic 默认开启mixup 默认 0.0。小数据集上我倾向于保留 mosaic 但把比例降一点同时开启轻度 mixupyolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ batch8 \ imgsz640 \ mosaic0.5 \ mixup0.2 \ close_mosaic10 \ fliplr0.5 \ scale0.3参数含义说明mosaic0.5表示一半的训练样本由四张图拼接生成这个操作对小目标帮助很大因为拼接后目标在画面中的相对尺寸变小迫使模型学会检测小目标但 mosiac 太猛会让梯内空间透视关系失真所以压到 0.5。close_mosaic10表示最后 10 个 epoch 关闭 mosaic让模型在正常尺寸的图片上做最后精调这是 Ultralytics 官方建议能有效缓解 mosaic 带来的分布偏移。scale0.3控制随机缩放的幅度电梯内摄像头普遍是广角目标尺度变化剧烈0.3 的缩放范围已经够用。还有一个实践技巧训练完看results.png里的mosaic样例图如果拼接边界特别明显、目标被切碎就把 mosaic 继续调低。这类可视化验证比单纯看 loss 曲线更直观也更容易发现数据分布被增强破坏的问题。4.3 评估指标怎么读mAP50 与漏检优先级的取舍小样本数据集上不要只盯 mAP50-95 不放。类别就三类mAP50-95 容易被小目标拉低但实际业务里你更关心的是“有没有漏掉推着车的人”。我一般按优先级看四个指标指标含义在小数据集上的解读mAP50IoU 阈值 0.5 下的平均精度反映整体检出能力低于 0.7 先别调参查标签mAP50-95多阈值平均精度受框精度影响大梯内场景能到 0.5 以上就算健康Recall召回率漏检率直接相关业务上 Recall 比 Precision 优先级高每类 AP类别单独计算的平均精度重点看 motorcycle 和 bicycle 是否被互相拉低在验证集上跑一轮指标统计yolo detect val \ modelruns/train/elevator_yolov8n/weights/best.pt \ datadataset/data.yaml \ conf0.25 \ iou0.5conf0.25是置信度阈值低于这个值的目标会被过滤iou0.5是 NMS 的 IoU 阈值。如果输出里 bicycle 的 AP 明显低于另外两类先别加数据回去看标签里 bicycle 的框是不是普遍比摩托车小小框在归一化坐标下学习难度本来就大。另一种调整思路是在训练时把imgsz从 640 提到 960目标在特征图上的像素占比变大对 AP 的提升通常比盲目加增强更明显。5. 避坑排查小数据集训练最容易翻车的五个点5.1 标签类别索引错位现象训练正常跑完验证时模型把人物框标成 bicycle或者预测结果整体乱套。原因txt 标签里的类别索引是 0、1、2但 data.yaml 的 names 顺序和标注时的类别顺序不一致。比如标注工具里背景算 0 类导出时没过滤导致 person 实际索引是 1而 yaml 里 0 是 person。解决写一行命令统计所有 txt 的首列值分布确认索引只有 0/1/2 且没有空缺cat dataset/labels/train/*.txt | awk {print $1} | sort -n | uniq -c正常输出应该类似0 127 1 89 2 34三行。如果出现3或更大的数字说明标签混入了多余类别索引需要用脚本批量改写或重新导出。5.2 PNG 图片通道问题导致训练中断现象训练到某个 epoch 突然报AssertionError: image must be 3-channel或类似解码错误。原因文件名里能看到有 png 也有 jpgpng 可能带 Alpha 通道PyTorch 的 DataLoader 解码时默认按三通道读遇到四通道直接中断。有些 PNG 还是 16 位深度也会触发这类问题。解决训练前统一把图片转成 RGB 三通道 8 位深度。用 OpenCV 批量处理python -c import cv2, glob for f in glob.glob(dataset/images/**/*.png, recursiveTrue): img cv2.imread(f) assert img is not None, f cv2.imwrite(f.replace(.png, .jpg), img) 注意转换后缀后对应的 txt 标签文件名也要同步改成 .jpg否则 YOLO 会因找不到对应标签而跳过该样本。更稳妥的做法是保留后缀用cv2.imread(f, cv2.IMREAD_UNCHANGED)读入后检查通道数如果等于 4 就用cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)去掉 Alpha 再写回。5.3 模型学到电梯反光而不是目标本身现象训练时 loss 正常下降验证 mAP50 也能到 0.85但拿到新场景的视频里一测检测框全压在镜面反光区域人一走过反光变化就丢框。原因小数据集容易过拟合到高频背景特征。电梯内金属门、镜面墙、地面瓷砖反光在训练图里出现频率极高模型把这些纹理当成了目标共现特征。解决降低背景学习权重。操作上我一般分两步第一步在训练参数里把hsv_s和hsv_v调低减少颜色扰动导致的背景纹理失真第二步给增强参数加一点随机擦除或随机裁剪让目标不再总是出现在画面中心区域。Ultralytics 没有直接暴露 cutout 参数但可以用-augmenter自定义或者退一步用scale0.3加translate0.2增加目标位置的随机性。另外如果你手里的原始视频能抽出不带目标的电梯空镜建议拼一批背景负样本效果比调增强参数更直接。5.4 人车重叠时的漏检问题现象人物推着摩托车进电梯两个目标重叠度高时模型只输出一个框要么框住人、要么框住车。原因电梯内空间狭小摄像头俯角拍摄时人和车天然大面积重叠。训练样本里如果这类重叠场景占比不高模型没有学到“两框共存”的模式。加上 YOLO 的 NMS 机制本身对高 IoU 重叠框有抑制作用两个 GT 框重叠超过阈值时预测框容易被合并。解决在验证阶段把 NMS 的 IoU 阈值调低到 0.3看漏检是否有改善yolo detect val \ modelruns/train/elevator_yolov8n/weights/best.pt \ datadataset/data.yaml \ iou0.3如果改善明显说明问题出在 NMS 而非模型能力可以采样把输入分辨率imgsz提到 960让模型输出更精细的框回归结果。对于业务场景宁可多输出两个重叠框也不要漏掉电动车。5.5 固定随机种子后 mAP 依然忽高忽低现象同一份数据、同一套参数重复训练三次mAP50 分别是 0.82、0.71、0.88波动大到没法判断调参方向。原因97 张图做 train/val 划分后验证集可能只有 20 张左右验证集样本差异直接导致指标剧烈波动。这在小数据集上不是 bug是统计规律。解决改用 k 折交叉验证评估而不是单次划分。把 97 张图按 5 折切分每折训练一次取 mAP 均值这个均值比单次结果更接近模型真实水平。Ultralytics 没有内置 k 折训练命令常见做法是写个 Python 脚本循环五个 data.yaml 配置每个配置指向不同的 val 目录最后汇总指标。6. 进阶把 97 张图的模型迁到自己的电梯监控里6.1 冻结主干特征提取层做迁移小数据集训练时直接全量微调预训练权重容易把主干学到的通用特征破坏掉。我的习惯是优先冻结前 10 层只让检测头学习电梯场景特征yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ freeze10freeze10表示前 10 层不参与梯度更新保留 ImageNet 预训练学到的边缘、纹理等底层特征。跑完一轮看验证指标如果 mAP50 没有明显提升把freeze降到 5 再试。实际上对于电梯内场景主干浅层学到的通用特征已经够用检测头才是真正需要重点训练的部分。6.2 用伪标签扩充自己的监控数据把训练好的模型接到你自己场景的视频流上用高置信度预测结果生成伪标签人工快速复核后并入训练集。这一步能解决公开数据集和现场场景的分布差异问题。推理时用这个命令导出检测结果yolo detect predict \ modelruns/train/elevator_yolov8n/weights/best.pt \ source./elevator_video.mp4 \ conf0.7 \ save_txtTrue \ save_confTrue \ save_cropTrueconf0.7调高置信度让伪标签更可靠save_txtTrue按 YOLO 格式输出坐标save_cropTrue把每个检测目标单独裁剪保存方便快速复核人车类别有没有标错。确认无误后把这些 txt 和对应帧挪到 dataset/labels/train 和 dataset/images/train重新训练即可。反复做两轮模型的现场表现提升往往是最明显的。6.3 导出 ONNX 部署到边缘设备训练收敛后部署到电梯轿厢的 IPC 或边缘盒子前把权重导出成 ONNX 格式yolo export \ modelruns/train/elevator_yolov8n/weights/best.pt \ formatonnx \ imgsz640 \ opset12opset12兼顾主流推理框架的兼容性导出后可以用 onnxruntime 在 CPU 上跑到 15ms 左右的单帧延迟对电梯监控这种低速场景足够用。从那以后我每次拿新数据集都会强制先走一遍标签索引校对、通道检查和固定随机种子这三步再谈训练和调参。这套流程帮我在好几个类似的小样本项目里少走了不少弯路希望帮到你。本文还有配套的精品资源点击获取