Python批量检测图片中的人脸并制作数据集(Dlib)
Posted Xavier Jiezou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python批量检测图片中的人脸并制作数据集(Dlib)相关的知识,希望对你有一定的参考价值。
写在前面
本教程教你使用卷积神经网络深度学习模型批量检测图片中的人脸,并制作人脸数据集。
安装依赖
素材准备
素材用我们之前在唯美女生网站爬取的17601张共1.62GB的小姐姐图片。
爬虫教程:【Python】多线程爬取某站高颜值小姐姐照片(共1.62GB)
素材下载:微软云盘 | 百度网盘(提取码:2233) | 天翼云盘
单图预览
多图预览
人脸检测
采用多线程技术批量检测图片中人脸并将其裁剪保存下来。
import os
import cv2
import dlib
import time
from tqdm import tqdm
import concurrent.futures as cf
class MakeFaceDataset():
def __init__(self, srcdir, dstdir):
self.srcdir = srcdir # 指定图像文件夹路径
self.dstdir = dstdir # 指定人脸文件夹路径
os.makedirs(dstdir, exist_ok=True)
def crop(self, subdir):
for j in tqdm(os.listdir(f'{self.srcdir}/{subdir}'), desc=subdir):
in_path = f'{self.srcdir}/{subdir}/{j}'
out_path = f'{self.dstdir}/{subdir}_{j.split(".")[0]}'
model_path = './cnn_human_face_detect.dat'
cnn_face_detector = dlib.cnn_face_detection_model_v1(model_path)
img = cv2.imread(in_path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_hist = cv2.equalizeHist(img_gray)
faces = cnn_face_detector(img_hist, 1)
for index, face in enumerate(faces):
x1 = face.rect.left()
y1 = face.rect.top()
x2 = face.rect.right()
y2 = face.rect.bottom()
cp = img[y1:y2, x1:x2]
cv2.imwrite(f'{out_path}_{index+1}.jpg', cp)
def main(self):
with cf.ThreadPoolExecutor() as tp:
for i in os.listdir(self.srcdir):
tp.submit(self.crop, i)
print('Face Detection Finished!')
if __name__ == '__main__':
MakeFaceDataset('./vmgs', './vmgs-face').main()
数据处理
对提取出来的人脸图像进行筛选,只保留长、宽都大于128的,并resize到128x128大小。
import os
from tqdm import tqdm
from PIL import Image
import concurrent.futures as cf
class DataProcessing(object):
def __init__(self, srcdir, dstdir):
self.srcdir = srcdir # 指定人脸文件夹路径
self.dstdir = dstdir # 指定处理后的人脸文件夹路径
os.makedirs(self.dstdir, exist_ok=True)
def size(self, in_path, out_path, pbar):
img = Image.open(in_path)
w, h = img.size
if w >= 128 and h >= 128:
img = img.resize((128, 128), Image.ANTIALIAS)
img.save(out_path, quality=95)
else:
pass
pbar.update(1)
def main(self):
total = len(os.listdir(self.srcdir))![在这里插入图片描述](https://img-blog.csdnimg.cn/20210503113427465.jpg?x-oss-process=image,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyOTUxNTYw,size_16,color_FFFFFF,t_70#pic_center)
with tqdm(total=total) as pbar:
with cf.ThreadPoolExecutor() as tp:
for item in os.listdir(self.srcdir):
in_path = f'{self.srcdir}/{item}'
out_path = f'{self.dstdir}/{item}'
tp.submit(self.size, in_path, out_path, pbar)
if __name__ == '__main__':
DataProcessing('./vmgs-face', './vmgs-face-processing').main()
最终结果
数据处理后人脸数据集就制作好了,共8768张128x128的小姐姐人脸图像。
代码仓库
以上是关于Python批量检测图片中的人脸并制作数据集(Dlib)的主要内容,如果未能解决你的问题,请参考以下文章
python 识别图片中的人脸,并裁剪人脸,将图片转化成固定大小,并将图片再按照自己的后缀名存储起来