拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

行人实例分割数据集实战:YOLOv8-seg训练与Re-ID裁剪

行人实例分割数据集实战:YOLOv8-seg训练与Re-ID裁剪

简介:行人实例分割数据集面向智能安防、自动驾驶感知、服务机器人交互及计算机视觉研究等场景,为需要训练高精度行人识别与轮廓分割模型的开发者提供可直接使用的工业级数据。资源包共2000个文件,以1226个txt标注文件、772张jpg图像为主,另含1个yaml配置与1份docx说明文档,压缩包约96.18MB,原生YOLO实例分割格式可直接对接YOLOv5、YOLOv8等主流框架。数据按训练集1131张、验证集48张、测试集47张完整划分,每个行人实例包含50余个多边形轮廓点,能精确捕捉复杂姿态与遮挡情况,并覆盖监控、航拍等多视角及不同光照、天气条件。标注经交叉校验保证一致性,除实例分割外还可迁移至目标检测、姿态估计与行人重识别等任务。目前已有277人学习下载,适合作为算法基准测试与项目落地的实用数据支撑。

1. 行人实例分割数据集:1131 张训练图能跑出什么名堂

监控画面里两个人挨着走,检测框叠在一起,你根本分不清谁是谁——这是目标检测在人群场景下的经典翻车现场。实例分割要解决的就是这个问题:不只告诉你"这里有人",还要把每个人的像素级轮廓勾出来。这份行人实例分割数据集,训练集 1131 张、验证集 48 张、测试集 47 张,标注格式是原生 YOLO 实例分割格式,每个行人实例带 50+ 轮廓点坐标。它适合三类人:想跑通 YOLOv8-seg 全流程的新手、需要行人精细轮廓做安防或自动驾驶感知的从业者、以及拿它做 Re-ID 或姿态估计前置处理的算法工程师。数据覆盖监控视角和航拍视角,包含不同光照和天气条件,文件名里能看到 FudanPed、PennPed、man、person、building 等来源,说明它是从多个公开行人数据集整合而来。下面从目录结构开始,一步步拆到训练和推理。

2. 拆开压缩包:目录结构、标注格式与选型理由

2.1 拿到数据先看什么:目录树与文件命名规律

解压后你会看到图片和对应的标注文件。从项目正文给出的文件名来看,图片命名遵循原始名_640_jpg.rf.哈希.jpg的规律,其中640表示图片短边被缩放到 640 像素,rf.后面是 Roboflow 导出时生成的唯一哈希。标注文件通常是同名的.txt,放在labels/train、labels/val、labels/test三个子目录下。先跑一遍目录统计,确认图片和标注一一对应:

# 统计各子集图片数量 find images/train -name "*.jpg" | wc -l # 预期 1131 find images/val -name "*.jpg" | wc -l # 预期 48 find images/test -name "*.jpg" | wc -l # 预期 47 # 检查是否有图片缺失对应标注 for f in images/train/*.jpg; do base=$(basename "$f" .jpg) [ -f "labels/train/$base.txt" ] || echo "缺失标注: $base" done

这段脚本做两件事:第一段用find + wc -l核对三个子集的图片数是否与简介一致;第二段遍历训练集图片,检查每个.jpg是否有同名.txt。如果输出为空,说明配对完整。常见问题是 Roboflow 导出时图片和标注分在不同文件夹,解压后路径对不上,这时候需要手动建软链接或调整data.yaml里的路径。

2.2 YOLO 实例分割标注长什么样:一行一个实例

YOLO 实例分割的标注格式和目标检测不同。目标检测是class x_center y_center width height,五个值;实例分割是class x1 y1 x2 y2 ... xn yn,第一个是类别索引,后面是所有归一化到 0~1 的多边形顶点坐标。打开一个标注文件看看:

# 查看第一个训练标注文件的前两行 head -n 2 labels/train/FudanPed00010_png.rf.24bc61111192b90017b72ae025a6eaaa.txt

输出大概是这样:

0 0.412 0.335 0.428 0.340 0.445 0.352 0.451 0.370 ... 0 0.712 0.520 0.725 0.531 0.738 0.545 0.741 0.560 ...

每行代表一个行人实例,0是类别索引(这里只有 Person 一类),后面是轮廓点坐标。简介说每个实例 50+ 轮廓点,意味着每行大约有 100+ 个数值。这个密度足以刻画复杂姿态和遮挡边缘,比矩形框信息量大得多。用 Python 快速验证一下每行的点数分布:

import os, glob point_counts = [] for txt in glob.glob('labels/train/*.txt'): with open(txt) as f: for line in f: parts = line.strip().split() # 第一个是类别,剩下的是 x,y 交替 n_points = (len(parts) - 1) // 2 point_counts.append(n_points) print(f"实例总数: {len(point_counts)}") print(f"最少轮廓点: {min(point_counts)}") print(f"最多轮廓点: {max(point_counts)}") print(f"平均轮廓点: {sum(point_counts)/len(point_counts):.1f}")

如果平均点数在 50 以上,说明标注精度符合简介描述。如果发现某些行只有 4 个点,那可能是矩形框被误转成了多边形,需要检查导出配置。

2.3 为什么选 YOLO 格式而不是 COCO:训练效率与框架兼容性

COCO 格式用 JSON 存所有标注,一个文件几十 MB,每次训练前要全量加载解析,内存占用高。YOLO 格式一行一个实例,按需读取,数据加载器可以并行解析,训练时 I/O 瓶颈小。更重要的是,YOLOv8-seg 原生支持 YOLO 分割格式,不需要写自定义 Dataset 类。如果你后续要转 COCO 做基准测试,用ultralytics自带的转换工具就行;反过来从 COCO 转 YOLO 则容易在类别映射和坐标归一化上出错。这份数据直接给 YOLO 格式,省掉了转换环节,对新手友好。常见做法是先用 YOLOv8n-seg 小模型快速验证数据可用性,再换更大的模型调精度。

3. 从零跑通 YOLOv8-seg 训练:配置、命令与参数调优

3.1 环境准备与 data.yaml 配置

先装 ultralytics,建议用虚拟环境避免依赖冲突:

python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install ultralytics

然后在数据集根目录建data.yaml,这是 YOLO 训练的数据入口:

# data.yaml path: /absolute/path/to/dataset # 数据集根目录,用绝对路径 train: images/train val: images/val test: images/test nc: 1 # 类别数,这里只有 Person 一类 names: ['Person'] # 类别名称,顺序必须和标注里的索引一致

path一定要写绝对路径,相对路径在不同工作目录下会找不到文件。nc和names必须和标注文件里的类别索引对应——如果标注里出现了1但你只定义了0,训练时会报索引越界。验证配置是否正确:

from ultralytics import YOLO model = YOLO('yolov8n-seg.pt') # 只做数据校验,不训练 model.train(data='data.yaml', epochs=1, imgsz=640, batch=4, dry_run=True)

dry_run=True会加载数据但不实际训练,能快速暴露路径错误和标注格式问题。

3.2 启动训练:关键参数怎么设

确认数据没问题后,正式启动训练:

yolo segment train \ data=data.yaml \ model=yolov8s-seg.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=20 \ project=runs/segment \ name=person_seg

逐个说参数:model选yolov8s-seg.pt而不是n版本,因为 1131 张图不算多,n容易欠拟合,s在精度和速度之间平衡更好;imgsz=640和图片短边一致,避免额外缩放损失;batch=16在 8GB 显存下能跑,如果 OOM 就降到 8;lr0=0.01是初始学习率,小数据集建议比默认的 0.01 再低一点,比如 0.005,防止早期震荡;patience=20表示验证集指标 20 轮不提升就早停,避免过拟合。训练过程中重点看mask mAP50和box mAP50两个指标,实例分割任务里 mask 指标比 box 更能反映轮廓质量。

3.3 训练日志怎么看:损失曲线与指标解读

训练开始后,runs/segment/person_seg/下会生成results.csv和 TensorBoard 日志。用 pandas 快速看关键指标走势:

import pandas as pd df = pd.read_csv('runs/segment/person_seg/results.csv') df.columns = df.columns.str.strip() # 列名可能带空格 # 看最后 10 轮的 mask mAP print(df[['epoch', 'metrics/mAP50(M)', 'metrics/mAP50-95(M)']].tail(10))

metrics/mAP50(M)是 mask 在 IoU=0.5 时的平均精度,metrics/mAP50-95(M)是 IoU 从 0.5 到 0.95 的平均值。行人轮廓分割里,如果 mAP50 能到 0.85 以上、mAP50-95 在 0.55 以上,说明模型对轮廓的拟合不错。如果 box mAP 高但 mask mAP 低,通常是轮廓点不够密或者标注边缘有噪声。损失曲线方面,train/seg_loss应该稳步下降,如果震荡剧烈,把lr0再降一半,或者把batch调大让梯度更平滑。

4. 推理、验证与踩坑排查

4.1 用训练好的模型跑推理:单图与批量

训练完成后,用best.pt跑推理:

from ultralytics import YOLO model = YOLO('runs/segment/person_seg/weights/best.pt') # 单张图片推理 results = model('images/test/FudanPed00031_png.rf.92ab4d3aaacb8e0ddfbd96551f783e36.jpg', conf=0.4) # 批量推理整个测试集 results = model('images/test/', conf=0.4, save=True, project='runs/predict')

conf=0.4是置信度阈值,低于这个值的检测框会被过滤。行人场景下建议从 0.4 开始试,如果漏检多就降到 0.25,误检多就升到 0.5。save=True会把带掩码的可视化结果存到runs/predict下。检查推理结果里的掩码数量:

for r in results: if r.masks is not None: print(f"{r.path}: 检测到 {len(r.masks)} 个行人实例") else: print(f"{r.path}: 未检测到行人")

如果测试集 47 张图里大部分都能检出合理数量的行人,说明模型泛化能力可以。如果某些图完全没检出,先确认这些图里确实有行人,再检查是不是光照或视角太极端。

4.2 避坑指南:五条血泪经验

现象一:训练 loss 不下降,一直卡在初始值附近。原因通常是data.yaml里的nc和标注类别数不一致,或者标注文件里有空行导致解析失败。解决方法是先跑dry_run=True校验数据,再用脚本扫描所有标注文件,统计出现的类别索引:

import glob classes = set() for txt in glob.glob('labels/train/*.txt'): with open(txt) as f: for line in f: if line.strip(): classes.add(int(line.split()[0])) print(f"标注中出现的类别索引: {classes}")

如果输出不是{0},说明有异常类别,需要清理或重新映射。

现象二:mask mAP 远低于 box mAP。原因可能是轮廓点太少或标注边缘不贴合目标。简介说 50+ 点,但实际数据里可能有个别实例只有十几个点。解决方法是过滤掉点数少于 20 的实例,或者用形态学操作平滑掩码边缘。另一个原因是imgsz设得太小,轮廓细节在缩放中丢失,把imgsz从 640 提到 960 试试。

现象三:验证集指标波动大,时好时坏。验证集只有 48 张,样本量太小,单轮指标受个别难样本影响大。解决办法是看多轮移动平均,或者把patience调大,不要因为某一轮掉点就停。常见做法是训练结束后取最后 10 轮里 mask mAP 最高的权重,而不是直接用最后一轮。

现象四:推理时显存溢出。批量推理整个测试集时,如果图片分辨率不一致,YOLO 会按最大尺寸 padding,显存占用飙升。解决方法是推理时加imgsz=640强制统一尺寸,或者逐张推理而不是批量。

现象五:导出的 ONNX 模型推理结果和 PyTorch 不一致。这是实例分割模型导出时的经典坑。YOLOv8-seg 导出 ONNX 需要指定opset=12以上,且后处理里的 mask 系数计算在 ONNX 里可能有精度差异。解决方法是导出后用onnxruntime跑一遍验证,对比掩码 IoU,如果差异超过 2% 就检查导出参数:

yolo export model=runs/segment/person_seg/weights/best.pt format=onnx opset=12 imgsz=640

4.3 用验证集做阈值扫描:找到最佳 conf 和 iou

默认conf=0.25、iou=0.7不一定适合你的场景。用验证集做一轮扫描:

from ultralytics import YOLO import numpy as np model = YOLO('runs/segment/person_seg/weights/best.pt') best_f1, best_conf = 0, 0 for conf in np.arange(0.1, 0.9, 0.1): metrics = model.val(data='data.yaml', conf=conf, iou=0.6, split='val') f1 = metrics.seg.f1 if f1 > best_f1: best_f1, best_conf = f1, conf print(f"conf={conf:.1f} mask F1={f1:.4f}") print(f"最佳 conf={best_conf:.1f}, F1={best_f1:.4f}")

metrics.seg.f1是分割任务的 F1 分数,综合了精度和召回。扫描后选 F1 最高的 conf 作为推理阈值。iou参数控制 NMS 的合并阈值,人群密集场景下建议调到 0.5~0.6,避免把相邻行人合并成一个实例。

5. 进阶技巧:把分割掩码转成 Re-ID 可用的裁剪图

行人实例分割的一个高价值下游任务是 Re-ID(行人重识别)。Re-ID 需要把每个行人裁剪成独立小图,再送进特征提取网络。用分割掩码做裁剪比矩形框裁剪干净得多,因为背景像素被掩码过滤掉了。下面这段代码把测试集里每个行人实例抠出来,存成带透明通道的 PNG:

import cv2 import numpy as np from ultralytics import YOLO from pathlib import Path model = YOLO('runs/segment/person_seg/weights/best.pt') out_dir = Path('reid_crops') out_dir.mkdir(exist_ok=True) results = model('images/test/', conf=0.4, retina_masks=True) for r in results: img = r.orig_img if r.masks is None: continue masks = r.masks.data.cpu().numpy() # shape: (N, H, W) boxes = r.boxes.xyxy.cpu().numpy() for i, (mask, box) in enumerate(zip(masks, boxes)): x1, y1, x2, y2 = map(int, box) # 把掩码缩放到原图尺寸 mask_resized = cv2.resize(mask, (img.shape[1], img.shape[0])) mask_binary = (mask_resized > 0.5).astype(np.uint8) # 裁剪区域 crop = img[y1:y2, x1:x2] crop_mask = mask_binary[y1:y2, x1:x2] # 生成 RGBA 图,背景透明 rgba = cv2.cvtColor(crop, cv2.COLOR_BGR2BGRA) rgba[:, :, 3] = crop_mask * 255 name = Path(r.path).stem cv2.imwrite(str(out_dir / f"{name}_person{i}.png"), rgba) print(f"保存 {name}_person{i}.png 尺寸 {crop.shape[:2]}")

retina_masks=True让掩码输出保持原图分辨率,避免缩放导致的边缘模糊。mask > 0.5是二值化阈值,如果边缘有锯齿可以改成 0.3 让掩码稍微膨胀。生成的 RGBA 图可以直接送进 Re-ID 模型,背景透明意味着数据增强时不会引入背景噪声。这个流程跑完,测试集 47 张图大概能产出 100~200 个行人裁剪图,足够做小规模 Re-ID 验证。

从那以后我每次拿到新的分割数据集,都强制先跑一遍点数统计和类别索引扫描,确认标注质量再开训练——这两步花不了五分钟,但能省掉后面几小时的无效等待。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表