如何使用OpenCV自定义去识别面
去身份是指将数据匿名化的过程。随着欧洲联盟的GDPR和其他国家的类似措施的实施,保护PII(个人身份信息)成为准备数据集或任何个人信息处理的必要步骤。当然,一个人(™)的脸是一个人(™)身份最突出的特征之一,因此有很多解决方案可以检测和匿名化面孔。但是,它们很难定制和自动化。这是一份DIY指南,面向那些想要使用开放源码自己做这件事的人。整个代码示例可以在Colab中运行,并可在此处获得。 GDPR here:https://github.com/changsin/DL/blob/main/notebooks/deidentify_faces_opencv.ipynb
自动匿名化人脸所涉及的步骤包括:
1.人脸检测
由于人脸检测是对象检测的一种类型,因此我们可以使用深度学习网络来实现这一目的。OpenCV包含一个深度学习神经网络,该网络经过预先训练,可以使用公开可用的数据集检测人脸。它使用Caffe深度学习框架,您可以下载模型定义和预先训练的权重文件。下载后,加载它们以创建深度神经网络,该网络现在可以检测图像中的人脸。 Caffe Deep Learning framework
现在,我们只需要加载图像并将其传递给DNN以检测人脸,如以下代码片段所示:
每个预测结果包含类别ID(索引=1)、置信度(索引=2)和检测到的面部坐标。
- # a sample prediction output from DNN
- array([0. , 1. , 0.8745881 , 0.68375957, 0.47576728, 0.75310016, 0.62532324], dtype=float32)
因为我们只对人脸检测感兴趣,所以我们可以只关注置信概率,并使用它来接受或拒绝预测。
现在让?euro™处理一个示例图像。我之所以选择这张公开发布的图片,是因为它有不同角度和肤色的People-uro™的面孔。
当置信度阈值设置为0.5(即50%确信这是一张脸)时,它只检测到一张脸:面向前面的人。
这是可以理解的,也是所有人脸检测算法的共同问题。解决这个问题的正确方法是添加更多种类的包含侧面轮廓和其他角度的图像。一种简单而廉价的方法就是简单地降低信心。例如,当置信度设置为0.12时,结果会好得多。
然而,引入了一个新的问题。在如此低的置信阈值下,预计会有更多的假阳性和假阴性。你可以在左边看到三个标有标签的盒子。好消息是,您可以在一定程度上控制模型预测。
2.人脸匿名化
一旦检测到人脸,下一步就是如何对其进行匿名化/去身份识别。存在不同的技术。我将展示三种方法:即两种模糊技术和一种像素化方法。
a.矩形中的模糊处理
最简单的方法是使用OpenCVâuro™的模糊方法,该方法通过对卷积内核内的像素值进行平均来实现。换句话说,卷积的作用相当于平滑的过滤。通过调整内核大小,可以获得或多或少的粗粒度模糊效果。由于图像是作为多维整数数组处理的,因此您只需在一行代码中将感兴趣区域替换为模糊像素即可: OpenCV’s blur
- image[startY:endY, startX:endX] = cv2.blur(image[startY:endY, startX:endX], kernel_size)
以下是使用kernel_size(20,20)时的结果:
b.省略号中的模糊处理
虽然在矩形中进行模糊可以实现所需的匿名化,但生成的图像看起来相当不和谐。使用较小的核大小,可以平滑不一致的模糊,但另一种方法是在椭圆中进行模糊,因为People?uro™的脸是椭圆形的。要做到这一点,需要通过创建掩码和执行一些按位操作来完成一些工作。以下是(10,10)内核大小的结果:
c.像素化
另一种流行的去识别人脸的方法是使用œ像素化。在像素化中,感兴趣的区域被分成几个小块。-euro�在像素化中,感兴趣的区域被分成几个小块。对于每个挡路,将计算平均RGB值并将其应用于整个挡路。如您所见,生成的图像看起来非常自然:
结论
取消人脸识别是保护隐私的第一步。虽然有许多现成的解决方案可用,但本文展示了使用OpenCV进行自定义和自动化的简单DIY步骤。整个源代码都在Jupyter笔记本上,可以在这里找到。https://github.com/changsin/DL/blob/main/notebooks/deidentify_faces_opencv.ipynb
参考文献
- 使用OpenCV和Python模糊和匿名化人脸
- 基于OpenCV和深度学习的人脸检测