
简介这份数据集面向智慧交通与铁路安全场景下的行为识别研究适合从事目标检测、视频监控分析的学生与算法工程师使用主要解决铁路上人员危险行为躺卧、坐卧、站立及轨道区域的自动检测问题。包内共2000个文件以1999个xml标注文件和1个txt说明文件为主压缩包约920.36MB标注采用labelImg工具以矩形框方式完成对应VOC与YOLO两种格式图片与标注一一对应。数据集共3766张jpg图像含4个类别sitting、sleeping、standing、track各类框数分别为1406、689、1782、1819总框数5696覆盖铁轨上人员多种姿态与轨道区域。需注意包内包含较多增强图片下载前建议仔细查看图片质量再斟酌使用该数据集仅标注人员行为铁路上动物等目标未作标注。目前已有704人学习下载可为铁路危险行为检测模型的训练、验证与类别分布分析提供现成标注基础。1. 铁路场景行为识别数据集3766 张 VOCYOLO 双格式标注到底能跑出什么铁路沿线的人员安全监控最头疼的不是摄像头不够而是「人躺在道心里」和「人蹲在轨道旁系鞋带」在低分辨率画面里长得几乎一样。这份智慧交通铁路人员危险行为检测数据集就是冲着这个痛点来的3766 张 jpg 图片配套 3766 个 xmlVOC和 3766 个 txtYOLO标注文件4 个类别——sitting、sleeping、standing、track总框数 5696。标注工具是 labelImg规则就是最朴素的矩形框。它适合谁做铁路/轨道交通安防算法验证的工程师、需要快速搭行为识别 baseline 的学生、以及想拿真实场景数据做迁移学习预训练的人。一句话如果你要检测「人是否在铁路上做出危险姿态」这份数据能让你跳过最耗时的标注环节直接进模型训练。2. VOC 与 YOLO 双格式拆解从 xml 到 txt 的字段映射与目录组织2.1 为什么同一批图要存两套标注VOC 的 xml 是「自描述」结构每个文件里写死了 filename、size、object 的 bndbox 坐标xmin/ymin/xmax/ymax适合做数据审计和跨框架转换YOLO 的 txt 是「归一化」结构每行class_id cx cy w h数值全在 0~1 之间训练时直接喂给 dataloader省去解析开销。这份数据集两套都给意味着你既可以用 xml 做可视化校验又可以用 txt 直接开训不用自己写转换脚本——但前提是你得确认两套标注的框是一一对应的而不是各标各的。常见做法是先用 xml 跑一遍可视化确认框的位置和类别没错再把 txt 喂给 YOLO 系列。我一般会抽 20 张图做交叉验证看同一个 object 在 xml 和 txt 里的坐标换算后是否重合。2.2 目录结构还原与文件命名规律从项目正文给出的文件列表看xml 文件命名是firc_railway_数字.xml数字不连续671、672、668、795、793、796、797、25、30说明图片是从视频抽帧或分批采集后统一编号的中间有丢弃帧。txt 文件应该与 xml 同名同数量。典型的解压后目录长这样dataset/ ├── 使用前必读.txt ├── annotations/ # 3766 个 xml │ ├── firc_railway_25.xml │ ├── firc_railway_30.xml │ └── ... ├── labels/ # 3766 个 txt │ ├── firc_railway_25.txt │ ├── firc_railway_30.txt │ └── ... └── images/ # 3766 张 jpg ├── firc_railway_25.jpg ├── firc_railway_30.jpg └── ...如果你拿到的压缩包解压后不是这个结构先别急着改代码用find . -name *.xml | head和find . -name *.txt | head确认文件实际路径再决定是软链接还是重命名。血泪经验很多人卡在「路径不对」上其实是解压时多了一层同名文件夹。2.3 类别 ID 映射与标注框数分布4 个类别的框数分布很不均衡standing 1782、track 1819、sitting 1406、sleeping 689。sleeping 最少意味着如果直接训练模型对「躺卧」的召回会明显偏低。YOLO 的 txt 里 class_id 通常是 0~3但具体哪个 id 对应哪个类别必须看使用前必读.txt或classes.txt。常见映射是class_id类别名框数占比0sitting140624.7%1sleeping68912.1%2standing178231.3%3track181931.9%注意这个映射顺序不是固定的不同标注批次可能不同。动手前一定先读使用前必读.txt或者用脚本统计 txt 里出现的 id 集合再和类别名对齐。翻车案例有人直接把 0 当 sitting 训结果模型把 standing 全判成 sittingmAP 掉到 0.2 以下。3. 从解压到训练YOLO 格式数据集的落地操作与参数配置3.1 解压与完整性校验拿到.7z后Linux 下用7z x解压Windows 下用 7-Zip。解压完先做三件事数 jpg 个数、数 xml 个数、数 txt 个数三者都应该是 3766。如果对不上说明压缩包不完整或解压出错。# 统计三类文件数量确认是否一致 find dataset/images -name *.jpg | wc -l find dataset/annotations -name *.xml | wc -l find dataset/labels -name *.txt | wc -l # 检查是否有空标注文件0 字节的 txt 会导致训练报错 find dataset/labels -name *.txt -size 0 | head逻辑说明wc -l统计行数即文件数-size 0找出空文件。参数上如果空文件数量很少比如个位数可以直接删掉对应图片和标注如果大量为空说明标注流程有问题得重新核对。3.2 划分训练集/验证集并生成 data.yamlYOLO 训练需要train.txt和val.txt两个列表文件里面写图片的绝对路径或相对路径。常见做法是按 8:2 随机划分但这份数据里有大量增强图片随机划分可能导致同一张原图的增强版本同时出现在训练和验证集里造成验证指标虚高。更稳妥的是按文件名前缀或采集批次划分。import os import random random.seed(42) # 固定随机种子保证可复现 img_dir dataset/images all_imgs [f for f in os.listdir(img_dir) if f.endswith(.jpg)] all_imgs.sort() # 按 8:2 划分实际项目建议按批次划分避免增强泄漏 random.shuffle(all_imgs) split int(len(all_imgs) * 0.8) train_imgs all_imgs[:split] val_imgs all_imgs[split:] with open(train.txt, w) as f: for name in train_imgs: f.write(os.path.join(img_dir, name) \n) with open(val.txt, w) as f: for name in val_imgs: f.write(os.path.join(img_dir, name) \n) print(ftrain: {len(train_imgs)}, val: {len(val_imgs)})逻辑说明random.seed(42)保证每次划分结果一致os.path.join生成路径。参数上0.8是训练集比例数据量小的时候可以调到 0.9但验证集至少留 300 张以上才有统计意义。然后写data.yamlpath: ./dataset train: train.txt val: val.txt nc: 4 names: [sitting, sleeping, standing, track]注意names的顺序必须和 txt 里的 class_id 严格对应错一个位置所有指标都不可信。3.3 训练参数怎么设以 YOLOv8 为例假设你用 YOLOv8n 做 baseline命令行训练yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ device0参数说明imgsz640是输入分辨率铁路场景里人比较小可以试 960 但显存翻倍batch16在 8G 显存上比较稳lr00.01是初始学习率YOLOv8 默认值patience20表示 20 轮没提升就早停。如果 sleeping 类召回低可以在data.yaml里加cls_pw或者用 copy-paste 增强补样本。训练完看runs/detect/train/weights/best.pt用yolo detect val跑验证重点看 sleeping 的 AP 和 track 的误检——track 框数最多容易把铁轨旁边的杂物也框进去。4. 避坑与排查增强图片、类别混淆与标注噪声的 5 个具体问题4.1 增强图片导致验证集指标虚高现象训练 loss 正常下降验证 mAP 冲到 0.9 以上但拿真实视频一测漏检严重。 原因数据集里很多增强图片旋转、裁剪、亮度变化和原图高度相似随机划分时增强版进了验证集模型「见过」原图指标自然好看。 解决按文件名前缀或采集时间段划分确保同一场景的增强图只出现在训练集。如果文件名没有批次信息可以用感知哈希pHash做相似图聚类再按簇划分。4.2 sleeping 类召回率始终上不去现象训练 100 轮后sitting 和 standing 的 AP 都在 0.7 以上sleeping 只有 0.3~0.4。 原因sleeping 只有 689 个框且躺卧姿态在铁路场景里可能被遮挡、角度单一模型学到的特征不够泛化。 解决对 sleeping 类做过采样或者用 mosaic、mixup 增强时给 sleeping 更高权重。另一个思路是把 sleeping 和 sitting 的混淆样本单独拎出来做 hard negative mining。4.3 track 类把铁轨旁边的护栏、电缆也框进去现象模型对 track 的检测框明显偏大经常把轨道旁边的金属护栏、信号灯杆也包进去。 原因标注时 track 的边界定义不严格不同标注员对「轨道区域」的理解不一致导致框的大小和位置有噪声。 解决抽 50 张 track 框最大的图做可视化人工复核。如果噪声比例超过 10%建议对 track 类做标注清洗或者训练时降低 track 的 loss 权重。4.4 xml 和 txt 坐标对不上现象用 xml 可视化时框位置正确转成 YOLO 格式训练后框整体偏移或缩放。 原因xml 里的 size 字段width/height和实际图片尺寸不一致或者转换时归一化用错了分母。 解决写脚本逐张比对 xml 的 size 和PIL.Image.open(jpg).size不一致的挑出来。归一化时 cx 除以 width、cy 除以 height别搞反。from PIL import Image import xml.etree.ElementTree as ET def check_size(xml_path, jpg_path): tree ET.parse(xml_path) root tree.getroot() w int(root.find(size/width).text) h int(root.find(size/height).text) img Image.open(jpg_path) if (w, h) ! img.size: return False return True逻辑说明ET.parse解析 xmlroot.find(size/width)取标注里的宽img.size是实际图片尺寸。返回 False 的就是需要人工处理的。4.5 空标注文件导致训练中断现象训练跑了几轮突然报错提示某个 txt 文件格式不对或索引越界。 原因部分图片没有目标对应的 txt 是空文件。YOLO 本身支持空标注表示背景但如果空文件里有多余空格或换行符解析会出错。 解决用find dataset/labels -name *.txt -size 0找出空文件确认对应图片确实没有目标后保留如果有目标但标注为空需要补标。另外检查 txt 里是否有\r\n换行统一转成\n。5. 进阶技巧用 5696 个框做类别平衡与模型验证的实操5.1 按框数做加权采样5696 个框里sleeping 只占 12%直接训练会让模型偏向多数类。除了在 loss 里加权还可以在 dataloader 层面做加权采样。以 PyTorch 为例import torch from torch.utils.data import WeightedRandomSampler # 假设 labels 是每个样本的类别列表 class_counts [1406, 689, 1782, 1819] # sitting, sleeping, standing, track class_weights [1.0 / c for c in class_counts] sample_weights [class_weights[label] for label in sample_labels] sampler WeightedRandomSampler( weightssample_weights, num_sampleslen(sample_weights), replacementTrue )逻辑说明class_weights是类别频率的倒数频率越低权重越高WeightedRandomSampler按权重抽样replacementTrue允许重复抽。参数上num_samples一般设成训练集大小太大容易过拟合少数类。5.2 用混淆矩阵定位类别边界训练完别只看 mAP跑一遍混淆矩阵。YOLOv8 的 val 会自动生成confusion_matrix.png重点看 sleeping 和 sitting 之间的误判。如果 sleeping 被大量判成 sitting说明两个类的特征在模型眼里太接近可以考虑合并成「卧姿/坐姿」一个大类或者加一个「姿态关键点」辅助任务。5.3 验证集要覆盖不同光照和遮挡这份数据里有很多增强图片但增强不等于真实场景覆盖。我一般会额外留出 100 张未增强的原图做「干净验证集」只在这上面看最终指标。如果干净验证集的 mAP 比增强验证集低 15 个点以上说明模型过拟合增强模式得减少增强强度或增加真实场景数据。从那以后我每次拿到带增强的数据集都强制走一遍「原图/增强图分离验证」不然指标再高也不敢上线。希望帮到你。本文还有配套的精品资源点击获取