简介:这份资源是一套基于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 用验证集指标判断预标注模型够不够用
训练日志里重点看mAP@0.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 度,幸好导入前看了一眼。预标注工具的价值不在于完全替代人工,而在于把人工从「画框」降级成「改框」,省下的时间足够你把模型再迭代两轮。希望帮到你。
本文还有配套的精品资源,点击获取