如何構(gòu)建自己的臉部模糊工具
如何使用OpenCV自定義去識(shí)別面
去身份是指將數(shù)據(jù)匿名化的過(guò)程。隨著歐洲聯(lián)盟的GDPR和其他國(guó)家的類似措施的實(shí)施,保護(hù)PII(個(gè)人身份信息)成為準(zhǔn)備數(shù)據(jù)集或任何個(gè)人信息處理的必要步驟。當(dāng)然,一個(gè)人(™)的臉是一個(gè)人(™)身份最突出的特征之一,因此有很多解決方案可以檢測(cè)和匿名化面孔。但是,它們很難定制和自動(dòng)化。這是一份DIY指南,面向那些想要使用開放源碼自己做這件事的人。整個(gè)代碼示例可以在Colab中運(yùn)行,并可在此處獲得。 GDPR here:https://github.com/changsin/DL/blob/main/notebooks/deidentify_faces_opencv.ipynb
自動(dòng)匿名化人臉?biāo)婕暗牟襟E包括:
1.人臉檢測(cè)
由于人臉檢測(cè)是對(duì)象檢測(cè)的一種類型,因此我們可以使用深度學(xué)習(xí)網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)這一目的。OpenCV包含一個(gè)深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò),該網(wǎng)絡(luò)經(jīng)過(guò)預(yù)先訓(xùn)練,可以使用公開可用的數(shù)據(jù)集檢測(cè)人臉。它使用Caffe深度學(xué)習(xí)框架,您可以下載模型定義和預(yù)先訓(xùn)練的權(quán)重文件。下載后,加載它們以創(chuàng)建深度神經(jīng)網(wǎng)絡(luò),該網(wǎng)絡(luò)現(xiàn)在可以檢測(cè)圖像中的人臉。 Caffe Deep Learning framework
現(xiàn)在,我們只需要加載圖像并將其傳遞給DNN以檢測(cè)人臉,如以下代碼片段所示:
每個(gè)預(yù)測(cè)結(jié)果包含類別ID(索引=1)、置信度(索引=2)和檢測(cè)到的面部坐標(biāo)。
- # a sample prediction output from DNN
- array([0. , 1. , 0.8745881 , 0.68375957, 0.47576728, 0.75310016, 0.62532324], dtype=float32)
因?yàn)槲覀冎粚?duì)人臉檢測(cè)感興趣,所以我們可以只關(guān)注置信概率,并使用它來(lái)接受或拒絕預(yù)測(cè)。
現(xiàn)在讓?euro™處理一個(gè)示例圖像。我之所以選擇這張公開發(fā)布的圖片,是因?yàn)樗胁煌嵌群湍w色的People-uro™的面孔。
當(dāng)置信度閾值設(shè)置為0.5(即50%確信這是一張臉)時(shí),它只檢測(cè)到一張臉:面向前面的人。
這是可以理解的,也是所有人臉檢測(cè)算法的共同問(wèn)題。解決這個(gè)問(wèn)題的正確方法是添加更多種類的包含側(cè)面輪廓和其他角度的圖像。一種簡(jiǎn)單而廉價(jià)的方法就是簡(jiǎn)單地降低信心。例如,當(dāng)置信度設(shè)置為0.12時(shí),結(jié)果會(huì)好得多。
然而,引入了一個(gè)新的問(wèn)題。在如此低的置信閾值下,預(yù)計(jì)會(huì)有更多的假陽(yáng)性和假陰性。你可以在左邊看到三個(gè)標(biāo)有標(biāo)簽的盒子。好消息是,您可以在一定程度上控制模型預(yù)測(cè)。
2.人臉匿名化
一旦檢測(cè)到人臉,下一步就是如何對(duì)其進(jìn)行匿名化/去身份識(shí)別。存在不同的技術(shù)。我將展示三種方法:即兩種模糊技術(shù)和一種像素化方法。
a.矩形中的模糊處理
最簡(jiǎn)單的方法是使用OpenCVâuro™的模糊方法,該方法通過(guò)對(duì)卷積內(nèi)核內(nèi)的像素值進(jìn)行平均來(lái)實(shí)現(xiàn)。換句話說(shuō),卷積的作用相當(dāng)于平滑的過(guò)濾。通過(guò)調(diào)整內(nèi)核大小,可以獲得或多或少的粗粒度模糊效果。由于圖像是作為多維整數(shù)數(shù)組處理的,因此您只需在一行代碼中將感興趣區(qū)域替換為模糊像素即可: OpenCV’s blur
- image[startY:endY, startX:endX] = cv2.blur(image[startY:endY, startX:endX], kernel_size)
以下是使用kernel_size(20,20)時(shí)的結(jié)果:
b.省略號(hào)中的模糊處理
雖然在矩形中進(jìn)行模糊可以實(shí)現(xiàn)所需的匿名化,但生成的圖像看起來(lái)相當(dāng)不和諧。使用較小的核大小,可以平滑不一致的模糊,但另一種方法是在橢圓中進(jìn)行模糊,因?yàn)镻eople?uro™的臉是橢圓形的。要做到這一點(diǎn),需要通過(guò)創(chuàng)建掩碼和執(zhí)行一些按位操作來(lái)完成一些工作。以下是(10,10)內(nèi)核大小的結(jié)果:
c.像素化
另一種流行的去識(shí)別人臉的方法是使用œ像素化。在像素化中,感興趣的區(qū)域被分成幾個(gè)小塊。-euro�在像素化中,感興趣的區(qū)域被分成幾個(gè)小塊。對(duì)于每個(gè)擋路,將計(jì)算平均RGB值并將其應(yīng)用于整個(gè)擋路。如您所見,生成的圖像看起來(lái)非常自然:
結(jié)論
取消人臉識(shí)別是保護(hù)隱私的第一步。雖然有許多現(xiàn)成的解決方案可用,但本文展示了使用OpenCV進(jìn)行自定義和自動(dòng)化的簡(jiǎn)單DIY步驟。整個(gè)源代碼都在Jupyter筆記本上,可以在這里找到。https://github.com/changsin/DL/blob/main/notebooks/deidentify_faces_opencv.ipynb
參考文獻(xiàn)
- 使用OpenCV和Python模糊和匿名化人臉
- 基于OpenCV和深度學(xué)習(xí)的人臉檢測(cè)