视频加载失败

课程

1432 字
约 5 分钟

模块二:基于 YOLOv5 的人脸目标检测与模型训练系统 (Face Detection & YOLOv5 Training)

专业实践与小学期实训2026_0706_yolov5·更新于 2026-09-15

模块二:基于 YOLOv5 的人脸目标检测与模型训练系统 (Face Detection & YOLOv5 Training)

PyTorch YOLOv5 OpenCV License


📖 模块概述

本模块构建了端到端的人脸目标检测与识别流水线:从原始明星图像集出发,利用 OpenCV Haar 级联分类器完成面部区域的自动化定位与 YOLO 标注文件生成;随后按照 8:2 比例将数据集拆分为训练集与验证集;最后基于 Ultralytics YOLOv5 架构完成模型的迁移学习训练、指标评估与推理测试。

graph LR
    A[原始图片集 mingxing_tupian/] --> B[OpenCV Haar Cascade 人脸初筛]
    B --> C[自适应边界扩增与坐标归一化]
    C --> D[生成 YOLO 格式 .txt 标注]
    D --> E[8:2 数据集划分 train/val]
    E --> F[YOLOv5 网络迁移学习训练]
    F --> G[生成 best.pt 权重]
    G --> H[detect.py 目标检测与置信度推理]

🛠️ 数据集自动标注与划分

在传统目标检测流程中,手动标注(如 LabelImg)耗时耗力。本项目编写了自动标注脚本 zidong_biaozhu.py,实现全自动的数据集制作流水线。

1. 类别映射定义

classes = ["jujingyi", "chenyao", "dilireba", "wangxinling", "bailu"]
# Class ID: 0, 1, 2, 3, 4

2. 坐标转换原理 (Bounding Box 归一化)

YOLO 标注格式要求所有坐标相对于整图尺寸归一化至 [0,1][0, 1]x_center=x+w/2Wimg,y_center=y+h/2Himg\text{x\_center} = \frac{x + w/2}{W_{\text{img}}}, \quad \text{y\_center} = \frac{y + h/2}{H_{\text{img}}} yolo_w=wWimg,yolo_h=hHimg\text{yolo\_w} = \frac{w}{W_{\text{img}}}, \quad \text{yolo\_h} = \frac{h}{H_{\text{img}}}

3. 核心标注与划分脚本 (zidong_biaozhu.py)

import os
import shutil
import cv2

mingxing_list = ["jujingyi", "chenyao", "dilireba", "wangxinling", "bailu"]

# 初始化数据集目录结构
for split in ["train", "val"]:
    os.makedirs(f"datasets/images/{split}", exist_ok=True)
    os.makedirs(f"datasets/labels/{split}", exist_ok=True)

# 加载 OpenCV 预训练人脸检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

for class_id, name in enumerate(mingxing_list):
    tupian_files = []
    if os.path.exists("mingxing_tupian"):
        tupian_files = [f for f in os.listdir("mingxing_tupian") if f.startswith(name)]
    tupian_files.sort()
    
    # 8:2 划分训练集与验证集
    total = len(tupian_files)
    train_count = max(1, int(total * 0.8)) if total > 0 else 0
    
    for j, f_name in enumerate(tupian_files):
        src_path = os.path.join("mingxing_tupian", f_name)
        subset = "train" if j < train_count else "val"
        
        dst_img = f"datasets/images/{subset}/{f_name}"
        base_name = os.path.splitext(f_name)[0]
        dst_txt = f"datasets/labels/{subset}/{base_name}.txt"
        
        shutil.copy(src_path, dst_img)
        
        # 图像读取与人脸检测
        img = cv2.imread(src_path)
        h_img, w_img, _ = img.shape
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
        
        if len(faces) > 0:
            # 选取面积最大的人脸区域
            max_face = max(faces, key=lambda b: b[2] * b[3])
            x, y, w, h = max_face
            
            # 适度扩增外边框以覆盖完整面部轮廓
            new_w, new_h = w * 1.8, h * 1.8
            new_x = max(0, x - (new_w - w) / 2)
            new_y = max(0, y - (new_h - h) / 2)
            new_w = min(new_w, w_img - new_x)
            new_h = min(new_h, h_img - new_y)
            
            x_center = (new_x + new_w / 2) / w_img
            y_center = (new_y + new_h / 2) / h_img
            yolo_w = new_w / w_img
            yolo_h = new_h / h_img
        else:
            # 未检出时的中央兜底框
            x_center, y_center, yolo_w, yolo_h = 0.5, 0.3, 0.4, 0.4
            
        with open(dst_txt, "w") as f_out:
            f_out.write(f"{class_id} {x_center:.6f} {y_center:.6f} {yolo_w:.6f} {yolo_h:.6f}\n")
            
print("✨ 自动标注与数据集切分全部完成!")

🚀 YOLOv5 模型训练与推理

1. 数据集配置 (datasets/data.yaml)

path: ../datasets
train: images/train
val: images/val

nc: 5
names: ['jujingyi', 'chenyao', 'dilireba', 'wangxinling', 'bailu']

2. 模型训练 (Training)

进入 yolov5-train/ 目录执行训练命令:

python train.py \
  --img 640 \
  --batch 16 \
  --epochs 50 \
  --data ../datasets/data.yaml \
  --weights yolov5s.pt \
  --name exp_face_detection

关键参数解析:

  • --img:输入图像的缩放分辨率(通常为 640x640)。
  • --batch:单批次处理样本数。
  • --epochs:全量迭代轮数。
  • --weights:初始化骨干网络预训练权重(如 yolov5s.pt),大幅加速收敛。

3. 模型推理与检测 (Inference)

利用训练生成的最佳权重 best.pt 进行图像或视频的目标检测:

python detect.py \
  --weights runs/train/exp4/weights/best.pt \
  --source datasets/images/val/ \
  --conf 0.4 \
  --save-txt \
  --save-conf
Note

检测结果将保存在 runs/detect/ 目录下,包含渲染边界框、类别标签及置信度数值的图片。


📊 模型评估与实验指标

训练完成后,YOLOv5 将在 runs/train/exp4/ 自动生成综合评估报告:

  • 混淆矩阵 (Confusion Matrix):各明星类别分类精准度与漏检率。
  • PR 曲线 (Precision-Recall Curve):在各置信度阈值下的查准率与查全率。
  • F1 分数曲线:综合调和平均值指标。
  • 最终权重runs/train/exp4/weights/best.pt

📄 开源许可证

本项目遵循 CC BY-NC-SA 4.0 许可协议开源。

Profile Image of the Author
Sonder
好想要技术
这是公告标题
这只是一个公告
分类
标签
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录