ARTICLE DETAIL

资讯详情

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

9769张性别检测数据集:VOC与YOLO双格式实战指南

9769张性别检测数据集:VOC与YOLO双格式实战指南 简介本数据集面向计算机视觉开发者与性别识别模型训练者提供男女性别二分类检测所需的完整标注数据适用于目标检测算法训练、模型微调与教学实验等场景。资源采用Pascal VOC与YOLO双格式组织包含9769张jpg图片并配套等量的xml标注文件与yolo格式txt文件标注类别为Female与Male两类其中Female框数5491、Male框数4308总框数9799全部由labelImg工具按矩形框规则完成标注。压缩包为7z格式共2000个文件以1999个xml标注文件和1个说明txt为主整体约104.49MB目录结构清晰便于直接接入主流检测框架。目前已有349人学习下载适合需要快速获取规范标注数据、开展性别检测训练或验证的读者参考使用。1. 9769 张性别检测数据集VOC 与 YOLO 双格式到底怎么选手上有个做门店客流分析的项目客户临时加了个需求区分进店顾客的性别用来做广告屏的内容推荐。时间紧自己标数据肯定来不及翻了一圈找到这份 9769 张的男女性别检测数据集VOC 和 YOLO 双格式都给了直接省掉格式转换的功夫。这份资源的核心价值就一句话图片、VOC 的 xml、YOLO 的 txt 三样东西数量完全对齐都是 9769拿来就能训。数据集标注两个类别Female 和 Male框数分别是 5491 和 4308总框数 9799。注意这个数字比图片数多了 30说明有少量图片里同时出现了男女两个目标这在真实场景里很正常处理的时候别默认一图一框。标注工具用的是 labelImg规则就是画矩形框没有关键点、没有分割掩码纯检测任务。适合谁用做行人属性识别、零售客流分析、安防场景性别粗分类的从业者尤其是想快速跑通 YOLO 训练流程、验证自己模型结构的那批人。不适合谁需要精细性别分类比如跨性别、年龄交叉的场景这个数据集只有两个粗类别别指望它做细粒度。下面从格式差异讲到训练落地再到我踩过的坑一步步拆。2. VOC 与 YOLO 双格式拆解坐标、路径与类别映射2.1 两种格式的本质差异VOC 格式的 xml 文件里标注信息是绝对坐标bndbox下面四个值xmin、ymin、xmax、ymax都是像素值原点在图片左上角。YOLO 格式的 txt 文件里每行是class_id x_center y_center width height后四个值全部归一化到 0 到 1 之间class_id 从 0 开始。这份数据集里 Female 对应 0Male 对应 1顺序别搞反反了训练出来的模型会把男女标签对调。为什么会有两种格式并存VOC 是早期检测框架比如 Faster R-CNN 的参考实现的标配YOLO 系列从 v5 开始默认吃 txt。数据集作者两种都提供等于把格式转换这一步替你做了。但要注意摘要里明确写了「不包含分割路径的 txt 文件」意思是只有标注 txt没有 train/val 划分列表。这个得自己切。2.2 目录结构与文件对应关系拿到压缩包解压后典型结构是这样的dataset/ ├── 使用前必读.txt ├── JPEGImages/ # 9769 张 jpg ├── Annotations/ # 9769 个 xml └── labels/ # 9769 个 txt三个目录里的文件主名必须一一对应比如firc_gender_8473.jpg对应firc_gender_8473.xml和firc_gender_8473.txt。项目正文里列出的那些 xml 文件名就是样本命名规则是firc_gender_加数字编号。如果你解压后发现某个目录文件数对不上先别急着训大概率是解压不完整或者文件名编码出了问题。2.3 用脚本校验三者的对齐情况动手训练前我习惯先跑一遍校验确认图片、xml、txt 三者没有缺失或错位。下面这段脚本直接抄import os img_dir dataset/JPEGImages xml_dir dataset/Annotations txt_dir dataset/labels # 取主名集合 imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.endswith(.jpg)} xmls {os.path.splitext(f)[0] for f in os.listdir(xml_dir) if f.endswith(.xml)} txts {os.path.splitext(f)[0] for f in os.listdir(txt_dir) if f.endswith(.txt)} print(图片数:, len(imgs)) print(xml数:, len(xmls)) print(txt数:, len(txts)) # 找缺失 print(有图无xml:, imgs - xmls) print(有xml无图:, xmls - imgs) print(有图无txt:, imgs - txts)逻辑说明用集合差集找出单边缺失的文件。参数上img_dir等三个路径按你实际解压位置改。如果三个集合完全相等输出三个空集合说明数据对齐没问题。这一步花不了几秒但能避免训练到一半报「找不到标注文件」的翻车。2.4 类别映射与框数核对校验完文件对齐再核对类别分布。用下面这段统计每个类别的框数和摘要里的 5491、4308 对一下import os txt_dir dataset/labels female_count 0 male_count 0 for f in os.listdir(txt_dir): if not f.endswith(.txt): continue with open(os.path.join(txt_dir, f)) as fp: for line in fp: parts line.strip().split() if not parts: continue cls int(parts[0]) if cls 0: female_count 1 elif cls 1: male_count 1 print(Female框数:, female_count) print(Male框数:, male_count) print(总框数:, female_count male_count)逻辑说明逐行读 txt第一列是类别 id。参数上如果统计出来 Female 是 4308、Male 是 5491说明你的类别映射反了得去检查生成 txt 时的类别字典。正常应该输出 Female 5491、Male 4308、总框数 9799。这个核对能帮你提前发现类别错位比训练完看混淆矩阵才发现要省事得多。3. 从零跑通 YOLO 训练划分、配置与启动3.1 训练集验证集划分数据集没给划分列表得自己切。常见做法是按 8:2 分9769 张里约 7815 张训练、1954 张验证。用脚本生成两个 txt 列表import os import random random.seed(42) # 固定种子保证可复现 img_dir dataset/JPEGImages imgs [f for f in os.listdir(img_dir) if f.endswith(.jpg)] random.shuffle(imgs) split int(len(imgs) * 0.8) train_list imgs[:split] val_list imgs[split:] with open(train.txt, w) as f: for name in train_list: f.write(os.path.join(img_dir, name) \n) with open(val.txt, w) as f: for name in val_list: f.write(os.path.join(img_dir, name) \n) print(训练集:, len(train_list), 验证集:, len(val_list))逻辑说明random.seed(42)固定随机种子保证每次划分一致方便复现实验。参数上0.8 是训练比例你可以按需调成 0.9。注意这里写的是图片绝对或相对路径YOLO 训练时按这个列表读图标注文件它会自动去同主名的 labels 目录找。3.2 data.yaml 配置YOLO 训练需要一个 data.yaml 描述数据位置和类别path: /abs/path/to/dataset train: train.txt val: val.txt nc: 2 names: 0: Female 1: Male逻辑说明path是数据集根目录train和val是相对 path 的列表文件。nc是类别数这里 2。names的键必须和 txt 里的 class_id 对应0 是 Female、1 是 Male写反了模型输出就全乱。参数上如果你把 train.txt 放在别处路径要相应调整。3.3 启动训练与关键参数配置好之后启动训练以 YOLOv8 为例yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/gender \ nameexp1逻辑说明modelyolov8n.pt用 nano 版预训练权重起步速度快适合先验证流程。epochs100是训练轮数imgsz640是输入尺寸batch16按显存调显存不够就降到 8。lr00.01是初始学习率patience20表示 20 轮没提升就早停。参数上如果你用 YOLOv5命令换成python train.py --data data.yaml --weights yolov5n.pt其余参数名类似。训练过程中重点看三个指标box_loss 是否稳定下降、mAP50 是否上升、cls_loss 有没有震荡。如果 box_loss 一直不降先检查标注坐标有没有越界归一化后应该在 0 到 1 之间。3.4 推理验证训练完拿一张图测一下yolo detect predict \ modelruns/gender/exp1/weights/best.pt \ sourcetest.jpg \ conf0.25 \ saveTrue逻辑说明conf0.25是置信度阈值低于这个值的框不显示。参数上性别检测场景如果误检多可以把 conf 提到 0.4 到 0.5如果漏检多降到 0.15 试试。saveTrue会把带框的结果图存下来方便肉眼核对。4. 避坑与排查标注、类别与训练的五个血泪经验4.1 现象训练报「No labels found」原因YOLO 默认去图片同级的labels目录找 txt或者去path下找。如果你的 txt 放在别处或者目录名不是labels它就找不到。解决确认 txt 目录名和位置或者在 data.yaml 里显式指定。最稳妥的是保持JPEGImages和labels同级图片和 txt 主名一致。4.2 现象mAP 一直是 0 或者极低原因类别映射反了或者 txt 里的 class_id 超出了nc范围。比如 txt 里写了 2但 nc2 只允许 0 和 1。解决跑一遍 2.4 的统计脚本确认 Female 是 5491、Male 是 4308。如果反了批量把 txt 第一列的 0 和 1 对调。4.3 现象某些图片训练时报坐标越界原因VOC 转 YOLO 时如果 xmax 超过图片宽度归一化后 x_center 可能大于 1。这份数据集是作者转好的但个别文件可能有边界问题。解决写个脚本扫一遍所有 txt检查每行后四个值是否都在 0 到 1 之间超出就裁剪到边界。别直接删删了图片和标注就对不上了。4.4 现象验证集 loss 突然飙升原因验证集里混进了标注质量差的图或者划分时把同一场景的图分到了两边导致分布不一致。解决划分时按文件名前缀分组同一组的图要么全在训练集要么全在验证集。这份数据集文件名是firc_gender_加编号编号连续的可能是同一批采集的划分时注意别切太碎。4.5 现象推理时男女框重叠严重原因图片里两个人挨得近NMS 阈值默认 0.45 可能把两个框合并了。解决推理时把iou参数调到 0.5 到 0.6让重叠框保留更多。或者训练时用更大的输入尺寸让模型区分得更细。5. 进阶技巧用混淆矩阵和阈值扫描把性别检测调到可用训练跑通只是第一步真正上线前得知道模型在哪些情况下会错。YOLO 训练完会自动生成混淆矩阵在runs/gender/exp1/下面。打开confusion_matrix.png重点看两个地方Female 被误判成 Male 的比例以及背景被误判成目标的 False Positive。性别检测里长发男性、短发女性是最容易翻车的样本混淆矩阵能直接告诉你这类错误占多少。如果混淆矩阵显示某一类召回明显偏低别急着加数据先做阈值扫描。写个脚本遍历不同 conf 值看 Precision 和 Recall 的权衡from ultralytics import YOLO model YOLO(runs/gender/exp1/weights/best.pt) for conf in [0.1, 0.2, 0.3, 0.4, 0.5]: metrics model.val(datadata.yaml, confconf, iou0.5) print(fconf{conf} mAP50{metrics.box.map50:.4f} fprecision{metrics.box.mp:.4f} recall{metrics.box.mr:.4f})逻辑说明model.val在验证集上跑评估conf控制置信度阈值iou控制 NMS 阈值。参数上如果你更在意误检少选 precision 高的 conf更在意漏检少选 recall 高的。我一般会把 conf 定在 precision 和 recall 交叉点附近再根据业务微调。还有一个容易被忽略的点这份数据集总框数 9799 比图片数 9769 多 30说明有 30 张左右的图里同时有男女两个目标。训练时如果 batch 里这类图占比低模型对「一图多目标」的区分能力会弱。可以在划分时特意把这 30 张图均匀分到训练和验证集或者训练时用 mosaic 增强让模型多见一些多目标场景。最后说个我自己的习惯。每次拿到新数据集不管作者说标注多准我都会先抽 20 张图把框画出来肉眼过一遍。这份数据集我抽检的时候发现个别图的框贴边贴得比较紧训练时如果做随机裁剪增强可能把框裁掉一半。所以我在 data.yaml 里把mosaic的概率从默认 1.0 降到了 0.5减少裁剪带来的标注损失。从那以后我每次训新数据集都强制走一遍「抽检画框 校验对齐 统计类别」这三步再也没出现过训到一半发现标签错位的情况。希望帮到你。本文还有配套的精品资源点击获取
返回列表