使用PyTorch+OpenCV进行人脸识别(附代码演练)

人脸识别是一种用于从图像或视频中识别人脸的系统。它在许多应用程序和垂直行业中很有用。如今,我们看到这项技术可帮助新闻机构在重大事件报道中识别名人,为移动应用程序提供二次身份验证,为媒体和娱乐公司自动索引图像和视频文件,允许人道主义团体识别和营救人口贩卖受害者。

在这个博客中,我尝试构建一个人脸识别系统,该系统将一个人的图像与数据集中的护照大小的照片相匹配,并输出该图像是否匹配。

该系统可分为以下部分:人脸检测和人脸分类器

人脸检测

首先,将加载包含护照尺寸的图像和自拍照的数据集。然后将其分为训练数据和验证数据。

pip install split-folders

该库有助于将数据集划分为训练,测试和验证数据。

import splitfolders
splitfolders.ratio('dataset', output="/data", seed=1337, ratio=(.8, 0.2))

这将创建一个包含训练和有效子文件夹的数据目录,将数据集分别划分为80%训练集和20%验证集。

现在,我们将尝试从图像中提取人脸。为此,我将OpenCV的预训练Haar Cascade分类器用于人脸。

首先,我们需要加载haarcascade_frontalface_default XML分类器。然后以灰度模式加载我们的输入图像(或视频)。如果找到人脸,则将检测到的人脸的位置返回为Rect(x,y,w,h)。然后,将这些位置用于为人脸创建ROI。

import fnmatch
import os
from matplotlib import pyplot as plt
import cv2

# Load the cascade
face_cascade = cv2.CascadeClassifier('/haarcascade_frontalface_default.xml')

paths="/data/"


for root,_,files in os.walk(paths):
    for filename in files: 
        file = os.path.join(root,filename)
        if fnmatch.fnmatch(file,'*.jpg'):
            
            img = cv2.imread(file)        
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            # Detect faces
            faces = face_cascade.detectMultiScale(gray, 1.1, 4)
            # Draw rectangle around the faces
            for (x, y, w, h) in faces:
              crop_face = img[y:y+h, x:x+w]
            path = os.path.join(root,filename)
            cv2.imwrite(path,crop_face)

这会将目录中的所有图像替换为图像中检测到的人脸。分类器的数据准备部分现已完成。

现在,我们将加载该数据集。

from torch import nn, optim, as_tensor
from torch.utils.data import Dataset, DataLoader
import torch.nn.functional as F
from torch.optim import lr_scheduler
from torch.nn.init import *
from torchvision import transforms, utils, datasets, models
import cv2
from PIL import Image
from pdb import set_trace
import time
import copy
  • 8
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用 PyTorch 和 ResNet 进行人脸识别代码: ```python import torch import torch.nn as nn import torchvision.models as models # 加载 ResNet 模型 resnet = models.resnet18(pretrained=True) # 冻结 ResNet 的所有层 for param in resnet.parameters(): param.requires_grad = False # 将最后一层的输出特征数修改为人脸的类别数 num_classes = 10 resnet.fc = nn.Linear(resnet.fc.in_features, num_classes) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(resnet.fc.parameters()) # 训练模型 for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): images = images.to(device) labels = labels.to(device) outputs = resnet(images) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() if (i+1) % 100 == 0: print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' .format(epoch+1, num_epochs, i+1, total_step, loss.item())) # 测试模型 with torch.no_grad(): correct = 0 total = 0 for images, labels in test_loader: images = images.to(device) labels = labels.to(device) outputs = resnet(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: {} %'.format(100 * correct / total)) ``` 在这个代码中,我们使用了一个预先训练好的 ResNet-18 模型,将其最后一层的输出特征数修改为我们需要分类的类别数,并且只训练了最后一层的参数。在训练期间,我们使用交叉熵损失函数和 Adam 优化器来更新模型的参数。在测试期间,我们使用测试集来评估模型的准确性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值