opencv两个图像相减_用OpenCV和Python模糊和匿名化人脸

RvXPGX0FpO2xYv RwaAorR1b2nDQJ

在本教程中,您将学习如何使用OpenCV和Python模糊和匿名化人脸。

今天的博文灵感来自我上周收到的一封来自PyImageSearch读者李伟的电子邮件:

嗨,阿德里安,我在为我的大学做一个研究项目。

我负责创建数据集,但我的教授要求我通过检测人脸,然后模糊它们来“匿名”每个图像,以确保隐私得到保护(显然这是我所在机构在公开分发数据集之前的要求)。

你有人脸匿名的教程吗?如何使用OpenCV模糊人脸?

谢谢,

李伟

李提出了一个很好的问题——我们经常在项目中使用人脸检测,通常是作为人脸识别流程的第一步。

但如果我们想做与人脸识别相反的事情呢?如果我们想通过模糊人脸来匿名,从而使他人无法识别人脸的身份,那该怎么办?

人脸模糊和匿名化的实际应用包括:

  • 公共/私人领域的隐私和身份保护

  • 在线保护儿童(即上传照片中未成年人的模糊面孔)

  • 新闻摄影和新闻报道(例如,模糊未授权人物的面貌)

  • 数据集的收集和分发(例如,在数据集中匿名化个人)

  • ……还有更多!

要学习如何使用OpenCV和Python模糊和匿名化人脸,请继续阅读!

用OpenCV和Python模糊和匿名化人脸

在本教程的第一部分中,我们将简要讨论什么是面部模糊,以及如何使用OpenCV在图像和视频流中匿名化面部。

在这里,我们将讨论用OpenCV和Python模糊人脸的四步方法。

然后,我们将回顾我们的项目结构,并使用OpenCV实现两种面部模糊方法:

  • 使用高斯模糊对图像和视频流中的人脸进行匿名化

  • 将“像素模糊”效果应用于图像和视频中的匿名人脸

考虑到我们的两个实现,我们将创建Python脚本来将这些面部模糊方法应用于图像和视频。

然后我们将回顾我们的面部模糊和匿名化方法的结果。

什么是人脸模糊,如何将其用于人脸匿名?

RwaAose5JYXXyW

图1:在本教程中,我们将学习如何使用OpenCV和Python模糊面部,类似于本例中的面部

人脸模糊是一种用于图像和视频中人脸匿名化的计算机视觉方法。

一个脸部模糊和匿名化的例子可以在上面的图1中看到-注意脸部是如何模糊的,而且人的身份是不可分辨的。

我们使用面部模糊来帮助保护图像中人的身份。

4个步骤来执行人脸模糊和匿名化

RwaAotD2gwOsRA

图2:OpenCV和Python的面部模糊可以分为四个步骤。

应用OpenCV和计算机视觉进行人脸模糊有四个步骤。

步骤1是执行面部检测。

RwaAoteHm4NlCQ

图3:使用OpenCV和Python进行人脸模糊的第一步是检测图像/视频(图像源)中的所有人脸。

这里可以使用任何人脸检测器,只要它可以在图像或视频流中生成人脸的边界坐标。

您可能使用的有代表性的面部探测器包括

  • Haar cascades

  • HOG+线性支持向量机

  • 基于深度学习的人脸检测器。

有关如何检测图像中的人脸的详细信息,请参阅脸检测指南(https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/)。

一旦检测到人脸,步骤2是提取感兴趣区域(ROI):

RwaApP5ENs9g2h

图4:使用Python和OpenCV模糊人脸的第二步是提取感兴趣的人脸区域(ROI)。

你的人脸检测器会给你一个图像中人脸的边界(x,y)坐标。这些坐标通常表示:人脸边界框的起始x坐标、人脸的结束x坐标、人脸位置的起始y坐标、人脸的结束y坐标。

然后,您可以使用这些信息提取面部ROI本身,如上面的图4所示。

得到了人脸的ROI,步骤3是实际模糊/匿名化人脸:

RwaApPv5BL7uaQ

图5:使用OpenCV进行人脸模糊的第三步是应用模糊算法。在本教程中,我们将学习两种模糊算法-高斯模糊和像素化。

通常,你会应用高斯模糊来匿名化人脸。如果你发现最终结果更美观,你也可以对脸部进行像素化。

到底你如何“模糊”图像取决于你-重要的是,脸是匿名的。

在人脸模糊和匿名的情况下,步骤4是将模糊的人脸存储回原始图像中:

RwaApQY9LJ4uu0

图6:使用Python和OpenCV进行面部模糊的第四步也是最后一步是用模糊的面部ROI替换原始的面部ROI。

使用人脸检测的原始(x,y)-坐标(即步骤2),我们可以获取模糊/匿名的人脸,然后将其存储回原始图像中(如果您使用OpenCV和Python,则此步骤使用NumPy数组切片)。

原始图像中的人脸已被模糊和匿名化-此时人脸匿名化通道已完成。

在本教程的其余部分中,让我们看看如何使用OpenCV实现人脸模糊和匿名化。

如何安装OpenCV进行面部模糊处理

要学习我的面部模糊教程,您需要在您的系统上安装OpenCV。我建议使用我的教程之一安装OpenCV 4:

  • pip install opencv-最简单、最快的方法(https://www.pyimagesearch.com/2018/09/19/pip-install-opencv/)

  • 如何在Ubuntu上安装OpenCV 4(https://www.pyimagesearch.com/2018/08/15/how-to-install-opencv-4-on-ubuntu/)

  • 在macOS上安装OpenCV 4(https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/)

我推荐99%的读者使用pip安装方法——这也是我通常为快速项目(如面部模糊)安装OpenCV的方式。

如果您认为可能需要完全安装OpenCV来使用特有算法,则应根据您的操作系统考虑第二个或第三个方案。这两个指南都需要从源代码编译,这也需要相当长的时间,但可以(1)为您提供完整的OpenCV安装和(2)允许您为操作系统和系统架构优化OpenCV。

一旦安装了OpenCV,就可以继续学习本教程的其余部分。

注意:我在PyImageSearch不建议使用Windows操作系统。请参阅我的常见问题页面。

项目结构

继续使用本教程的“下载”部分下载源代码、示例图像和预训练的人脸检测模型。之后,让我们检查一下内容:

RwaApRHA6QtKkX

人脸模糊的第一步是执行人脸检测,以定位图像/帧中的人脸。我们将使用基于深度学习的Caffe模型,如face_detector/目录所示。

我们的两个Python脚本blur_face.py和blur_face_video.py首先检测人脸,然后在图像和视频流中执行人脸模糊。我们将阐释这两个脚本,以便您可以根据自己的项目调整它们。

首先,我们将回顾face_blurring.py文件中的面部模糊函数。

用高斯模糊和OpenCV模糊人脸

RwaApRrITjf4pW

图7:使用OpenCV和Python进行高斯人脸模糊处理。

我们将实现两个辅助函数来帮助我们进行面部模糊和匿名:

  • anonymize_face_simple:在人脸ROI上执行简单的高斯模糊(如上图7所示)

  • anonymize_face_pixelate:创建像素化的模糊效果(我们将在下一节中介绍)

让我们来看看anonymize_face_simple的实现----在pyimagesearch模块中打开face_blurring.py文件,并插入以下代码:

RwaApuGDaH1SdT

我们的面部模糊实用程序需要导入NumPy和OpenCV,如第2行和第3行所示。

从第5行开始,我们定义了anonymize_face_simple函数,该函数接受输入的人脸图像image和模糊核心范围factor。

第8-18行导出模糊内核的宽度和高度,作为输入图像尺寸的函数:

  • 核心的大小越大,输出面就越模糊

  • 核心越小,输出面越不模糊

因此,增加该因子将增加应用于面的模糊量。

当应用模糊时,我们的内核尺寸必须是奇数整数,这样核心就可以放在输入图像的中心(x,y)(关于内核为什么必须是奇数整数的更多信息,请参阅我的OpenCV卷积教程)。

一旦我们得到核维数kW和kH,第22行将高斯模糊核应用于人脸图像,并将模糊的人脸返回给调用函数。

在下一节中,我们将介绍另一种匿名方法:像素化模糊。

使用OpenCV创建像素化的面部模糊

RwaApupDp1ydTg

图8:使用OpenCV和Python在图像上创建像素化模糊效果。

我们将要实现的是人脸模糊和匿名化的第二种方法,它创建了一个像素化的模糊效果-这种方法的示例如图8所示。

请注意我们是如何对图像进行像素化处理并使人的身份变得不可分辨的。

这种像素化的面部模糊通常是大多数人听到“面部模糊”时所想到的——这与你在晚间新闻上看到的面部模糊是同一种类型的,主要是因为它比高斯模糊更“美观”(实际上是有点“不协调”)。

让我们学习如何使用OpenCV实现这种像素化的人脸模糊方法-打开face_blurring.py文件(与上一节中使用的文件相同),并附加以下代码:

RwaApvR5LFcQoV

从第24行开始,我们定义了anonymize_face_pixilate函数和参数。此函数接受一个面部图像image和像素块的数量blocks。

第26-28行获取我们的面部图像尺寸并将其划分为MxN块。

之后,我们在x和y两个方向对块进行循环(第31和32行)。

为了计算当前块的起始和结束边界坐标,我们使用阶跃索引i和j(第35-38行)。

随后,我们提取当前块ROI并计算ROI的平均RGB像素强度(第43行和第44行)。

然后,我们使用计算出的平均RGB值在块上注释一个rectangle,从而创建“像素化”效果(第45行和第46行)。

注意:要了解有关OpenCV绘图功能的更多信息,请务必花一些时间学习我的OpenCV教程。

最后,第49行将像素化的人脸图像返回给调用者。

用OpenCV实现图像中的人脸模糊

现在我们已经实现了两种人脸模糊方法,让我们学习如何使用OpenCV和Python应用它们来模糊图像中的人脸。

打开项目结构中的blur_face.py文件,并插入以下代码:

RwaApw5EnlMn7R

我们最值得注意的导入都是我们的人脸像素化和前面两部分的脸模糊功能(第2和第3行)。

我们的脚本接受五个命令行参数,其中前两个是必需的:

--image:包含人脸图像的路径

--face:指向人脸检测器模型目录的路径

--method:使用此标志可以选择简单的模糊或像素化方法。简单方法是默认的

--blocks:对于像素化的匿名人脸,必须提供要使用的块数,或者可以保留默认值20

--confidence:过滤弱人脸检测的最小概率默认为50%

再加上我们的命令行参数,我们现在可以执行面部检测了:

RwaApyA2kN9boh

首先,我们加载基于Caffe的人脸检测模型(第26-29行)。

然后我们加载并预处理我们的输入——图像,生成一个blob进行推断(第33-39行)。阅读我的“OpenCV的blobFromImageWork”教程,了解第38行和第39行函数调用背后的“为什么”和“如何”。

深度学习人脸检测推理(步骤1)发生在第43行和第44行。

接下来,我们将开始循环detections:

RwaAqbH2row9Zk

在这里,我们循环检测并检查可信度,确保它满足最小阈值(第47-54行)。

符合条件之后,我们然后通过第57-61行提取面部ROI(步骤2)。

然后我们将匿名化面部(步骤3):

RwaAqbxJDf2fHk

根据--method,我们将执行简单的模糊处理或像素化以匿名化面部(第65-72行)。

步骤4需要使用我们的匿名面部ROI覆盖图像中的原始面部ROI(第75行)。

然后对输入图像中的所有人像重复步骤#2-#4,直到我们准备好显示结果:

RwaAqcTCbMY5Bk

总而言之,原始图像和修改后的图像并排显示,直到按下一个键(第79-81行)。

图像结果中的人脸模糊与匿名化现在让我们的脸模糊和匿名化方法开始工作。

继续使用本教程的“下载”部分下载源代码、示例图像和经过预训练的OpenCV人脸检测器。

然后,打开一个终端,执行以下命令:

RwaAqcx3zSSp93

图9:左:我的照片。右:我的脸被OpenCV和Python用高斯方法弄模糊了。

在左边,你可以看到原始输入图像(即,我),而右边显示我的脸已经模糊使用高斯模糊方法-没有看到原始图像,你不会知道是我(除了纹身)。

让我们尝试另一个图像,这次应用像素化模糊技术:

RwaAqdg4VnxlXU

图10:TomKing的脸已经用OpenCV和Python进行了像素化;您可以调整块设置,直到您对匿名级别感到满意为止。(图片来源)

在左边,我们有汤姆·金的原始输入图像,他是我最喜欢的漫画作家之一。

然后,在右边,我们有像素化模糊方法的输出-如果没有看到原始图像,你将不知道图像中是谁的脸。

用OpenCV实现实时视频中的人脸模糊

我们之前的例子只处理图像中的模糊和匿名化人脸-但是如果我们想将人脸模糊和匿名化应用于实时视频流呢?

有可能吗?

你肯定觉得可以!

打开项目结构中的blur_face_video.py文件,让我们学习如何使用OpenCV在实时视频中模糊面部:

RwaArF5BdzIje5

我们从2-10号线开始导入。对于视频中的人脸识别,我们将在imutils包中使用VideoStream API(第4行)。

我们的命令行参数与前面一样(第13-23行)。

然后我们将加载面部探测器并初始化视频流:

RwaArFq8O0tdbt

我们获取计算机的网络摄像头生成的视频流(第34行)。

然后,我们将继续循环流中的帧并执行步骤1-人脸检测:

RwaArGOC4XUmk4

一旦检测到人脸,我们将确保它们满足最小可信阈值:

RwaArGz4ZXNabH

在高可信度检测的循环中,我们提取第55-69行的面部ROI(步骤2)。

为了完成步骤3,我们通过第73-80行应用我们选择的匿名方法。

最后,在步骤4中,我们替换相机帧中的匿名人脸(第83行)。

为了结束我们的面部模糊循环,我们在屏幕上显示帧(带有模糊的面部):

RwaArHVEkDV0La

如果按q键,我们将脱离面模糊循环并执行清理。

干得好-在下一节中,我们将分析结果!

实时人脸模糊OpenCV结果

我们现在已经准备好使用OpenCV对实时视频流应用面部模糊。

首先使用本教程的“下载”部分下载源代码和经过预训练的OpenCV人脸检测器。

然后,可以使用以下命令启动blur_face_video.py:

RwaArwkCINdUiB

注意在视频流使用高斯模糊方法时我的脸是如何模糊。

我们可以通过提供--method pixelated标志来应用像素化的人脸模糊方法:

RwaArxmCnaWkpS

同样,我的脸是匿名/模糊使用OpenCV,但使用更“美观”的像素化方法。

处理漏检和“检测闪烁”

我们在这里应用的人脸模糊方法假设在我们输入视频流的每一帧中都可以检测到一个人脸。

但是,如果我们的面部检测器漏掉了检测,比如在本节顶部的视频中,会发生什么?

如果我们的人脸检测器漏掉了一个人脸检测,那么该人脸就不能被模糊,从而破坏了人脸模糊和匿名化的目的。

在这种情况下我们该怎么办?

通常,最简单的方法是取人脸的最后一个已知位置(即先前的检测位置),然后模糊该区域。

人脸移动不太快,所以模糊最后一个已知的位置将有助于确保人脸匿名,即使你的人脸检测器漏掉了人脸。

更高级的选择是使用专用的对象跟踪器,类似于我们在《people/footfall counter guide》中所做的操作。

使用此方法,您将:

  • 在视频流中检测人脸

  • 为每个人像创建对象跟踪器

  • 使用目标跟踪器和面部探测器关联面部位置

  • 如果面部检测器错过了检测,那么返回跟踪器以提供面部的位置

  • 这种方法比简单的“最后一个已知位置”的计算更复杂,但它也更加健壮。

我将把实现这些方法留给您(尽管我很想在以后的教程中介绍它们,因为它们是非常有趣的实现方法)。

总结

在本教程中,您学习了如何使用OpenCV和Python在图像和实时视频流中模糊和匿名化人脸。

人脸模糊和匿名化是一个四步过程:

  • 步骤1:使用人脸检测器(即Haar cascades、HOG+线性支持向量机、基于深度学习的人脸检测器)检测图像中是否存在人脸

  • 步骤2:使用边界(x,y)坐标从输入图像中提取面部ROI

  • 步骤3:模糊图像中的人脸,通常使用高斯模糊或像素模糊,从而匿名化人脸并保护图像中人的身份

  • 步骤4:将模糊/匿名的人脸存储在原始图像中

然后我们只用OpenCV和Python实现了整个流程。

我希望这个教程能帮助到你!

要下载在本文的源代码(包括示例图片和经过预训练的面部检测器),只需在下面的表单中输入您的电子邮件地址!

下载源代码和免费17页的资源指南

https://www.pyimagesearch.com/2020/04/06/blur-and-anonymize-faces-with-opencv-and-python/

请在下面输入您的电子邮件地址,以获取一个.zip代码和一个关于计算机视觉、OpenCV和深度学习的17页免费资源指南。在里面你会发现我精心挑选的教程,书籍,课程和图书馆,以帮助你掌握 CV 和 DL!

英文原文:https://www.pyimagesearch.com/2020/04/06/blur-and-anonymize-faces-with-opencv-and-python/
译者:QL
RvXPKnU5vYMwDH
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值