简介:行人实例分割数据集面向计算机视觉开发者、算法工程师及高校研究人员,聚焦行人目标的精细化识别与轮廓分割任务。资源共2000个文件,以1226个txt标注文件、772张jpg图像为主,另含1个yaml配置文件与1份docx说明文档,压缩包约96.18MB,原生YOLO实例分割格式可直接对接YOLOv5、YOLOv8等主流框架。数据划分为训练集1131张、验证集48张、测试集47张,每个行人实例包含50余个多边形轮廓点,能精确捕捉复杂姿态与遮挡情况,并覆盖监控、航拍等多视角及不同光照、天气条件。该数据集可服务于智能安防中的异常行为检测与人群密度分析、自动驾驶感知系统的行人轮廓分割、服务机器人与AR场景的实时人物融合,也可作为实例分割算法基准测试及行人重识别的前期处理支持。目前已有277人学习下载,适合需要快速开展行人分割实验与多任务迁移的读者参考使用。
1. 行人实例分割数据集:1131 张训练图能跑出什么名堂
如果你正在做智能安防、自动驾驶感知或者服务机器人方向的项目,大概率绕不开一个核心问题:去哪里找一份标注质量过硬、格式又不用二次转换的行人实例分割数据。我最近拆了一份名为「行人实例分割数据集」的资源包,训练集 1131 张、验证集 48 张、测试集 47 张,全部是 YOLO 实例分割格式,每个行人实例带 50 个以上的多边形轮廓点。这个量级不算大,但对于验证算法可行性、做行业数据集的基准测试、或者给行人重识别任务做前期预处理,已经够用了。它适合两类人:一是想快速跑通实例分割训练流程的工程师,二是需要一份干净行人数据做迁移学习起点的研究者。下面我从数据拆包、格式解析、训练配置到踩坑排查,完整走一遍。
2. 拆开数据包:YOLO 实例分割格式到底长什么样
2.1 目录结构与文件命名规律
拿到压缩包解压后,你会看到图片文件和对应的标注文件混在一起,或者按 images/labels 分目录存放。从项目正文给出的文件名来看,图片命名有几个明显特征:一部分是man-2753309_640_jpg.rf.14351e36d8e0202f3c8632dde3545b7c.jpg这种带rf.哈希后缀的,这是 Roboflow 平台导出时的典型命名方式;另一部分是FudanPed00010_png.rf.24bc61111192b90017b72ae025a6eaaa.jpg和PennPed00092_png.rf.d747021a6d529c4502e5226340da2f36.jpg,说明数据混合了 FudanPed 和 PennPed 两个经典行人数据集的样本。这种混合来源意味着场景多样性有保障,但也意味着你在做类别映射时要确认标注一致性。
常见做法是解压后先跑一遍目录统计,确认图片和标注文件一一对应:
# 统计图片数量和标注数量 find ./dataset -name "*.jpg" -o -name "*.png" | wc -l find ./dataset -name "*.txt" | wc -l # 检查是否有图片缺失对应标注 for img in $(find ./dataset/images -name "*.jpg"); do base=$(basename "$img" .jpg) if [ ! -f "./dataset/labels/${base}.txt" ]; then echo "缺失标注: $img" fi done这段脚本的逻辑很直接:先分别统计图片和标注文件总数,理论上两者应该相等。然后逐个检查每张图片是否有同名 txt 标注文件,输出缺失项。参数上注意图片扩展名可能是 jpg 或 png 混合,脚本里要同时覆盖。如果发现缺失,大概率是解压不完整或者原始数据就有遗漏,需要重新下载或手动剔除。
2.2 YOLO 实例分割标注格式逐字段解析
YOLO 实例分割的标注文件和普通检测格式不同,每行代表一个实例,格式是:
<class-index> <x1> <y1> <x2> <y2> ... <xn> <yn>其中坐标是归一化到 0-1 之间的多边形轮廓点。以行人实例为例,一行可能有 50 多个点对,这就是摘要里说的「50+ 轮廓点标注」。我一般会写个小脚本先可视化几条标注,确认坐标没跑偏:
import numpy as np import cv2 def visualize_annotation(img_path, label_path): img = cv2.imread(img_path) h, w = img.shape[:2] with open(label_path, 'r') as f: for line in f: parts = line.strip().split() class_id = int(parts[0]) coords = np.array([float(x) for x in parts[1:]]).reshape(-1, 2) # 反归一化到像素坐标 coords[:, 0] *= w coords[:, 1] *= h pts = coords.astype(np.int32).reshape((-1, 1, 2)) cv2.polylines(img, [pts], isClosed=True, color=(0, 255, 0), thickness=2) cv2.imwrite('vis_output.jpg', img) visualize_annotation('./dataset/images/FudanPed00010_png.rf.24bc61111192b90017b72ae025a6eaaa.jpg', './dataset/labels/FudanPed00010_png.rf.24bc61111192b90017b72ae025a6eaaa.txt')逻辑说明:读取图片获取宽高,然后逐行解析标注文件。parts[0]是类别索引,这里只有 Person 一类所以通常是 0。后面的坐标两两一组,先反归一化乘回像素尺寸,再用cv2.polylines画闭合多边形。参数上isClosed=True保证轮廓闭合,thickness=2方便肉眼观察。跑完打开vis_output.jpg,如果轮廓贴合行人边缘,说明标注没问题;如果轮廓乱飞,可能是归一化坐标被误读成了绝对坐标。
2.3 训练/验证/测试集划分的验证
摘要里写得很清楚:训练集 1131 张、验证集 48 张、测试集 47 张。这个划分比例大概是 92:4:4,验证集和测试集偏小。对于快速验证没问题,但如果你要做严格的模型调优,48 张验证集可能不够稳定。我一般会先确认划分文件是否存在:
# 假设数据集中有 train.txt / val.txt / test.txt wc -l ./dataset/train.txt ./dataset/val.txt ./dataset/test.txt如果资源包里没有现成的划分文件,你需要自己按 8:1:1 重新分。注意保持同一视频序列的帧不要跨集分布,否则验证集精度会虚高。这个坑后面会细说。
3. 用 YOLOv8 跑通训练:配置文件与参数怎么设
3.1 数据集 YAML 配置文件的写法
YOLOv8 训练实例分割任务需要一个 dataset.yaml 文件,指定路径、类别数和类别名。针对这份行人数据集,配置如下:
# person_seg.yaml path: /home/user/datasets/person_seg # 数据集根目录 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 test: images/test # 测试集图片相对路径 nc: 1 # 类别数,只有 Person 一类 names: 0: person # 类别名称逻辑说明:path是根目录,train/val/test是相对于根目录的子路径。YOLOv8 会自动在对应路径下找同名的 labels 文件夹读取标注。nc: 1表示单类别,names字典的键必须从 0 开始。常见错误是路径写成绝对路径但没加引号,或者 labels 文件夹命名不一致导致找不到标注。
3.2 训练命令与关键参数解读
配置文件准备好后,直接用 CLI 启动训练:
yolo segment train \ data=person_seg.yaml \ model=yolov8n-seg.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=20 \ project=runs/segment \ name=person_exp参数逐个说:model=yolov8n-seg.pt用的是 nano 版分割模型,参数量小、训练快,适合先跑通流程;如果精度不够再换yolov8s-seg.pt或yolov8m-seg.pt。epochs=100配合patience=20表示 20 轮没有提升就早停,避免过拟合。imgsz=640是输入分辨率,和原始图片的 640 宽度一致,不需要额外缩放。batch=16在 8GB 显存上基本能跑,如果 OOM 就降到 8。lr0=0.01是初始学习率,YOLOv8 默认会用余弦退火调度。
训练过程中重点看三个指标:box_loss和seg_loss是否稳定下降,mask mAP50是否在上升。如果 seg_loss 震荡厉害,可能是学习率偏大或者 batch 太小导致梯度噪声大。
3.3 推理验证与结果解读
训练完成后,用验证集跑一遍推理,确认模型实际效果:
yolo segment predict \ model=runs/segment/person_exp/weights/best.pt \ source=./dataset/images/test \ conf=0.25 \ save=True \ save_txt=Trueconf=0.25是置信度阈值,低于这个值的检测框会被过滤。save_txt=True会把预测结果保存成 YOLO 格式的 txt,方便后续做定量对比。推理完打开输出目录,重点看两类问题:一是漏检,行人密集区域有没有整片没框出来;二是轮廓贴合度,多边形是否紧贴人体边缘。如果轮廓明显偏大或偏小,可能是训练轮次不够或者标注本身有偏差。
4. 避坑与排查:行人实例分割训练中的五个血泪教训
4.1 验证集 mAP 虚高但测试集崩了
现象:训练日志里 mask mAP50 到了 0.85,但拿测试集一跑只有 0.5 出头。原因:验证集和训练集来自同一视频序列的相邻帧,画面几乎一样,模型相当于在「背答案」。解决:重新划分数据集时按视频序列或场景分组,确保同一场景的图片只出现在一个集合里。如果原始数据没有序列信息,至少按图片哈希前缀分组,避免FudanPed00010和FudanPed00012分到不同集合。
4.2 标注坐标归一化基准不一致
现象:可视化时轮廓整体偏移,有的偏左上有的偏右下。原因:部分标注文件用的是绝对像素坐标,另一部分用的是归一化坐标,混在一起训练导致模型学乱。解决:写脚本检查所有标注文件的最大坐标值,如果超过 1.0 说明是绝对坐标,需要除以图片宽高做归一化。统一之后再重新训练。
4.3 单类别数据集误设 nc 导致训练报错
现象:启动训练时报AssertionError: nc != len(names)。原因:dataset.yaml 里nc写成了 2 或更多,但names里只有一个 person。解决:确认nc等于names字典的键值对数量。这份数据集只有 Person 一类,nc: 1不能多写。
4.4 图片格式混合导致读取失败
现象:训练中途报cv2.error或图片读取为空。原因:数据集中 jpg 和 png 混用,某些 png 带透明通道,YOLOv8 默认按三通道读取时出错。解决:统一转成 jpg 格式,或者用 PIL 读取时强制转 RGB。批量转换命令:
mogrify -format jpg -background white -alpha remove ./dataset/images/*.png4.5 小目标行人轮廓点太少导致分割质量差
现象:远处的小尺寸行人分割 mask 几乎是个点,IoU 很低。原因:原图 640 宽度下,远处行人可能只有 20x40 像素,50 个轮廓点挤在这么小的区域里,归一化后精度损失严重。解决:训练时把imgsz提到 1024 或 1280,让模型看到更多细节;或者在数据增强里减少缩放幅度,避免小目标进一步变小。
5. 进阶技巧:用这份数据做迁移学习和多任务适配
5.1 从实例分割迁移到目标检测和姿态估计
这份数据原生是 YOLO 实例分割格式,但你可以低成本迁移到其他任务。做目标检测时,只需要把多边形标注转成外接矩形框:
import numpy as np def seg_to_bbox(label_path, output_path): with open(label_path, 'r') as f_in, open(output_path, 'w') as f_out: for line in f_in: parts = line.strip().split() class_id = parts[0] coords = np.array([float(x) for x in parts[1:]]).reshape(-1, 2) x_min, y_min = coords.min(axis=0) x_max, y_max = coords.max(axis=0) # 转成 YOLO 检测格式:class cx cy w h cx = (x_min + x_max) / 2 cy = (y_min + y_max) / 2 w = x_max - x_min h = y_max - y_min f_out.write(f"{class_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}\n")逻辑说明:读取每行多边形坐标,取 min/max 得到外接矩形,再转成 YOLO 检测格式的中心点加宽高。参数上保留 6 位小数足够精度。这个转换脚本我一般会批量跑完整个数据集,然后直接用 YOLOv8 的 detect 模式训练,省去重新标注的成本。
5.2 用预训练权重加速收敛
1131 张训练图不算多,从零训练容易过拟合。我一般会加载 COCO 预训练的yolov8s-seg.pt,冻结 backbone 前几层先跑 10 个 epoch,再解冻全量微调。这样 mask mAP50 通常能比从零训练高 5 到 8 个点。具体做法是在训练命令里加pretrained=yolov8s-seg.pt,YOLOv8 会自动加载权重并跳过不匹配的类别头。
5.3 验证模型是否真正学到了行人轮廓
训练完不能只看 loss 曲线,我习惯做一组消融验证:把测试集图片做水平翻转、亮度调整、随机裁剪,再跑推理,看 mask 是否依然贴合。如果翻转后轮廓崩了,说明模型学的是位置记忆而不是形状特征。这个验证方法比单看 mAP 更能暴露过拟合问题。
从那以后我每次拿到新的实例分割数据集,都强制先跑一遍标注可视化、再做一次划分泄漏检查、最后用增强后的测试集验证鲁棒性,三步走完才敢说这份数据能用。希望帮到你。
本文还有配套的精品资源,点击获取