计算机毕设指导师头像
Python毕设实战:YOLO11+Django实现基于深度学习的面部关键特征识别与检测系统(附核心代码)封面图

Python毕设实战:YOLO11+Django实现基于深度学习的面部关键特征识别与检测系统(附核心代码)

Python / YOLO11 / Django / 深度学习

📌 发布顺序:复制标题 → 摘要粘到发布页摘要栏 → 正文按顺序粘贴 → 代码块粘到代码块组件(选Python)→ 图片复制上传 → 标签逐个添加。

文章摘要

基于深度学习的面部关键特征识别与检测系统,YOLO11训练六类五官特征检测模型,Django+Vue实现三种识别方式,含历史记录与统计大屏,附核心后端代码。

一、选题背景

人脸图像分析在现实场景中用得很多,虚拟试妆、人机交互、表情辅助类应用,都需要先把五官特征定位出来。传统方法依赖人工设计的特征和规则,对光照、角度、脸型差异敏感,换批图片就要重新调整,泛化能力有限。近几年目标检测模型发展迅速,YOLO系列在速度与精度之间平衡得较好,训练和部署门槛明显降低,一张消费级显卡即可完成小规模训练,个人独立完成检测类课题成为可能。对毕设选题而言,数据可得性、单机可训练性、结果可展示性是三个关键条件,面部关键特征检测在这三方面都表现合适:数据集公开、训练单机可跑、检测框画在脸上直观。因此本课题选定该方向,完成从数据到模型再到网站的完整实现。

二、选题意义

本课题的实际意义体现在几个层面。技术层面,它完整覆盖了目标检测的工程流程:数据检查、清洗、分组划分、训练、对比实验、格式导出、Web部署,这些环节构成了后续做相关工作的基础能力。学习层面,项目横跨图像处理、后端接口、数据库与前端展示,作为综合训练能显著加深对完整工程的理解。应用层面,检测得到的五官特征位置可以作为美妆辅助、人机交互、图像分析等应用的底层输入,系统虽只实现到检测环节,但保留了扩展接口。展示层面,系统具备可视化界面与实时识别效果,便于在答辩中讲清模型训练思路,工作量真实可查。整体上这是一个难度适中、过程完整、可落地的深度学习毕设方向。

三、系统总体设计

基于深度学习的面部关键特征识别与检测系统是一个用Python完成的完整毕业设计项目,选题属于深度学习里的目标检测方向。系统要解决的问题是:给人脸图片或视频画面,自动找出其中的面部关键特征,并标出类别和位置。项目一共定义了六类特征,分别是蓝眼、棕眼、尖鼻、圆眉、直眉和圆鼻,检测时每一处特征都会画出一个框,同时给出置信度分数。模型训练部分是整个项目的工作量重心,使用了约2793张带标注的人脸图片,共一万两千多个标注框,先对数据做了完整性检查和错标筛查,再按组重新划分训练集、验证集和测试集,避免同源的增强图片跨集合造成评估失真。训练的主模型是YOLO11,另外还安排了不同家族的检测模型做对比实验,把损失曲线、精确率、召回率等指标画成图表放在一起比较,选主模型时理由更充分。训练完成的权重支持导出成PyTorch和ONNX两种格式,方便后续部署和调用。网站部分采用Django做后端,前端用Vue搭建,识别页提供三种方式:上传图片识别、上传视频识别、打开摄像头实时识别,模型可以在页面里切换,不同识别方式的结果都会保存下来。每次识别的结果都会写入数据库,历史记录页支持分页查看、查看详情和删除,方便随时回看之前的检测情况。统计大屏用六张图表汇总识别次数、类别分布、平均置信度等数据,让整个系统的运行情况一目了然。

四、核心亮点

自训YOLO11主模型,配跨家族对比实验:用两千多张标注图片自己完成训练,另安排不同家族检测模型做对比,损失曲线、精确率、召回率、混淆矩阵等指标画图比较,选型有依据。

三种识别方式覆盖多场景:上传图片识别、上传视频识别、摄像头实时识别,演示效果直观。

识别结果入库,历史记录与统计大屏齐全:每次识别的类别、位置、置信度、耗时写入数据库,历史页支持分页、详情、删除,统计大屏六张图表动态汇总。

PyTorch与ONNX双格式导出,模型可切换:权重可双格式部署,识别页内切换模型对比效果。

五、核心功能

图片识别:上传人脸图片,YOLO11检测六类特征,返回类别、位置与置信度,结果写入历史记录。

视频识别:上传视频逐帧检测,输出带特征框画面,可观察连续帧下的检测稳定性。

摄像头实时识别:打开本机摄像头实时检测,检测框与标签直接叠加在实时画面上。

识别历史记录管理:所有识别生成记录,支持分页查看、详情查看与删除。

统计大屏:六张图表展示识别总量、类别分布、平均置信度、识别方式分布等,数据动态更新。

模型选择与切换:识别页提供模型列表,可在主模型与对比模型间切换比较。

六、核心后端代码(Python/Django)

# ============ 基于深度学习的面部关键特征识别与检测系统 后端核心代码(Python/Django) ============
# 统计模块引入大数据组件Spark,用SparkSession完成识别记录的聚合分析
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.types import StructType, StructField, StringType, DoubleType
import cv2, time, uuid
from pathlib import Path
from django.http import JsonResponse, StreamingHttpResponse
from django.core.paginator import Paginator
from main.models import DetectionRecord, DetectionItem
from ultralytics import YOLO
CLASS_MAP = {0: "blu_eye", 1: "brown_eye", 2: "pointy_nose", 3: "rounded_eyebrows", 4: "rounded_nose", 5: "straight_eyebrows"}
model = YOLO("ModelTraining/best.pt")
spark = SparkSession.builder.appName("FacialFeatureStat").master("local[*]").config("spark.sql.shuffle.partitions", "4").getOrCreate()
# ---------- 核心功能1:图片识别,上传后推理并把结果写库 ----------
def recognize_image(request):
    img_file = request.FILES.get("file")
    if not img_file:
        return JsonResponse({"code": 1, "msg": "请先选择要识别的图片"})
    save_dir = Path("media/detection")
    save_dir.mkdir(parents=True, exist_ok=True)
    img_path = save_dir / ("%s.jpg" % uuid.uuid4().hex)
    with open(img_path, "wb") as f:
        for chunk in img_file.chunks():
            f.write(chunk)
    start = time.time()
    result = model.predict(str(img_path), conf=0.4, imgsz=640, verbose=False)[0]
    items = []
    for box in result.boxes:
        cls_id = int(box.cls[0])
        x1, y1, x2, y2 = [round(float(v), 2) for v in box.xyxy[0].tolist()]
        items.append({"name": CLASS_MAP.get(cls_id, "unknown"), "conf": round(float(box.conf[0]), 3), "box": [x1, y1, x2, y2]})
    record = DetectionRecord.objects.create(user=request.user, image=str(img_path), mode="image", cost=round(time.time() - start, 3), count=len(items))
    if items:
        DetectionItem.objects.bulk_create([DetectionItem(record=record, name=it["name"], conf=it["conf"]) for it in items])
    return JsonResponse({"code": 0, "msg": "识别完成", "count": len(items), "items": items, "record_id": record.id})
# ---------- 核心功能2:摄像头实时识别,逐帧检测并画框 ----------
def detect_frame(frame):
    frame = cv2.resize(frame, (640, 640))
    result = model.predict(frame, conf=0.4, imgsz=640, verbose=False)[0]
    names = result.names
    for box in result.boxes:
        cls_id = int(box.cls[0])
        x1, y1, x2, y2 = [int(v) for v in box.xyxy[0].tolist()]
        label = "%s %.2f" % (names.get(cls_id, str(cls_id)), float(box.conf[0]))
        cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 200, 0), 2)
        cv2.putText(frame, label, (x1, max(y1 - 6, 12)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 200, 0), 1)
    return frame, len(result.boxes)
def camera_feed(request):
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        return JsonResponse({"code": 1, "msg": "摄像头打开失败"})
    def gen():
        while True:
            ok, frame = cap.read()
            if not ok:
                break
            frame, cnt = detect_frame(frame)
            ok, buf = cv2.imencode(".jpg", frame)
            yield (b"--frame\r\nContent-Type: image/jpeg\r\n\r\n" + buf.tobytes() + b"\r\n")
        cap.release()
    return StreamingHttpResponse(gen(), content_type="multipart/x-mixed-replace; boundary=frame")
# ---------- 核心功能3:统计大屏,用Spark聚合识别记录 ----------
def dashboard_stats(request):
    qs = DetectionItem.objects.values("name", "conf", "record__mode")
    rows = [dict(name=r["name"], conf=float(r["conf"]), mode=r["record__mode"] or "image") for r in qs]
    schema = StructType([StructField("name", StringType()), StructField("conf", DoubleType()), StructField("mode", StringType())])
    df = spark.createDataFrame(rows, schema=schema) if rows else spark.createDataFrame([], schema)
    by_class = df.groupBy("name").agg(F.count("*").alias("total"), F.round(F.avg("conf"), 3).alias("avg_conf")).orderBy(F.desc("total"))
    by_mode = df.groupBy("mode").count()
    class_data = [{"name": r["name"], "total": r["total"], "avg_conf": r["avg_conf"]} for r in by_class.collect()]
    mode_data = [{"mode": r["mode"], "count": r["count"]} for r in by_mode.collect()]
    total_records = DetectionRecord.objects.count()
    return JsonResponse({"code": 0, "total_records": total_records, "by_class": class_data, "by_mode": mode_data})

七、总结

本课题从数据整理、模型训练到网站实现,完整完成了一套面部关键特征识别与检测系统。受个人水平和时间限制,系统在遮挡场景和极端光照下的表现还有提升空间,模型种类和统计维度也可以继续丰富。后续会在现有基础上补充数据、优化参数,让检测更稳定。希望这份记录能给同样在做深度学习毕设的同学一点参考,少走一些弯路。

成品视频

YOLO11实现基于深度学习的面部关键特征识别与检测系统

核心功能图

配图:图片识别

配图:摄像头实时识别

配图:统计大屏

识别历史

识别详情

视频识别

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2301_80395604/article/details/170564869

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--