來源:量子位
你能看出下面兩張圖有什么區別嗎?
它們看起來一樣,都是廣場風景照。只是右邊的仔細一看,會發現有些 " 奇怪的點陣 "。
但在 AI 的眼里,右邊的照片卻是一只哈士奇。為什么?
問題就出在那些 " 奇怪的點陣 " 里,原來把點陣重新組合,就能看到哈士奇的縮略圖。
這種騙過 AI 的方法其實并不新鮮,也不復雜。AI 技術還未流行的時候,已經有網友在泡論壇的時候發現了這種技巧:
把一張正常圖片縮小后在色情圖片里,沒點進帖子,縮略圖上看到的是一張無害照片。但是如果你當眾點開了這個帖子,一張黃圖顯示在眼前,立刻讓你 " 社會性死亡 "。
比如把著名的花花公子封面女郎 Lena 稍微偽裝一下,縮略圖就變成了一個長發男子。
在今年的 USENIX 安全研討會上,來自德國布倫瑞克大學的團隊提出了這種攻擊 AI 的方法:圖片縮放攻擊(image scaling attack)。
騙過 AI 和人眼
圖片縮放功擊的操作原理很簡單,把需要隱藏的圖像按比例插在新圖像的像素中,一般大圖是小圖的 5 到 10 倍。
當圖像交給 AI 模型處理時,出于計算成本考慮,系統一般會進行預處理,也就是圖片壓縮到比較小的尺寸。而且卷積神經網絡本身處理圖像時,還會進行池化(pooling)。
不僅 AI,人眼也會過濾掉圖像像素中的 " 少數派 ",被這種攻擊方法騙過。
下面,我們來看看把文章開頭的右側圖片用OpenCV的圖像壓縮預處理一下的結果:
廣場照真的變成了哈士奇。縮小的圖片和原來的圖片完全不一樣!
除了 OpenCV 外,該團隊還測試了PyTorch的 Pillow 和TensorFlow的 tf.image,幾種常見的圖像濾波器全部都中招了。
原理
縮放攻擊的根本原因是,下采樣和卷積相互作用的結果。通俗來說,就是算法沒有同等地考慮源圖像中的所有像素。
因此,攻擊者只需修改一小部分權重較高的像素,就能改變縮略圖,圖片其余大部分像素保持不變。
下面以一維情況來簡單說明一下攻擊的基本原理。
壓縮圖的像素是這樣算出來的:濾波器窗口在圖片源信號 s 上移動,將窗口中的每個像素值(圖中圓圈)乘以該位置窗口上的權重,得到縮略后的點值。
可以看到,輸出縮略圖圖中的第一個像素是 s 第三、第四個像素的平均結果,而第二個像素僅考慮了 s 第七個像素。導致 9 個像素中只有 3 個被用于計算縮略圖。
只有那些靠近內核中心(三角形部分)的像素會獲得較高的權重,而其他像素對縮略圖的作用有限。
如果算法的步長超過窗口寬度,甚至有些像素還會被忽略。因此,攻擊的成功取決于高權重像素的稀疏性。
如果要進行圖像縮放攻擊,需要做到兩點。首先,修改少數影響壓縮算法的像素;其次,攻擊圖像在視覺上與源圖像匹配。
如何預防
圖像縮放攻擊原理簡單,能同時騙過人眼和 AI,因此布倫瑞克大學團隊認為這種攻擊具有一定的迷惑性。
經過處理的圖像中,在后端,可以逃過 AI 對圖片的審查;在前端,可以騙過收集數據集的人,污染 AI 訓練數據集。
如果有人把這些圖像摻進自動駕駛訓練數據集,那么我們用訓練出來的自動駕駛系統可靠嗎?在這種情況下,汽車會不會發生意外?
當然,這種方法并非不可預防。
既然問題出在圖像壓縮的濾波器上,那么我們只要選擇合適的濾波器就能抵御攻擊。
實驗表明,中值濾波和隨機濾波對非自適應攻擊提供了有效的防御。
具體到代碼上,如果你在使用 OpenCV,可以通過在調用 resize API 時使用 interpolation 參數來解決,而不要使用默認值。
TensorFlow 2.0 依然容易受到攻擊,雙線性和雙三次縮放對圖像縮放攻擊具有魯棒性,可將參數 antialias 設置為 true,但是此舉會影響網絡性能。