流行人脸检测与模糊算法,王者究竟是谁?实战揭秘

译者 | 朱先忠
审校 | 重楼
在当今这个数据驱动的世界里 , 保护个人的隐私和匿名是至关重要的事情 。从保护个人身份到遵守GDPR(General Data Protection Regulation,即《通用数据保护条例》,为欧盟制订的条例)等严格法规,对各种媒体格式的人脸匿名化高效可靠解决方案的需求前所未有 。
简介在本文提供的这个实战项目中 , 我们将探索并比较人脸模糊算法相关的几种解决方案,并开发了一个用于比较评估这几种算法的网络应用程序 。
首先 , 让我们来介绍这样一个应用程序的系统需求:

  • 保护隐私
  • 驾驭监管环境:随着监管环境的快速发展,世界各地的行业和地区都在实施更严格的规范,以保护个人身份信息 。
  • 训练数据保密性:机器学习模型在多样化和准备充分的训练数据上蓬勃发展 。然而,共享此类数据通常需要谨慎的匿名化 。
总体来看,这个实战项目可以划分成两个基本部分:
  • 人脸检测
  • 面部模糊技术
人脸检测为了解决匿名化挑战 , 首先要解决的问题是定位图像中存在人脸的区域 。为此,我测试了三个用于图像检测的模型 。
Haar Cascade算法
流行人脸检测与模糊算法,王者究竟是谁?实战揭秘

文章插图
图1:类哈尔特征算法(来源——原始论文)
Haar Cascade是一种机器学习方法,用于图像或视频中的人脸等对象的检测 。它通过利用一组被称为“类哈尔特征”(图1)的训练特征进行操作,这些特征是简单的矩形滤波器,专注于图像区域内像素强度的变化 。这些特征可以捕捉人脸中常见的边缘、角度和其他特征 。
训练过程包括为算法提供正面样本(包含人脸的图像)和负面样本(不包含人脸的图片) 。然后,该算法通过调整特征的权重来学习区分这些样本 。经过训练后,Haar Cascade本质上变成了一个分类器的层次结构,每个阶段都逐步完善检测过程 。
为了实现人脸检测,我使用了一个预先训练的Haar Cascade模型,该模型是在人脸的前向图像上训练的 。关键实现代码如下所示:
 import cv2face_cascade = cv2.CascadeClassifier('./configs/haarcascade_frontalface_default.xml')def haar(image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))print(len(faces) + " total faces detected.")for (x, y, w, h) in faces:print(f"Face detected in the box {x} {y} {x+w} {y+h}")MTCNN算法
流行人脸检测与模糊算法,王者究竟是谁?实战揭秘

文章插图
图2:MTNN算法中的人脸检测过程(来源——原始论文:)
MTNN(Multi-Task Cascaded Convolutional.NETworks , 多任务级联卷积网络)是一种复杂且高度准确的人脸检测算法 , 超过了前面的Haar Cascades算法的能力 。MTCNN算法设计在具有不同面部大小、方向和照明条件的场景中表现出色,它利用了一系列神经网络,每个神经网络都适合执行面部检测过程中的特定任务 。
  • 第一阶段——提案生成:MTNN通过一个小型神经网络生成大量潜在的人脸区域(边界框)来启动这一过程 。
  • 第二阶段——细化:在第一阶段生成的候选信息在此步骤中进行筛选 。算法中的第二个神经网络用来评估所提出的边界框,调整它们的位置,以便与真实面部边界更精确地对齐 。这有助于提高准确性 。
  • 第三阶段——识别和定位面部特征点:该阶段负责识别面部标志,如眼角、鼻子和嘴巴 。然后 , 使用神经网络来精确定位这些特征 。
MTNN算法引入的级联架构使其能够在过程的早期快速丢弃没有人脸的区域,将计算集中在包含人脸概率较高的区域 。与Haar Cascades算法相比,它能够处理不同比例(缩放级别)的人脸和旋转,非常适合复杂场景下的应用 。然而,这种算法的计算强度源于其基于神经网络的顺序方法 。
为了实现MTNN,我使用了MTCNN库 。关键实现代码如下所示:
import cv2from mtcnn import MTCNNdetector = MTCNN()def mtcnn_detector(image):faces = detector.detect_faces(image)print(len(faces) + " total faces detected.")for face in faces:x, y, w, h = face['box']print(f"Face detected in the box {x} {y} {x+w} {y+h}")


推荐阅读