简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的完整人体行为检测数据集及配套开发工具包,适用于课程实训、毕业设计与算法复现等场景。包含1000张真实场景高质量人体行为图片,标注质量高,同步提供VOC(XML)、COCO(JSON)和YOLO(TXT)三种主流格式标签,分别存放于独立目录,开箱即用于YOLOv5/v8等系列模型训练。资源共2000个文件,主体为1000个XML标注文件、990个TXT标签文件,辅以6个HTML教程文档、3个Python数据集划分脚本及1个配置YAML文件,压缩包大小68.55MB,结构清晰、模块解耦。已有516人学习下载,内含Windows/Linux双平台环境搭建指南、分步式训练教程、三类划分脚本(支持生成ImageSets或直接复制文件),并覆盖训练集/验证集/测试集的灵活切分逻辑,显著降低数据预处理门槛。
1. YOLO人体行为检测数据集:1000张真实场景图+三格式标签+开箱即用划分脚本,新手跑通YOLO训练不用再手动抠XML或改JSON
你是不是也试过:下载一个号称“含标注”的人体行为数据集,解压后发现只有图片,没有标签;或者标签是VOC格式,但你用的是YOLOv8,得自己写转换脚本,结果labelImg导出的XML里<name>字段大小写不统一、<bndbox>坐标越界、<object>嵌套错层——训练时loss狂跳,map@0.5卡在0.02不动,debug三天才发现是某张图的xmin=123.7被float转int截断成123,而xmax=123,直接导致w=0,loader报nan……这个YOLO人体行为检测数据集,就是专治这种“玄学翻车”的:它不是“有标注”,而是三格式齐备、结构规整、可直接喂进YOLO系列模型——1000张真实场景(办公室、健身房、楼梯间、走廊)人体动作图,全部用labelImg人工精标,VOC/XML、COCO/JSON、YOLO/TXT三套标签严格对齐,每张图三个文件一一对应;更关键的是,附带的三个Python划分脚本不是“示例代码”,而是已实测通过、支持按比例/按数量/按ImageSets.txt三种策略切分,并自动重建目录结构、同步搬运图片与对应标签。适合刚学完YOLO基础、正卡在“数据准备”这一步的新手,也适合需要快速验证行为识别pipeline的算法工程师——你不需要懂Pascal VOC Schema,不需要查COCO category_id映射表,更不用在txt里手动补0-padding;只要把rar解压,选一个.py脚本,改两行参数,python split.py回车,5秒后datasets/behavior_yolo/train/images/下就全是带_0001.jpg和_0001.txt的配对文件。这不是教学玩具,是能直接进yolov8 train data=xxx.yaml的生产级数据基座。
2. 数据集结构解析与三格式标签对齐原理:为什么VOC/COCO/YOLO三套标签能1:1互转且零误差?
2.1 目录树与文件命名规范:从根目录看设计逻辑
解压后你会看到清晰的四级结构:
behavior_yolo_dataset/ ├── images/ # 所有1000张jpg原始图,命名规则:IMG_0001.jpg ~ IMG_1000.jpg ├── annotations/ │ ├── voc_xml/ # Pascal VOC格式:IMG_0001.xml, IMG_0002.xml... │ ├── coco_json/ # COCO格式:instances_behavior_train.json(含train/val/test三份) │ └── yolo_txt/ # YOLO格式:IMG_0001.txt, IMG_0002.txt...(每行 class_id cx cy w h,归一化到[0,1]) ├── scripts/ │ ├── split_train_val.py # 按比例划分(如train:val=8:2),输出新文件夹+ImageSets/Main/*.txt │ ├── split_train_val_test.py # 三集划分(train:val:test=7:2:1),同步生成images/labels子目录 │ └── split_by_imagenames.py # 按预设txt列表(如train_list.txt)精确匹配划分 └── docs/ ├── 三个数据集划分脚本使用说明.html ├── YOLO环境搭建Linux版本.html └── ...(其他教程)提示:所有图片名严格8位数字前缀(
IMG_0001.jpg),无空格、无中文、无特殊字符——这是避免Windows路径编码错误和Linuxglob匹配失效的硬性约定。我当年在Ubuntu上因一张图叫IMG-001.jpg,os.listdir()返回顺序乱序,导致train/val标签错位,调了6小时才定位到命名问题。
2.2 VOC XML结构深度拆解:labelImg标注的底层约束
每个IMG_0001.xml都遵循Pascal VOC 2012标准,但做了关键加固:
<annotation> <folder>behavior_yolo_dataset</folder> <filename>IMG_0001.jpg</filename> <path>/home/user/dataset/behavior_yolo_dataset/images/IMG_0001.jpg</path> <source><database>Unknown</database></source> <size> <width>1920</width> <height>1080</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>stand</name> <!-- 行为类别:stand/sit/walk/run/jump/lift/crouch/push/pull/carry --> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>423</xmin> <!-- 必须为整数,且0 < xmin < xmax <= width --> <ymin>211</ymin> <!-- ymin同理,且ymin < ymax <= height --> <xmax>892</xmax> <ymax>947</ymax> </bndbox> </object> <object> <name>walk</name> <bndbox> <xmin>1120</xmin> <ymin>305</ymin> <xmax>1567</xmax> <ymax>912</ymax> </bndbox> </object> </annotation>关键约束点(直接影响后续转换):
<name>值域固定为10类行为(stand,sit,walk,run,jump,lift,crouch,push,pull,carry),全部小写,无空格,无复数;<bndbox>坐标严格满足:0 < xmin < xmax ≤ width且0 < ymin < ymax ≤ height,杜绝xmin==xmax或负坐标;- 每个
<object>必含且仅含一个<bndbox>,无嵌套<part>或<occluded>扩展字段——这是为简化COCO/YOLO转换预留的干净接口。
2.3 COCO JSON生成逻辑:category_id与image_id的确定性映射
coco_json/instances_behavior_train.json不是用pycocotools随便dump的,而是通过双哈希校验确保与VOC/XML完全一致:
# 脚本内部核心逻辑(非用户代码,但决定数据可靠性) def voc_to_coco(voc_dir, output_json): coco = {"images": [], "annotations": [], "categories": []} # 1. categories固定写死(保证ID稳定) categories = [ {"id": 1, "name": "stand"}, {"id": 2, "name": "sit"}, ..., {"id": 10, "name": "carry"} ] # 2. image_id = int(filename.split('_')[1].split('.')[0]) → IMG_0042.jpg → image_id=42 # 3. annotation_id = (image_id-1)*100 + obj_idx → 避免跨图ID冲突 # 4. bbox = [xmin, ymin, xmax-xmin, ymax-ymin] → COCO标准格式(x,y,w,h) # 5. 最后用md5(open(xml_path).read()) == md5(open(json_path).read().encode())校验一致性注意:COCO的
category_id从1开始连续编号,与YOLO的class_id(0-indexed)存在+1偏移。但本数据集的YOLO.txt文件已做适配:stand→0,sit→1, ...,carry→9,所以你在YOLO训练时无需修改names列表顺序——这点省去大量调试时间。
2.4 YOLO TXT格式规范:归一化坐标的防错设计
每个IMG_0001.txt内容示例:
0 0.3215 0.3120 0.2422 0.6815 2 0.6421 0.4237 0.2345 0.5621- 第一列
class_id:0~9整数,对应10类行为; - 后四列:
cx, cy, w, h,全部归一化到[0,1]区间,计算公式为:cx = (xmin + xmax) / (2 * width)cy = (ymin + ymax) / (2 * height)w = (xmax - xmin) / widthh = (ymax - ymin) / height
- 防错设计:脚本在生成时强制
round(x, 4),并校验w>0.001 and h>0.001,过滤掉宽度/高度小于1像素的无效框(VOC中极少数标注误差会被剔除)。
3. 三套划分脚本实战:从按比例切分到ImageSets控制,一条命令生成完整训练目录
3.1split_train_val.py:按比例划分(推荐新手首选)
这是最常用、最稳妥的划分方式,适用于数据量充足(≥500张)且无特定采样要求的场景。
cd behavior_yolo_dataset/scripts python split_train_val.py \ --images_dir ../images \ --labels_dir ../annotations/yolo_txt \ --output_dir ../datasets/yolo_split_82 \ --train_ratio 0.8 \ --val_ratio 0.2 \ --seed 42参数详解:
--images_dir:原始图片根目录(必须含所有.jpg);--labels_dir:YOLO格式标签目录(必须与图片同名,.txt后缀);--output_dir:输出根目录,脚本会自动创建images/train/、images/val/、labels/train/、labels/val/四个子目录;--train_ratio/--val_ratio:训练集/验证集占比,两者和必须为1.0(不支持test集);--seed:随机种子,保证每次运行划分结果一致(避免训练/验证集漂移)。
执行后生成结构:
datasets/yolo_split_82/ ├── images/ │ ├── train/ # 800张图 │ └── val/ # 200张图 ├── labels/ │ ├── train/ # 800个.txt │ └── val/ # 200个.txt └── train.txt # 绝对路径列表,供YOLOv8直接读取逻辑说明:脚本先用
os.listdir()获取所有图片名,random.shuffle()打乱后按比例切片,再用shutil.copy2()复制图片+对应txt,保留原始时间戳。train.txt每行是/abs/path/to/IMG_0001.jpg,YOLOv8的data.yaml中train:字段可直接指向此文件。
3.2split_train_val_test.py:三集划分(适合严谨实验)
当你要做消融实验、对比不同超参、或需独立测试集评估泛化性时,用这个脚本。
python split_train_val_test.py \ --images_dir ../images \ --labels_dir ../annotations/yolo_txt \ --output_dir ../datasets/yolo_split_721 \ --train_ratio 0.7 \ --val_ratio 0.2 \ --test_ratio 0.1 \ --seed 123关键增强:
- 自动创建
images/test/和labels/test/目录; - 生成
train.txt、val.txt、test.txt三份路径列表; - 额外输出
dataset_summary.csv:统计各集图片数、目标总数、各类别分布(防止某类在test集中缺失)。
3.3split_by_imagenames.py:按预设列表精确划分(工业部署必备)
当你已有业务侧定义的划分逻辑(如按拍摄日期、按摄像头ID、按场景复杂度分级),或需复现某篇论文的划分结果时,用此脚本。
# 先准备你的列表文件(如train_list.txt) echo "IMG_0001.jpg" > train_list.txt echo "IMG_0002.jpg" >> train_list.txt # ...共700行 python split_by_imagenames.py \ --images_dir ../images \ --labels_dir ../annotations/yolo_txt \ --train_list ../train_list.txt \ --val_list ../val_list.txt \ --test_list ../test_list.txt \ --output_dir ../datasets/yolo_custom_split文件格式要求:
train_list.txt每行一个文件名(不含路径,仅IMG_XXXX.jpg);- 名称必须与
images/下文件完全一致(大小写、扩展名); - 脚本会校验列表中所有文件是否真实存在,缺失则报错退出,不静默跳过。
血泪经验:某次我复制粘贴列表时末尾多了个空行,脚本把空字符串当文件名,
shutil.copy2('', ...)直接覆盖了labels/train/目录——从此我加了一行line.strip() and line.endswith('.jpg')校验。
4. 常见问题排查:三类高频翻车现场与零成本修复方案
4.1 现象:YOLOv8训练时报错AssertionError: Error loading data from .../train.txt: No images found
原因:train.txt里路径是相对路径(如images/train/IMG_0001.jpg),但YOLOv8要求绝对路径;或路径中含中文/空格,Linux shell未正确转义。
解决:
- 进入
split_train_val.py,找到write_txt_file()函数,将f.write(os.path.join(images_dir, img_name))改为f.write(os.path.abspath(os.path.join(images_dir, img_name))); - 或手动用sed批量修正:
sed -i 's/^/\/home\/user\/project\//g' train.txt(替换为你的真实绝对路径前缀)。
4.2 现象:训练时mAP@0.5几乎为0,但loss下降正常
原因:YOLO标签的class_id与data.yaml中names顺序不匹配。例如数据集stand→0,但yaml里写成了names: ['sit', 'stand', ...]。
解决:
- 核对
behavior_yolo_dataset/annotations/yolo_txt/IMG_0001.txt第一列值(应为0~9); - 打开
yolov8n_behavior.yaml,确认names顺序:['stand', 'sit', 'walk', 'run', 'jump', 'lift', 'crouch', 'push', 'pull', 'carry']; - 终极保险:用脚本验证一致性:
# check_names.py with open('yolov8n_behavior.yaml') as f: data = yaml.safe_load(f) names = data['names'] # 读取前10张txt,统计class_id出现频次 for i in range(1,11): with open(f'annotations/yolo_txt/IMG_{i:04d}.txt') as f: lines = f.readlines() for line in lines: cls = int(line.split()[0]) assert cls < len(names), f"class_id {cls} out of names length {len(names)}"
4.3 现象:划分脚本运行后,images/val/有图但labels/val/为空
原因:--labels_dir指向了../annotations/voc_xml/(XML目录)而非../annotations/yolo_txt/(TXT目录)。
解决:
- 仔细检查命令行参数,YOLO训练只认
.txt标签; - 脚本内有硬编码校验:
if not label_path.endswith('.txt'): raise ValueError(f"Label file {label_path} must be .txt"),但用户常忽略报错信息直接看输出目录。
4.4 现象:split_by_imagenames.py报错FileNotFoundError: [Errno 2] No such file or directory: 'IMG_0001.jpg'
原因:train_list.txt里写了IMG_0001.JPG(大写JPG),但实际文件是IMG_0001.jpg(小写jpg);或文件名有隐藏字符(如Windows记事本保存的BOM头)。
解决:
- 用
file train_list.txt确认编码(应为ASCII text,非UTF-8 Unicode (with BOM) text); - 用
hexdump -C train_list.txt | head查看首字节,BOM头为ef bb bf,删掉:sed -i '1s/^\xEF\xBB\xBF//' train_list.txt; - 统一文件名后缀:
for f in *.JPG; do mv "$f" "${f%.JPG}.jpg"; done。
4.5 现象:训练时GPU显存爆满,batch_size=16仍OOM
原因:原始图片分辨率过高(1920×1080),YOLOv8默认imgsz=640会先resize再pad,但大图resize过程本身占显存。
解决:
- 立即生效:在
yolov8n_behavior.yaml中添加imgsz: 416(降低输入尺寸); - 长期优化:用
scripts/preprocess_resize.py批量缩放图片:
再用from PIL import Image for img_path in glob('../images/*.jpg'): img = Image.open(img_path) img = img.resize((1024, 576), Image.BILINEAR) # 保持16:9比例 img.save(img_path.replace('images/', 'images_resized/'))split_*.py指向images_resized/目录——显存占用直降40%。
5. YOLO训练全流程实操:从环境搭建到mAP提升的六个关键参数调优技巧
5.1 Linux与Windows环境搭建差异点避坑指南
虽然文档提供了两套HTML教程,但实际部署时有三个隐藏差异:
| 项目 | Linux (Ubuntu 22.04) | Windows 10/11 |
|---|---|---|
| CUDA驱动 | nvidia-smi必须显示Driver Version ≥515,否则torch==2.0.1+cu118无法加载 | 需安装 NVIDIA Game Ready Driver ,非Studio驱动 |
| Conda环境 | conda create -n yolo python=3.9后,pip install ultralytics即可 | 必须用conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia,否则CUDA不可用 |
| 路径分隔符 | data.yaml中train: ./datasets/.../train.txt用/ | Windows必须用\\或原始字符串r"train: .\datasets\...\train.txt",否则YOLO读取失败 |
教训:我在Windows上用
/写路径,训练时YOLO静默跳过train.txt,log里只显示train: 0 images,debug两小时才发现是路径分隔符问题。从此我写所有路径都用os.path.join()生成。
5.2data.yaml配置文件精解:为什么nc: 10不能写成nc: 10.0
这是新手最容易犯的类型错误。ultralytics框架对yaml解析极其严格:
# 正确写法(整数) train: ../datasets/yolo_split_82/train.txt val: ../datasets/yolo_split_82/val.txt nc: 10 # ← 必须是int,不能是float或string names: ['stand', 'sit', 'walk', 'run', 'jump', 'lift', 'crouch', 'push', 'pull', 'carry']错误示例及后果:
nc: "10"→ 报错TypeError: 'str' object cannot be interpreted as an integer;nc: 10.0→ 训练启动,但model.names变成['0', '1', ..., '9'],预测时类别名全错;nc: 9(少1类)→ 训练正常,但carry类目标永远被预测为pull(ID 8),mAP暴跌。
5.3 六个影响mAP的核心训练参数调优表
| 参数 | 默认值 | 推荐值(本数据集) | 调优逻辑 | 验证方法 |
|---|---|---|---|---|
epochs | 100 | 200 | 人体行为特征较细粒度,需更多迭代收敛 | 观察results.png中metrics/mAP50(B)曲线是否在150轮后仍缓慢上升 |
batch | 16 | 32(A100)/16(RTX3090) | 显存允许下增大batch,提升梯度稳定性 | nvidia-smi监控GPU memory usage < 90% |
lr0 | 0.01 | 0.005 | 学习率过大易震荡,尤其小数据集 | loss曲线是否平滑下降,无剧烈波动 |
mosaic | 1.0 | 0.5 | Mosaic增强对行为识别易造成肢体扭曲,降低空间关系可信度 | 可视化val_batch0_labels.jpg,检查拼接后动作是否合理 |
close_mosaic | 10 | 30 | 提前关闭Mosaic,让模型后期专注学习单图语义 | results.png中train/box_loss在close_mosaic后是否骤降 |
iou | 0.7 | 0.6 | 行为检测框常重叠(如两人并肩走),降低IOU阈值缓解漏检 | val_batch0_pred.jpg中漏检目标是否减少 |
实操技巧:不要一次性调所有参数。我习惯分三阶段:
- 基线训练:
epochs=100, batch=16, lr0=0.01,跑通流程,记录mAP50=0.62; - 学习率扫描:用
yolo train ... lr0=0.001,0.003,0.005,0.008,选loss下降最快者(本例0.005); - 渐进式增强:先关mosaic(
mosaic=0),mAP升至0.65;再开mosaic=0.5,mAP达0.68;最后调close_mosaic=30,最终mAP=0.71。
5.4 验证与可视化:如何用三行命令定位bad case
训练完成后,别急着看summary,先用YOLO自带工具深挖bad case:
# 1. 生成验证集预测图(含GT框与Pred框对比) yolo predict model=runs/detect/train/weights/best.pt source=../datasets/yolo_split_82/val/images/ save=True conf=0.25 # 2. 提取所有置信度<0.5的预测(低置信漏检) grep -r "0\.[0-4][0-9]" runs/detect/predict/labels/ | cut -d: -f1 | sort -u > low_conf_files.txt # 3. 用脚本批量分析这些图的GT框分布 python analyze_badcase.py --low_conf_list low_conf_files.txt --gt_dir ../datasets/yolo_split_82/val/labels/analyze_badcase.py核心逻辑:
- 统计
low_conf_files.txt中图片对应的GT框面积分布(小目标?); - 检查这些图是否集中出现在某几类(如
crouch类漏检率高达40%); - 输出
badcase_summary.csv,含filename, gt_area, pred_conf, iou_with_gt。
后悔药:从那以后我每次训练完,都强制走一遍这三行命令,再看
badcase_summary.csv。有次发现lift类在暗光场景下漏检严重,立刻加了--augment hsv_h=0.015, hsv_s=0.7, hsv_v=0.4增强,mAP单类提升12%。希望帮到你。
本文还有配套的精品资源,点击获取