当前位置: 首页 > news >正文

基于 PyTorch 的 VGG16 深度学习人脸识别检测系统的实现+ui界面

VGG16深度学习人脸识别检测系统

文章目录

      • **1. 数据准备**
        • **1.1 数据加载器**
      • **2. 模型定义**
      • **3. 训练与评估**
        • **3.1 训练代码**
      • **4. 可视化 UI 界面**
      • 1. 数据加载 (`data_loader.py`)
      • 2. 模型定义 (`model.py`)
      • 3. 训练代码 (`train.py`)
      • 4. 可视化 UI 界面 (`ui.py`)
      • 目录结构

预达到预期:
基于Pytorch的VGG16学习实现
支持GPU加速训练
可视化UI界面
在这里插入图片描述

基于 PyTorch 的 VGG16 深度学习人脸识别检测系统的实现,支持 GPU 加速训练和可视化 UI 界面。我们将分步骤完成数据准备、模型定义、训练与评估以及 UI 界面的构建。


1. 数据准备

假设你有一个包含人脸图像的数据集,目录结构如下:

dataset/
├── train/
│   ├── person1/
│   │   ├── img1.jpg
│   │   └── ...
│   ├── person2/
│   │   ├── img1.jpg
│   │   └── ...
│   └── ...
└── val/├── person1/│   ├── img1.jpg│   └── ...├── person2/│   ├── img1.jpg│   └── ...└── ...
1.1 数据加载器

使用 torchvision.datasets.ImageFoldertorch.utils.data.DataLoader 加载数据。

import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader# 数据预处理
transform = transforms.Compose([transforms.Resize((224, 224)),  # VGG16 输入大小为 224x224transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # ImageNet 标准化
])# 加载数据集
train_dataset = datasets.ImageFolder(root="dataset/train", transform=transform)
val_dataset = datasets.ImageFolder(root="dataset/val", transform=transform)train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)

2. 模型定义

加载预训练的 VGG16 模型,并修改最后的全连接层以适应人脸分类任务。

import torch.nn as nn
from torchvision.models import vgg16class FaceRecognitionModel(nn.Module):def __init__(self, num_classes):super(FaceRecognitionModel, self).__init__()self.vgg16 = vgg16(pretrained=True)  # 加载预训练的 VGG16self.vgg16.classifier[6] = nn.Linear(4096, num_classes)  # 修改最后一层def forward(self, x):return self.vgg16(x)

3. 训练与评估

3.1 训练代码
import torch.optim as optim
from tqdm import tqdmdef train_model(model, train_loader, val_loader, num_epochs=20, lr=0.001, device='cuda'):optimizer = optim.Adam(model.parameters(), lr=lr)criterion = nn.CrossEntropyLoss()model.to(device)for epoch in range(num_epochs):model.train()train_loss = 0.0correct = 0total = 0for images, labels in tqdm(train_loader):images, labels = images.to(device), labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()train_loss += loss.item()_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {train_loss/len(train_loader):.4f}, Accuracy: {correct/total:.4f}")# 验证模型evaluate_model(model, val_loader, device)def evaluate_model(model, val_loader, device):model.eval()correct = 0total = 0with torch.no_grad():for images, labels in val_loader:images, labels = images.to(device), labels.to(device)outputs = model(images)_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f"Validation Accuracy: {correct/total:.4f}")

4. 可视化 UI 界面

使用 PyQt5 构建一个简单的 GUI 应用程序,用于加载图片并进行人脸识别。

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidget, QFileDialog
from PyQt5.QtGui import QImage, QPixmap
import cv2
import torchclass App(QMainWindow):def __init__(self, model, class_names):super().__init__()self.setWindowTitle("VGG16 人脸识别系统")self.setGeometry(100, 100, 800, 600)self.model = modelself.class_names = class_names# UI 元素self.label_image = QLabel(self)self.label_image.setGeometry(50, 50, 700, 400)self.btn_load = QPushButton("加载图片", self)self.btn_load.setGeometry(50, 500, 150, 40)self.btn_load.clicked.connect(self.load_image)self.label_result = QLabel("预测结果:", self)self.label_result.setGeometry(250, 500, 500, 40)def load_image(self):file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Images (*.jpg *.png)")if file_path:image = cv2.imread(file_path)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 显示原始图像height, width, channel = image.shapebytes_per_line = 3 * widthq_img = QImage(image.data, width, height, bytes_per_line, QImage.Format_RGB888)self.label_image.setPixmap(QPixmap.fromImage(q_img))# 预测result = self.predict_image(file_path)self.label_result.setText(f"预测结果:{result}")def predict_image(self, image_path):from PIL import Imagefrom torchvision import transforms# 图像预处理transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])image = Image.open(image_path).convert("RGB")image = transform(image).unsqueeze(0).to('cuda')# 推理self.model.eval()with torch.no_grad():output = self.model(image)_, predicted = torch.max(output, 1)class_idx = predicted.item()return self.class_names[class_idx]if __name__ == "__main__":device = 'cuda' if torch.cuda.is_available() else 'cpu'# 加载模型model = FaceRecognitionModel(num_classes=len(train_dataset.classes))model.load_state_dict(torch.load("face_recognition_model.pth"))model.to(device)model.eval()app = QApplication([])window = App(model, train_dataset.classes)window.show()app.exec_()

为了实现一个基于 VGG16 的人脸识别系统,并且支持 GPU 加速训练和可视化 UI 界面,我们可以分步骤进行。以下是详细的代码实现:

1. 数据加载 (data_loader.py)

import torch
from torchvision import datasets, transforms# 数据预处理
transform = transforms.Compose([transforms.Resize((224, 224)),  # VGG16 输入大小为 224x224transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # ImageNet 标准化
])def get_data_loaders(data_dir, batch_size=32):train_dataset = datasets.ImageFolder(root=f"{data_dir}/train", transform=transform)val_dataset = datasets.ImageFolder(root=f"{data_dir}/val", transform=transform)train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=batch_size, shuffle=False)return train_loader, val_loader

2. 模型定义 (model.py)

import torch.nn as nn
from torchvision.models import vgg16class FaceRecognitionModel(nn.Module):def __init__(self, num_classes):super(FaceRecognitionModel, self).__init__()self.vgg16 = vgg16(pretrained=True)  # 加载预训练的 VGG16self.vgg16.classifier[6] = nn.Linear(4096, num_classes)  # 修改最后一层def forward(self, x):return self.vgg16(x)

3. 训练代码 (train.py)

import torch
import torch.optim as optim
from model import FaceRecognitionModel
from data_loader import get_data_loadersdef train_model(model, train_loader, val_loader, num_epochs=20, lr=0.001, device='cuda'):optimizer = optim.Adam(model.parameters(), lr=lr)criterion = nn.CrossEntropyLoss()model.to(device)for epoch in range(num_epochs):model.train()train_loss = 0.0correct = 0total = 0for images, labels in tqdm(train_loader):images, labels = images.to(device), labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()train_loss += loss.item()_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {train_loss/len(train_loader):.4f}, Accuracy: {correct/total:.4f}")# 验证模型evaluate_model(model, val_loader, device)def evaluate_model(model, val_loader, device):model.eval()correct = 0total = 0with torch.no_grad():for images, labels in val_loader:images, labels = images.to(device), labels.to(device)outputs = model(images)_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f"Validation Accuracy: {correct/total:.4f}")if __name__ == "__main__":device = 'cuda' if torch.cuda.is_available() else 'cpu'num_classes = len(train_loader.dataset.classes)model = FaceRecognitionModel(num_classes)train_loader, val_loader = get_data_loaders("path_to_your_data")train_model(model, train_loader, val_loader, num_epochs=20, lr=0.001, device=device)torch.save(model.state_dict(), "best_model.pth")

4. 可视化 UI 界面 (ui.py)

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidget, QFileDialog
from PyQt5.QtGui import QImage, QPixmap
import cv2
import torch
from model import FaceRecognitionModelclass App(QMainWindow):def __init__(self, model, class_names):super().__init__()self.setWindowTitle("VGG16 人脸识别系统")self.setGeometry(100, 100, 800, 600)self.model = modelself.class_names = class_names# UI 元素self.label_image = QLabel(self)self.label_image.setGeometry(50, 50, 700, 400)self.btn_load = QPushButton("加载图片", self)self.btn_load.setGeometry(50, 500, 150, 40)self.btn_load.clicked.connect(self.load_image)self.label_result = QLabel("预测结果:", self)self.label_result.setGeometry(250, 500, 500, 40)def load_image(self):file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Images (*.jpg *.png)")if file_path:image = cv2.imread(file_path)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 显示原始图像height, width, channel = image.shapebytes_per_line = 3 * widthq_img = QImage(image.data, width, height, bytes_per_line, QImage.Format_RGB888)self.label_image.setPixmap(QPixmap.fromImage(q_img))# 预测result = self.predict_image(file_path)self.label_result.setText(f"预测结果:{result}")def predict_image(self, image_path):from PIL import Imagefrom torchvision import transforms# 图像预处理transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])image = Image.open(image_path).convert("RGB")image = transform(image).unsqueeze(0).to('cuda')# 推理self.model.eval()with torch.no_grad():output = self.model(image)_, predicted = torch.max(output, 1)class_idx = predicted.item()return self.class_names[class_idx]if __name__ == "__main__":device = 'cuda' if torch.cuda.is_available() else 'cpu'# 加载模型model = FaceRecognitionModel(num_classes=len(train_loader.dataset.classes))model.load_state_dict(torch.load("best_model.pth"))model.to(device)model.eval()app = QApplication([])window = App(model, train_loader.dataset.classes)window.show()app.exec_()

目录结构

基于VGG16的人脸识别/
├── data/
│   ├── train/
│   └── val/
├── hub/
│   ├── best_model.pth
│   ├── c罗.jpg
│   ├── c罗_1.jpg
│   ├── data_loader.py
│   ├── model.py
│   ├── train.py
│   ├── ui.py
│   ├── 小罗伯特唐尼.jpg
│   ├── 梅西.jpg
│   └── 梅西_1.jpg
└── 从部署/

相关文章:

  • 机器学习的数学基础:线性模型
  • unix/linux,sudo,其高级使用
  • 在 Android 框架中,接口的可见性规则
  • Excel 透视表以及透视图应用(基础版)
  • 实验设计如何拯救我的 CEI VSR 28G 设计
  • Springboot——整合websocket并根据type区别处理
  • Git忽略规则.gitignore不生效解决
  • Dockerfile基础
  • 【Docker 从入门到实战全攻略(二):核心概念 + 命令详解 + 部署案例】
  • 【计算机网络】HTTPS
  • FTPS、HTTPS、SMTPS以及WebSockets over TLS的概念及其应用场景
  • JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/等待通知机制/锁消除
  • 结构型设计模式之Proxy(代理)
  • 基于VMD-LSTM融合方法的F10.7指数预报
  • 证券交易柜台系统解析与LinkCounter解决方案开发实践
  • 基于Axure+墨刀设计的电梯管理系统云台ERP的中保真原型图
  • Axure 下拉框联动
  • 如果安装并使用RustDesk
  • nt!CcInitializeCacheMap函数分析初始化Vacbs结构
  • 机器学习实战37-基于情感字典和机器学习的股市舆情分析可视化系统
  • 制作公司网页的步骤/南宁seo推广优化
  • 嘉兴企业做网站/免费申请网站
  • 教育网站集群建设方案/网络舆情分析
  • 简单手机网站如何制作/上海做推广的引流公司
  • 如何网站建设自己怎么个人网站/宁德市属于哪个省份
  • 网站后台管理员做链接/bt磁力链好用的引擎