照片里的秘密,你看到的不是你认为的,这种造假方法能同时骗过AI和人眼
来自 | 量子位
你能看出下面两张图有什么区别吗?
它们看起来一样,都是广场风景照。只是右边的仔细一看,会发现有些“奇怪的点阵”。
但在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,但是此举会影响网络性能。