手把手教你从零开始训练 YOLOv11 人脸检测模型,并附上完整的可运行代码与训练日志分析

📌 前言

这是我学习 YOLOv11 目标检测的第一个实战项目——用 YOLOv11 实现简单的人脸识别检测。本文的目的非常纯粹:记录和整理我的完整学习过程,方便日后回顾,也希望帮助和我一样刚入门的朋友少走弯路。

项目虽简单,但覆盖了一个完整深度学习项目的全部环节:

  • ✅ GPU 环境配置验证

  • ✅ 数据集准备与组织

  • ✅ 模型训练

  • ✅ 模型验证与测试

  • ✅ 单张图片推理预测

我会把每一步的完整代码运行日志都贴出来,你可以直接复制修改路径后使用。

⚠️ 阅读提示:文中所有路径 D:\develop\yolov11_Face_recognition 请替换为你自己的项目路径。

一、项目背景与环境

1.1 我的硬件配置
  • GPU:NVIDIA GeForce RTX 5060 Laptop GPU(显存约 8GB)

  • 系统:Windows 11

  • CUDA:12.8

1.2 软件环境安装

首先需要创建虚拟环境并在其中安装 PyTorch 和 Ultralytics 框架。

Step 1:创建虚拟环境

打开 Anaconda Prompt 或终端,执行以下命令:

conda create -n yolo11 python=3.10 -y

Step 2:激活虚拟环境

conda activate yolo11

激活成功后,命令行前缀会显示 (yolo11),表示已进入虚拟环境。

Step 3:安装 PyTorch(GPU 版本)和Ultralytics 框架(也就是yolo)

根据你的 CUDA 版本选择合适的安装命令。我的环境是 CUDA 12.8,执行:

pip3 install --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/cu128

pip install ultralytics

安装完成后,在pycharm创建项目后配置刚才创建的虚拟环境中的python解释器,随后我写了一个简单的脚本 testGPU.py 来确认 GPU 是否被正确识别

import torch
from ultralytics import YOLO

# ===================== 1. 基础 GPU 信息检测 =====================
print("=" * 50)
print("📌 基础 GPU 信息")
print("=" * 50)
# 验证 PyTorch 是否识别 GPU
cuda_available = torch.cuda.is_available()
print(f"PyTorch 识别 CUDA:{cuda_available}")
if cuda_available:
    # 显卡数量
    gpu_count = torch.cuda.device_count()
    print(f"显卡数量:{gpu_count}")
    # 默认显卡名称
    gpu_name = torch.cuda.get_device_name(0)
    print(f"默认显卡:{gpu_name}")
    # CUDA 版本
    cuda_version = torch.version.cuda
    print(f"CUDA 版本:{cuda_version}")
    # 显卡算力(Compute Capability)
    gpu_capability = torch.cuda.get_device_capability(0)
    print(f"显卡算力:{gpu_capability[0]}.{gpu_capability[1]} (核心算力值)")
    # 显卡显存
    gpu_memory = torch.cuda.get_device_properties(0).total_memory / 1024 / 1024 / 1024
    print(f"显卡显存:{gpu_memory:.2f} GB")

# ===================== 2. YOLOv11 模型 GPU 调用验证 =====================
print("\n" + "=" * 50)
print("📌 YOLOv11 GPU 调用验证")
print("=" * 50)
# 加载 YOLOv11 模型并强制加载到 GPU
model = YOLO('yolo11n.pt').to('cuda' if cuda_available else 'cpu')
# 查看模型当前设备
model_device = model.device
print(f"YOLOv11 模型加载设备:{model_device}")
print(f"YOLOv11 是否调用 GPU:{model_device.type == 'cuda'}")

运行结果:

==================================================
📌 基础 GPU 信息
==================================================
PyTorch 识别 CUDA:True
显卡数量:1
默认显卡:NVIDIA GeForce RTX 5060 Laptop GPU
CUDA 版本:12.8
显卡算力:12.0 (核心算力值)
显卡显存:7.96 GB

==================================================
📌 YOLOv11 GPU 调用验证
==================================================
YOLOv11 模型加载设备:cuda:0
YOLOv11 是否调用 GPU:True

✅ 环境验证通过,可以开始正式项目了。

二、数据集准备

2.1 数据来源与标注

我使用的是自建的小型人脸数据集,包含 5 个不同人物(personA ~ personE),共计约 200 张图片。

数据集划分如下:

  • 训练集 (train):140 张

  • 验证集 (valid):40 张

  • 测试集 (test):20 张

标注格式采用 YOLO 格式,即每张图片对应一个同名的 .txt 文件

2.2 数据集配置文件 data.yaml

在项目根目录下的 datasets/ 文件夹中创建 data.yaml 文件

train: D:\develop\yolov8_Face_recognition\datasets\train\images
val: D:\develop\yolov8_Face_recognition\datasets\valid\images
test: D:\develop\yolov8_Face_recognition\datasets\test\images
nc: 5
names: ['personA', 'personB', 'personC', 'personD', 'personE']
2.3 下载预训练权重

从 Ultralytics 官方下载 YOLOv11n 的预训练权重文件 yolo11n.pt,放在项目根目录下。

三、模型训练

训练脚本 train.py
from ultralytics import YOLO
import torch
import sys

BASE_DIR = r"D:\develop\yolov11_Face_recognition"
# 日志保存功能
class Logger:
    def __init__(self, filename="train_log.txt"):
        self.terminal = sys.stdout
        self.log = open(filename, "w", encoding="utf-8")
    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)
    def flush(self):
        pass
sys.stdout = Logger()


# 验证CUDA与独显
print("CUDA可用:", torch.cuda.is_available())
print("GPU数量:", torch.cuda.device_count())
print("当前GPU:", torch.cuda.get_device_name(0))


# 1. 加载预训练模型
model = YOLO(r"D:\develop\yolov11_Face_recognition\yolo11n.pt")
# 2. 开始训练(参数根据你的电脑配置调整)
results = model.train(
    # 数据集配置文件路径(绝对路径,100%不报错)
    data=r"D:\develop\yolov11_Face_recognition\datasets\data.yaml",
    # 训练轮数(新手50-100轮足够,轮数越多越慢)
    epochs=50,
    # 批次大小(根据显卡显存调整:4G显存用4,8G用8,16G用16)
    batch=8,
    # 输入图像尺寸(640是标准,越大越慢)
    imgsz=800,
    # 训练结果保存路径(自动生成,不用手动建文件夹)
    project=r"D:\develop\yolov11_Face_recognition\runs\train",
    # 实验名称(每次训练改名字,避免覆盖之前的结果)
    name="Face_recognition_exp_yolo11n",
    # 设备:0代表用第1块NVIDIA显卡,cpu代表用CPU(不推荐,太慢)
    device=0,
    # 其他优化参数(新手不用改)
    workers=0,
    pretrained=True,
    amp=True,  # 自动混合精度,加快训练,节省显存
    cache=True,
    exist_ok = True
)

训练完成后,最佳模型权重保存在:

runs/train/Face_recognition_exp_yolo11n/weights/best.pt

四、模型验证与测试

4.1 验证集评估 valid.py

验证集用于在训练过程中监控模型表现,帮助判断是否过拟合。

from ultralytics import YOLO
import torch
import sys

BASE_DIR = r"D:\develop\yolov11_Face_recognition"

# 日志输出(控制台 + 文件同时保存)
class Logger:
    def __init__(self, filename="valid_log.txt"):
        self.terminal = sys.stdout
        self.log = open(filename, "w", encoding="utf-8")
    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)
    def flush(self):
        pass
sys.stdout = Logger()

# 显示GPU信息
print("="*60)
print("           🔍 YOLOv11 模型验证")
print("="*60)
print("CUDA可用:", torch.cuda.is_available())
print("GPU数量:", torch.cuda.device_count())
print("当前GPU:", torch.cuda.get_device_name(0))
print("="*60)

# ====================== 核心:加载你训练好的模型 ======================
# 路径完全和你训练代码一致
model = YOLO(BASE_DIR + r"\runs\train\Face_recognition_exp_yolo11n.pt\weights\best.pt")

# ====================== 开始验证 ======================
metrics = model.val(
    data=BASE_DIR + r"\datasets\data.yaml",        # 你的数据集配置
    imgsz=800,                                     # 与训练保持一致
    batch=4,                                       # 验证可小一点,不爆显存
    device=0,                                      # 使用GPU
    project=BASE_DIR + r"\runs\valid",                # 验证结果保存路径
    name="Face_recognition_valid_exp",                # 验证文件夹名称
    exist_ok=True,
    workers=0
)

# ====================== 输出关键指标 ======================
print("\n" + "="*60)
print("           ✅ 模型验证完成!")
print("="*60)
print(f"mAP50          : {metrics.box.map50:.4f}")
print(f"精确率(Precision) : {metrics.box.p[0]:.4f}")
print(f"召回率(Recall)    : {metrics.box.r[0]:.4f}")
print(f"mAP50-95       : {metrics.box.map:.4f}")
print("="*60)

验证结果输出:

============================================================
           ✅ 模型验证完成!
============================================================
mAP50          : 0.9872
精确率(Precision) : 0.8479
召回率(Recall)    : 1.0000
mAP50-95       : 0.6861
============================================================

指标解读:

  • mAP50 = 0.9872:说明在 IoU=0.5 的宽松标准下,模型对人脸的检测效果非常好,接近满分。

  • Recall = 1.0000:召回率达到 100%,说明验证集中所有真实人脸都被成功检测出来,没有出现漏检的情况,这对于人脸识别任务来说非常关键。

  • Precision = 0.8479:精确率约 84.8%,说明模型偶尔会有误检(把不是人脸的区域当成人脸),但整体在可接受范围内。

  • mAP50-95 = 0.6861:这是更严格的多 IoU 阈值综合指标,68.6% 对于仅有 140 张训练图片的小数据集来说是一个相当不错的成绩,说明模型在不同 IoU 标准下都有较好的表现。

4.2 测试集评估 test.py

测试集是模型从未见过的数据,用于最终评估模型的泛化能力。

from ultralytics import YOLO
import torch
import sys

BASE_DIR = r"D:\develop\yolov11_Face_recognition"

# 日志保存
class Logger:
    def __init__(self, filename="test_log.txt"):
        self.terminal = sys.stdout
        self.log = open(filename, "w", encoding="utf-8")
    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)
    def flush(self):
        pass
sys.stdout = Logger()

# GPU信息
print("="*60)
print("        🧪 YOLOv11 测试集评估")
print("="*60)
print("CUDA可用:", torch.cuda.is_available())
print("GPU:", torch.cuda.get_device_name(0))
print("="*60)

# 加载模型
model = YOLO(BASE_DIR + r"\runs\train\Face_recognition_exp_yolo11n.pt\weights\best.pt")

# 测试集推理
metrics = model.val(
    data=BASE_DIR + r"\datasets\data.yaml",
    split="test",        # 跑测试集
    imgsz=800,
    batch=8,
    device=0,
    workers=0,
    project=BASE_DIR + r"\runs\test",
    name="Face_recognition_test_exp",
    exist_ok=True
)

# 输出结果
print("\n" + "="*60)
print("        ✅ 测试完成!")
print("="*60)
print(f"Test mAP50      : {metrics.box.map50:.4f}")
print(f"Test Precision  : {metrics.box.p[0]:.4f}")
print(f"Test Recall     : {metrics.box.r[0]:.4f}")
print(f"Test mAP50-95   : {metrics.box.map:.4f}")
print("="*60)

五、模型预测:实际使用

训练好的模型最终要用来检测新图片。predict.py 展示了如何对单张图片进行推理。

单张图片检测结果示例:

============================================================
        🧪 YOLOv11 单张图片检测
============================================================
CUDA可用: True
GPU: NVIDIA GeForce RTX 5060 Laptop GPU
============================================================

image 1/1 D:\develop\yolov11_Face_recognition\datasets\test\images\071.jpg: 608x800 1 personA, 1 personB, 1 personC, 1 personD, 1 personE, 69.2ms
Speed: 6.1ms preprocess, 69.2ms inference, 16.3ms postprocess per image at shape (1, 3, 608, 800)
Results saved to D:\develop\yolov11_Face_recognition\runs\predict\single_image_detect

============================================================
        ✅ 单张图片检测完成!
============================================================
图片路径: D:\develop\yolov11_Face_recognition\datasets\test\images\071.jpg
检测到目标数量: 5

--- 检测框详情 ---
目标 1: 类别=personD, 置信度=0.9387, 坐标=(1148,598,1284,712)
目标 2: 类别=personC, 置信度=0.8993, 坐标=(205,570,334,690)
目标 3: 类别=personA, 置信度=0.8774, 坐标=(481,581,603,702)
目标 4: 类别=personB, 置信度=0.7930, 坐标=(817,593,942,709)
目标 5: 类别=personE, 置信度=0.7455, 坐标=(1486,606,1613,724)
============================================================


 

六、踩坑经验总结

作为新手,我在这个项目过程中遇到了几个坑,记录下来供参考:

问题 原因 解决方法
训练时卡住不动 Windows 下多进程加载数据问题 设置 workers=0
报错 FileNotFoundError 路径中包含中文或使用了相对路径 使用绝对路径,并在字符串前加 r
显存不足 (CUDA out of memory) batch 或 imgsz 太大 调小 batch=4,或调小 imgsz=640
路径报错 \n 转义问题 Windows 路径中的 \ 被当作转义符 路径前加 r,如 r"D:\data"
训练时 loss 为 nan 学习率过大或数据标注错误
检查标注文件格式是否正确

七、项目文件清单

最后整理一下本次项目的所有核心文件,方便读者对照:

yolov11_Face_recognition/

├── yolo11n.pt                     # 预训练权重

├── testGPU.py                     # GPU 环境验证脚本
├── train.py                       # 训练脚本
├── valid.py                       # 验证脚本
├── test.py                        # 测试脚本
├── predict.py                     # 单图预测脚本

├── datasets/
│   ├── data.yaml                  # 数据集配置
│   ├── train/
│   │   ├── images/                # 140 张训练图片
│   │   └── labels/                # 140 个标注文件
│   ├── valid/
│   │   ├── images/                # 40 张验证图片
│   │   └── labels/                # 40 个标注文件
│   └── test/
│       ├── images/                # 20 张测试图片
│       └── labels/                # 20 个标注文件

├── runs/
│   ├── train/Face_recognition_exp_yolo11n/weights/best.pt
│   ├── valid/Face_recognition_valid_exp/
│   ├── test/Face_recognition_test_exp/
│   └── predict/single_image_detect/

├── train_log.txt                  # 训练日志
├── valid_log.txt                  # 验证日志
└── predict_log.txt                # 预测日志

写在最后

这是我的第一个 YOLOv11 实战项目记录,虽然只是一个简单的人脸识别任务,但完整走通了一遍后,对 YOLO 的训练流程、参数含义、指标解读都有了更直观的理解。

如果你也是刚入门的新手,强烈建议自己动手跑一遍——环境配置、路径设置这些小细节,只有亲手踩过坑才能真正记住。

最后的话,就是想说,我第一次搞项目复现,把项目放在了develop文件夹,不太好,我以后决定都放在project文件夹😄。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐