- 人工智能
- 计算机视觉
- 深度学习
【免费下载链接】yolov8-face
yolov8 face detection with landmark
基于仓库文档 docs/yolov5/tips_for_best_training_results.md 与yolov8-face(基于 YOLOv8 的人脸检测 + 关键点回归实现,通过 pose 任务承载 5 点人脸关键点)的源码、配置与训练脚本,本文给出从数据集质量、模型选择到训练超参数的一整套调优方法论。读完本文,你将掌握:先用默认配置建立性能基线的方法、WIDER FACE 数据集标注质量的检查要点、预训练权重与从零训练的选择逻辑,以及 epochs / imgsz / batch / 数据增强等关键设置的实战取舍,并了解如何结合训练日志与 WIDER FACE 评测(Easy / Medium / Hard)完成迭代闭环。
一、先跑通默认配置:建立性能基线再谈调优
原文档的核心忠告是:大多数时候,只要数据集足够大且标注质量好,不改模型和训练设置也能获得不错的结果。如果一开始效果不理想,再考虑优化步骤——但永远先以全部默认设置训练一次。这样做的价值在于:
- 建立可复现的性能基线,后续所有改动都有对比对象;
- 快速暴露数据问题(标注错误、类别不平衡、图片损坏等),避免在错误数据上浪费时间调参。
在yolov8-face仓库中,默认训练入口是根目录的 train.py,它直接使用 Python API 完成人脸关键点(pose)训练:
import os os.environ["OMP_NUM_THREADS"]='2' from ultralytics import YOLO model = YOLO('yolov8s-pose.pt') # 加载预训练权重(推荐) model.train(data='widerface.yaml', epochs=300, imgsz=640, batch=16, device=[0,1])这一脚本已经体现了“先用默认设置”的思想:数据指向widerface.yaml,输入尺寸 640,300 个 epoch,batch 16 并用双卡device=[0,1]。训练启动后,所有日志、权重和绘图都会保存到实验目录(对应源码 PoseTrainer 的save_dir),从 test_widerface.py 的默认权重路径runs/pose/yolov8n-face/weights/best.pt可以确认:人脸模型训练结果默认落在runs/pose/<实验名>/下,其中weights/best.pt是验证集表现最好的权重,weights/last.pt是最后一个 epoch 的权重。
训练参数的完整默认值定义在 ultralytics/yolo/cfg/default.yaml:epochs: 100、batch: 16、imgsz: 640、optimizer: auto、patience: 50(连续 50 个 epoch 无改善则早停)、amp: True(混合精度)、close_mosaic: 10(最后 10 个 epoch 关闭 mosaic 增强)等。训练时通过model.train(...)传参即可覆盖这些默认值。
提问技巧:如果带着训练问题去咨询他人,原文档建议提供尽可能完整的信息——训练/验证 loss 曲线、P/R/mAP、PR 曲线、混淆矩阵、训练 mosaic 图、测试结果图、数据集统计图(如 labels.png)。这些文件都在实验目录(
runs/pose/<name>/)中,也是后续本文第五部分的迭代依据。
二、数据质量决定精度上限:面向人脸检测的数据集要求
原文档强调,模型精度上限由数据决定。对照人脸检测(带 5 点关键点)任务,逐条落实到yolov8-face的 WIDER FACE 数据集上:
2.1 数量要求(每个类别)
- 每类图片数 ≥ 1500 张:人脸检测只有
face一个类别(见 ultralytics/datasets/widerface.yaml 中names: {0: face}),因此要求训练集中人脸图片总量充足; - 每类实例数 ≥ 10000 个:即标注出的人脸框数量。WIDER FACE 本身是大型人脸基准,足够满足该量级;
- 图片多样性:必须代表真实部署环境。对监控、安防、美颜类应用,应覆盖不同时段(白天/夜晚)、不同季节、不同天气、不同光照、不同角度、不同拍摄设备与采集来源。WIDER FACE 数据本身自带 Easy / Medium / Hard 三档难度,Hard 档正是多尺度、模糊、遮挡密集场景的代表。
2.2 标注一致性:全部实例都要标注
所有图片中所有类别的所有实例都必须标注,部分标注是行不通的——未标注的人脸会成为隐式负样本,直接压制召回(R)。这与yolov8-face的评测脚本一致:test_widerface.py会把预测结果写成x1 y1 w h conf的 txt,与官方widerface_evaluate的 ground truth 比对计算 AP,漏标即漏检。
2.3 标注精度:框要贴合,关键点要准
标注框必须紧密包围目标,目标与框之间不应有缝隙,也不应有目标缺失标注。对带关键点的人脸任务,还需要保证 5 个关键点(左右眼、鼻尖、左右嘴角)位置准确且可见性标志正确。仓库数据集 YAML 中:
# ultralytics/datasets/widerface.yaml(节选) kpt_shape: [5, 3] # 5 个关键点,每点 3 维 (x, y, visible) flip_idx: [1, 0, 2, 4, 3] # 水平翻转后关键点索引交换(左眼↔右眼、左嘴角↔右嘴角)flip_idx表明关键点顺序约定为:0 左眼、1 右眼、2 鼻尖、3 左嘴角、4 右嘴角(该推断与水平翻转对称性一致)。若你的数据集顺序不同,必须同步修改flip_idx,否则fliplr增强会破坏关键点语义。
数据加载时,源码 ultralytics/yolo/data/dataset.py 会校验kpt_shape与标注文件:若kpt_shape缺失或维度不是 2/3,会直接抛出ValueError;若所有标签为空,训练无法启动。data/widerface/val/label.txt展示了 WIDER FACE 标注行格式:首行是图片相对路径(如# 0--Parade/0_Parade_marchingband_1_465.jpg),随后每行是一个实例的 bbox 与关键点坐标。
2.4 标注可视化验证:看train_batch*.jpg
原文档建议在训练开始时查看train_batch*.jpg确认标注正确。在yolov8-face中,PoseTrainer.plot_training_samples 会在每个训练批次(按save_period相关节奏)把图像连同类别标签、bbox 和关键点绘制到save_dir/train_batch{ni}.jpg——人脸框与 5 个关键点是否贴合、有无漏标/错标,一目了然。建议首次训练时重点检查前几个批次的 mosaic 图。
2.5 背景图:压低误检
背景图指不含任何目标的图片,用于减少假阳性(FP)。原文档建议背景图约占 0%–10%(COCO 参考值为 1000 张,约占总量的 1%),背景图无需标注。对 WIDER FADE 这类密集人脸基准,Hard 档的难点之一就是复杂背景下的误检,适当加入无脸背景图有助于压低 FP。
三、模型选择:预训练迁移还是从零训练
原文档的模型选择经验:更大的模型在几乎所有情况下精度更高,但参数量、显存占用和推理延迟也更高。对应到本仓库的人脸模型家族(见 ultralytics/models/v8/yolov8-pose.yaml 的scales与 README.md 的 WIDER FACE 结果表):
| 模型 | Easy | Medium | Hard | 说明(README 结果表) |
|---|---|---|---|---|
| yolov8-lite-t | 90.3 | 87.5 | 72.8 | 轻量,适合端侧 |
| yolov8-lite-s | 93.4 | 91.1 | 77.7 | 轻量,适合端侧 |
| yolov8n | 94.5 | 92.2 | 79.0 | 移动端基线 |
| yolov8s | 96.0 | 94.2 | 82.6 | 通用推荐 |
| yolov8m | 96.6 | 95.0 | 84.1 | 更高精度 |
(注:上表数值直接取自仓库 README 的结果表,640 输入尺寸、WIDER FACE 三档评测口径。)
选择建议与原文档一致:
- 移动端部署:优先
yolov8n-face/yolov8-lite-t/s(yolov8-lite-s-pose.yaml); - 云端/服务端部署:优先
yolov8s/yolov8m。
3.1 从预训练权重开始(中小数据集)
原文档推荐中小数据集(如 VOC、VisDrone、GlobalWheat 这类规模)从预训练权重开始。对yolov8-face而言,人脸检测迁移自 COCO 预训练的 pose 权重收益明显(人脸与行人具有相近的低层视觉特征),仓库 train.py 正是推荐写法:
from ultralytics import YOLO model = YOLO('yolov8s-pose.pt') # 加载预训练权重(推荐) model.train(data='widerface.yaml', epochs=300, imgsz=640, batch=16, device=[0,1])对应 CLI 写法(pose 任务):
yolo pose train model=yolov8s-pose.pt data=widerface.yaml epochs=300 imgsz=640 batch=163.2 从零开始(超大数据集)
如果数据集足够大(如 COCO、Objects365 量级),可以从模型结构 YAML 从零训练。原文档对应命令是--weights ''并显式指定--cfg,本仓库的 Python 等价写法为:
model = YOLO('yolov8s-pose.yaml') # 从 YAML 构建新模型 model.train(data='widerface.yaml', epochs=300, imgsz=640, batch=16, device=[0,1])yolov8s-pose.yaml中kpt_shape默认为[17, 3](COCO 人体关键点),而人脸任务是 5 点——因此从零构建时务必确保传入的widerface.yaml里的kpt_shape: [5, 3]覆盖默认值(源码 PoseTrainer.get_model 会用self.data['kpt_shape']构造模型,并在set_model_attributes中再次赋值,以数据 YAML 为准)。
四、训练设置:关键参数与超参数逐项解析
原文档明确:修改任何东西之前,先按默认超参数训练。完整参数清单见 ultralytics/yolo/cfg/default.yaml 与 docs/modes/train.md。
4.1 epochs:从 300 起步
原文档建议先用 300 个 epoch。若提前过拟合,则减少;若 300 后仍未过拟合,可延长到 600、1200。仓库 train.py 的训练脚本正是epochs=300。注意default.yaml中patience: 50会启用早停:验证指标连续 50 个 epoch 无改善即自动停止,因此 300 epoch 的显式设置通常不会被真的跑满。
4.2 imgsz:训练与推理保持一致
原文档要点:COCO 用原生分辨率 640 训练,小目标多的数据集受益于更高分辨率(如 1280);推理最好使用与训练相同的--img。WIDER FACE 的 Hard 档含大量小人脸,因此在yolov8-face中:
- 训练
imgsz=640时,验证/推理也应使用imgsz=640(test_widerface.py 默认--img-size 640与此一致); - 若追求更高召回,可尝试
imgsz=1280训练,但需同步增大显存预算,并用同尺寸推理。
4.3 batch:尽量用硬件允许的最大值
原文档强调小 batch 会得到较差的 batchnorm 统计量,应使用硬件允许的最大--batch-size。yolov8-face的训练脚本使用batch=16, device=[0,1](双卡)。default.yaml中还支持batch: -1的 AutoBatch 模式,自动估算显存能容纳的最大 batch。
4.4 超参数:默认优先,增强超参是抗过拟合的主力
人脸关键点训练的核心超参数(default.yaml)及其对训练的影响:
| 参数 | 默认值 | 作用与调优建议 |
|---|---|---|
lr0 | 0.01 | 初始学习率(SGD 约 1e-2,Adam 约 1e-3);收敛过慢可微调 |
lrf | 0.01 | 最终学习率 =lr0 * lrf |
momentum | 0.937 | SGD 动量 / Adam beta1 |
weight_decay | 0.0005 | 权重衰减,防过拟合 |
warmup_epochs | 3.0 | 学习率热身轮数(支持小数) |
box | 7.5 | bbox IoU loss 增益 |
cls | 0.5 | 分类 loss 增益(随像素缩放) |
dfl | 1.5 | DFL(分布聚焦损失)增益 |
pose | 1.0 | 关键点 loss 增益(人脸任务核心) |
kobj | 1.0 | 关键点可见性 loss 增益 |
label_smoothing | 0.0 | 标签平滑比例,可在过拟合时启用 |
hsv_h/s/v | 0.015/0.7/0.4 | HSV 颜色增强,提升光照鲁棒性 |
degrees/translate/scale/shear/perspective | 0.0/0.1/0.5/0.0/0.0 | 几何增强:旋转/平移/缩放/剪切/透视 |
flipud/fliplr | 0.0/0.5 | 上下/左右翻转概率(翻转时关键点按flip_idx交换) |
mosaic | 1.0 | mosaic 拼接增强概率 |
mixup | 0.0 | mixup 增强概率 |
copy_paste | 0.0 | 复制粘贴增强概率(分割任务为主) |
close_mosaic | 10 | 最后 10 个 epoch 关闭 mosaic,帮助模型适应真实图像分布 |
原文档的核心结论可以量化对照:增大增强类超参数(hsv_*、degrees、scale、mosaic、mixup等)会延后并减轻过拟合,允许更长的训练并得到更高 mAP;而降低特定 loss 分量增益(如人脸任务的pose、kobj)有助于缓解该分量的过拟合。yolov8-face的 loss 组合在源码 ultralytics/yolo/utils/loss.py 的v8PoseLoss中可见:由 box(box增益)、pose 关键点(pose增益)、kobj 关键点可见性(kobj增益)、cls(cls增益)、dfl(dfl增益)五项构成;其中关键点坐标损失使用WingLoss(对小人脸关键点误差更鲁棒),并按kpt_mask(可见性标志)屏蔽不可见点。这意味着:如果你发现训练后期关键点抖动大、但 bbox 已收敛,应优先关注pose/kobj两个增益而非box。
4.5 自动化超参搜索:从 YOLOv5 进化到 Ray Tune
原文档末尾推荐了 YOLOv5 的 Hyperparameter Evolution(遗传算法自动调参,教程见 docs/yolov5/hyp_evolution.md)。在yolov8-face所基于的 YOLOv8 架构中,对应的自动化手段是 Ray Tune 集成,实现在 ultralytics/yolo/utils/tuner.py:
- 默认搜索空间覆盖
lr0、lrf、momentum、weight_decay、warmup_epochs以及全部增强超参(degrees、scale、mosaic、mixup等),与default.yaml的超参一一对应; - 使用 ASHA 调度器(
reduction_factor=3,grace_period=10)按TASK2METRIC(pose 任务即关键点 mAP)最大化; - 用法示例:
from ultralytics import YOLO; model = YOLO('yolov8s-pose.pt'); model.tune(data='widerface.yaml', epochs=10, iterations=300, gpu_per_trial=1)(iterations对应进化世代数)。
与 YOLOv5 遗传进化 300 世代的做法相比,Ray Tune 提供了更工程化的分布式搜索能力,但“先默认后搜索”的原则不变。
五、验证与迭代:读懂日志并用 WIDER FACE 三档评测收口
原文档强调,结果图(训练/验证 loss、P、R、mAP、PR 曲线、混淆矩阵、mosaic、测试图、labels.png)都位于project/name目录。在yolov8-face中:
- 训练过程指标:
PoseTrainer.plot_metrics会绘制results.png(包含 box_loss、pose_loss、kobj_loss、cls_loss、dfl_loss 与 P、R、mAP),同时每轮结果写入results.csv供二次分析; - 验证集可视化:
PoseValidator.plot_val_samples生成val_batch{ni}_labels.jpg(真值),plot_predictions生成val_batch{ni}_pred.jpg(预测),可直观对比关键点拟合质量(见 ultralytics/yolo/v8/pose/val.py)。其get_desc同时输出 Box 与 Pose 两套 P/R/mAP50/mAP50-95,方便分别观察“框得准不准”和“点得准不准”。
5.1 用 WIDER FACE 官方工具完成最终评估
yolov8-face提供了完整的 WIDER FACE 评测闭环:先用 test_widerface.py 在 WIDER val 集上批量预测并输出结果 txt:
python test_widerface.py --weights runs/pose/yolov8n-face/weights/best.pt \ --img-size 640 --conf-thres 0.01 --iou-thres 0.5 \ --save_folder ./widerface_evaluate/widerface_txt/ \ --dataset_folder ./data/widerface/val/images/然后运行widerface_evaluate目录下的评测工具(widerface_evaluate/evaluation.py),对照ground_truth中的wider_easy_val.mat、wider_medium_val.mat、wider_hard_val.mat得到 Easy / Medium / Hard 三档 AP——这正是 README 结果表(yolov8s 达到 96.0/94.2/82.6)的口径。
5.2 迭代决策树
结合原文档与上文,可归纳出如下迭代思路:
- mAP 低但 loss 正常:先查数据——
train_batch*.jpg看标注是否贴合、labels.png看类别与尺度分布,再考虑增大imgsz或换更大模型; - 训练 loss 下降但验证 loss 上升(过拟合):增加增强超参(
mosaic、scale、degrees、hsv_*)、启用label_smoothing,或缩短epochs; - 关键点 mAP 明显低于框 mAP:核查
kpt_shape与flip_idx是否正确、关键点标注是否准确,微调pose/kobj增益; - FP 偏高:按 0%–10% 比例加入背景图,并可在验证时适当提高
conf。
六、进一步阅读
- 训练模式与完整参数表:docs/modes/train.md
- 超参数进化方法论(YOLOv5 遗传算法版):docs/yolov5/hyp_evolution.md
- 人脸模型结构(scales 与 Pose head 定义):ultralytics/models/v8/yolov8-pose.yaml
- 人脸数据配置:ultralytics/datasets/widerface.yaml
- 人脸训练入口:train.py 与 PoseTrainer 实现
- 人脸评测闭环:test_widerface.py 与 widerface_evaluate
此外,Andrej Karpathy 的《Recipe for Training Neural Networks》对训练方法论有跨领域的普适启发,值得作为延伸阅读。最后回到原文档的忠告:多数场景下,默认设置 + 高质量数据已经足够;调参只是锦上添花,而数据才是决定精度的天花板。
- 人工智能
- 计算机视觉
- 深度学习
【免费下载链接】yolov8-face
yolov8 face detection with landmark
相关推荐
YOLOv8-Face 模型训练完全指南:基于 Train Mode 与 WIDER Face 数据集
YOLOv8 Face 模型训练完全指南:基于 Train Mode 与 WIDER Face 数据集 YOLOv8 的 Train mode(训练模式)用于在
人工智能计算机视觉深度学习2d-extras源码解析:深入理解Scriptable Tiles的实现原理
2d extras源码解析:深入理解Scriptable Tiles的实现原理 2d extras是Unity官方提供的开源扩展包,专注于2D游戏开发中的瓦片系
用 Roboflow 构建高质量人脸数据集并训练 yolov8-face 检测模型
用 Roboflow 构建高质量人脸数据集并训练 yolov8 face 检测模型 导读 本文以仓库文档 Roboflow Datasets https://l
人工智能计算机视觉深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考