
简介面向目标检测算法训练与监控场景应用的人群提供1000张真实场景行人图像及对应标注场景涵盖校园、街景、道路、遮挡及严重遮挡行人适合公共场所监控行人检测项目或作为通用检测数据补充。标注基于LabelImg完成同时提供VOC(xml)、COCO(json)、YOLO(txt)三种主流格式可直接接入YOLO等框架训练。包内还附YOLO11一键训练脚本覆盖GPU(GPUs)、CPU、Mac(M芯片)三平台并配有博主训练结果日志作为效果参考。资源以1个pdf文件交付大小约4.17MBpdf中包含数据集基本情况介绍与百度网盘获取方式。目前已有1043人浏览学习适合需要快速获取高质量行人检测数据并进行算法验证的开发者、科研人员及竞赛选手。1. 先泼盆冷水1000张行人图和三格式标签离能用的模型还差几步做行人目标检测的都知道数据集比模型更值钱。标题里这套组合——1000张行人图像、VOC/COCO/YOLO三份标签、外加一份能跑GPU/CPU/Mac三平台的YOLO11一键训练脚本看起来已经把从数据到训练的整个链路都包圆了。但我得先说实话1000张图属于“能启动项目、别指望直接上线”的量级三格式标签是省了你手工标注的苦力活真正决定模型成色的是数据分布、标签一致性和训练参数这三件事。这篇文章按从业者最常用的路径拆先教你怎么判断这1000张图的成色再讲三种标签格式之间的换算关系和常见转换坑然后给一份能在三平台跑通的YOLO11训练脚本和参数说明最后是训练翻车排查和推理验证闭环。适合刚入门目标检测、手头有数据集想快速出第一个行人检测模型的人也适合被“数据看着没问题但模型就是烂”折腾过的熟手。2. 行人检测数据集选型与三格式标签1000张图能不能用先看这四点2.1 分布比数量重要场景、遮挡与小目标的占比决定模型上限1000张行人图听起来不多但真要评估它值不值得拿来训练我一般不看总数看四个分布指标。第一个是场景分布白天、夜间、雨天、逆光、室内外的比例是否均衡。行人检测在夜间和逆光场景翻车是常态如果1000张图全是白天街道模型一放到地下车库就懵。第二个是遮挡比例行人互相遮挡、被车辆或栏杆遮挡的样本至少要占两成否则训练出来的模型只会框“完整的人”。第三个是小目标占比画面里远处的小人像在640x640输入下可能只有二三十个像素高这类样本缺了模型在密集人群中基本只能框到最近那几个——这正是小目标检测这个方向的核心痛点。第四个是标注一致性。拿到别人整理的数据集最隐蔽的坑是漏标一张图里明明有5个行人只框了3个。漏标的行人在训练时会被当作背景模型学到的是“这部分区域不需要输出框”召回率直接被打残。检查方法很土但有效用任一工具把标签画到图上逐张扫一遍挑出人眼明显可见但没框的样本能补就补不能补就从训练集里删掉。1000张图里漏标超过5%这个数据集的质量就得打问号。这四个指标里小目标和遮挡占比直接决定模型上限而标注一致性决定训练过程会不会“带病学习”。后者可以通过代码自动检查下面给一个用YOLO格式快速粗查的思路统计每张图的平均目标数、目标宽高像素分布把目标高度小于32像素的图单独列出来看——这批就是小目标样本数量不够就得靠后续的数据增强和训练策略补。2.2 VOC/COCO/YOLO标签对照三种格式的坐标换算与文件结构三种格式的核心差别就两个坐标基准和文件组织。VOC用的是绝对像素坐标XML文件里的bndbox四个值是xmin、ymin、xmax、ymax单位是像素左上角为原点。COCO的JSON用[x, y, width, height]同样是绝对像素坐标但起点是框的左上角。YOLO格式最特殊每个txt文件一行一个目标写的是归一化后的中心点坐标和宽高class_id x_center y_center width height所有值都在0到1之间。格式文件载体坐标表示单位适用场景VOCXMLxmin, ymin, xmax, ymax绝对像素标注工具默认导出人类可读COCOJSONx, y, width, height绝对像素学术评测、实例类任务YOLOTXTx_center, y_center, width, height归一化(0~1)训练加载最快坐标换算的公式并不复杂但三个细节容易踩坑。第一COCO的与VOC转换时x对应xminy对应yminwidth是xmax减xminheight是ymax减ymin别把COCO的width理解成中心点偏移。第二VOC和COCO转YOLO时必须除以图片的真实宽高不是除以640或训练尺寸——图片缩放是训练时的事标签文件存的一直是原图比例。第三YOLO的class_id必须从0开始连续编号行人检测只有“person”一个类id就是0如果你在数据里加了一个“rider”它就得是1不能跳号。标注工具方面常见做法是用LabelImg导出VOC格式或者用支持YOLO导出的在线标注工具直接拿txt。到手的数据集如果三种格式都给了最好先随机抽三张图把同一种标签用手动脚本分别从三份文件里解析出来对比一遍确认坐标一致再进训练流程。格式统一这件事花半小时做能省后面调模型的三天。2.3 为什么训练脚本要把三种格式统一成YOLO数据加载与指标口径一致YOLO11的Ultralytics训练入口默认吃YOLO格式的txt标签data.yaml里指定图片目录标签目录与图片目录同名只是把images换成labels。即便训练脚本提供COCO和VOC的解析接口最常见也最稳的做法还是先统一转成YOLO格式再进训练。为什么要多这一步因为训练和验证用的是同一套数据加载逻辑如果你训练时用VOC解析器、验证时用另一套解析器两边的坐标口径一旦有细微差异验证指标会虚高模型上线时原形毕露——这种“指标很好、现场翻车”的案例我见过太多次。统一成YOLO格式还有一个好处可视化排查方便。txt文件可以直接被OpenCV画框脚本读取不用每次去解析XML或JSON。下面给一个VOC转YOLO的常用脚本COCO转YOLO的逻辑类似只是读取JSON后同样做归一化换算。import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, out_path, class_names): tree ET.parse(xml_path) root tree.getroot() # 拿到原始图的宽高用于归一化 width int(root.find(size/width).text) height int(root.find(size/height).text) with open(out_path, w) as f: for obj in root.iter(object): name obj.find(name).text if name not in class_names: continue class_id class_names.index(name) bndbox obj.find(bndbox) xmin float(bndbox.find(xmin).text) ymin float(bndbox.find(ymin).text) xmax float(bndbox.find(xmax).text) ymax float(bndbox.find(ymax).text) # 绝对像素 - 归一化中心点 宽高 x_center (xmin xmax) / 2.0 / width y_center (ymin ymax) / 2.0 / height w (xmax - xmin) / width h (ymax - ymin) / height # 框越界时截断防止归一化后出现负值或超过1 x_center min(max(x_center, 0.0), 1.0) y_center min(max(y_center, 0.0), 1.0) w min(w, 1.0) h min(h, 1.0) f.write(f{class_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n) # class_names的顺序必须和训练时data.yaml里的names一致 # 遍历VOC的xml目录逐文件转换到labels目录这段代码里class_names列表顺序是硬约束转换脚本里写的是什么顺序data.yaml里的names就必须是什么顺序否则模型训练时类别id直接错位。我一般会在转换后随机抽5张图把txt里的坐标换算回像素坐标画框肉眼核对确认无误再进训练。这个脚本不只是给VOC用COCO转YOLO的公式同理只是换成了读取JSON里的annotations字段。3. 用YOLO11一键训练脚本打通GPU/CPU/Mac环境准备与最小复现3.1 三平台的YOLO11环境检查CUDA、CPU版torch与Mac的MPS后端YOLO11基于Ultralytics框架核心依赖只有torch和ultralytics包但三个平台的环境差异不小配置错了连import都会报错。先看环境基线平台计算后端torch安装方式关键注意点NVIDIA GPUCUDApip install torch torchvision --index-url https://download.pytorch.org/whl/cu121驱动版本需匹配CUDA 12.x显存小于8GB建议batch调小CPUCPUpip install torch torchvision无GPU加速100轮训练可能要几小时到十几小时Mac (M系列)MPSpip install torch torchvision需macOS 12.3torch2.0MPS原生支持环境装好先别急着训练跑一条探活命令# GPU平台返回True说明CUDA可用Mac平台返回True说明MPS可用 python -c import torch; print(cuda:, torch.cuda.is_available()); print(mps:, torch.backends.mps.is_available())这条命令在两个平台的结果解读不一样。GPU机器上cuda为True还不够最好再跑一句nvidia-smi看驱动版本和显存占用Mac上mps为True就说明PyTorch走了Metal加速但MPS对某些算子的支持还不完整可能在训练中途报“not implemented”错这个放到第四章排查里细说。CPU平台不用看这个torch装好就完事。安装ultralytics包后验证一下版本能用pip install ultralytics # 快速验证YOLO11能被正常加载 python -c from ultralytics import YOLO; print(YOLO(yolo11n.pt))第一次加载yolo11n.pt会从网络下载预训练权重国内网络如果不稳定建议用镜像源或提前把权重文件放到当前目录。环境配置这块最常见的报错是torch的CUDA版本和显卡驱动不匹配现象是import torch就报NVML错误解决方法是去NVIDIA官网确认显卡算力再选对应的cu版本重装。3.2 数据集目录与data.yaml的写法让脚本第一遍就能跑通数据集的目录结构直接决定训练脚本能不能第一遍跑通Ultralytics的约定是images和labels两个顶层目录各自分train和val子目录图片与标签同名同扩展名前缀。dataset/ ├── images/ │ ├── train/ │ │ ├── 0001.jpg │ │ └── 0002.jpg │ └── val/ │ ├── 0101.jpg │ └── 0102.jpg └── labels/ ├── train/ │ ├── 0001.txt │ └── 0002.txt └── val/ ├── 0101.txt └── 0102.txt这里有个硬性约定images/train/0001.jpg对应labels/train/0001.txtjpg和txt的文件名必须完全一致多一个空格都不行。用1000张图的数据集建议350张做验证集650张做训练集比例比常规的8:2更保守因为行人检测里小目标和遮挡样本多验证集太小指标波动会很大。然后写data.yaml这是训练脚本的入口地图# dataset/data.yaml path: dataset # 数据集根目录相对当前工作目录 train: images/train val: images/val nc: 1 # 类别数量这里只有person一个类 names: 0: personpath支持绝对路径和相对路径我习惯用相对路径并让训练脚本从数据集根目录的上一级启动避免换机器后路径失效。val字段必须写不写验证集Ultralytics虽然也能训练但训练过程看不到val loss和mAP曲线等于盲训不建议这么做。如果目录结构和data.yaml对不上训练会直接报AssertionError: train: No labels in ...这是最常见的首跑报错优先检查路径拼写。3.3 一键训练脚本的核心逻辑与关键参数调整三平台一键训练脚本的关键在于自动探测计算后端避免每次换机器改代码。下面是我常用的最小脚本import torch from ultralytics import YOLO def auto_device(): # 优先CUDA其次Mac的MPS最后CPU兜底 if torch.cuda.is_available(): return 0 elif torch.backends.mps.is_available(): return mps else: return cpu if __name__ __main__: device auto_device() print(f使用设备: {device}) model YOLO(yolo11s.pt) # 从预训练权重开始迁移COCO上的行人特征 model.train( datadataset/data.yaml, epochs100, imgsz640, batch16, devicedevice, workers2, patience20, lr00.001, )参数说明device一行是关键返回0表示第一块GPU返回字符串“mps”让脚本在Mac上走Metal加速返回“cpu”则纯CPU训练。batch在GPU上可以拉到16或32显存8GB以下建议降到8CPU和Mac建议8以下否则一个batch就要算半天。workers在Windows上设0最稳Mac和Linux设2到4能加快数据读取。lr0默认0.01对小数据集偏高1000张图我一般压到0.001不然loss容易在前几个epoch震荡。训练启动后终端会按epoch打印一行指标box_loss、cls_loss、dfl_loss和验证集的mAP50、mAP50-95。看收敛看两个点box_loss持续下降说明定位在学mAP50稳步上升且最终不低于0.8模型基本可用如果box_loss降但mAP50不动大概率是置信度阈值的默认设置或类别不均衡问题。训练完成后runs/detect/train/weights/下会生成best.pt和last.pt后面推理验证用的是best.pt。4. 行人检测与YOLO11训练的5个典型翻车现场现象、原因与处理4.1 现象一loss降不下去或者val loss一路往上飙loss曲线不收敛是新手翻车重灾区。现象是训练到20轮左右box_loss还在0.08以上徘徊val loss从低位一路向上走mAP50在0.3上下抖动。原因大概率有三个学习率偏高导致参数在最优解附近震荡数据集的标注不一致让模型反复被互相矛盾的样本拉偏batch太小导致梯度噪声大。先用lr00.0005重新训一版如果box_loss在10轮内有下降趋势说明是学习率问题。再检查训练集里有没有漏标严重的图把明显错误的标签样本剔除掉。这两步做完还不收敛就要看是不是类别数写错了——四类目标写成了nc1模型硬把所有框都当人的局部特征去学loss低不了。4.2 现象二mAP50看着不错实际摄像头里一个行人都框不出来这是最伤人自信的坑验证集mAP50到了0.9模型拿到实际场景拍的照片却一个框都出不来。原因通常是验证集和小目标的真实分布不一致以及推理时的置信度阈值太高。YOLO11的默认推理conf是0.25但小目标的响应分数天然偏低密集场景里远距离行人可能只有0.1到0.2的置信度。处理方法是把推理的conf降到0.05到0.1看一版输出如果框出来了说明模型学到的东西没问题但要部署还得配合算法过滤用小目标增强模块或切片推理来提升小目标响应。再深一层训练时imgsz640对远距离行人确实不友好常见改进是把imgsz提到960或1280或者用SAHI这种切片推理工具把大图切成小块分别检测。4.3 现象三Mac上第一次训练就报错CPU跑起来又慢得离谱Mac平台的坑主要集中在MPS后端的算子支持不全。现象是训练跑到第一个epoch的中间直接抛NotImplementedError或者RuntimeError: MPS does not support binary op。原因在于部分PyTorch算子还没有MPS实现Ultralytics的某些增强逻辑会撞上。解决方法是给脚本设置环境变量PYTORCH_ENABLE_MPS_FALLBACK1让不支持的算子自动回退到CPU执行代价是速度略降但能跑通。另外Mac上训练时显存和内存是共享的batch超过16很容易被系统杀死进程报错信息里带killed字样就是内存不够把batch降到8、workers设0、imgsz降到480三管齐下就能稳住。CPU平台同理1000张图100轮可能要跑十几个小时先用10轮验证流程确认数据加载和标签没问题再跑完整训练。4.4 现象四VOC转YOLO之后可视化发现框全部偏移标签转换后的偏移问题几乎人人都会踩一次。现象是txt坐标转回像素坐标画框发现框整体向右下角或左上角偏移或者宽高被拉长。最常见的原因是把VOC的绝对坐标当成了相对坐标直接用或者归一化时漏了除以图片实际尺寸——注意不能除以640VOC里存的是原图尺寸即使训练时缩放到640标签文件里永远是原图比例。第二个隐蔽原因是XML里的width/height读出来是字符串没转float就做除法Python会做字符串拼接然后报类型错误。第三个原因是框本身越过图像边界导致归一化后出现负坐标我给的转换脚本里那段min/max截断就是干这个的。排查手段简单转换后随机取一张图用OpenCV把标签和原图画在一起对比框必须严丝合缝贴住行人。4.5 现象五训练日志里“no labels found”但标签明明存在这个报错会让人怀疑人生标签文件明明在目录里写着Ultralytics却说没找到。排查路径按三条来。第一条是扩展名和大小写Ultralytics严格匹配.txt文件如果你的标签是.TXT或转码工具生成的隐藏后缀比如0001.txt带个空格直接识别不到。第二条是标签文件内容为空或全部被过滤如果txt文件第一行格式写错解析失败后整个文件被跳过。第三条最容易被忽略——class_id超界标签里出现5 0.5 0.5 0.3 0.3而data.yaml里nc1ID为5的类别超出范围这个文件会被当成无效样本丢弃同时日志里打印警告。所以我每次拿到新数据集会先跑一个检查脚本读全部txt统计行数、解析失败数、ID范围全部通过再开始训练。5. 用一个推理脚本把模型用起来验证指标外还要看真实场景结果训练完拿到best.pt先别急着部署用推理脚本把模型拉到真实光照和场景里过一遍。from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model.predict( sourcetest_images/, # 放一些没参与训练的真实照片 imgsz640, conf0.1, # 调低阈值看模型真实召回能力 iou0.45, # 重叠框抑制阈值 saveTrue, devicemps, # 三平台分别填 0 / cpu / mps ) # 保存结果在 runs/detect/predict/ 下人眼逐张看conf和iou是两个要反复试的参数。conf从0.25降到0.1模型会多出大量低置信度框这时更容易看出它到底“认识”远距离行人还是只对近处的有反应。iou阈值控制两个重叠框的合并行人密集场景里0.45到0.5比较合适调太高会把贴着站的人错误合并成一个框。看完一轮输出后如果发现远距离小目标漏检不要急着头疼按优先级做三件事把imgsz提到960重新训练20轮看mAP50有没有回升如果还不行对训练集里小目标样本做切片增强把大图按512x512切块后重新标注训练最后才考虑yolo11s换yolo11m这类更大的模型。我的习惯是每次训练完除了看指标必须用一批真实场景照片做人工抽检——这个环节救过我太多次因为val指标在数据分布和真实场景有偏差时欺骗性极强。从1000张图起步做行人检测这个方向完全走得通但要对自己模型的边界心里有数小目标、遮挡、夜间场景这三关每一关都要靠数据和训练细节去磨。这份流程跑通之后你手上的三格式数据转换脚本、一键训练脚本和推理验证方法就是下一轮迭代的地基了。希望帮到你。本文还有配套的精品资源点击获取