
简介行人实例分割数据集面向智能安防、自动驾驶感知、服务机器人及计算机视觉研究等场景提供精细化的行人轮廓标注样本适合从事目标检测与实例分割的开发者、算法工程师及高校研究人员使用。资源包共约2000个文件以1226个txt标注文件、772张jpg图片为主另含1个yaml配置与1份docx说明文档压缩包整体约96.18MB原生YOLO实例分割格式可直接对接YOLOv5、YOLOv8等主流框架。数据集划分为训练集1131张、验证集48张、测试集47张每个行人实例包含50余个轮廓点能精确捕捉复杂姿态与遮挡情况并覆盖监控、航拍等多视角及不同光照、天气条件。目前已有277人学习下载可用于实例分割基准测试、行人重识别前期处理及多任务迁移兼顾算法验证与工程落地需求。1. 行人实例分割数据集.zip拿到压缩包之后先别急着解压你从某个渠道拿到一个叫「行人实例分割数据集.zip」的压缩包双击之前先想清楚一件事行人实例分割和行人检测、行人 ReID 是三件不同的事。检测只给你框ReID 只给你一个跨镜头的身份向量而实例分割要求对每一个行人像素级地画出轮廓——遮挡、重叠、贴边、只露半个身子都得单独成 mask。这个区别决定了后面所有标注格式、训练配置和评估指标的走向。这个数据集能解决的核心问题是让模型学会「哪些像素属于第几个行人」。适合谁做智慧园区客流统计、自动驾驶行人避让、零售门店动线分析、安防视频结构化的人。如果你只是想数人头检测就够一旦要做像素级抠图、遮挡关系推理、或者给下游 ReID 提供干净的行人裁剪实例分割才是对的路。压缩包本身只是原料真正决定成败的是解压后你怎么读它、怎么转格式、怎么喂给模型。2. 解压后先做体检目录结构、标注格式与三类常见组织方式2.1 先看目录判断它属于哪种标注体系行人实例分割数据集常见的组织方式有三种解压后第一件事就是tree或find看结构别急着写训练脚本。# 只看两层目录避免输出爆炸 find ./pedestrian_seg -maxdepth 2 -type d | head -50 # 统计图片和标注文件数量 find ./pedestrian_seg -name *.jpg -o -name *.png | wc -l find ./pedestrian_seg -name *.json -o -name *.xml -o -name *.txt | wc -l如果看到images/配annotations/*.json大概率是 COCO 系如果看到JPEGImages/配SegmentationClass/和SegmentationObject/那是 VOC 分割系如果每张图旁边跟一个同名.txt每行是归一化的多边形点那是 YOLO-seg 系。三种格式的转换成本完全不同先认清楚再动手。提示不要用ls直接看几万文件的目录会卡住终端。用find ... | wc -l先数数量。2.2 用一段脚本把标注统计出来光看目录不够得知道每个类别多少实例、每张图平均几个行人、mask 面积分布。下面这段脚本对 COCO 格式做体检其他格式改读取逻辑即可。import json from collections import Counter with open(annotations/instances.json, r) as f: data json.load(f) # 类别分布 cats {c[id]: c[name] for c in data[categories]} cat_counter Counter() for ann in data[annotations]: cat_counter[cats[ann[category_id]]] 1 print(类别实例数:, cat_counter) # 每图实例数分布 img_ann Counter(ann[image_id] for ann in data[annotations]) counts list(img_ann.values()) print(f图片数: {len(data[images])}, 有标注图片数: {len(img_ann)}) print(f每图实例数 min/avg/max: {min(counts)}/{sum(counts)/len(counts):.1f}/{max(counts)}) # mask 面积分布判断小目标占比 areas [ann[area] for ann in data[annotations] if ann.get(area)] areas.sort() n len(areas) print(fmask 面积 P10/P50/P90: {areas[n//10]:.0f}/{areas[n//2]:.0f}/{areas[n*9//10]:.0f})逻辑说明cat_counter告诉你有没有混入非行人类别img_ann反映拥挤程度平均值超过 15 的基本是密集场景训练时要注意 NMS 和 mask 重叠面积分位数决定你是否需要开小目标增强。参数上如果 P10 面积小于 32×32建议在训练配置里把imgsz提到 1024 以上否则小行人 mask 会糊成一团。2.3 抽 20 张图肉眼过一遍比任何统计都值统计只能告诉你数量质量得靠眼睛。随机抽 20 张带标注的图把 mask 叠加到原图上可视化重点看四件事遮挡行人的 mask 是否断裂、贴边行人是否被裁掉、多人重叠处 mask 是否串了、有没有整张图漏标。这一步花 10 分钟能省掉后面几天的「模型玄学不收敛」排查。import cv2, json, numpy as np, random with open(annotations/instances.json) as f: data json.load(f) img_map {im[id]: im for im in data[images]} ann_map {} for ann in data[annotations]: ann_map.setdefault(ann[image_id], []).append(ann) for img_id in random.sample(list(ann_map.keys()), 20): info img_map[img_id] img cv2.imread(fimages/{info[file_name]}) overlay img.copy() for ann in ann_map[img_id]: for seg in ann[segmentation]: pts np.array(seg).reshape(-1, 2).astype(np.int32) cv2.fillPoly(overlay, [pts], (0, 255, 0)) cv2.addWeighted(overlay, 0.4, img, 0.6, 0, img) cv2.imwrite(fvis_{img_id}.jpg, img)这段代码把每个实例的多边形填成半透明绿色。看的时候注意如果两个行人重叠区域出现颜色叠加变深说明 mask 有交叠训练时 IoU 计算会受影响如果某个行人完全没有绿色就是漏标得决定是补标还是丢弃该图。3. 转成 YOLO-seg 格式多边形归一化与四个边界坑3.1 为什么优先转 YOLO-seg 而不是死磕 COCO现在做实例分割落地YOLOv8-seg 和 YOLOv11-seg 是性价比最高的选择推理速度快、部署链路成熟yolov8训练自己的数据集这套流程社区资料也最全。COCO 格式虽然通用但训练时读取慢、内存占用高。转成 YOLO-seg 的 txt 格式后每张图一个 txt每行是类别 x1 y1 x2 y2 ...坐标归一化到 0-1读取效率高一个量级。3.2 转换脚本COCO 多边形转 YOLO-segimport json, os from pathlib import Path def coco_to_yolo_seg(json_path, img_dir, out_dir): with open(json_path) as f: data json.load(f) img_map {im[id]: im for im in data[images]} # 只保留行人类别按你的数据集改 cat_map {c[id]: i for i, c in enumerate(data[categories]) if c[name] pedestrian} Path(out_dir).mkdir(parentsTrue, exist_okTrue) for ann in data[annotations]: if ann[category_id] not in cat_map: continue info img_map[ann[image_id]] w, h info[width], info[height] cls cat_map[ann[category_id]] lines [] for seg in ann[segmentation]: if len(seg) 6: # 少于3个点无法构成多边形 continue coords [] for i in range(0, len(seg), 2): x min(max(seg[i] / w, 0.0), 1.0) # 裁剪到[0,1] y min(max(seg[i1] / h, 0.0), 1.0) coords.append(f{x:.6f} {y:.6f}) lines.append(f{cls} .join(coords)) if lines: name Path(info[file_name]).stem .txt with open(os.path.join(out_dir, name), w) as f: f.write(\n.join(lines)) coco_to_yolo_seg(annotations/instances.json, images, labels)逻辑说明cat_map把行人映射为类别 0多类别数据集按需扩展。坐标除以宽高做归一化min(max(...))是防止标注越界导致训练报错。len(seg) 6过滤掉退化的两点线段。参数上.6f保留六位小数足够再多是浪费存储。3.3 四个边界坑每个都让我翻过车第一个坑多边形自交。有些标注工具画出的多边形自己交叉YOLO 训练时计算 mask 会得到奇怪结果。解决方法是转换后用shapely检查Polygon(pts).is_valid无效的直接丢弃或修复。第二个坑坐标越界。标注时图片被缩放或裁剪过坐标可能超出原图尺寸。上面脚本里的裁剪是兜底但更好的做法是转换前先统计越界比例超过 5% 说明标注流程有问题得回头查。第三个坑空标注图。有些图里没有行人COCO 里就没有对应 annotation转换后没有 txt 文件。YOLO 训练时如果按图片路径找标签找不到会报错需要为这些图生成空 txt 文件或者在数据集配置里允许缺失。第四个坑类别名不一致。有的数据集用person有的用pedestrian有的用walker。转换前先打印data[categories]确认别硬编码。4. 训练配置怎么设从 imgsz 到 mask 比率的实操参数4.1 数据集 yaml 与目录约定YOLO-seg 要求固定的目录结构转换完按下面组织# pedestrian_seg.yaml path: /data/pedestrian_seg train: images/train val: images/val names: 0: pedestrian图片和标签分开放images/train/xxx.jpg对应labels/train/xxx.txt。如果标签和图片同目录YOLO 也能读但分开更清晰。划分比例上行人场景我一般用 8:1:1如果总图少于 2000 张用 7:1.5:1.5验证集留够才能看出过拟合。4.2 关键训练参数与取值理由yolo segment train \ modelyolov8s-seg.pt \ datapedestrian_seg.yaml \ epochs100 \ imgsz1024 \ batch8 \ rectTrue \ mask_ratio4 \ overlap_maskTrue \ lr00.01 \ patience20imgsz1024是因为行人 mask 普遍偏小640 下小目标 mask 会丢细节。rectTrue做矩形训练减少 padding对长宽比差异大的监控画面友好。mask_ratio4表示 mask 相对输入下采样 4 倍这是精度和显存的平衡点显存够可以设 2但收益递减。overlap_maskTrue允许训练时 mask 重叠推理时再分离密集场景必须开。patience20是早停行人数据集容易过拟合别硬跑满。注意batch8配imgsz1024在 12G 显存上基本是上限再大就 OOM。显存小就降 imgsz 到 768别降 batch 到 4 以下BN 层会不稳定。4.3 训练时盯哪几个指标box_loss和seg_loss要一起看。如果 box 降但 seg 不降说明框对了但轮廓学不好通常是 mask 标注质量差或 mask_ratio 太大。metrics/mAP50-95(M)是分割的主指标行人场景能到 0.4 以上就算可用。验证时重点看val/seg_loss有没有反弹反弹就是过拟合提前停。5. 避坑与排查行人实例分割训练里最常见的五类翻车5.1 现象训练 loss 正常但 mask 全是糊的原因mask_ratio设太大或者标注本身是粗糙的矩形近似而非真实轮廓。解决先可视化几张预测 mask如果形状是方的回去检查标注如果形状对但边缘糊把mask_ratio从 4 降到 2同时确认imgsz不低于 768。5.2 现象密集场景漏检严重重叠行人只出一个 mask原因NMS 阈值太高或者overlap_mask没开。解决推理时把iou从默认 0.7 降到 0.5训练时确认overlap_maskTrue。另外检查标注里重叠行人是否真的各自有独立 mask有些数据集重叠处只标了一个模型学不出来。5.3 现象验证集指标远低于训练集原因训练集和验证集场景分布不一致比如训练全是白天、验证混了夜间。解决划分时按场景分层抽样别随机分。如果数据集本身场景单一验证指标虚高也别高兴换个场景测就崩。5.4 现象小目标行人 mask 面积几乎为零原因imgsz太小或者数据增强里的缩放把小人缩没了。解决提高imgsz关掉或减弱scale增强考虑用copy_paste增强专门补小目标。面积小于 32×32 的行人在 640 输入下基本学不到有效 mask。5.5 现象转格式后训练报「label out of bounds」原因归一化坐标出现负数或大于 1通常是标注越界或除错了宽高。解决转换脚本里加裁剪兜底同时打印越界样本的文件名回头查原标注。别直接忽略越界样本往往对应标注工具或流程的系统性问题。6. 进阶用 mask 质量筛选反哺标注把数据集越用越干净数据集不是拿到就固定不变的。训练一轮之后用模型在训练集上推理把预测 mask 和标注 mask 的 IoU 算出来低于 0.3 的样本单独拎出来看。这些样本要么是标注错了要么是极难样本。我一般会分两堆处理标注错的直接修极难样本留着做 hard example mining。import cv2, numpy as np from pathlib import Path def mask_iou(pred_path, gt_path): pred cv2.imread(pred_path, 0) 127 gt cv2.imread(gt_path, 0) 127 inter np.logical_and(pred, gt).sum() union np.logical_or(pred, gt).sum() return inter / union if union else 0.0 bad [] for gt in Path(labels_vis).glob(*.png): pred Path(pred_vis) / gt.name if pred.exists(): iou mask_iou(str(pred), str(gt)) if iou 0.3: bad.append((gt.stem, iou)) print(f低 IoU 样本数: {len(bad)}) for name, iou in sorted(bad, keylambda x: x[1])[:20]: print(f{name}: {iou:.3f})这段代码把预测 mask 和标注 mask 都转成二值图算 IoU。低于 0.3 的样本人工过一遍能修则修修不了就标记为困难样本。迭代两三轮之后数据集的标注一致性会明显提升模型指标也跟着涨。参数上0.3 这个阈值不是死的标注质量高的数据集可以提到 0.5质量差的先降到 0.2 看趋势。还有一个习惯每次改完标注重新转格式、重新划分、重新训练别在旧标签上打补丁。我吃过亏改了一半标签忘了重新生成 txt训练出来的模型在验证集上表现诡异排查了一整天才发现是标签和图片对不上。数据集这东西干净比大重要一致比多重要。希望帮到你。本文还有配套的精品资源点击获取