如何構建自己的臉部模糊工具
如何使用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和深度學習的人臉檢測