人脸识别是一种用于从图像或视频中识别人脸的系统。它在许多应用程序和垂直行业中很有用。如今,我们看到这项技术可帮助新闻机构在重大事件报道中识别名人,为移动应用程序提供二次身份验证,为媒体和娱乐公司自动索引图像和视频文件,允许人道主义团体识别和营救人口贩卖受害者。
在这个博客中,我尝试构建一个人脸识别系统,该系统将一个人的图像与数据集中的护照大小的照片相匹配,并输出该图像是否匹配。
该系统可分为以下部分:人脸检测和人脸分类器
人脸检测
首先,将加载包含护照尺寸的图像和自拍照的数据集。然后将其分为训练数据和验证数据。
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