
简介目标检测是计算机视觉的核心任务旨在解决“物体在哪、是什么”的根本问题而YOLO系列算法凭借端到端单阶段检测与高效推理成为工业落地最广泛的框架之一。在安防场景中快速识别民警、保安等特定身份人员是高频需求但多分类模型面临标注成本高、小样本易过拟合等痛点。采用“警察/非警察”二分类策略能有效降低数据依赖、提升模型稳定性。基于一个仅含357张图片、已标注且支持YOLO26训练的警察识别数据集本文系统讲解了YOLO格式标注规则、数据集目录组织、训练配置与关键参数选择并分享了过拟合应对、类别不均衡处理及模型评估与导出的工程经验帮助开发者快速跑通从数据预处理到模型部署的完整链路也为小样本目标检测和安防身份识别落地提供了可直接借鉴的实践路径。 数据集的坑做安防项目的朋友应该都有体会你费劲巴拉地训练一个人物检测模型结果到了现场发现它只能告诉你这里有个人但完全分不清这个人是保安、是快递员还是需要特别关注的执勤民警。过去我一般会建议直接上多分类但多分类意味着每个类别都要攒够足够的样本对于动不动就几十个类别的需求来说数据标注量会迅速失控。所以当我看到这个带标注的警察民警识别数据集时第一反应是这其实是一个很聪明的切入方式——它只做二分类警察和非警察357张图直接支持yolo26训练看起来数据量不大但足够把整个流程跑通也足够验证二分类思路在人员身份识别这件事上到底可不可行。这个数据集的数据量确实不算大但它的价值恰恰在于够用和干净。对于想快速验证算法效果的研究者或者想把人员身份分类功能集成到现有安防系统里的工程师来说拿它来跑通yolo26的完整训练链路、调通数据标注格式、验证二分类精度完全够用。对于学生和刚入门目标检测的开发者来说它更是一个绝佳的练手素材不用自己去网上爬图不用自己标注几百个框下载下来直接就能开始训练把精力花在理解模型原理和调参上。下面我就结合自己实际折腾yolo系列的经验把这个数据集从里到外拆开讲清楚包括标注格式、目录组织、训练配置、参数选择以及我踩过的各种坑。1. 数据集的定位与设计思路拆解1.1 为什么是警察和非警察而不是更细的分类很多人拿到这个数据集的第一反应是只有两个标签为什么不把消防员、保安、交警都分出来我最初也有这个疑问但仔细想了一下业务场景就明白了这个设计的合理性。在园区管理、校园安保、商场运营这类实际场景里真正高频的需求其实不是要把所有职业都识别出来而是要识别出特定身份的人。对于民警识别来说业务方关心的问题往往就是一个这个人是不是民警。是就走相应的处理流程不是就按普通人员处理。这种过滤式的需求非常适合二分类模型因为二分类模型的决策边界更清晰类别之间不会互相干扰在样本量有限的情况下也更容易训出稳定效果。另一个现实原因是数据量和标注成本的约束。357张图说多不多如果强行分成民警、辅警、交警、保安等多个类别每个类别平均下来可能只有几十张图这对目标检测模型来说是灾难性的——类别越多每个类别的特征学习就越不充分模型很容易陷入过拟合。而压缩成二分类之后每类的样本量相对充裕模型能够更好地学习到民警这一类别的核心视觉特征比如制服颜色、警衔标志、装备配置等。我做过的项目里有一个客户最初坚持要按警种分类结果标注了1200张图六个类别训练出来的模型mAP只有0.52检测结果几乎不可用。后来改成二分类警务人员/普通人员同样的数据量mAP直接拉到了0.78以上。这个经历让我深刻意识到分类粒度不是越细越好而是要看业务容忍度和数据支撑能力是否匹配。1.2 357张图能做什么不能做什么既然这个数据集只有357张图我得说实话它不能直接支撑一个高并发、高精度的生产级系统。在真实的监控场景中光线变化、遮挡、拍摄角度、分辨率等因素都会对检测精度产生巨大影响357张训练图很难覆盖所有这些变化。但它的定位本来就不是生产级大模型数据集它的核心价值在于三个方面第一快速验证二分类思路的可行性。在你的业务中做个小实验看看模型能不能有效区分民警和普通人如果效果不理想说明这个方案本身有问题及时止损比什么都重要。第二跑通yolo26的完整训练流程。从YOLO格式标注的解析、data.yaml的配置到训练参数的调整、模型评估和导出这357张图足够让你把所有环节走一遍熟悉工具链。第三作为迁移学习的起点。yolo26带有预训练权重比如在COCO数据集上训练过的权重你可以在这个基础上用357张图做微调让模型快速适应民警识别这一特定任务。我自己在小数据集上做实验的一个习惯是先把训练目标定在流程跑通而不是精度达标。第一轮训练只求不报错、能收敛第二轮再调整参数追求更好的mAP。这样做的好处是不会被细节问题卡住导致迟迟进入不了调参阶段。1.3 数据集的理想使用人群根据我的经验这个数据集最适合下面几类人目标检测入门者。刚接触yolo系列的人最怕的不是模型复杂而是不知道数据怎么准备。这个数据集已经是YOLO格式标注好的直接拿来就能训练省去了从图片标注开始的最大一道坎。算法工程师。需要快速评估yolo26在人员身份二分类任务上的表现可以通过这个数据集做benchmark跑几个对比实验。系统集成开发者。如果正在做一个需要区分特定身份人员和普通人员的视觉系统可以用这个数据集先搭一个基础模型后续再根据实际场景补充数据迭代。研究者和学生。在做数据增强策略对比、小样本训练策略等课题时这个数据集是一个不错的起点。2. 数据标注格式与数据集实用细节解析2.1 YOLO标注格式的核心规则既然说支持yolo26训练那数据集里的标注文件必然是YOLO格式。YOLO格式的标注是一种基于归一化坐标的文本格式每张图片对应一个同名的txt文件文件中的每一行代表一个目标。每一行的格式是这样的class_id x_center y_center width height这四个坐标值全部是相对于图片宽度和高度的归一化值取值范围在0到1之间。比如一张宽1920像素、高1080像素的图片某个目标框的中心点位于(960, 540)框的宽度是480像素高度是270像素那么这一行就是0 0.5 0.5 0.25 0.25注意x_center和y_center是中心点坐标不是左上角坐标这是YOLO格式和COCO格式、VOC格式最大的区别之一。很多新手第一次从VOC格式转过来的时候经常在这里栽跟头一不留神标注框就偏移到奇怪的位置去了。这个数据集里的标签映射需要看具体的配置文件一般来说class_id为0的对应警察class_id为1的对应非警察。但这只是惯例具体以数据集的yaml文件或说明文档为准。2.2 文件目录组织的标准结构对于yolo26训练来说数据集的目录组织方式对训练脚本能否正常运行至关重要。标准的YOLO数据集结构是这样分层的数据集根目录/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamlimages目录存放图片文件labels目录存放同名txt标注文件train、val、test子目录分别对应训练集、验证集和测试集。data.yaml是整个数据集的说明书它告诉yolo26训练脚本类别名称和各个目录的路径。如果你拿到这个数据集后发现目录结构不是上面这样比如图片和标签混在同一个目录里或者没有划分train/val/test那就要先做一步数据整理再开始训练。处理的方法很简单写一个几行的Python脚本就能搞定。2.3 拿到数据集后我建议先做这三件事我每次拿到一个没接触过的标注数据集不会急着开训练而是先花几分钟做三件事。这些步骤看起来基础但能帮你避开很多后面的坑。第一件事检查标注是否越界。用脚本读取所有标注文件检查坐标值是否在0到1范围内同时检查是否有宽度或高度为0的非法框。越界的标注说明数据在标注时出现了坐标计算错误或格式转换失误这种问题如果直接进入训练会让loss出现莫名其妙的波动。第二件事统计类别分布。统计警察类别和非警察类别的目标数量看是否存在严重不均衡。如果一边占了90%另一边只有10%就需要考虑样本均衡策略比如在训练时加大少数类的loss权重。这个数据集的357张图里如果警察类别只有一百来个目标框那训练时就要特别留意模型会不会只顾着学多数类忽略了少数类。第三件事可视化验证。随机抽20到30张图片把标注框画上去人工检查一遍框的位置是否贴合目标有没有漏标、错标的情况。我自己的经验是可视化检查是最容易发现标注质量问题的环节很多数据集的标注框中心点都有系统性的偏移这种问题用脚本查不出来但人眼一看就露馅了。import cv2 import os img_dir images/train label_dir labels/train for img_name in os.listdir(img_dir)[:20]: img cv2.imread(os.path.join(img_dir, img_name)) h, w img.shape[:2] label_path os.path.join(label_dir, img_name.replace(.jpg, .txt)) if not os.path.exists(label_path): continue with open(label_path) as f: for line in f: parts line.strip().split() class_id int(parts[0]) cx, cy, bw, bh map(float, parts[1:]) # 反归一化为像素坐标并转成左上角/右下角格式 x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) color (0, 255, 0) if class_id 0 else (0, 0, 255) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.imshow(check, img) cv2.waitKey(0)2.4 小数据集的划分策略357张图怎么划分训练集、验证集和测试集直接影响模型评估的可信度。对于这么小的数据集我建议的比例是70%训练、20%验证、10%测试也就是大约250张、70张、35张。测试集最好先冻结不动等模型训练完、调好参之后再用它做最终评估不能在训练过程中反复用测试集来选参数那样会让测试集失去独立性。另外要注意的是在划分时尽量保证两个类别在训练集、验证集中都有分布。如果某张图片里只有民警目标而它被全部划到了训练集验证集里就几乎没有民警样本那验证集的评估结果就会失真。稳妥的做法是先用脚本统计每张图片的类别标签然后按类别进行分层采样。3. 基于yolo26的训练实操全记录3.1 环境准备与工具链安装yolo26作为yolo系列的新一代版本在环境依赖上跟之前的yolov5、yolov8保持了较好的兼容性。基础环境方面需要Python 3.8以上、PyTorch 1.8以上以及CUDA支持的GPU环境。如果没有GPU用CPU也能训练这个小数据集只是速度会慢不少357张图大概需要多花几倍时间但这个量级的数据集CPU训练也不是不能忍受。安装yolo26的依赖时我建议直接用conda创建独立环境避免和系统Python环境互相干扰。创建环境后用pip安装依赖核心依赖包包括torch、torchvision、opencv-python、numpy、matplotlib等。yolo26框架本身可以通过pip直接安装也可以从源码仓库拉下来后本地安装我比较推荐后一种方式因为后续如果需要改网络结构或者调训练逻辑本地源码更方便。conda create -n yolo26 python3.9 conda activate yolo26 pip install torch torchvision pip install ultralytics这里有个小经验如果GPU显存不太够安装PyTorch时可以选择CPU版本毕竟这个数据集很小CPU训练也只是慢一点而已。但如果你想跑batch size大于8的训练那还是建议用GPU。3.2 数据集配置文件data.yaml的编写data.yaml是整个训练流程中的关键文件里面定义的是数据集的元信息。一个典型的data.yaml长这样path: /path/to/your/dataset/ train: images/train val: images/val test: images/test names: 0: police 1: non_policepath字段是数据集所在的根目录路径train、val、test字段对应的是相对于根目录的图片目录路径。这里特别要注意的是yolo26在读取标签文件时会基于图片目录路径自动推断标签目录路径。具体逻辑是如果图片在images/train目录那么标签就在labels/train目录。所以如果你改了图片目录名一定要同步改标签目录名否则训练时找不到标签文件会报一个no labels found的错误。names字段是类别名称映射表0对应police警察1对应non_police非警察。这个名字不是随便写的它会出现在训练日志、评估结果和推理结果的类别名称中。如果你的业务场景需要其他命名可以改但注意要跟标注文件中的class_id保持一致。3.3 训练命令与关键参数选择训练yolo26的命令本身不复杂本质上就是调用训练脚本并传入配置参数。对于这个小数据集我建议的初始参数配置是yolo detect train datadata.yaml modelyolo26n.pt epochs150 batch8 imgsz640 device0下面对关键参数逐一说明这些参数的选择都是有讲究的epochs训练轮数设置为150。357张图的数据量不大如果轮数太少模型还没来得及充分学习特征如果轮数太多容易过拟合。150轮是一个相对安全的中等值训练过程中可以观察loss曲线和验证集指标在模型收敛后提前停止。batch size批次大小设置为8。这个值跟数据集大小和GPU显存都有关系。对于小数据集batch size太大比如32或64反而容易让模型陷入局部最优而且每轮迭代次数太少梯度更新不够平滑。8是一个相对稳定的起步值。imgsz输入图像尺寸设置为640。这是yolo系列默认的标准尺寸。如果你的数据集里很多图片是1920x1080的大尺寸图640的输入尺寸意味着训练时会对原图做resize这会丢失一定细节。但如果要原始尺寸输入显存需求会成倍增加对于357张图的数据集来说先用640把流程跑通更重要。model参数选择yolo26n.pt其中n代表nano是yolo26系列中最轻量的版本。选择nano而不是更大的small或medium原因有两个一是数据集本身就小用大模型极易过拟合二是nano版本训练速度快迭代实验的周期大大缩短。yolo detect train datadata.yaml modelyolo26n.pt epochs150 batch8 imgsz640 device0 patience30我习惯额外加一个patience参数设置为30。这个参数的意思是如果连续30轮验证集指标没有提升就提前终止训练。对于小数据集这个机制非常实用可以有效节省时间避免无意义的继续训练。3.4 训练过程的关键监控指标训练命令跑起来之后不是坐等结束就行。yolo系列在训练过程中会实时输出各种指标你需要关注的几个关键指标是box_loss边界框损失反映了模型对目标位置预测的准确程度。随着训练推进这个值应该持续下降并趋于平滑。如果box_loss波动剧烈或者不降反升说明学习率设置可能有问题或者数据本身就有问题。cls_loss分类损失反映了模型区分警察和非警察的能力。这个指标直接决定了二分类效果如果cls_loss在训练后期还是很高说明模型没能有效学出两类目标的特征差异这时要考虑是不是特征太相似或者标注有问题。mAP50和mAP50-95平均精度均值是衡量检测效果的核心指标。mAP50是IoU阈值为0.5时的平均精度mAP50-95则是在0.5到0.95之间多个IoU阈值下的平均精度。对于二分类人员识别任务来说mAP50达到0.8以上算是一个比较理想的结果mAP50-95能到0.6以上就不错了。precision精确率表示模型预测为警察的目标中真正是警察的比例。recall召回率表示所有真正的警察目标中模型成功找出来的比例。这两个指标之间存在权衡如果追求高精确率可能会牺牲召回率反之亦然。具体怎么取舍要看业务场景。在安防辅助识别场景中我通常会优先保证召回率因为漏报的代价比误报更大。我个人的经验法则是前50轮重点看loss是否稳定下降后50轮重点看mAP和precision/recall的变化。如果在前50轮loss就降得很低甚至训练集loss接近0但验证集指标停滞不前那就要警惕过拟合了。3.5 模型评估与导出训练完成之后先别急着导出模型部署先用测试集做一次严格评估。运行评估命令yolo detect val datadata.yaml modelruns/detect/train/weights/best.pt评估结束后会输出一组指标重点看测试集上的mAP50和precision/recall。这里要强调一下如果测试集和训练集来自同一个数据分布评估结果会偏乐观这在小数据集上是必然存在的现象。不要因此就对模型实战能力过于自信。模型导出时可以选择多种格式。如果只是做本地推理验证直接用PyTorch格式的权重文件即可如果要部署到边缘设备或嵌入式设备建议导出为ONNX格式或TensorRT格式。导出ONNX的命令是yolo export modelruns/detect/train/weights/best.pt formatonnx我自己做部署时一直习惯先导出ONNX再根据设备情况转成其他格式。ONNX相当于一个通用中间格式后续转TensorRT或者用ONNX Runtime推理都比较方便。4. 小数据集训练的典型问题与排查实录4.1 过拟合训练集表现好验证集一塌糊涂这是小数据集训练中最常见的问题没有之一。357张图太少了模型很容易把训练集里的死记硬背下来而不是学到民警的通用特征。我遇到过的情况是训练到100轮时训练集的mAP50已经到0.95但验证集只有0.5而且还在下降。出现这种经典过拟合信号时可以依次尝试以下对策增加数据增强的强度。yolo26支持多种在线数据增强比如随机翻转、旋转、缩放、色彩抖动等。增强的本质是无中生有地扩大数据多样性防止模型把某个特定背景、特定姿态跟类别绑定起来。对小数据集来说我把增强参数调得比默认值更激进一些通常能有效缓解过拟合。提前终止训练。也就是上面说的patience参数验证集指标连续多轮不提升后自动停止。对小数据集来说最佳epoch数往往在几十轮而不是一百多轮。换成更小的模型。如果yolo26n还是过拟合可以尝试减少模型深度或将输入分辨率降低到416。4.2 类别数量和分布不均衡的处理在这个警察/非警察二分类数据集中警察类别在整张图中的比例通常比较小而且357张图里如果只有50张包含警察那模型能学到的警察特征就非常有限。处理类别不均衡有几个手段。最简单的是通过数据增强对少数类进行过采样也就是在训练时让包含警察目标的图片被更频繁地采样。yolo系列的dataset类支持每个类的采样权重配置可以手动调整。另一个手段是调整分类loss的权重给警察类别更高的loss系数强制模型更重视少数类。我踩过一个坑直接用默认参数训练不均衡数据结果推理时对警察的漏检率非常高因为模型认为把所有目标都预测为非警察就能拿到很低的loss。后来我通过统计训练集里每个类别的目标框数量发现警察占比只有20%左右于是手动调整了采样逻辑才把警察的召回率提上来。所以拿到这个数据集第一步就要统计类别分布不要盲目开练。4.3 标注质量问题导致的检测异常数据集虽然自带标注但标注质量也需要实际验证。我遇到过标注框整体偏小的情况目标只框住了上半身导致模型训练时学的是上半身特征推理时遇到完整人像反而检测不完整。另一个常见问题是标签错位某张图片明明只有警察目标但标注文件里写的是non_police。这种错误在小数据集里很难完全避免但会直接影响模型的分类准确率。缓解的办法是可视化抽查尤其在训练前把有代表性的图片都过一遍。如果发现明显标注错误可以用标注工具修正后再导入训练。标注工具推荐X-AnyLabeling它基于yolo生态做了大量适配操作比传统工具顺滑很多。4.4 数据扩充的几个实用方向现实中单纯靠这357张图肯定不够用我建议在验证流程后按需扩充数据。扩充方向有一个优先级排序第一个方向是收集更多真实场景的图片。同一个场景、不同光线条件下的多张截图能显著提升模型的鲁棒性。第二个方向是数据增强除了yolo26内置的在线增强还可以做离线增强生成更多样本。第三个方向是引入公开数据集里的警务人员图片但要特别注意版权和合规性。第四个方向是合成数据用虚拟场景生成器模拟不同角度的民警形象。这里有一条经验数据扩充不是越多越好而是要尽量贴近真实部署场景。如果你的系统最终用在学校门口那训练数据里就应该包含大量的校门口场景图而不是泛泛的街景图。5. 从二分类到实际应用的延伸思考5.1 这个数据集可以演变成什么这个357张图的二分类数据集只是一个起点。沿着这个方向你可以做几件有实际价值的事情把它扩充成一个持续更新的数据基准集。在每次模型迭代后都用同一套测试集评估量化改进效果。基于它做更细分的人员分类。在积累了更多数据后逐步把非警察类拆分成保安、学生、路人等升级成多分类识别系统。联合其他模型做完整的业务闭环。比如先用通用行人检测模型定位所有人再用这个模型判断是否是民警两个模型串联形成完整的处理流程。5.2 我对这类小数据集的一点看法在目标检测这个领域现在有个不太好的风气是过度追求大模型、大数据集好像没有几十万张图片就不配做项目。但实际业务里大部分需求的数据量就是几百到几千张能把这个量级的数据利用好做出稳定可靠的系统才是真正的工程能力。357张图做二分类恰恰是最适合用来练习这种能力的数据量。我个人的建议是拿到这个数据集后别想着一步到位达到生产级精度而是先把从数据到模型的完整链路跑通再一步步根据评测结果迭代。说实话我在做人物身份检测相关项目的过程中最深的体会是数据集不需要一开始就很大但标注质量一定要有保障训练流程一定要可控。这个357张图的警察民警识别数据集正好是一个可以让你安心试错、快速积累经验的练习场。哪怕最后你用专业的数据扩充工具把数据量扩到了几千张再回头看看用这357张图跑通的第一版模型你也会发现那些从零到一踩过的坑其实才是最值钱的经验。本文还有配套的精品资源点击获取