全文共3208字,預計學習時長6分鐘git
圖片來源:Upsplash/Pavel Anoshingithub
目前,人臉識別的使用率正在不斷上升,隨之而來關於面部識別道德問題的爭論也愈發激烈。從機場到社交媒體,面部識別的應用無處不在。所以,想讓本身的臉不被掃描幾乎是不可能的。數據庫
對面部識別的理想化攻擊是看起來絕不知情的假裝。在Hyperface項目的啓發下,本文將介紹一個可穿戴式對抗實例的全過程——詳細介紹建立對抗圖象愚弄選定類型的面部識別,以及如何在面罩上實現實例演示。數組
面部檢測 VS 面部識別微信
面部檢測示例(左)vs面部識別示例(右)網絡
對此項目進行深刻研究以前,頗有必要先明確一下面部檢測與面部識別之間的區別。面部檢測指的是檢測圖象中是否出現人臉的能力。而面部識別首先依靠面部檢測肯定圖象中是否出現了人臉,而後進一步肯定是誰。dom
對此項目,咱們選擇主攻面部檢測,這主要是由於它更易於檢測。爲了更好地測試面部識別,選用面部識別數據庫最好不過了。函數
面部檢測模型學習
下一步是選擇創建對抗實例的面部檢測模型。目前使用的面部檢測模型有不少。Vikas Gupta在「Learn OpenCV」平臺上對面部檢測模型及其應用作了全面深刻的入門介紹。在此,僅進行簡要回顧。測試
深度神經網絡(DNNs):深度神經網絡可使用輸入的數據集進行訓練,以在各個不一樣的方向檢測人臉。基於人臉檢測的一種流行的深度神經網絡檢測方法是單次多盒檢測器。深度神經網絡準確性高且具備普適性。
卷積神經網絡(CNNs):卷積神經網絡是一種深度神經網絡,旨在標註出圖象中不一樣部分的重要程度。它十分強大,可是在CPU上運行很慢。
Haar級聯分類器:Haar級聯使用一個數據集和大量標記過的積極和消極示例圖片進行訓練。Haar級聯分類器的主要缺點是隻能識別正面照片。因爲神經網絡更爲通用,因此它們沒法普遍應用。
定向梯度直方圖(HOG):定向梯度直方圖是一種面部檢測方法,在將結果輸入支持向量機以前,將通過處理的輸入圖象劃分爲具備梯度方向的單元格。定向梯度直方圖檢測快速輕便,但不適用於某些不常見的的面部角度。
將人臉建模爲dlib中定向梯度直方圖的示例(感受能夠刪去數據庫,我查了一下感受和數據庫有區別)
最簡單的攻擊候選模型是定向梯度直方圖。最值得注意的是,定向梯度直方圖的預期輸入易於可視化並反饋到面部檢測模型中。定向梯度直方圖還有一個優勢就是,它的面部可視化結果不是人類觀察者輕易能看出來的人臉。
Python中的定向梯度直方圖面部檢測
附帶的GitHub儲存庫中提供了具備顯示結果功能的擴展代碼示例。
GitHub庫傳送門:https://github.com/BruceMacD/Adversarial-Faces
測試這些例子須要一個基於定向梯度直方圖(HOG)進行簡單的面部檢測。幸運地是,dlib庫中的正面人臉探測器內置了HOG面部檢測器。
import dlib import cv2 cv2.imread("path/to/input_img.png") frontal_face_detector = dlib.get_frontal_face_detector() upscaling_factor = 1 detected_faces = frontal_face_detector(img, upscaling_factor)
正面人臉探測器運行時須要輸入圖片和放大因子。放大因子爲1表示所輸入圖片會放大一次。放大令圖像變得更大,而且便於檢測人臉。正面人臉檢測的結果是一個邊界框列表,每一個邊界框對應一個被檢測的人臉。
可視化HOG中使用dlib庫檢測人臉的結果
運用隨機優化建立對抗設計
因爲認識到目前HOG預期輸入的可視化內容會被檢測爲正面人臉假陽性,因此須要建立一個設計,打印在看起來不顯眼的口罩上。然而,影響設計的因素有不少,咱們並不知道如何優化。人臉的位置、方向和大小都會影響圖像中檢測到的面部數量。也能夠嘗試不一樣的設計,直到找到一個好的設計,可是讓學習模型使得這些艱苦工做作起來更加有趣。
研究了強化學習、生成對抗網絡和Q—學習後,最終決定使用隨機優化的模擬退火,由於它最適合解決咱們的問題,能找到與dlib庫檢測到最屢次的人臉相匹配的輸入。
使用Python圖象庫(PIL)和mlrose(用於隨機優化的Python庫)來生成圖像並找到最佳狀態。用mlrose優化須要初始狀態和適應度函數。在這個案例中,找到這種最佳狀態須要昂貴的計算,由於生成的狀態須要做爲圖像保存到磁盤,以便找到檢測到的人臉數。
# indexes: # 0 % 4 = pos_x # 1 % 4 = pos_y # 2 % 4 = rotation # 3 % 4 = scale initial_state = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
從初始狀態開始,milrose須要一個一維數組。這意味着必須使用一個黑客解決方案,賦予不一樣的數組位置不一樣的意義(詳見索引解釋)。選擇優化6張人臉的輸入,由於能夠一直複製設計以增長其大小。
def detected_max(state): # converts the 1D state array into images get_img_from_state(state) return len(detect_faces(cv2.imread(OUTPUT)))
適應度函數只是將狀態轉換爲圖像,而後檢測圖像中的人臉數量。人臉的數量越多,適應度就越好。咱們還能夠嘗試根據輸入的HOG人臉圖像的大小將適應度函數改得更高。由於在現實生活中,更大的面孔更容易被發現,因此這種效果可能更好。然而,發現考慮人臉大小會耗費更多計算時間,而獲得的結果在視覺上是類似的。
fitness = mlrose.CustomFitness(detected_max) problem = mlrose.DiscreteOpt(length=24, fitness_fn=fitness, maximize=True, max_val=scale_factor) schedule = mlrose.ExpDecay() best_state, max_faces = mlrose.simulated_annealing(problem, schedule=schedule, max_attempts=10, max_iters=1000, init_state=initial_state, random_state=1) print('Optimal state found: ', best_state) print('Max fitness found: ', max_faces) # save the optimal found get_img_from_state(best_state) print("Number of faces in output: ", len(detect_faces(cv2.imread(OUTPUT))))
利用適應度和初始狀態集配置milrose進行模擬退火很簡單。分配輸入內容,並讓它運行直到找到一個最佳結果。作幾回這樣的測試,以找到視覺上看起來有趣的結果。
模擬退火狀態下有趣的輸出結果
最後,在這個有趣的輸出中添加了一些最後的潤色,以模糊面部設計——其意圖是愚弄人類。
模糊面部結構的最終設計
在面罩上測試此設計
使用對抗面部設計的原型面罩上檢測到的面部
完成最終的設計後,我設計了一些模擬面具來測試HOG面部檢測如何評估它們。初步結果彷佛頗有但願,上述設計返回結果始終爲4-5個錯誤檢測到的面孔。
留言 點贊 關注
咱們一塊兒分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」
(添加小編微信:dxsxbb,加入讀者圈,一塊兒討論最新鮮的人工智能科技哦~)