GeekPwn對抗樣本挑戰賽冠軍隊伍開源人臉識別攻擊解決方案
10 月 24 日,2018 GeekPwn 國際安全極客大賽在上海展開,由 FAIR 研究工程師ofollow,noindex" target="_blank"> 吳育昕 、約翰霍普金斯大學在讀博士謝慈航組成的團隊獲得了令人矚目的CAAD CTF 冠軍 。近日,該冠軍隊伍開源了其在 人臉識別 攻擊專案中的解決方案。
2018 Geekpwn CAAD(對抗樣本挑戰賽)繼承了 NIPS CAAD 2017 比賽的形式,但同時也添加了一些新的挑戰。2018 年 10 月,吳育昕和謝慈航受邀參加 Geekpwn CAAD CTF,這是一場展示不同型別對抗樣本攻防的現場比賽。
比賽上半場中,賽會要求所有選手進行非定向圖片(將飛行器識別為任何其他物體)、定向圖片(將武器識別為特定的其他物品)以及亞馬遜名人鑑別系統(將大賽主持人蔣昌建的照片識別為施瓦辛格)共計三種影象的對抗樣本攻擊。由於在比賽前選手並不知曉題目模型所採用的演算法,所以此類攻擊也被稱為「黑盒攻擊」,其中第三個挑戰在賽前更是被評委視為「無法完成的任務」。
第三項挑戰是一項新挑戰,要求參賽隊伍攻擊未知的人臉識別系統。在限時 30 分鐘的上半場比賽中,參賽者拿到大賽主持人蔣昌建的照片。他們需要對照片做一些小的修改,以欺騙人臉識別系統,讓它把照片中的人識別為施瓦辛格。比賽結束後,大家才知道該人臉識別系統是亞馬遜名人鑑別系統。
由吳育昕與謝慈航組成的「IYSWIM」戰隊在限時 30 分鐘的比賽中,首先於 21 分鐘破解了亞馬遜名人鑑別系統 Celebrity Recognition,並隨後在定向圖片的對抗樣本攻擊上破解成功,取得了領先。
近日,吳育昕在部落格中簡單介紹了他們對人臉識別的攻擊,程式碼也放到了 GitHub/">GitHub 上。吳育昕稱他們對比賽其他型別的攻擊使用的是類似的演算法,只是換了不同的 CNN。而關於比賽下半段防禦相關內容的 paper 將稍後放出,程式碼和模型將於明年開源。
攻擊方法
吳育昕在部落格中稱其黑盒攻擊是很傳統的方法,即用已知模型做梯度下降。
1. Model:
搜了搜 GitHub 上的人臉識別程式碼,找了個 5 分鐘內能跑起來的 facenet。畢竟 GitHub 上大部分程式碼質量堪憂,有不少專案完全是靠 README 騙 star 的。能否短時間內復現 evaluation 結果是評判質量的重要 metric。更何況,我這次只需要能 evaluation 就夠了。
facenet 的人臉識別流程很標準:對每張臉 I 輸出一個 vector f(I),然後通過比較不同臉的 f(I) 之間的 cosine distance 進行人臉識別。
2. Objective:
對於分類器的 target/untarget attack,沒什麼好說的,就是 minimize/maximize 一個 cross entropy loss。而對於人臉,我們首先收集 target 人物的 N 張人臉圖片,執行模型得到 N 個 embedding vector v_i。我們的 objective 就是 minimize 輸入圖片的 embedding 到這 N 個 embedding 的平均距離:
3. Attack:
我們在最原始的 PGD (ProjectedGradient Descent) 攻擊上加了點 trick。原始的 PGD 就是
1)算 objective 對輸入圖片的梯度 ΔI
2)更新輸入 I = I−sign(ΔI)
3)clip 以免輸入超出允許範圍:I←clip(I,I_orig−ϵ,I_orig+ϵ)
4)回到第一步迴圈
這裡有不少 trick 可以提高黑盒攻擊的 generalization 能力:
1)對梯度 normalize 一下,然後更新時用 0.9 的 momentum
2)在迴圈每一步給圖片隨機加點小 noise
3)在迴圈每一步對輸入圖片做些亂七八糟的隨機 resize 變換
4)對梯度做 spatial smoothing
這些 trick 從去年的 NIPS 比賽之後就陸續被大家用了。這次的人臉攻擊用了 1,2,3。第三條是我比賽時發現程式碼不 work 臨時加上的。事後驗證發現,這一點尤其重要。如果不加的話攻擊很難成功。
在相關的 GitHub repo 中,我們可以看到該團隊的攻擊程式碼和結果:
結果
比賽期間,吳育昕團隊成功地攻擊了AWS名人鑑別系統,讓它把蔣昌建識別為了施瓦辛格。
下面這個挑戰比較困難(不同隨機種子的成功率較低),可能是因為:1)原人物和目標人物都是美國名人。2)性別不同。
很明顯,Azure Vision API 和 Clarifai Celebrity Recognition 系統都可以被欺騙:
以上影象的原版本和對抗版本都可以從以下地址找到,若有興趣你可以下載並在公開 API 上進行測試:https://github.com/ppwwyyxx/Adversarial-Face-Attack/blob/master/images
使用程式碼的準備工作
1. 安裝TensorFlow ≥ 1.7
2. 按照 facenet wiki 中的步驟 1 - 4 設定 facenet (https://github.com/davidsandberg/facenet/wiki/Validate-on-LFW)
3. 複製此 repo 並解壓內部的預訓練模型:
git clone https://github.com/ppwwyyxx/Adversarial-Face-Attack cd Adversarial-Face-Attack wget https://github.com/ppwwyyxx/Adversarial-Face-Attack/releases/download/v0.1/model-20180402-114759.tar.bz2 tar xjvf model-20180402-114759.tar.bz2
你也可以從 facenet 下載模型(https://github.com/davidsandberg/facenet#pre-trained-models )。
4. 驗證模型和資料集:
./face_attack.py --data /path/to/lfw_mtcnnpy_160 --validate-lfw # /path/to/lfw_mtcnnpy_160 is obtained above in step #4 in facenet wiki.
它應該在 LFW 資料集上有高準確率,如:
<mark data-type="technologies" data-id="8be77eae-12da-4e9e-9a88-b7f5bae98c2e">Accuracy</mark>: 0.99517+-0.00361 Validation rate: 0.97467+-0.01454 @ FAR=0.00067
執行攻擊
./face_attack.py --data /path/to/lfw_mtcnnpy_160 \ --attack images/clean-JCJ.png \ --target Arnold_Schwarzenegger \ --output JCJ-to-Schwarzenegger.png
--target 必須是在 LFW 資料集中有很多影象(越多越好)的人。可以通過以下方式找到這種人:
find /path/to/lfw_mtcnnpy_160/ -type f -printf "%h\0" | \ xargs -0 -L1 basename | sort | uniq -c | sort -k1 -n
你可以在 LFW 目錄中新增新的名人作為 victim,或者為 LFW 中現有的名人新增影象。新增新影象之後,你需要重複 facenet wiki 中的步驟 4,以裁剪和對齊新增的新影象。
請注意,攻擊包含隨機性:你不會每次都得到相同的輸出。