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

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

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加载数据。

importtorchfromtorchvisionimportdatasets,transformsfromtorch.utils.dataimportDataLoader# 数据预处理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 模型,并修改最后的全连接层以适应人脸分类任务。

importtorch.nnasnnfromtorchvision.modelsimportvgg16classFaceRecognitionModel(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)# 修改最后一层defforward(self,x):returnself.vgg16(x)

3. 训练与评估

3.1 训练代码
importtorch.optimasoptimfromtqdmimporttqdmdeftrain_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)forepochinrange(num_epochs):model.train()train_loss=0.0correct=0total=0forimages,labelsintqdm(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)defevaluate_model(model,val_loader,device):model.eval()correct=0total=0withtorch.no_grad():forimages,labelsinval_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 应用程序,用于加载图片并进行人脸识别。

fromPyQt5.QtWidgetsimportQApplication,QMainWindow,QPushButton,QLabel,QVBoxLayout,QWidget,QFileDialogfromPyQt5.QtGuiimportQImage,QPixmapimportcv2importtorchclassApp(QMainWindow):def__init__(self,model,class_names):super().__init__()self.setWindowTitle("VGG16 人脸识别系统")self.setGeometry(100,100,800,600)self.model=model self.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)defload_image(self):file_path,_=QFileDialog.getOpenFileName(self,"选择图片","","Images (*.jpg *.png)")iffile_path:image=cv2.imread(file_path)image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)# 显示原始图像height,width,channel=image.shape bytes_per_line=3*width q_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}")defpredict_image(self,image_path):fromPILimportImagefromtorchvisionimporttransforms# 图像预处理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()withtorch.no_grad():output=self.model(image)_,predicted=torch.max(output,1)class_idx=predicted.item()returnself.class_names[class_idx]if__name__=="__main__":device='cuda'iftorch.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)

importtorchfromtorchvisionimportdatasets,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 标准化])defget_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)returntrain_loader,val_loader

2. 模型定义 (model.py)

importtorch.nnasnnfromtorchvision.modelsimportvgg16classFaceRecognitionModel(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)# 修改最后一层defforward(self,x):returnself.vgg16(x)

3. 训练代码 (train.py)

importtorchimporttorch.optimasoptimfrommodelimportFaceRecognitionModelfromdata_loaderimportget_data_loadersdeftrain_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)forepochinrange(num_epochs):model.train()train_loss=0.0correct=0total=0forimages,labelsintqdm(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)defevaluate_model(model,val_loader,device):model.eval()correct=0total=0withtorch.no_grad():forimages,labelsinval_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'iftorch.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)

fromPyQt5.QtWidgetsimportQApplication,QMainWindow,QPushButton,QLabel,QVBoxLayout,QWidget,QFileDialogfromPyQt5.QtGuiimportQImage,QPixmapimportcv2importtorchfrommodelimportFaceRecognitionModelclassApp(QMainWindow):def__init__(self,model,class_names):super().__init__()self.setWindowTitle("VGG16 人脸识别系统")self.setGeometry(100,100,800,600)self.model=model self.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)defload_image(self):file_path,_=QFileDialog.getOpenFileName(self,"选择图片","","Images (*.jpg *.png)")iffile_path:image=cv2.imread(file_path)image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)# 显示原始图像height,width,channel=image.shape bytes_per_line=3*width q_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}")defpredict_image(self,image_path):fromPILimportImagefromtorchvisionimporttransforms# 图像预处理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()withtorch.no_grad():output=self.model(image)_,predicted=torch.max(output,1)class_idx=predicted.item()returnself.class_names[class_idx]if__name__=="__main__":device='cuda'iftorch.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 └── 从部署/
http://www.jsqmd.com/news/856669/

相关文章:

  • 一文理解软件开发中的“设计模式”
  • Blender新手必看:别再乱点右上角那个“漏斗”了,详解大纲视图的4个隐藏开关
  • 别再让音频信号忽大忽小:手把手教你用运放和模拟乘法器设计一个更现代的AGC模块
  • 2026年保姆级指南:怎么降AI率?10个好用降AI工具亲测AIGC率90%→6% - 降AI实验室
  • 口碑好的虫情测报控制系统公司有哪些? - mypinpai
  • 使用worker执行Three.js中耗时的步骤
  • 3分钟掌握B站视频转文字:bili2text完整指南与效率提升方案
  • 智慧树刷课插件:如何用自动化工具解放你的学习时间
  • 告别官方镜像:手把手教你用Armbian Build系统为树莓派5定制专属Debian系统
  • 5月精选!市面上口碑好的不锈钢离心泵源头厂家推荐分析,不锈钢无负压供水设备/灌溉泵,离心泵直销厂家哪个好 - 品牌推荐师
  • 杂木半成品定制厂家哪家好,云松木业口碑出众 - mypinpai
  • 口碑好的郑州医考机构推荐
  • 导师不会告诉你的秘密:9款免费AI神器,30分钟生成高信度问卷论文 - 麟书学长
  • ArcGIS Pro 3.0 加载天地图WMTS服务,解决偏移问题的保姆级教程(附最新Key申请流程)
  • Gemini 3.5 Flash 实测报告:快4倍、编程跑分超自家Pro,这6类场景到底该不该换?
  • 超越基础采集:用STC89C51和ADC0832打造简易数据记录仪(串口绘图/Excel分析)
  • Ccursor安装使用
  • 波卡XCMP深度解析:跨链通信的核心标准与实战指南
  • Vivado ILA核的‘高级玩法’:用多个比较器实现复杂触发,告别简单边沿抓取
  • 别再写一堆if-else了!用状态机重构你的嵌入式C代码(附3种实现对比)
  • ESP32-C3 I²S实战:手把手教你驱动ES8311音频编解码器实现回声消除
  • 从ResNet到Res2Net:手把手教你理解ECAPA-TDNN中的多尺度特征提取(附PyTorch代码)
  • 2026断桥铝门窗十大品牌揭晓!装修选窗认准这几家,闭眼入不踩坑!
  • 手把手教你用Arduino+CAN总线模块DIY一个OBD升窗器(附代码与调试心得)
  • 【Perplexity本地新闻查询实战指南】:零配置部署+实时数据源接入,3步搞定离线新闻检索系统
  • 若依框架:自定义接口与权限验证实践
  • c语言循环结构-for
  • Python 实现电脑垃圾自动清理工具(附完整源码)
  • 思科Packet Tracer 7.4 生成树协议(STP)配置与安全防护上机讲义
  • 告别手动!用J-Flash批处理脚本+USB-HUB,实现多Jlink同时烧录STM32(附完整脚本)