课程
1432 字
约 5 分钟
大三下
模块二:基于 YOLOv5 的人脸目标检测与模型训练系统 (Face Detection & YOLOv5 Training)
专业实践与小学期实训2026_0706_yolov5·更新于 2026-09-15
模块二:基于 YOLOv5 的人脸目标检测与模型训练系统 (Face Detection & YOLOv5 Training)
📖 模块概述
本模块构建了端到端的人脸目标检测与识别流水线:从原始明星图像集出发,利用 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 标注格式要求所有坐标相对于整图尺寸归一化至 :
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 许可协议开源。













