当前位置: 首页 > 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.zskr.cn/news/1337286.html

相关文章:

  • 口碑好的虫情测报控制系统公司有哪些? - mypinpai
  • STM32CubeMX安装避坑指南:从Java环境配置到离线库安装,保姆级教程(含网盘资源)
  • 智慧树刷课插件:如何用自动化工具解放你的学习时间
  • 避坑指南:在Codesys V3.5中用ST处理XML,我踩过的那些‘坑’
  • 3个核心优化:让你的华硕笔记本性能翻倍且更省电
  • Qt布局进阶:除了setStretchFactor,QSplitter的setSizes和保存用户偏好你会用吗?
  • 超越基础采集:用STC89C51和ADC0832打造简易数据记录仪(串口绘图/Excel分析)
  • RT-Thread GUI开发:基于QEMU的跨平台仿真环境搭建与实战
  • 从ResNet到Res2Net:手把手教你理解ECAPA-TDNN中的多尺度特征提取(附PyTorch代码)
  • 口碑好的郑州医考机构推荐
  • 驭势科技港股上市:市值95亿港元 吴甘沙十年磨一剑 创新工场是股东
  • 若依框架:自定义接口与权限验证实践
  • 从计划到入库:手把手跟完一张SAP生产订单的全生命周期(含MRP触发逻辑)
  • 从‘动物叫’到‘电机转’:我的Codesys面向对象编程踩坑实录与避坑指南
  • 深入解析Cosmos IBC:跨链通信的核心标准、实战应用与未来展望
  • MXM-ACMA模块化GPU:AI边缘计算的高性能可升级解决方案
  • 告别500轮训练!用Conditional DETR在COCO上快速收敛目标检测模型(附PyTorch代码)
  • 终极指南:3分钟解决微信网页版无法访问的难题
  • MuleRun助力MakerChip-FPGA在线编程模拟仿真操练
  • RuoYi-Cloud项目导入避坑指南:从Maven配置到依赖下载的完整流程(附常见错误解决)
  • Perplexity词组搭配查询深度解析(工业级语料验证版):基于127万条真实英文语境的搭配强度阈值模型首次公开
  • AI客流统计如何实现99%准确率?从3D视觉到ReID去重解析
  • c语言循环结构-for
  • SpringBean完整生命周期
  • 2026年必看!10款降AI率工具大测评:教你AI降AI与免费降低AI率 - 降AI实验室
  • 一个营销系准大一新生的 AI 猜想:我们把大脑和身体装反了
  • 用Verilog手把手教你设计一个5分频电路(附RTL代码与仿真波形)
  • 手把手教你用STC89C52和DS1302做一个带按键调节的电子时钟(附完整代码)
  • 模型替换易,工作流锁定难!AI 锁定效应转移,企业决策何去何从?
  • 别再乱接电阻了!从I2C总线到按键消抖,手把手教你玩转STM32的上下拉电阻配置