尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

YOLOv5人脸数据集预标注工具:从推理到人工校正全流程

YOLOv5人脸数据集预标注工具:从推理到人工校正全流程 简介这份资源是一套基于YOLOv5的智能人脸数据集标注工具面向需要批量处理人脸数据的算法工程师、数据集制作人员及计算机视觉方向的学生。它通过预训练模型自动检测人脸并生成标注框替代传统手工拉框显著提升标注效率同时支持自定义人脸检测模型以适配不同场景。压缩包共59个文件约78.68MB包含11个Python脚本、8个Markdown说明文档、2个pt模型权重及若干示例图片与视频脚本覆盖VOC XML、COCO JSON、YOLO TXT等多种标签格式导出文档则记录了WiderFace、DarkFace等模型的训练与使用要点。工具支持webcam实时标注、图片与视频的批量处理按a键捕获视频帧、q键退出图片兼容jpg、png、bmp等格式视频支持mp4。目前已有338人学习下载适合希望快速构建人脸数据集、减少重复劳动并打通标注到训练流程的读者参考使用。1. 从一堆没标注的人脸图说起YOLOv5 预标注到底省了什么手里攒了几千张人脸图准备训一个检测模型真正卡住进度的往往不是网络结构而是标注。用 LabelImg 一张张画框一天下来眼睛发直框还画得忽大忽小。基于 YOLOv5 的智能人脸数据集标注工具解决的正是这个环节先用一个已经能检出人脸的 YOLOv5 模型对整批图片做推理把预测框导出成 YOLO 格式的 txt 预标注文件人只需要在标注工具里改错框、补漏框而不是从零画起。它适合两类人一类是刚入门、想跑通「yolov5训练自己的数据集」全流程的新手另一类是手里有存量图片、想批量预处理再人工精修的从业者。核心链路就三步——模型推理出框、坐标转成 YOLO 归一化格式、导入标注工具人工校正。这套东西不神秘但每一步都有容易翻车的地方下面按能复现的顺序拆开讲。2. 预标注链路拆解YOLOv5 推理输出怎么变成可编辑的标注文件2.1 为什么选 YOLOv5 做人脸预标注而不是通用检测模型预标注工具对模型的要求和最终上线模型不一样。它不需要极致精度但要求推理快、依赖少、导出格式现成。YOLOv5 在这三点上比较均衡权重文件小CPU 也能跑出可用速度后处理逻辑固定输出就是框加类别加置信度官方推理脚本直接支持--save-txt省掉自己写坐标转换。人脸属于单类别检测把data配置里的nc设成 1、names设成[face]即可不需要 COCO 那 80 类。常见做法是拿一个在公开人脸数据上训过的 YOLOv5 权重做预标注或者先用少量人工标注样本微调一个基础权重再拿它去标剩余图片。这里有个取舍预标注模型越准人工改的越少但准备这个模型本身也要成本。我的经验是如果图片场景单一比如都是证件照或同一摄像头抓拍用通用人脸权重直接推就够如果场景杂、光照差异大先手工标 200 到 500 张微调一轮预标注的可用率会明显提升。2.2 用 YOLOv5 跑批量推理并导出 txt 的最小命令先把环境和权重准备好推理这一步用官方detect.py就能完成关键是打开保存 txt 的开关。# 进入 yolov5 目录后执行 # --source 指向待标注图片文件夹 # --weights 是预标注模型权重 # --save-txt 保存 YOLO 格式标注 # --save-conf 在 txt 里附带置信度方便后续按阈值过滤 # --nosave 不保存带框的可视化图省磁盘 python detect.py \ --source ./raw_faces \ --weights ./weights/face_yolov5s.pt \ --img-size 640 \ --conf-thres 0.25 \ --iou-thres 0.45 \ --save-txt \ --save-conf \ --nosave \ --project ./prelabel_out \ --name run1跑完后prelabel_out/run1/labels/下会生成和图片同名的 txt每行格式是类别 x_center y_center w h [conf]坐标都是相对图片宽高归一化到 0 到 1 的值。--conf-thres是置信度阈值调低会多出框、漏检少但误检多调高反之预标注阶段我一般设 0.25 左右宁可多给几个候选框让人删也别漏掉真人脸。--iou-thres控制 NMS 合并程度人脸密集时适当调低能减少框重叠。--img-size要和训练时一致否则小脸召回会掉。2.3 坐标格式转换从 YOLO 归一化值到标注工具能读的格式不同标注工具吃的格式不一样。LabelImg 直接认 YOLO txt但如果你用的是 LabelMe 或 CVAT就得转成 VOC 的xmin ymin xmax ymax或 COCO 的 json。转换本身不难坑在归一化和图片尺寸要对上。import os from PIL import Image def yolo_to_voc(label_path, img_path, class_names): 把单个 YOLO txt 转成 VOC 格式的标注行 img Image.open(img_path) w, h img.size lines [] with open(label_path, r) as f: for line in f: parts line.strip().split() if len(parts) 5: continue cls_id int(parts[0]) xc, yc, bw, bh map(float, parts[1:5]) # 归一化中心点宽高 还原成绝对像素坐标 xmin int((xc - bw / 2) * w) ymin int((yc - bh / 2) * h) xmax int((xc bw / 2) * w) ymax int((yc bh / 2) * h) # 边界裁剪防止越界导致标注工具报错 xmin, ymin max(0, xmin), max(0, ymin) xmax, ymax min(w, xmax), min(h, ymax) lines.append(f{class_names[cls_id]} {xmin} {ymin} {xmax} {ymax}) return lines这段代码的关键点是w, h必须来自原图不能用推理时的--img-size因为 YOLO 保存的归一化坐标是相对原图还原的。如果图片在推理前被 resize 过又没记录坐标就会整体偏移这是预标注框「整体飘移」最常见的原因。class_names要和训练时的names顺序一致否则类别会错位。2.4 把预标注导入标注工具做人工校正txt 生成后导入 LabelImg 时选 YOLO 格式把classes.txt放在 labels 同级目录类别名和顺序要对上。导入后逐张检查重点看三类问题漏检的小脸、误检的背景纹理、框得过大或过小的。校正完直接保存LabelImg 会覆盖原 txt省去二次转换。如果图片量大建议按置信度排序处理先改低置信度的框那些往往是模型犹豫的地方错得最多。高置信度的框大多正确快速扫过即可。这个顺序能把人工时间花在刀刃上。3. 训练自己的预标注模型让工具越用越准3.1 从零标注到微调的样本量判断预标注工具的上限取决于背后那个模型。如果直接用公开权重遇到你的特定场景比如红外、戴口罩、大角度侧脸召回会掉。这时候需要用自己的数据微调。样本量没有绝对标准但有个经验区间单场景、单类别200 到 500 张人工精标图通常能让模型在该场景下明显变好场景多样则要上千张。判断标准不是数量而是验证集上的漏检率——如果预标注在你关心的场景里漏检超过两成就该补数据微调了。微调时不要从零训加载预训练权重做迁移学习学习率调小一般 0.001 量级训练轮数几十轮就够避免过拟合到小样本。3.2 用 YOLOv5 训练人脸检测模型的关键参数数据按 YOLO 格式组织好写一个 data yaml然后启动训练。# data/face.yaml 内容示例 # path: ./datasets/face # train: images/train # val: images/val # nc: 1 # names: [face] python train.py \ --data ./data/face.yaml \ --weights ./weights/face_yolov5s.pt \ --img-size 640 \ --batch-size 16 \ --epochs 100 \ --hyp ./data/hyp.scratch-low.yaml \ --cache--weights加载预训练权重做迁移比随机初始化收敛快得多。--batch-size受显存限制显存不够就调小或开--accumulate梯度累积。--hyp用低学习率的超参文件微调场景比默认超参更稳。--cache把图片缓存进内存小数据集能明显加速。训练完在runs/train/exp/weights/best.pt拿到权重替换预标注脚本里的--weights即可。3.3 用验证集指标判断预标注模型够不够用训练日志里重点看mAP0.5和recall。预标注场景下 recall 比 precision 更重要因为漏检的框人工很难补全你不知道那里有脸而误检的框人工删一下就行。所以宁可 precision 低一点也要把 recall 拉高。如果 recall 上不去优先查标注质量和小脸样本比例而不是盲目加轮数。验证集最好包含和实际待标注图片同分布的样本否则指标好看但预标注照样翻车。4. 避坑与排查预标注工具最容易翻车的五个地方4.1 框整体偏移或缩放错位现象导入标注工具后所有框都往一个方向偏或者大小整体不对。原因坐标转换时用的图片尺寸和推理时不一致或者图片被 EXIF 旋转信息影响PIL 读出来的宽高和实际显示方向不符。解决转换前统一用ImageOps.exif_transpose处理旋转并打印每张图的w, h和推理日志里的尺寸核对发现不一致就查预处理环节。4.2 类别 id 错位导致标注全错现象框位置对但类别名全变成错的或者标注工具报类别越界。原因classes.txt的顺序和训练时names不一致或者nc设错。解决把训练用的names原样复制成classes.txt顺序一个都不能变转换脚本里的class_names也从同一份配置读别手写。4.3 小脸漏检严重现象大脸框得准远处或小尺寸人脸基本没框。原因--img-size太小小脸在特征图上只剩几个像素或者训练数据里小脸样本太少。解决推理时把--img-size提到 1280 试试代价是速度下降训练侧补充小脸样本或用 mosaic 增强提升小目标召回。4.4 置信度阈值设太高漏掉真人脸现象明明有脸却没框调低阈值后又冒出一堆误检。原因单一阈值难兼顾。解决预标注阶段用低阈值0.2 到 0.25先多出框人工删比人工补快如果误检太多影响效率再按置信度分段处理低分段重点看。4.5 大批量推理中途显存爆掉现象跑几百张后进程被 kill。原因detect.py默认逐张推理但如果自己改成批处理又没控制 batch或者开了可视化保存导致内存堆积。解决保持逐张推理加--nosave关掉图片保存自己写批处理脚本时把 batch 控制在 8 以内并及时释放中间变量。5. 进阶技巧把预标注准确率再往上抬一档预标注工具用顺之后真正拉开效率差距的是几个细节。第一是分场景建多个预标注模型如果数据里既有证件照又有监控抓拍用一个模型硬扛不如按场景各训一个推理时按文件夹切换权重可用率能差出一大截。第二是用主动学习挑图先全量低阈值预标注把置信度处于中间段比如 0.3 到 0.6的图片挑出来优先人工精修这批图信息量最大修完再微调模型下一轮预标注就更准形成闭环。第三是固定一套坐标校验脚本每次转换后随机抽 5 张图把框画回原图存成可视化图肉眼扫一眼有没有整体偏移这一步花不了一分钟但能挡住大部分低级错误。技巧适用场景预期收益分场景多模型数据来源杂、光照差异大预标注可用率明显提升主动学习挑图图片量大、人工预算有限同样标注量下模型提升更快坐标校验脚本每次批量转换后提前发现偏移类错误我自己的习惯是任何一批预标注结果进标注工具之前先跑一遍校验脚本出几张可视化图确认框贴合再批量导入。这个习惯帮我省过好几次返工——有一次 EXIF 旋转没处理几千张图的框全偏了 90 度幸好导入前看了一眼。预标注工具的价值不在于完全替代人工而在于把人工从「画框」降级成「改框」省下的时间足够你把模型再迭代两轮。希望帮到你。本文还有配套的精品资源点击获取
返回列表