人脸预处理:人脸检测+人脸对齐

article/2025/9/23 15:13:22

1 简介

  • 对于人脸识别任务,人脸预处理至关重要。首先我们需要检测出图像中的人脸,然后通过人脸相似性变换得到对齐后的标准人脸。然后在对其进行人脸识别。
  • 在人脸识别过程中,往往检测到的人脸是倾斜的。相似性变换根据检测到的关键点和目标点得到变换矩阵,把整张脸乘变换矩阵得到对齐后的人脸。因为如果没有人脸对齐这一步操作,或者训练的对齐方式与验证的对齐方式不同,这将导致很大的性能差距。
  • 目前科研人员基本都用一致的对齐方法,就是MTCNN检测五个人脸关键点,然后使用相似性变换得到对齐后的人脸,大小为112×112。
  • 博主找了好几种方法,结果效果都不一致,最后参考insightface的方法,达到了一致的效果。

2 具体方法

2.1 下载insightface源码及RetinaFace预训练模型

https://github.com/deepinsight/insightface

安装后解压,我们需要使用其中的几个文件,分别为:

  1. gender-age文件夹下的mtcnn-model文件夹,mtcnn_detector,helper
  2. deploy文件夹下的mtcnn_detector
  3. detection/RetinaFace文件夹下的rcnn文件夹,retinaface
  4. recognition/common文件夹下的face_align

下载预处理模型:
https://pan.baidu.com/s/1C6nKq122gJxRhb37vK0_LQ

将这些置于一个文件夹中。
在这里插入图片描述

2.2 搭建开发环境

我是用的是pycharm+anaconda+win10
软件包安装

pip install opencv-python numpy tqdm scikit-image Cython
pip install mxnet-cu101 (根据自己的cuda版本来安装mxnet)

2.3 编译rcnn的pyx文件

参考博客:链接
第一步:
打开rcnn/cython文件夹下的cpu_nms文件,将

cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1]

改为

cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1].astype(np.int32)

第二步:
将setup.py改为

try:from setuptools import setupfrom setuptools import Extension
except ImportError:from distutils.core import setupfrom distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy as np###这里的try...except...是百度的网上的帖子,必须加上,否则会出现Unable to find vcvarsall.bat错误。try:numpy_include = np.get_include()
except AttributeError:numpy_include = np.get_numpy_include()ext_modules = [Extension("bbox",["bbox.pyx"],extra_compile_args=["/openmp"],include_dirs=[numpy_include]),Extension("anchors",["anchors.pyx"],extra_compile_args=["/openmp"],include_dirs=[numpy_include]),Extension("cpu_nms",["cpu_nms.pyx"],extra_compile_args=["/openmp"],include_dirs = [numpy_include]),
]setup(name='frcnn_cython',ext_modules=ext_modules,# inject our custom trigger# cmdclass={'build_ext': custom_build_ext},cmdclass={'build_ext': build_ext},
)

第三步:
进入cython文件夹下,在终端输入指令:

python setup.py build_ext --inplace

2.4 编写代码

import cv2
import numpy as np
import face_align
from retinaface import RetinaFace
from tqdm import tqdm
import os
from mtcnn_detector import MtcnnDetector
import mxnet as mx'''
使用mtcnn检测,对于一些mtcnn检测不出的图像,可以使用retainface检测。
检测对齐结果与别人完全一致。
'''gpu_id = 0 # gpu号
det_prefix = 'C:/Users/win10/Desktop/face_align/retinaface-R50/R50' # retinaface预训练模型
model_folder = 'C:/Users/win10/Desktop/face_align/mtcnn-model' # mtcnn预训练模型
input_root = "E:/Dataset/lfw" # 原始图像
output_root = "E:/Dataset/lfw_align" # 处理后的图像
image_size = 112 # 处理后大小
align_mode = 'arcface' # 参考点选择
target_size = 400 # 目标尺寸
max_size = 800 # 限制图像最大尺寸# 得到校正后的图像
def get_norm_crop(image_path):im = cv2.imread(image_path) # 读取图像im_shape = im.shape # 尺寸 (w,h,3)im_size_min = np.min(im_shape[0:2]) # 最小值im_size_max = np.max(im_shape[0:2]) # 最大值im_scale = float(target_size) / float(im_size_min) # 比例# 防止原图尺寸过大if np.round(im_scale * im_size_max) > max_size:im_scale = float(max_size) / float(im_size_max)# 检测五个关键点 bbox是五个参数,前四个是2个坐标点参数,最后一个是得分 landmark由10个参数(5个坐标点)ret = detector_mtcnn.detect_face(im, det_type=0)if ret is None:# return None# 如果mtcnn没检测到,就是用retinaface检测bbox, landmark = detector_retinaface.detect(im, threshold=0.5, scales=[im_scale])# # 如果还没有检测到,放宽要求进行在次检测# if bbox.shape[0] == 0:#     bbox, landmark = detector_retinaface.detect(im, threshold=0.05, scales=[im_scale * 0.75, im_scale, im_scale * 2.0])#     print('refine', im.shape, bbox.shape, landmark.shape)else:bbox, landmark = ret# 判断是否检测到了,检测到进行根据五个特征点相似变换nrof_faces = bbox.shape[0]if nrof_faces > 0:det = bbox[:, 0:4] # 存储2个坐标点用于计算bbox大小img_size = np.asarray(im.shape)[0:2] # 原图尺寸bindex = 0# 如果一张图检测到多个人脸,通过bbox大小以及离中心的程度来选择人脸if nrof_faces > 1:bounding_box_size = (det[:, 2] - det[:, 0]) * (det[:, 3] - det[:, 1]) # 人脸bbox尺寸img_center = img_size / 2 # 图像中心点坐标offsets = np.vstack([(det[:, 0] + det[:, 2]) / 2 - img_center[1],(det[:, 1] + det[:, 3]) / 2 - img_center[0]]) # 计算bbox中心点离图像中心点的距离offset_dist_squared = np.sum(np.power(offsets, 2.0), 0) # 平方bindex = np.argmax(bounding_box_size - offset_dist_squared * 2.0)  # 选择最合适的人脸bbox# _bbox = bbox[bindex, 0:4] # bboxif ret == None:_landmark = landmark[bindex]  # 特征点 retinafaceelse:_landmark = [[landmark[bindex][j], landmark[bindex][j + 5]] for j in range(5)] # 特征点 mtcnn_landmark = np.array(_landmark, dtype=float)# 选取参考点,进行相似性变换warped = face_align.norm_crop(im, landmark=_landmark, image_size=image_size, mode=align_mode)return warpedelse:return Noneif __name__ == '__main__':# 创建输出文件夹if not os.path.isdir(output_root):os.mkdir(output_root)# 检测器初始化detector_mtcnn = MtcnnDetector(model_folder=model_folder, ctx=mx.gpu(gpu_id),num_worker=1, accurate_landmark=True, threshold=[0.6, 0.7, 0.8])detector_retinaface = RetinaFace(det_prefix, 0, gpu_id, network='net3')# 处理 input_root下存放文件夹for subfolder in tqdm(os.listdir(input_root)): # 读取input_root文件夹下的文件夹名称# 读取到的是文件夹,然后创建它if not os.path.isdir(os.path.join(output_root, subfolder)):os.mkdir(os.path.join(output_root, subfolder))# 读取文件夹下的图片,进行处理for image_name in os.listdir(os.path.join(input_root, subfolder)):print("Processing\t{}".format(os.path.join(input_root, subfolder, image_name))) # 打印信息# 如果报错说明没有检测到人脸try:warped_face = get_norm_crop(os.path.join(input_root, subfolder, image_name)) # 检测并对齐if image_name.split('.')[-1].lower() not in ['jpg', 'jpeg']:  # 加后缀.jpgimage_name = '.'.join(image_name.split('.')[:-1]) + '.jpg'cv2.imwrite(os.path.join(output_root, subfolder, image_name), warped_face) # 保存except Exception:print("{} is discarded due to exception!".format(os.path.join(input_root, subfolder, image_name)))continue

3 总结

本方式使用insightface的mtcnn加相似性变换,如果mtcnn没有找到人脸,就使用retinaface处理,如果还没找到就提示信息。
该方法应该与那些处理好的数据集是一个检测对齐处理方式,用lfw数据集测试完全一致。处理后的人脸为112×112大小。


http://chatgpt.dhexx.cn/article/95Yj6wde.shtml

相关文章

dlib人脸配准(人脸对齐)

dlib人脸配准有两种方式。 一种是使用 get_face_chip()方法,使用5个关键点模型来进行配准,这种方法Dlib已经提供了完整的接口(imutils里也有类似函数, face_utils.FaceAligner,代码放在最后面)另一种是自己使用68点关键点模型&am…

基于OpenCV的人脸对齐步骤详解及源码实现

目录 1. 前言2. 人脸对齐基本原理与步骤3. 人脸对齐代码实现 1. 前言 在做人脸识别的时候,前期的数据处理过程通常会遇到一个问题,需要将各种人脸从不同尺寸的图像中截取出来,再进行人脸对齐操作:即将人脸截取出来并将倾斜的人脸…

人脸识别 (4) 人脸对齐

参考:FaceDetector/face_align.ipynb at master faciallab/FaceDetector GitHub 中文:从零开始搭建人脸识别系统(二):人脸对齐 - 知乎 Face Alignment Step-by-Step 1、Align Faces by Spatial Transform Operati…

OpenCV实现人脸对齐

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达 一、人脸对齐介绍 在人脸识别中有一个重要的预处理步骤-人脸对齐,该操作可以大幅度提高人脸识别的准确率与稳定性,但是早期的OpenCV版本不支持人…

人脸对齐(一)--定义及作用

参考: http://www.thinkface.cn/thread-4354-1-1.html http://www.thinkface.cn/thread-4488-1-1.html 人脸对齐任务即根据输入的人脸图像,自动定位出面部关键特征点,如眼睛、鼻尖、嘴角点、眉毛以及人脸各部件轮…

人脸关键点对齐

转:https://www.jianshu.com/p/e4b9317a817f 摘要: 从传统方法到深度学习方法,对人脸关键点定位/人脸对齐的发展进行梳理,对该领域中经典的方法,最新成果进行汇总,并给出相应的paper原文,项目主…

人脸对齐介绍

转自:https://cloud.tencent.com/community/article/532672 一、 人脸对齐,也叫做人脸特征点检测,图为人脸特征点例子 二、 人脸对齐有哪些应用? 1 五官定位 2 表情识别 3 人脸漫画、素描生成 4 增强现实 5 换脸 6 3D建模 三、 人…

常见的人脸对齐方法 python

人脸对齐 1. 通过Dlib库 1.1.环境需求: opencv-python dlib下载dlib库的68关键点文件: http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 然后解压后得到shape_predictor_68_face_landmarks.dat。 其次,下面可能需要有一…

QGIS中也有“fishnet”——QGIS怎么生成渔网

QGIS堪称Mac上的ArcGIS,免费小巧,插件丰富,比ArcGIS更容易上手。今天分享的是如何在QGIS中生成规则网格,也就是ArcGIS中的fishnet功能怎么在QGIS中完美实现。 # 环境声明:QGIS3.10 MacOS10.15.6 # 分享背景&#xff…

ArcMap Fishnet生成规则网格

在利用ArcGIS处理数据时,有时需要对整个工作区域进行规则网格划分,这个在ArcGIS中是一件非常简单的事情,现在就将利用ArcGIS生成规则网格的步骤详细的介绍一下。 首先我有一个工作的范围,比如图一所示的范围: 我要在研…

POJ 1408 Fishnet

题目大意: 有一个1*1的正方形,分别给出下,上,左,右边每个边上的n个点,对边对应点连线,问这些线段相交的最大的四边形面积是多少(面积最大的定义是必须当前面积内没有更小的四边形内…

创建渔网工具

创建渔网(create fishnet)工具是指创建由矩形像元组成的渔网。输出可以是折线或面要素。创建渔网需要三条基本信息:渔网的空间范围、行数和列数以及旋转的角度。要指定这些基本信息可通过多种方法。例如,您可能不确定准确的行数和…

ARCGIS怎么在地图上绘制长宽500m*500m的fishnet

用的是ArcGIS 10.6的版本。 参考教程:https://my.oschina.net/u/4416039/blog/3308651 首先先导入深圳市的shp文件 Layers右键,点击Properties 需要将坐标系改成投影坐标系 点击Projected Coordinate Systems 点击UTM 点击WGS 1984 选择WGS 1984 UT…

fishboat

渔船产品功能说明文档1.0 线上地址:http://101.200.121.215:9090/ git前端: https://gitee.com/cinblx/fishboat-ui.git git后端:https://gitee.com/cinblx/fishboat-server.git 产品介绍 为什么使用该产品 该产品致力于两方面。1.实现基础功能&#xff…

文献阅读笔记5——《Composited FishNet: Fish Detection and Species Recognition From Low-Quality ...》

《Composited FishNet: Fish Detection and Species Recognition From Low-Quality Underwater Videos》 写文章模板论文 Abstact 重要意义:水下视频中鱼类的自动检测和识别对于渔业资源评估和生态环境监测具有重要意义。 问题和挑战:由于水下图像质量…

使用Arc Map创建渔网(fishnet)

使用Arc Map创建渔网(fishnet) 工具位置:ArcToolbox----数据管理工具----采样----创建渔网 (Arcgis 10.2以上版本)(找不到工具可以ControlF选择工具项搜索) 添加图层,设置坐标系&am…

arcgis fishnet渔网功能学习

听说要来跟我请教fishnet功能,吓我一跳,arcgis不就只有个创建渔网功能吗??纳尼?! 赶紧捡捡知识点,避免一问三不知.。 版本12.4后工具位于data management/sampling/create fishnet,12.4之前应…

POJ1408-Fishnet

全解题报告索引目录 -> 【北大ACM – POJ试题分类】 转载请注明出处:http://exp-blog.com ------------------------------------------------------------------------- 大致题意: 一个1X1的正方形,每条边上有n个不同的点(…

关于在ArcGIS里创建fishnet时只有几个网格的解决办法

在ArcGIS里创建渔网时可能会出现以下情况,例如只有两个网格 可以看到在创建渔网的窗口中导入的数据中上下左右的单位是经纬度,不是米制单位。 这是由于在创建渔网时没有将坐标系进行转换,利用的shp数据本身的坐标系是度分秒单位的&#xf…

【ArcGIS微课1000例】0002:创建渔网(Create fishnet)

本文讲解ArcGIS软件中渔网(fishnet)工具的原理,方法及使用技巧。 文章目录 微课目标工具介绍实现过程微课目标 如下图所示,影像为无人机航测生产的DOM,现在需要在ArcGIS平台中进行DLG数据采集(数字化),由于测区较大,需要创建500*500的渔网,并对影像进行裁剪下发给多…