在本教程中,您將學習如何使用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文件(與上一節中使用的文件相同),並附加以下代碼:現在我們已經實現了兩種人臉模糊方法,讓我們學習如何使用OpenCV和Python應用它們來模糊圖像中的人臉。打開項目結構中的blur_face.py文件,並插入以下代碼:
繼續使用本教程的「下載」部分下載原始碼、示例圖像和經過預訓練的OpenCV人臉檢測器。
圖9:左:我的照片。右:我的臉被OpenCV和Python用高斯方法弄模糊了。
在左邊,你可以看到原始輸入圖像(即,我),而右邊顯示我的臉已經模糊使用高斯模糊方法-沒有看到原始圖像,你不會知道是我(除了紋身)。圖10:TomKing的臉已經用OpenCV和Python進行了像素化;您可以調整塊設置,直到您對匿名級別感到滿意為止。(圖片來源)在左邊,我們有湯姆·金的原始輸入圖像,他是我最喜歡的漫畫作家之一。然後,在右邊,我們有像素化模糊方法的輸出-如果沒有看到原始圖像,你將不知道圖像中是誰的臉。
我們之前的例子只處理圖像中的模糊和匿名化人臉-但是如果我們想將人臉模糊和匿名化應用於實時視頻流呢?打開項目結構中的blur_face_video.py文件,讓我們學習如何使用OpenCV在實時視頻中模糊面部:我們從2-10號線開始導入。對於視頻中的人臉識別,我們將在imutils包中使用VideoStream API(第4行)。
然後我們將加載面部探測器並初始化視頻流:
我們獲取計算機的網絡攝像頭生成的視頻流(第34行)。
然後,我們將繼續循環流中的幀並執行步驟1-人臉檢測:
我們現在已經準備好使用OpenCV對實時視頻流應用面部模糊。首先使用本教程的「下載」部分下載原始碼和經過預訓練的OpenCV人臉檢測器。然後,可以使用以下命令啟動blur_face_video.py:我們可以通過提供--method pixelated標誌來應用像素化的人臉模糊方法:
同樣,我的臉是匿名/模糊使用OpenCV,但使用更「美觀」的像素化方法。
處理漏檢和「檢測閃爍」
我們在這裡應用的人臉模糊方法假設在我們輸入視頻流的每一幀中都可以檢測到一個人臉。但是,如果我們的面部檢測器漏掉了檢測,比如在本節頂部的視頻中,會發生什麼?如果我們的人臉檢測器漏掉了一個人臉檢測,那麼該人臉就不能被模糊,從而破壞了人臉模糊和匿名化的目的。通常,最簡單的方法是取人臉的最後一個已知位置(即先前的檢測位置),然後模糊該區域。步驟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