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

2021-02-19 Python程式設計師

  

在本教程中,您將學習如何使用OpenCV和Python模糊和匿名化人臉。

今天的博文靈感來自我上周收到的一封來自PyImageSearch讀者李偉的電子郵件:

嗨,阿德裡安,我在為我的大學做一個研究項目。

  

我負責創建數據集,但我的教授要求我通過檢測人臉,然後模糊它們來「匿名」每個圖像,以確保隱私得到保護(顯然這是我所在機構在公開分發數據集之前的要求)。

  

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

  

謝謝,  

李偉

李提出了一個很好的問題——我們經常在項目中使用人臉檢測,通常是作為人臉識別流程的第一步。

但如果我們想做與人臉識別相反的事情呢?如果我們想通過模糊人臉來匿名,從而使他人無法識別人臉的身份,那該怎麼辦?

  

人臉模糊和匿名化的實際應用包括:

公共/私人領域的隱私和身份保護

在線保護兒童(即上傳照片中未成年人的模糊面孔)

新聞攝影和新聞報導(例如,模糊未授權人物的面貌)

數據集的收集和分發(例如,在數據集中匿名化個人)

……還有更多!

  

要學習如何使用OpenCV和Python模糊和匿名化人臉,請繼續閱讀!

 

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

  

在本教程的第一部分中,我們將簡要討論什麼是面部模糊,以及如何使用OpenCV在圖像和視頻流中匿名化面部。

在這裡,我們將討論用OpenCV和Python模糊人臉的四步方法。

然後,我們將回顧我們的項目結構,並使用OpenCV實現兩種面部模糊方法:

使用高斯模糊對圖像和視頻流中的人臉進行匿名化

將「像素模糊」效果應用於圖像和視頻中的匿名人臉

考慮到我們的兩個實現,我們將創建Python腳本來將這些面部模糊方法應用於圖像和視頻。

  

然後我們將回顧我們的面部模糊和匿名化方法的結果。

  

什麼是人臉模糊,如何將其用於人臉匿名?

圖1:在本教程中,我們將學習如何使用OpenCV和Python模糊面部,類似於本例中的面部

人臉模糊是一種用於圖像和視頻中人臉匿名化的計算機視覺方法。

  

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

  

我們使用面部模糊來幫助保護圖像中人的身份。

4個步驟來執行人臉模糊和匿名化

      

圖2:OpenCV和Python的面部模糊可以分為四個步驟。

   

應用OpenCV和計算機視覺進行人臉模糊有四個步驟。

步驟1是執行面部檢測。

 圖3:使用OpenCV和Python進行人臉模糊的第一步是檢測圖像/視頻(圖像源)中的所有人臉。

 

這裡可以使用任何人臉檢測器,只要它可以在圖像或視頻流中生成人臉的邊界坐標。

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

Haar cascades

HOG+線性支持向量機

基於深度學習的人臉檢測器。

有關如何檢測圖像中的人臉的詳細信息,請參閱臉檢測指南(https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/)。

一旦檢測到人臉,步驟2是提取感興趣區域(ROI):

 

圖4:使用Python和OpenCV模糊人臉的第二步是提取感興趣的人臉區域(ROI)。

你的人臉檢測器會給你一個圖像中人臉的邊界(x,y)坐標。這些坐標通常表示:人臉邊界框的起始x坐標、人臉的結束x坐標、人臉位置的起始y坐標、人臉的結束y坐標。

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

得到了人臉的ROI,步驟3是實際模糊/匿名化人臉:

 

圖5:使用OpenCV進行人臉模糊的第三步是應用模糊算法。在本教程中,我們將學習兩種模糊算法-高斯模糊和像素化。

通常,你會應用高斯模糊來匿名化人臉。如果你發現最終結果更美觀,你也可以對臉部進行像素化。

  

到底你如何「模糊」圖像取決於你-重要的是,臉是匿名的。

  

在人臉模糊和匿名的情況下,步驟4是將模糊的人臉存儲回原始圖像中:

 

圖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作業系統。請參閱我的常見問題頁面。

項目結構

  

繼續使用本教程的「下載」部分下載原始碼、示例圖像和預訓練的人臉檢測模型。之後,讓我們檢查一下內容:

  

人臉模糊的第一步是執行人臉檢測,以定位圖像/幀中的人臉。我們將使用基於深度學習的Caffe模型,如face_detector/目錄所示。

我們的兩個Python腳本blur_face.py和blur_face_video.py首先檢測人臉,然後在圖像和視頻流中執行人臉模糊。我們將闡釋這兩個腳本,以便您可以根據自己的項目調整它們。

  

首先,我們將回顧face_blurring.py文件中的面部模糊函數。

用高斯模糊和OpenCV模糊人臉


圖7:使用OpenCV和Python進行高斯人臉模糊處理。

我們將實現兩個輔助函數來幫助我們進行面部模糊和匿名:

 

讓我們來看看anonymize_face_simple的實現----在pyimagesearch模塊中打開face_blurring.py文件,並插入以下代碼:

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

 

從第5行開始,我們定義了anonymize_face_simple函數,該函數接受輸入的人臉圖像image和模糊核心範圍factor。

 

第8-18行導出模糊內核的寬度和高度,作為輸入圖像尺寸的函數:

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

核心越小,輸出面越不模糊

因此,增加該因子將增加應用於面的模糊量。

 

當應用模糊時,我們的內核尺寸必須是奇數整數,這樣核心就可以放在輸入圖像的中心(x,y)(關於內核為什麼必須是奇數整數的更多信息,請參閱我的OpenCV卷積教程)。

一旦我們得到核維數kW和kH,第22行將高斯模糊核應用於人臉圖像,並將模糊的人臉返回給調用函數。

 

在下一節中,我們將介紹另一種匿名方法:像素化模糊。

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


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

我們將要實現的是人臉模糊和匿名化的第二種方法,它創建了一個像素化的模糊效果-這種方法的示例如圖8所示。

 

請注意我們是如何對圖像進行像素化處理並使人的身份變得不可分辨的。

 

這種像素化的面部模糊通常是大多數人聽到「面部模糊」時所想到的——這與你在晚間新聞上看到的面部模糊是同一種類型的,主要是因為它比高斯模糊更「美觀」(實際上是有點「不協調」)。

讓我們學習如何使用OpenCV實現這種像素化的人臉模糊方法-打開face_blurring.py文件(與上一節中使用的文件相同),並附加以下代碼:


從第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教程。

 

現在我們已經實現了兩種人臉模糊方法,讓我們學習如何使用OpenCV和Python應用它們來模糊圖像中的人臉。打開項目結構中的blur_face.py文件,並插入以下代碼:

我們最值得注意的導入都是我們的人臉像素化和前面兩部分的臉模糊功能(第2和第3行)。我們的腳本接受五個命令行參數,其中前兩個是必需的:--method:使用此標誌可以選擇簡單的模糊或像素化方法。簡單方法是默認的--blocks:對於像素化的匿名人臉,必須提供要使用的塊數,或者可以保留默認值20--confidence:過濾弱人臉檢測的最小概率默認為50%再加上我們的命令行參數,我們現在可以執行面部檢測了:首先,我們加載基於Caffe的人臉檢測模型(第26-29行)。然後我們加載並預處理我們的輸入——圖像,生成一個blob進行推斷(第33-39行)。閱讀我的「OpenCV的blobFromImageWork」教程,了解第38行和第39行函數調用背後的「為什麼」和「如何」。深度學習人臉檢測推理(步驟1)發生在第43行和第44行。在這裡,我們循環檢測並檢查可信度,確保它滿足最小閾值(第47-54行)。

符合條件之後,我們然後通過第57-61行提取面部ROI(步驟2)。

根據--method,我們將執行簡單的模糊處理或像素化以匿名化面部(第65-72行)。

步驟4需要使用我們的匿名面部ROI覆蓋圖像中的原始面部ROI(第75行)。

然後對輸入圖像中的所有人像重複步驟#2-#4,直到我們準備好顯示結果:總而言之,原始圖像和修改後的圖像並排顯示,直到按下一個鍵(第79-81行)。

 

 

繼續使用本教程的「下載」部分下載原始碼、示例圖像和經過預訓練的OpenCV人臉檢測器。

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

 

在左邊,你可以看到原始輸入圖像(即,我),而右邊顯示我的臉已經模糊使用高斯模糊方法-沒有看到原始圖像,你不會知道是我(除了紋身)。圖10:TomKing的臉已經用OpenCV和Python進行了像素化;您可以調整塊設置,直到您對匿名級別感到滿意為止。(圖片來源)在左邊,我們有湯姆·金的原始輸入圖像,他是我最喜歡的漫畫作家之一。然後,在右邊,我們有像素化模糊方法的輸出-如果沒有看到原始圖像,你將不知道圖像中是誰的臉。

 

我們之前的例子只處理圖像中的模糊和匿名化人臉-但是如果我們想將人臉模糊和匿名化應用於實時視頻流呢?打開項目結構中的blur_face_video.py文件,讓我們學習如何使用OpenCV在實時視頻中模糊面部:我們從2-10號線開始導入。對於視頻中的人臉識別,我們將在imutils包中使用VideoStream API(第4行)。

 

然後我們將加載面部探測器並初始化視頻流:

我們獲取計算機的網絡攝像頭生成的視頻流(第34行)。

 

然後,我們將繼續循環流中的幀並執行步驟1-人臉檢測:


在高可信度檢測的循環中,我們提取第55-69行的面部ROI(步驟2)。為了完成步驟3,我們通過第73-80行應用我們選擇的匿名方法。最後,在步驟4中,我們替換相機幀中的匿名人臉(第83行)。為了結束我們的面部模糊循環,我們在屏幕上顯示幀(帶有模糊的面部):

 

我們現在已經準備好使用OpenCV對實時視頻流應用面部模糊。首先使用本教程的「下載」部分下載原始碼和經過預訓練的OpenCV人臉檢測器。然後,可以使用以下命令啟動blur_face_video.py:

我們可以通過提供--method pixelated標誌來應用像素化的人臉模糊方法:

 

同樣,我的臉是匿名/模糊使用OpenCV,但使用更「美觀」的像素化方法。


處理漏檢和「檢測閃爍」

我們在這裡應用的人臉模糊方法假設在我們輸入視頻流的每一幀中都可以檢測到一個人臉。但是,如果我們的面部檢測器漏掉了檢測,比如在本節頂部的視頻中,會發生什麼?如果我們的人臉檢測器漏掉了一個人臉檢測,那麼該人臉就不能被模糊,從而破壞了人臉模糊和匿名化的目的。通常,最簡單的方法是取人臉的最後一個已知位置(即先前的檢測位置),然後模糊該區域。

人臉移動不太快,所以模糊最後一個已知的位置將有助於確保人臉匿名,即使你的人臉檢測器漏掉了人臉。更高級的選擇是使用專用的對象跟蹤器,類似於我們在《people/footfall counter guide》中所做的操作。我將把實現這些方法留給您(儘管我很想在以後的教程中介紹它們,因為它們是非常有趣的實現方法)。在本教程中,您學習了如何使用OpenCV和Python在圖像和實時視頻流中模糊和匿名化人臉。

步驟1:使用人臉檢測器(即Haar cascades、HOG+線性支持向量機、基於深度學習的人臉檢測器)檢測圖像中是否存在人臉

步驟2:使用邊界(x,y)坐標從輸入圖像中提取面部ROI

步驟3:模糊圖像中的人臉,通常使用高斯模糊或像素模糊,從而匿名化人臉並保護圖像中人的身份

步驟4:將模糊/匿名的人臉存儲在原始圖像中

然後我們只用OpenCV和Python實現了整個流程。要下載在本文的原始碼(包括示例圖片和經過預訓練的面部檢測器),只需在下面的表單中輸入您的電子郵件地址!
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

相關焦點

  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • Python+OpenCV的基礎圖像處理操作匯總
    通過在CMD(命令提示符)中發出以下命令來安裝opencv python(這是一個用於python的非正式預構建opencv包):opencv-contrib-python(包含main和contrib模塊)opencv-python-headless(與opencv-python相同,但沒有
  • 使用Python+OpenCV實現神經網絡預處理人臉圖像的快速指南
    這是一篇簡短的文章,包含了一些基本的指導原則、示例和代碼,你可以根據需求將它們應用到人臉分類或識別問題上。注意:本文中使用的所有靜態圖像都來自 https://imgflip.com/memetemplates圖片載入我們將使用imread()函數加載圖像,指定文件的路徑和mode,第二個參數對於動態運行通道和像素轉換非常重要。
  • Python不超過10行代碼就可實現人臉識別,教你辨別真假
    人臉識別技術大致由人臉檢測和人臉識別兩個環節組成。之所以要有人臉檢測,不光是為了檢測出照片上是否有人臉,更重要的是把照片中人臉無關的部分刪掉,否則整張照片的像素都傳給f(x)識別函數肯定就不可用了。人臉檢測不一定會使用深度學習技術,因為這裡的技術要求相對低一些,只需要知道有沒有人臉以及人臉在照片中的大致位置即可。
  • 「python opencv 計算機視覺零基礎實戰」第一節
    前置條件說明:本系列opencv實戰教程將從基礎到實戰,若只是簡單學習完python也可以通過該教程完成一般的機器學習編程;文中將會對很多python的基礎內容進行講解,但由於文章定位的原因將不會贅述過多的基礎內容,基礎內容進行第一次講解後第二次將不會過多贅述,本文主要講解的是opencv相關知識。
  • python應用之人臉識別及人臉解鎖
    各位看官大家好,今天我們繼續用python編寫一些無用,但卻有趣的小程序,
  • 使用Python+OpenCV+Dlib實現人臉檢測與人臉特徵關鍵點識別
    我們可以將這些信息作為一個預處理步驟來完成,例如捕捉照片中人物的人臉(手動或通過機器學習),創建效果來「增強」我們的圖像(類似於Snapchat等應用程式中的效果),對人臉進行情感分析等等。今天我們將通過引入DLib和從圖像中提取面部特徵來將其提升到一個新的水平。
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • 利用OpenCV和深度學習實現人臉檢測
    這裡整理了一份前段時間做的小demo,實現獻醜了本文基於OpenCV3.3.1或以上版本(如OpenCV3.4)、DNN模塊和face_detector示例實現簡單、實時的人臉檢測。face_detector文件分析:本教程直接使用訓練好的.caffemodel來進行人臉檢測,即只需要.caffemodel和deploy.prototxt兩個文件。
  • 如何快速簡單的安裝opencv-python
    python3.6.8下載將pip源更換到國內鏡像用pip管理工具安裝庫文件時,默認使用國外的源文件,因此在國內的下載速度會比較慢,可能只有50KB/s。最新版本為4.1.1 ----2019-8-28在opencv-contrib-python 版本中含有額外模塊( Extra modules ),而 opencv-python 版本中只含有基礎模塊。
  • 「Python+cv2」Python安裝opencv及圖像的基本操作
    Python環境opencv的安裝1、檢查是否安裝python環境3、安裝opencvpython環境下opencv的安裝:pip3 install opencv-pythonpython opencv安裝因為我已經安裝,所以會出現安裝位置的提示。
  • 給OpenCV初學者的禮物——OpenCV人臉檢測入門教程
    本文的參考文檔見https://docs.opencv.org/4.0.1/d1/dfb/intro.html圖像的基本操作對於人類來說,圖像可以解構為畫面結構、色彩和非常豐富的意象。你可以把它解構為各種色塊或線條,然後用故事性的語言把這幅圖像存在腦海裡。
  • Python系列之三——人臉檢測、人臉識別
    之前有利用C++和OpenCv寫過人臉識別的系列文章,對於人臉識別的基本理解和步驟流程等基本知識不做反覆敘述。比詹小白還要白的童鞋可以查看往期文章進行了解噢1.人臉識別(一)——從零說起2.人臉識別(二)——訓練分類器3.人臉識別(二)——訓練分類器的補充說明4.人臉識別(三)——源碼放送一、人臉檢測      python版人臉檢測基本上可以參照C++版本的程序,根據語法不同進行改寫即可。
  • opencv-python獲取圖像:面向對象與面向過程
    關於圖片的來源:1973年6月,美國南加州大學的信號圖像處理研究所的一個助理教授和他的一個研究生打算為了一個學術會議找一張數字照片,而他們對於手頭現有成堆"無聊"照片感到厭煩。事實上他們需要的是一個人臉照片,同時又能讓人眼前一亮。這時正好有人走進實驗室,手上帶著一本當時的花花公子雜誌,結果故事發生了……而限於當時實驗室設備和測試圖片的需要,lenna的圖片只摳到了原圖的肩膀部分。
  • 用OpenCV和深度學習進行年齡識別
    年齡識別是僅用人臉的照片去自動識別其年齡的過程通常,您會看到年齡識別可分為兩個階段進行實現:1.階段1:檢測輸入圖像/視頻中的人臉2.階段2:提取人的面部(感興趣區域,ROI),並通過年齡檢測器的算法去預測人物的年齡對於階段1,能夠為圖片中的人臉生成邊框的人臉檢測器都是可用的,這些檢測器包括但不限於Haar cascades,HOG
  • 人臉檢測+數據訓練+人臉識別
    準備工作:安裝opencv-python安裝opencv-contrib-python一、先寫一個單張的人臉識別代碼
  • Python 圖像處理 OpenCV (1):入門
    /官方 Demo :https://github.com/opencv/opencv/blob/master/samples/python圖書推薦圖書的話我就推薦一本吧,如果要看書學習絕對不能錯過的「Learning OpenCV 3」,當然,是英文原版的,中文版的話翻譯有點慘不忍睹,對英文閱讀壓力大的同學可以中英文對照著看:
  • Win7-64+Anaconda3+Python3.7+pycharm+OpenCV3.4.9.33—opencv安裝
    Win7 64環境下+Anaconda3-2020.02+Python3.7+ pycharm-community-2020.1.1+OpenCV3.4.9.33環境搭建——opencv介紹Win7 64下opencv_python-3.4.9.33-cp37-cp37m-win_amd64
  • OpenCV-Python Meanshift和Camshift|四十七
    學習目標在本章中,我們將學習用於跟蹤視頻中對象的Meanshift和Camshift算法。MeanshiftMeanshift背後的直覺很簡單,假設你有點的集合。(它可以是像素分布,例如直方圖反投影)。
  • python利用opencv實現證件照換底
    opencv今天就給大家介紹一下python利用opencv庫進行藍底換紅底或者白底照片的操作。1.強大的opencv庫說到圖像處理,不得不提opencv庫。它是一個跨平臺的計算機視覺庫,可以運行在不同作業系統上,它由一些列c函數和少量c++函數組成,並提供python,matlab等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。我們這裡用的opencv-python 就是opencv的python API接口。