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.ImageFolder和torch.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_loader2. 模型定义 (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 └── 从部署/