5个课时实现车辆检测+安全算法,玩转智慧交通AI应用!
欢迎大家来到AidLux零基础边缘端智慧交通训练营~
在第三节课中,我们学习了在云服务器上使用Yolov5算法,训练了一个车辆检测模型并进行优化。
我们在前面说过,会构建一个车辆检测+AI安全的算法功能,也在前面学习了解了车辆检测模型的训练测试以及部署。
本节课,我们来学习智慧交通AI安全功能中非常重要的一个分支——对抗攻击&对抗防御的相关知识与应用。内容框架如下:
1 常用AI对抗攻击算法讲解
2 常用AI对抗防御算法讲解
3 PC端AI对抗攻击算法效果验证
4 AidLux端分类模型的部署与效果验证
5 课堂内容总结
1. 常用AI对抗攻击算法讲解
对抗攻击(adversarial attack)是AI安全方向的重要分支,其核心逻辑是在数据中增加一些微小扰动,在人类视觉系统无法察觉的情况下,使得算法模型对这些数据产生误判。其中被增加扰动的数据也称为对抗样本。
下面是一些直观的通过增加对抗噪声来让算法模型误判的例子:
在上图的熊猫图片中加入微小的对抗噪声,就能让AI模型将其误判为长臂猿。
下图是之前第一节课和第二节课带大家认识的不同对抗攻击逻辑,大家可以看图温习一下,也可以对照着之前的课件回顾一下:
我们该怎么去理解对抗样本呢?总的来说,我把它当作生成噪声的艺术,其攻击价值的底层依托是算法模型的过拟合问题。
1.1 对抗攻击算法的场景应用
在智慧交通场景中,由于通常来说场景多样复杂(卡口、出入口、十字路口、停车场等),环境多样复杂(白天、夜晚、雨天、大雾天、反光等),场景目标复杂多样(机动车种类多、非机动车种类多、行人流量大、交通事件种类繁杂等),让对抗攻击有了很广泛的应用价值。
对于攻击者来说,上述场景、环境、场景目标都可能是其攻击对象,这些在前三节课中都已经涉及,这里就不再展开。
对于防御者来说,对抗攻击作为AI安全方向中的一个分支,其能让算法解决方案提供方对攻击者知己知彼,促进算法模型去提升其鲁棒性与防御性。
接下来,我们讲讲对于防御者,该如何应用对抗攻击技术。
对抗攻击技术可以作为智慧交通AI业务的鲁棒性与安全性检查工具,用于算法解决方案的测试短,对算法解决方案可能存在的安全风险,早发现、早解决、早完善。
通过研究对抗攻击,来增强对实际场景中受到的攻击种类与情形的判断力,从而能够更好的设计相应的对抗防御方法。
使用对抗攻击对敏感信息进行隐藏,比如在交通场景的敏感数据进行对抗攻击,防止数据被非法分子破解和利用。
再比如对抗攻击与验证码相结合,对原始验证码有针对性的加入干扰,使得人眼识别不受影响,但会显著降低人工智能模型的识别率,从而防范打码平台的破解,同时保持用户体验。
而防御者最直接了当的使用对抗攻击的形式是对抗训练。
使用对抗样本在模型训练过程中进行对抗训练,我们在训练时将对抗样本加入训练集一起训练,即为对抗训练。
进行对抗训练能扩充训练集的可能性,使得数据集逼近我们想要的数据分布,训练后的模型鲁棒性和泛化性能也大大增强。
1.2 常用AI对抗攻击算法划分
上面我们了解了对抗攻击对AI项目带来的安全风险与场景应用,接下来我们再了解一下目前主流对抗攻击算法的总体分支与逻辑:
其中,当算法模型参数和训练数据等信息被攻击者所掌握,并且攻击者在此基础上进行的针对性攻击称为白盒攻击。白盒攻击主要分为基于梯度的攻击,基于优化的攻击以及基于GAN的攻击。
而在对算法模型的结构和参数一无所知,甚至相关训练数据也一无所知的情况下,进行攻击的过程称为黑盒攻击。
黑盒攻击主要分为基于迁移的攻击和基于查询的攻击两大类。
基于迁移的攻击逻辑由白盒攻击延伸而来,一般会有一个白盒模型作为替身模型(surrogate)进行攻击,而生成的对抗样本一般也会对其他模型有一定的迁移攻击性。
基于查询的攻击其主要是通过查询黑盒模型的输出信息,对黑盒模型进行直接的攻击,但完成整个攻击流程往往需要大量的查询,容易被模型所有者检测到异常。
再者,基于此我们再介绍两个有趣的攻击策略:
有目标攻击(targeted attack):通过攻击使得模型将特定数据错误输出到指定的label上。
无目标攻击:通过攻击使得模型将特定数据错误输出到除真实label外的其他任何label上。
比如一个10类别的包含猫狗的分类模型,针对有目标攻击,我们通过生成对抗样本,想让分类模型将猫的类别错判成狗。而无目标攻击,并不限定特定类别,只要模型发生错判即可。
(1)白盒攻击
基于迁移的攻击,我们先介绍最经典的FGSM算法,YOLOv4使用的SAT(self adversarial training)技术就是基于FGSM开展。
FGSM(Fast Gradient Sign Method) 是第一个使用模型梯度信息来进行对抗攻击的算法。
为什么使用梯度信息进行攻击会有效果呢?
直观地来说,我们想要模型输出错误预测,那就要增大模型对输入数据的loss,而这正好与模型训练时往梯度下降,loss减少的方向相反。
由于模型的参数与结构保持不变,那么我们只有通过原图+梯度信息->更新图像的步骤来实现这个逻辑。
PGD(Projected Gradient descent)是FGSM算法的一个优化版本。其在FGSM基础上引入了迭代攻击的思想,将多次攻击后的数据作为最终的对抗样本。
而基于优化的攻击算法的基本逻辑是将攻击流程转换为一个优化问题,以更小的扰动来生成更加高效的对抗样本。
其中Deepfool攻击算法是基于超平面分类的攻击方法,其通过迭代计算的方法生成最小规范对抗扰动,将位于分类边界内的图像逐步推到边界外,直到出现错误预测。
基于GAN的攻击。AdvGAN将GAN思想引对抗攻击,通过生成器生成对抗扰动,添加到干净样本中。而判别器主要负责判别输入的是对抗样本还是干净样本。整个对抗训练过程转化成GAN经典博弈过程。
(2)黑盒攻击
黑盒攻击主要有基于迁移的攻击和基于查询的攻击。
基于迁移的攻击主要由白盒攻击扩展,一般来说,通过白盒攻击生成的对抗样本,一般对不同的算法模型具备一定的迁移攻击性。
而基于查询的对抗攻击首先设定一个搜索空间,并通过不断的查询模型的输出来优化对抗扰动。
更多攻击算法的介绍可以查阅以下的相关材料:https://zhuanlan.zhihu.com/p/...
2. 常用AI对抗防御算法讲解
在对抗攻击技术出现之后,对抗防御技术也孕育而生。对抗防御一般针对对抗攻击技术而展开,有针对特定攻击的特定防御,也有一般性防御策略,下面我们就一起学习一下。
2.1 对抗防御算法的的场景应用
在智慧交通场景中,常用的对抗防御方法有与对抗攻击结合紧密的AI业务的鲁棒性与安全性检查工具;研究对抗攻击,来增强对实际场景中受到的攻击情形的判断力;使用对抗攻击对敏感信息进行隐藏;使用对抗样本在模型训练过程中进行对抗训练。
当然,除了上面讲到的与对抗攻击结合的形式,还包括在算法解决方案中加入防御预处理,设计鲁棒模型结构,加入对抗攻击检测模型等方法。
由于智慧交通场景的算法解决方案对耗时和内存占用有较高的要求,所以防御预处理与防御后处理作为常规防御的首要选择。
同时,针对可能存在的安全风险,在开发阶段,设计鲁棒性的模型结构,提升算法解决方案的整体安全性。
或者训练轻量级的对抗攻击检测模型,作为算法解决方案的安全模块,在受到攻击风险时,启动防御算法功能。
具体来说,我们需要生成一些对抗样本,并将其和干净样本一同作为训练集,训练一个能够捕捉对抗扰动的二分类模型,并将其作为实际AI项目中的一个前置防御模块。
2.2 常用AI对抗防御算法划分
上面我们了解了对抗防御的场景应用,接下来我们再了解一下目前主流对抗防御的总体分支与逻辑:
其中对抗训练是指在训练过程中加入对抗样本,通过不断的学习对抗样本的特征,从而提升模型的鲁棒性。
监测识别对抗样本顾名思义,在项目关键节点处,设置一些能够识别对抗样本的特种模型,从而提前预警对抗攻击风险。
模型鲁棒结构设计是指在模型中设计特定的滤波结构能够一定程度上增强模型鲁棒性,抵御对抗噪声。
对抗扰动结构破坏主要在数据流处理的时候使用,通过一些滤波算法,噪声结构破坏算法,噪声覆盖算法等策略,减弱对抗噪声的影响,使其不能对模型造成攻击。
梯度掩膜则是在白盒对抗防御中非常高效的一种算法,因为其能掩盖真实梯度,从而能够使得白盒攻击算法失效。
本章中在后面小节使用到的对抗防御方法主要是基于梯度掩膜的GCM模块。
GCM模块通过改造输入,使模型在前向测试时并不影响原来的结果,但是在进行梯度反向传播时,能隐藏原来的梯度,使得白盒攻击无所适从。
下图是加入GCM模块后的模型梯度反向传播图示:
同时我们设置很大的w参数,设置很小的epsilon参数,使得攻击算法在获取梯度时会得到一个很大的数,其与算法模型的有效梯度流无关,相关函数在Lesson4_code/adv_code/robust_layer.py中。
3. PC端AI对抗攻击算法效果验证
前面了解了对抗攻击与对抗防御的相关知识,我们来进行对抗攻击算法的代码实现以及效果验证。
本节课中,我们主要尝试白盒攻击以及白盒防御的算法,代码放在百度网盘资料包的Lesson4_code文件夹中。
大家可以点击这里进入AidLux AI开发者交流群,在群公告处获取下载链接。
3.1 对抗攻防相关依赖库的安装
我们先在PC端进行测试(用咱们自己的电脑就行),需要安装下面的一些依赖库:
安装skimage库:
pip install scikit-image -i https://pypi.tuna.tsinghua.ed... some-package
安装torch和torchvision(如果在第三节课中已经配置,则不需要重新配置):
pip install torch==1.8.1 -i https://pypi.tuna.tsinghua.ed... some-package
pip install torchvision==0.9.1 -i https://pypi.tuna.tsinghua.ed... some-package
3.2 PC端代码理解
(1)数据读取
在Lesson4_code/adv_code/attack_code.py中,首先我们需要修改图片读取路径:
将img_path中的参数改成自己的路径,测试图片在Lesson4_code/adv_code/images中,里面包含了校车,警车,卡车,出租车,自行车,轿车等图片可供我们测试。
(2)模型配置加载
完成了数据读取部分的修改,我们现在就可以加载模型了,这次实验我们选择了Pytorch已经训练好的预训练模型Mobilenet_v2,运行代码时,会将相应的预训练权重下载下来。
如果出现下载问题,dont’t worry 我们也可以选择本地我们已经下载好的模型权重,在Lesson4_code/model/mobilenet_v2-b0353104.pth中。
(3)模型测试
接着我们进行模型的效果测试,并且输出原label作为后续对抗攻击的素材。
(4)使用对抗攻击算法
接着我们使用刚才讲过的PGD攻击算法进行白盒攻击,将原模型model作为受攻击模型,eps代表对抗扰动的范围,eps_iter代表一次攻击的步长,nb_iter代表攻击次数,rand_init代表是否在一开始生成一个随机的对抗扰动。
等待一段时间,攻击就完成了,此时会输出对抗样本advimg。
(5)对抗攻击前后效果对比
最后我们使用show_iamges函数来直观展示源图片,对抗扰动,对抗样本以及模型的输出结果。
3.3 对抗攻击效果验证
测试集中总共有6张图片,分别是不同的交通工具图片。
我们可以看到经过攻击后,模型将山地自行车错判成三轮车。
将敞篷车错判成小巴士。
将出租车错判成美洲驼。
将卡车错判成scale。
将警车错判成了跑车。
将校车错判成原声吉他。
了解了上面的实验结果,可以看到,PGD对抗攻击的效果还是非常好的,只是添加了人眼系统一时无法分辨的微小对抗扰动,就可以使得AI模型出现严重的误判,这在智慧交通场景中,可能会引起很多不确定风险。
4. PC端AI对抗防御算法效果验证
既然对抗攻击的效果如此强,并且会引发重大安全风险,那么我们就必须进行对抗防御。
本小节将带着大家尝试白盒防御的实验,本次白盒防御算法选用刚才讲到过的GCM防御模块。
对抗防御代码需要的依赖库和对抗攻击代码的一致,大家只要安装了对抗攻击所需的依赖库就可以了。
看看是攻击者的剑厉害,还是防御者的盾更厉害!
4.1 PC端代码理解
(1)数据读取
在Lesson4_code/adv_code/defense_code.py中,首先我们还是需要修改图片读取路径:
将img_path中的参数改成自己的路径,测试图片在Lesson4_code/adv_code/images中,里面包含了校车、警车、卡车、出租车、自行车、轿车等图片可供我们测试。
(2)GCM防御模块+ AI模型配置
在对抗防御阶段,为了保持和对抗攻击一致,还是选用Mobilenet_v2模型,依旧使用预训练参数的形式,只是这次我们使用了class的形式,这样方便我们使用GCM模型作为防御模块嵌入模型中。
(3)对抗防御流程
接下来的数据预处理,测试模型输出,对抗攻击过程以及输出对抗样本的过程和上一小节一样,只是模型增加了防御模块。
4.2 对抗防御效果验证
这次我们依旧使用测试集中的6张交通工具图片。我们运行defense_code.py代码,可以看到如下的结果展示:
图片
我们可以看到,模型并未受到对抗攻击的影响,还是输出了正确的结果。
将使用防御模块后生成的对抗扰动与未使用防御模块的对抗扰动进行对比,我们可以发现,防御模块确实起到了应有的防御作用:
5. AidLux端分类模型的部署与效果验证
上面我们已经将对抗攻击和对抗防御的整个流程都跑通了,并且对结果有了直观的了解。
由于第五章节中要进行车辆检测+AI安全+分类模型的功能串联,需要将我们在AI安全功能中使用的分类模型以及很多Pytorch代码在AidLux端进行部署和效果验证。
5.1 Lesson4_codes代码上传
首先通过Cloud_ip在电脑端访问AidLux,将Lesson4_codes代码文件夹上传到home文件夹下。
在第二节课的时候,我们使用SSH,将PC端的VScode连接到AidLux端代码的方式,我们再进行连接一下。
5.2 AidLux依赖库安装
同样在AidLux命令行界面安装依赖库:
安装skimage库:
pip install scikit-image -i https://pypi.tuna.tsinghua.ed... some-package
安装torch和torchvision:
pip install torch==1.8.1 -i https://pypi.tuna.tsinghua.ed... some-package
pip install torchvision==0.9.1 -i https://pypi.tuna.tsinghua.ed... some-package
这边已经安装好了,大家只要按顺序安装就行:
5.3 Pytorch分类模型部署与测试
我们主要是使用Lesson4_code/adv_code/aidlux.py进行测试。
首先我们还是需要修改图片读取路径img_path:
由于实际中攻击一般不会在端侧进行,于是将代码中的攻击算法参数进行修改:
需要注意的是:
由于我们是进行Pytorch原生模型在AidLux部署,运行代码时可能会遇到 OpenBLAS Warning : Detect OpenMP Loop and this application may hang. Please rebuild the library with USE_OPENMP=1 option
这时需要在命令行输入export OMP_NUM_THREADS=1。
最后运行代码,就可以看到代码能够在AidLux上适配:
在后面第五节课中,我们会基于对抗攻击与防御在项目中做更多尝试。
6.课堂小结
第四节课主要是先从对抗攻击与对抗防御的场景应用和算法划分角度入手,和大家一起了解行业现状。
然后一起学习完成了对抗攻击与对抗防御的实验,过程非常有趣,大家也可以慢慢温习下本节课的内容。
第五节课,我们将使用车辆检测+AI安全+分类模型来完成更多的算法功能,大家也可以将前四节课再次回顾一下。
好了,本节课的内容到这里就结束了。
大家可以加入AidLux AI开发者交流群,群内有AidLux工程师和江大白、Rocky等众多AI行业专家,可以给予技术指导以及进行交流互动。
本节课所需的数据集、资料包,大家可以在AidLux AI交流群内获取呦~