譯者 | 朱先忠
審校 | 重樓
在當今這個數據驅動的世界里,保護個人的隱私和匿名是至關重要的事情。從保護個人身份到遵守GDPR(General Data Protection Regulation,即《通用數據保護條例》,為歐盟制訂的條例)等嚴格法規,對各種媒體格式的人臉匿名化高效可靠解決方案的需求前所未有。
在本文提供的這個實戰項目中,我們將探索并比較人臉模糊算法相關的幾種解決方案,并開發了一個用于比較評估這幾種算法的網絡應用程序。
首先,讓我們來介紹這樣一個應用程序的系統需求:
總體來看,這個實戰項目可以劃分成兩個基本部分:
為了解決匿名化挑戰,首先要解決的問題是定位圖像中存在人臉的區域。為此,我測試了三個用于圖像檢測的模型。
圖1:類哈爾特征算法(來源——原始論文)
Haar Cascade是一種機器學習方法,用于圖像或視頻中的人臉等對象的檢測。它通過利用一組被稱為“類哈爾特征”(圖1)的訓練特征進行操作,這些特征是簡單的矩形濾波器,專注于圖像區域內像素強度的變化。這些特征可以捕捉人臉中常見的邊緣、角度和其他特征。
訓練過程包括為算法提供正面樣本(包含人臉的圖像)和負面樣本(不包含人臉的圖片)。然后,該算法通過調整特征的權重來學習區分這些樣本。經過訓練后,Haar Cascade本質上變成了一個分類器的層次結構,每個階段都逐步完善檢測過程。
為了實現人臉檢測,我使用了一個預先訓練的Haar Cascade模型,該模型是在人臉的前向圖像上訓練的。關鍵實現代碼如下所示:
import cv2face_cascade = cv2.CascadeClassifier('./configs/haarcascade_frontalface_default.xml')def haar(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) print(len(faces) + " total faces detected.") for (x, y, w, h) in faces: print(f"Face detected in the box {x} {y} {x+w} {y+h}")
圖2:MTNN算法中的人臉檢測過程(來源——原始論文:)
MTNN(Multi-Task Cascaded Convolutional Networks,多任務級聯卷積網絡)是一種復雜且高度準確的人臉檢測算法,超過了前面的Haar Cascades算法的能力。MTCNN算法設計在具有不同面部大小、方向和照明條件的場景中表現出色,它利用了一系列神經網絡,每個神經網絡都適合執行面部檢測過程中的特定任務。
MTNN算法引入的級聯架構使其能夠在過程的早期快速丟棄沒有人臉的區域,將計算集中在包含人臉概率較高的區域。與Haar Cascades算法相比,它能夠處理不同比例(縮放級別)的人臉和旋轉,非常適合復雜場景下的應用。然而,這種算法的計算強度源于其基于神經網絡的順序方法。
為了實現MTNN,我使用了MTCNN庫。關鍵實現代碼如下所示:
import cv2from mtcnn import MTCNNdetector = MTCNN()def mtcnn_detector(image): faces = detector.detect_faces(image) print(len(faces) + " total faces detected.") for face in faces: x, y, w, h = face['box'] print(f"Face detected in the box {x} {y} {x+w} {y+h}")
圖3:YOLO目標檢測過程(來源——原始論文)
YOLO(You Only Look Once)算法是一種用于檢測包括人臉在內的大量對象的算法。與前代產品不同,YOLO通過神經網絡進行單次檢測,使其更快、更適合實時應用程序和視頻場景。總體來看,使用YOLO檢測媒體中人臉的過程可以分為四個部分:
YOLO算法的主要優勢在于它的速度。由于它通過神經網絡在一次前向傳遞中處理整個圖像,因此它比涉及滑動窗口或區域建議的算法快得多。然而,這種速度可能會與精度略有權衡,尤其是對于較小的對象或擁擠的場景。
YOLO算法可以通過在人臉特定數據上對其進行訓練并修改其輸出類別以便僅包括一個類別(“臉”)來適應人臉檢測。為此,我使用了基于YOLOv5算法構建的一個名叫“yoloface”的開源庫。關鍵實現代碼如下所示:
import cv2from yoloface import face_analysisface=face_analysis()def yolo_face_detection(image): img,box,conf=face.face_detection(image, model='tiny') print(len(box) + " total faces detected.") for i in range(len(box)): x, y, h, w = box[i] print(f"Face detected in the box {x} {y} {x+w} {y+h}")
在識別出圖像中潛在人臉周圍的邊界框后,下一步是對其進行模糊處理以刪除這些邊界標識。對于這個任務,我開發了兩個實現版本。用于演示這個任務的參考圖像如圖4所示。
圖4:參考圖片(Ethan Hoover引自提供免費高清圖片素材資源的Unsplash網站)
圖5:具有高斯模糊的模糊參考圖像
高斯模糊是一種用于減少圖像噪聲和污跡細節的圖像處理技術。這在人臉模糊領域尤其有用,因為它可以從圖像的這一部分中刪除細節。這種算法計算每個像素附近的像素值的平均值。該平均值以被模糊的像素為中心,并使用高斯分布進行計算,從而為附近的像素賦予更多權重,而為遠處的像素賦予更少權重。其結果是生成一個減少高頻噪聲和精細細節的軟化圖像。應用高斯模糊的結果如前面圖5所示。
高斯模糊采用三個參數:
1. 要模糊的圖像部分。
2. 內核大小:用于模糊操作的矩陣。較大的內核大小會導致更強的模糊。
3. 標準偏差:值越高,模糊效果越強。
f = image[y:y + h, x:x + w]blurred_face = cv2.GaussianBlur(f, (99, 99), 15) #你可以調整模糊參數image[y:y + h, x:x + w] = blurred_face
圖6:帶像素化的模糊參考圖像
像素化是一種圖像處理技術,其中圖像中的像素被替換為單一顏色的較大塊。這種效果是通過將圖像劃分為單元格網格來實現的,其中每個單元格對應于一組像素。然后,將該單元中所有像素的顏色或強度作為該單元中全部像素的顏色的平均值,并將該平均值應用于該單元中的所有像素。此過程可創建簡化的外觀,從而降低圖像中精細細節的級別。應用像素化的結果如圖6所示。正如你所觀察到的,像素化使識別一個人的身份變得非常復雜。
像素化算法使用一個主要的參數,該參數決定了一個特定區域應該有多少分組像素。例如,如果我們有一個包含人臉的圖像的(10,10)部分,它將被10x10像素組所取代。越小的數字結果越模糊。
f = image[y:y + h, x:x + w]f = cv2.resize(f, (10, 10), interpolation=cv2.INTER_NEAREST)image[y:y + h, x:x + w] = cv2.resize(f, (w, h), interpolation=cv2.INTER_NEAREST)
我將從兩個角度評估不同的上述算法:實時性能分析和特定的圖像場景。
使用相同的參考圖像(如圖4所示)的情況下,我計算了每個人臉檢測算法在圖像中定位人臉邊界框所需的時間。結果數據基于每種算法的10個測量值的平均值。模糊算法所需的時間可以忽略不計,在評估過程中不會考慮。
圖7:每個算法檢測人臉所需的平均時間(秒)花銷
可以觀察到,YOLOv5由于其通過神經網絡的單程處理而實現了最佳性能(速度)。相比之下,像MTNN這樣的方法需要通過多個神經網絡進行順序遍歷。這進一步使算法的并行化過程復雜化。
為了評估上述算法的性能,除了參考圖像(圖4)外,我還選擇了幾張在各種場景中測試算法的圖像:
1. 參考圖像(圖4)
2. 一群人靠得很近——以評估算法捕捉不同人臉大小的能力,有些更近,有些更遠(圖8)
3. 側視人臉——測試算法檢測不直視相機的人臉的能力(圖10)
4. 翻轉的人臉,180度——測試算法檢測旋轉180度人臉的能力(圖11)
5. 翻轉人臉,90度——測試算法檢測側向旋轉90度人臉的能力(圖12)
圖8:尼古拉斯·格林提供的在Unsplash網站上的人群相片
圖9:Naassom Azevedo提供的在Unsplash網站上的多重面孔照片
圖10:Unsplash網站上的來自Kraken Images的側面圖
圖11:將圖4照片翻轉180度
圖12:將圖4照片翻轉90度
Haar Cascade算法通常在匿名人臉方面表現良好,只有少數例外。它成功地檢測到了參考圖像(圖4)和“多張臉”場景(圖9)。在“人群”場景(圖8)中,它可以很好地處理任務,盡管有些人臉沒有被完全檢測到或距離更遠。Haar Cascade算法遇到了人臉不直接面對相機(圖10)和旋轉人臉(圖11和12)的挑戰,無法完全識別人臉。
圖13:Haar Cascade算法的運算結果
MTCNN算法設法實現了與Haar Cascade算法非常相似的結果,具有相同的優勢和劣勢。此外,MTNN算法很難檢測到圖9中膚色較深的人臉。
圖14:MTCNN算法的運算結果
YOLOv5算法產生的結果與Haar Cascade算法和MTCNN算法略有不同。它成功地檢測到人們沒有直視相機的一張臉(圖10),以及旋轉了180度的臉(圖11)。然而,在“人群”圖像(圖8)中,它并沒有像前面提到的算法那樣有效地檢測更遠的人臉。
圖15:YOLOv5算法的運算結果。
在解決圖像處理中的隱私挑戰時,需要考慮的一個關鍵方面是在保持圖像自然外觀的同時,在使人臉無法識別之間保持微妙的平衡。
高斯模糊有效地模糊了圖像中的面部區域(如圖5所示)。然而,它的成功取決于用于模糊效應的高斯分布的參數。在圖5中,很明顯,面部特征仍然是可辨別的,這表明需要更高的標準差和內核大小來實現最佳結果。
與高斯模糊相比,像素化(如圖6所示)作為一種人臉模糊方法,通常看起來更符合人眼的視覺感受。用于像素化的像素數量在這種情況下起著關鍵作用,因為較小的像素數量會使面部不太容易識別,但可能導致不太自然的外觀。
總的來說,相對于高斯模糊算法,像素化算法一直是人們更喜歡的選擇。理由在于人們更為熟悉這種算法以及這種算法語境的自然性,其在隱私和美學之間取得了較好的平衡。
隨著人工智能工具的興起,預測旨在從模糊圖像中去除隱私過濾器的逆向工程技術的潛力變得至關重要。然而,模糊面部的行為不可逆轉地用更廣義的面部細節取代了特定的面部細節。到目前為止,人工智能工具只能在呈現同一個人的清晰參考圖像時對模糊的人臉進行逆向工程。不過,這里也存在一個矛盾問題:這首先與逆向工程的必要性相矛盾,因為使用逆向工程的話必須以了解個人身份為前提。因此,面對不斷發展的人工智能技術,人臉模糊是保護隱私的一種比較有效和必要的手段。
由于視頻本質上是一系列圖像,因此修改每個算法以對視頻進行匿名化相對簡單。然而,在這里,處理耗費的時間變得至關重要。例如,對于以每秒60幀(每秒圖像)記錄的給定30秒視頻,算法將需要處理1800幀。在這種情況下,像MTNN這樣的算法是不可行的,盡管它們在某些場景中會有所改進。因此,我決定使用YOLO模型來實現視頻匿名化。
import cv2from yoloface import face_analysisface=face_analysis()def yolo_face_detection_video(video_path, output_path, pixelate): cap = cv2.VideoCapture(video_path) if not cap.isOpened(): raise ValueError("Could not open video file") #取得視頻屬性 fps = int(cap.get(cv2.CAP_PROP_FPS)) frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 定義編解碼器并為輸出視頻創建VideoWriter對象 fourcc = cv2.VideoWriter_fourcc(*'H264') out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height)) while cap.isOpened(): ret, frame = cap.read() if not ret: break tm = time.time() img, box, conf = face.face_detection(frame_arr=frame, frame_status=True, model='tiny') print(pixelate) for i in range(len(box)): x, y, h, w = box[i] if pixelate: f = img[y:y + h, x:x + w] f = cv2.resize(f, (10, 10), interpolation=cv2.INTER_NEAREST) img[y:y + h, x:x + w] = cv2.resize(f, (w, h), interpolation=cv2.INTER_NEAREST) else: blurred_face = cv2.GaussianBlur(img[y:y + h, x:x + w], (99, 99), 30) # 你可以調整模糊參數 img[y:y + h, x:x + w] = blurred_face print(time.time() - tm) out.write(img) cap.release() out.release() cv2.destroyAllWindows()
為了簡化對不同算法的比較與評估,我創建了一個Web版本的網絡應用程序,用戶可以在其中上傳任何圖像或視頻,選擇人臉檢測和模糊算法。處理后,結果返回給用戶。實現是使用Flask和Python在后端完成的,利用前面提到的庫以及OpenCV和React.js在前端進行用戶與模型的交互。完整的代碼可在鏈接https://github.com/dani2221/dpns處獲得。
在本文項目中,我對包括Haar Cascade、MTNN和YOLOv5在內的各種人臉檢測算法進行了不同方面的探索、比較和分析。此外,該項目還專注分析了圖像模糊技術。
實驗數據證明,Haar Cascade算法在某些場景中被證明是一種有效的方法,通常表現出良好的時間性能。MTNN算法作為一種在各種條件下都具有實體人臉檢測能力的算法脫穎而出,盡管它在處理通常不處于傳統方向的人臉時遇到了困難。YOLOv5算法具有實時人臉檢測功能,是時間作為關鍵因素的場景(如視頻)應用的絕佳選擇,盡管在群組對象環境中的準確性略有下降。
最后,我把所有算法和技術都集成到一個單獨的Web應用程序中。該應用程序提供了對所有人臉檢測和模糊方法的輕松訪問和利用,以及使用模糊技術處理視頻的能力。
朱先忠,51CTO社區編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。
原文標題:Exploration and Model Comparison,作者:Danilo Najkov
本文鏈接:http://www.tebozhan.com/showinfo-26-12325-0.html流行人臉檢測和模糊算法的實戰較量,誰是王者?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com