
简介包含10000张真实场景图片的YOLO人体行为检测数据集面向目标检测初学者与计算机视觉开发者旨在解决人体行为识别任务中数据采集困难、标注格式不统一以及YOLO训练环境配置复杂等实际问题。图片内容场景丰富标注框质量高同时提供VOCxml、COCOjson、YOLOtxt三种格式标签并按文件夹分类存放可直接用于YOLOv5、YOLOv8等主流目标检测框架。压缩包共2000个文件以1986个xml标注文件为主另含5个txt标签清单、3个Python数据划分脚本和6个HTML图文教程整体大小约412MB配套教程覆盖Ubuntu环境安装、Windows/Linux下YOLO环境搭建以及自定义数据集训练流程划分脚本支持一键生成训练集、验证集和测试集并可选生成ImageSets索引文件便于灵活组织数据。目前已有385人学习使用适合需要快速获取规范人体行为数据并跑通YOLO检测流程的开发者。1. 这份YOLO人体行为检测数据集先搞清楚它值在哪我拆过不少目标检测数据集资源YOLO人体行为检测数据集是少数把“直接可用”做到位的10000张真实场景图片同一份标注同时给出VOC、COCO、YOLO三种格式标签再配上三个数据集划分脚本和覆盖Linux/Windows的训练教程。对正在做人行为识别但卡在数据准备阶段的开发者来说这份课程资源能让你跳过采集、标注、格式转换三个最耗时的坎直接进训练环节。它适合刚入门YOLO的在校学生也适合需要快速验证算法效果的从业者。唯一前提是你要清楚三种标签格式之间是怎么映射的下面按这个顺序拆给你。2. 数据集内部结构三种标签格式并存的转换逻辑拿到资源包第一件事不是急着跑训练而是把目录结构摸清楚。人体行为检测和通用目标检测最大的差别在于同一张图里往往有多个目标、多个行为状态标签文件里每个目标框和类别名的对应关系必须严格一致否则训练出的模型会把“站着的人”和“走路的人”混成同一个类别。2.1 解压后的目录组织方式资源解压后图片和三套标签分别存放在不同文件夹下这是最合理的组织方式——训练框架读数据时只认固定目录不会因为你临时改路径而出错。常见结构如下dataset/ ├── JPEGImages/ # 10000张原始图片jpg格式 ├── Annotations/ # VOC格式标签xml文件 ├── coco/ # COCO格式标签json文件 ├── labels/ # YOLO格式标签txt文件 ├── train_list.txt # 训练样本清单 ├── 三个划分脚本.py └── 环境搭建与训练教程.htmltrain_list.txt 里每一行通常是“图片名 标签路径”或者“相对路径 类别id”的组合这取决于资源作者在划分脚本里写入的格式。我一般会先head -20 train_list.txt看一眼确认字段分隔符是空格还是逗号后面写数据配置文件时要用到。2.2 VOC格式读XML中的bbox坐标VOC格式以XML文件为容器每个XML文件对应一张图片记录目标框的绝对像素坐标。用labelImg标注工具标注时默认保存成这种格式所以它是最贴近原始标注的形态。annotation folderJPEGImages/folder filename000001.jpg/filename size width1920/width height1080/height depth3/depth /size object nameperson/name poseUnspecified/pose bndbox xmin120/xmin ymin210/ymin xmax520/xmax ymax720/ymax /bndbox /object /annotation这段XML里最关键的是bndbox四个值xmin、ymin是左上角坐标xmax、ymax是右下角坐标单位是像素。name是类别名这份数据里是person实际资源里可能包含站、坐、走、跑等多个行为类别。解析时要注意一张图片里有几个object就有几个目标框漏掉任何一个都会让训练集和标签数量对不上。2.3 COCO格式JSON里的categories和annotationsCOCO格式把整个数据集的所有标注汇总进一个JSON文件对做数据分析和模型评估特别友好。它的核心结构分三块images描述每张图的尺寸和文件名annotations描述每个目标框的坐标和类别归属categories定义类别id和类别名的映射。{ images: [ { id: 1, file_name: 000001.jpg, width: 1920, height: 1080 } ], annotations: [ { id: 1, image_id: 1, category_id: 1, bbox: [120, 210, 400, 510], area: 204000 } ], categories: [ { id: 1, name: person } ] }COCO里bbox的四个值依次是x左上角、y左上角、目标框宽度、目标框高度单位是像素。这个顺序最容易踩坑因为和VOC的xmin、ymin、xmax、ymax不是一一对应。把VOC转成COCO时width要算xmax - xminheight要算ymax - ymin很多人直接照搬坐标就错了。2.4 YOLO格式归一化坐标的txt标签YOLO格式是训练时最直接能用的每个txt文件对应一张图片每一行代表一个目标框。格式是class_id x_center y_center width height其中四个位置值全部归一化到0和1之间也就是用绝对像素坐标除以图片宽高。0 0.1667 0.4306 0.2083 0.4722 0 0.8333 0.4306 0.1250 0.4722第一行的含义是类别id为0的目标框中心点x在整张图宽度的16.67%处中心点y在高度的43.06%处框宽占整张图的20.83%框高占47.22%。把txt标签转换回可视化框时需要反归一化我常用的校验脚本如下# 快速校验YOLO标签是否画在正确位置 import cv2 img_path JPEGImages/000001.jpg label_path labels/000001.txt img cv2.imread(img_path) height, width img.shape[:2] with open(label_path, encodingutf-8) as f: for line in f: fields line.strip().split() cls_id, x_center, y_center, box_w, box_h map(float, fields) # 反归一化得到像素坐标限制在图像边界内 x1 int((x_center - box_w / 2) * width) y1 int((y_center - box_h / 2) * height) x2 int((x_center box_w / 2) * width) y2 int((y_center box_h / 2) * height) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, str(int(cls_id)), (x1, y1 - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2) cv2.imwrite(check_000001.jpg, img)这段脚本的核心逻辑在于txt里的归一化值乘上图片实际宽高才能还原成画面上的矩形框同时做一次越界裁剪避免坐标超出图片边界导致后面训练报错。每次拿到新数据集我都先随机挑五张图跑一遍这个脚本肉眼确认框有没有错位、类别id是否和names清单一致。2.5 三种格式怎么选取决于你的训练管线格式存储方式坐标类型最适合的场景VOC每图一个xml绝对像素用labelImg重新编辑、VOC系列框架COCO整个数据集一个json绝对像素评估指标计算、与现成API对接YOLO每图一个txt归一化直接喂给YOLO系列训练如果你只是要在YOLO框架下跑训练直接用labels目录下的txt标签别绕路。如果要做数据增强、挑选难例或者和别人的检测代码对接COCO的json更方便。唯一不建议的是拿着VOC格式直接塞进YOLO训练脚本虽然很多框架做了自动转换但转换过程里的边界坐标偏移会让你排查起来很头疼。3. 环境搭建与划分脚本从解压到能跑通的路径很多人拿到资源后直接跳进训练结果在环境这一步就卡一两周。YOLO训练本身不复杂复杂的是CUDA、PyTorch、显卡驱动三者版本互相匹配这件事。这里把Linux和Windows两条路线都说清楚。3.1 Ubuntu/Linux环境CUDA驱动和PyTorch一步到位Linux环境的坑主要在显卡驱动和PyTorch版本不匹配。先确认你的显卡驱动能跑CUDA再装PyTorch不要先装PyTorch再回头查驱动。# 先看驱动是否工作nvidia-smi能正常显示即可 nvidia-smi # 创建Python虚拟环境避免污染系统环境 python3 -m venv yolo_env source yolo_env/bin/activate # 安装PyTorch按当前CUDA版本选择对应命令 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装YOLO训练框架和日常依赖 pip install ultralytics opencv-python参数说明--index-url指定PyTorch官方预编译包源目的是拿到和本机CUDA版本匹配的二进制文件cu118表示CUDA 11.8版本如果你的驱动支持CUDA 12.x换成cu121。装完后用下面这个命令验证GPU可用import torch # 返回True说明训练时能调用GPU print(torch.cuda.is_available())如果返回False大概率是PyTorch版本和驱动不匹配或者驱动本身没装好优先检查驱动而不是重装PyTorch。3.2 Windows环境用虚拟环境隔离依赖Windows下我习惯用Anaconda管理环境因为conda会自动处理一些依赖冲突比裸pip省心。conda create -n yolo python3.9 conda activate yolo pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python装完后同样执行一遍torch.cuda.is_available()的验证。Windows上有个额外注意点如果你笔记本是双显卡集显独显可能需要在系统设置里为Python进程指定使用独立显卡否则训练时默认跑在集显上速度会慢得像是没装GPU。3.3 三个划分脚本的区别与用法资源里带了三个划分脚本功能有明确分工很多人不清楚该用哪一个这里拆开说训练集、验证集、测试集划分脚本.py把数据按比例分成三份适合最终交付模型时的正式评估。训练集、验证集划分脚本.py只分两份适合训练阶段调参不需要最终测试集。split_train_val生成ImageSets下txt文件划分脚本.py生成VOC风格ImageSets的txt索引文件供部分VOC系框架直接读取。这类脚本的通用逻辑我拆解一下方便你改比例时知道改哪里import os import random # 图片和标签严格同名只是扩展名不同 image_dir JPEGImages label_dir labels image_files [f for f in os.listdir(image_dir) if f.endswith(.jpg)] # 按8:1:1划分可改成7:2:1或6:2:2 random.seed(42) random.shuffle(image_files) train_split int(len(image_files) * 0.8) val_split int(len(image_files) * 0.9) train_files image_files[:train_split] val_files image_files[train_split:val_split] test_files image_files[val_split:]关键逻辑在random.seed(42)固定随机种子保证每次跑出来的划分结果一致这样你训练到一半发现数据有问题重新划分后还能复现之前的现象。random.shuffle打乱顺序避免连续图片来自同一段连续视频帧不然验证集和训练集里会出现内容几乎一样的图片mAP虚高但实战效果差。4. 训练实操把YOLO默认配置改成你的数据数据集和环境都准备好后训练本身反而最省心。但“省心”的前提是数据配置文件和训练参数写对。YOLO系列训练框架大同小异核心就两件事告诉模型你的图片在哪、你的类别有哪些。4.1 数据配置文件路径和类别清单是核心数据配置文件是训练入口格式通常是YAML。训练框架会读取这个文件里的路径去对应目录找图片和标签。# data.yaml训练前必改 path: /abs/path/to/dataset # 换成数据集的绝对路径 train: images/train # 训练集图片子目录 val: images/val # 验证集图片子目录 names: 0: person 1: walk 2: run 3: sit参数说明path建议写绝对路径相对路径在某些训练场景下会因为工作目录变化而找不到数据train和val是相对path的子目录如果你用自己的划分脚本生成了单独的图片文件夹这里要对应修改names的类别顺序和标签txt里的class_id一一对应顺序写反了模型也能训练但预测结果会张冠李戴。这份资源的标签文件在labels目录如果你没跑划分脚本直接把train指向JPEGImages所在目录并确保训练框架能自动找到同名的txt标签文件即可。4.2 训练命令从预训练权重继续练人体行为检测依然属于目标检测大类从COCO预训练权重开始迁移学习效果和收敛速度都远好于随机初始化。yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs100 \ batch16 \ imgsz640 \ device0参数说明modelyolov8n.pt用nano版本预训练权重显存占用小、训练快适合先跑通流程epochs100在10万级数据量下够用但这个数据集只有1万张100轮完全足够batch16按你显卡显存调整8GB显存用16没问题6GB建议降到8imgsz640是训练输入分辨率如果图片本身是1080P可以试imgsz896小目标检测会好一些但显存占用直线上升。4.3 中断恢复与训练日志判断训练到一半断电或显存溢出是常态不需要从头再来。YOLO训练框架的恢复机制会从最近的checkpoint继续跑。# 从上次中断的权重继续训练 yolo detect train resumeTrue modellast.pt训练日志里最需要关注的是box_loss、cls_loss和obj_loss三项。前50个epoch里loss波动大是正常的但如果100轮后box_loss还在0.1以上上下乱跳说明学习率过大或者数据标签有噪声。我判断训练是否收敛的核心方法是看验证集mAP是否还在稳定上升如果连续20个epoch mAP不涨就停掉别再把时间耗在无效训练上。5. 常见问题与避坑标签、路径、显存三座大山这部分是血泪经验的重灾区也是我拆完这个数据集资源后最想提醒你的。以下每条都是真实会发生的现象不是理论推导。5.1 图片和标签对不上号现象启动训练后报FileNotFoundError: labels/xxxxx.txt not found或者训练正常但所有目标的类别都是同一类。原因划分脚本运行时只列举了图片文件名没有做图片和标签的“交集过滤”。数据集中存在一些只有图片但没有对应标签的样本或者标签文件名后缀不是.txt。解决训练前写一段脚本把JPEGImages和labels两个目录都扫一遍只保留两者都存在的文件名。# 生成有效的训练列表 # 假设图片是jpg标签是txt文件名完全一致 ls JPEGImages | sed s/.jpg// all_images.txt ls labels | sed s/.txt// all_labels.txt comm -12 (sort all_images.txt) (sort all_labels.txt) valid_files.txt5.2 划分脚本跑完数据不完整现象划分完之后训练集能训练但验证集效果极差或者某些类别在验证集里一个都没有。原因划分时只按文件名随机没有按类别比例做分层抽样。人体行为数据集里“站”这个类别可能占了60%“跑”只占3%纯随机划分下“跑”在验证集里可能一个样本都分不到。解决按类别做分层划分。简单做法是先按类别id把所有样本分组再在每组内部按比例随机划分保证每个类别在训练集、验证集、测试集里都有比例接近总体分布。5.3 类别编号错位导致训练结果全乱现象模型能训练loss能降但验证时所有预测框的类别都错一位把“站”预测成“走”。原因VOC格式里类别是字符串转YOLO时要映射成整数id映射表和data.yaml的names顺序不一致。比如XML里类别顺序是person、walk、sit转换脚本里如果按字母序排成person、sit、walk两套id就对不上了。解决转换后随机抽几张图手动比对txt第一列的类别编号对应的names条目和XML里的原始类别名是否一致。这个校验脚本我每次都跑成了换数据集后的例行操作。5.4 显存不足直接OOM现象训练到第一个epoch就报CUDA out of memory程序直接退出。原因batch size设太大加上输入分辨率高显存一次性被占满。8GB显存跑nano模型、batch32、imgsz640很容易爆。解决把batch降到8imgsz降到640先跑通前面两个epoch。如果还爆改成modelyolov8n.pt并用device0强制单卡。另一种缓解办法是开启梯度累积但训练时间会变长不太推荐在基础阶段用。5.5 验证集和训练集信息泄露导致mAP虚高现象训练100轮后mAP高达98%但用手机拍几张真实照片测几乎全漏检。原因划分脚本没打乱数据或者数据采集自连续视频帧导致训练集和验证集里有大量内容几乎相同的图片。模型其实“记住”了这些特定画面遇到新场景就失效。解决确认划分脚本里执行了random.shuffle并且把连续视频帧的间隔抽帧做得足够大。更严苛的做法是按视频段划分而不是按单帧划分保证同一个视频的帧只出现在一个集合里。6. 让人体行为模型真正能用的验证与迭代技巧训练结束后别急着部署。先用验证集跑一轮正式评估拿到数字再决定下一步。yolo detect val modelruns/detect/train/weights/best.pt datadata.yaml重点看两个东西每个类别的平均精度和混淆矩阵。平均精度不均衡是常态比如“走”类AP 0.92“跑”类AP只有0.61说明“跑”这个类别的样本量不够或者场景变化太大。混淆矩阵里能看到哪些类别互相误判比如“蹲”和“坐”经常混在一起那就需要考虑合并类目或者在标注时把边界画得更清晰。模型验证通过后我建议你保留一个固定的“难例集”每次收集新的误检漏检样本加入训练集重新训练。这个动作比调学习率、换数据增强参数都管用。人体行为检测的难点从来不是网络结构而是“站”“蹲”“坐”这些行为在不同视角下差异极大只有不断喂入新场景的特例模型才能逐渐稳住。我曾经因为类别编号错位问题翻车整整三天训练出来的模型全是错位预测后来强制自己每次换数据集都走一遍验证脚本从那以后我再也没有因为这种低级错误浪费过时间。样本划分、标签校验、验证评估这些步骤每次多花十分钟换来的是不返工。希望这个资源包能真正帮到你跑通一个可用的YOLO人体行为检测模型。本文还有配套的精品资源点击获取