5个课时实现车辆检测+安全算法,玩转智慧交通AI应用!
欢迎大家来到AidLux零基础边缘端智慧交通训练营~
在第三节课中,我们学习了用目标检测YOLOv5算法训练一个车辆检测模型,并进行了基于数据为中心的鲁棒性优化。
在第四节课中,我们又进行了对抗攻击与对抗防御的尝试,了解攻击者的手段和防御者的防御策略。
了解了智慧交通场景下攻击者可能使用的手段后,就可以更好的做各种防御者的预防工作了。
熟悉了检测算法流程和AI攻防策略,接下来我们将二者结合,进行AI安全项目的学习研究。
经过前面章节的学习,我们知道在智慧交通的很多场景中,检测任务是整个任务逻辑的首要环节,比如车牌检测识别、交通事件识别、行人车辆级联任务等。
而AI安全风险多发于算法解决方案中、前后任务的关键级联点中。
比如当我们检测出车辆时,后续要进行车牌检测识别、车辆属性识别、车型识别以及车标识别等级联任务。
这时如果攻击者将干净的车辆框替换成含对抗扰动的对抗样本,可能导致后续任务出现误判,比如原本是一辆卡车,需要判断是否超载,但是出现误判,变成了一辆小轿车,从而导致严重的安全风险。
本节课将结合车辆检测+AI安全+分类模型的模式,将攻击与防御注入到检测任务与分类任务的级联点中,完成AI项目的对抗攻防安全功能。内容框架如下:
1 AI安全项目功能讲解
2 车辆检测区域目标提取
3 AidLux端注入黑盒攻击样本
4 AidLux端项目注入黑盒防御策略
5 大作业讲解及完成方式
lesson5
1. AI安全项目功能讲解
第三节课,我们实现了车辆检测算法功能,在智慧交通场景中,一般是将检测到的目标区域进行提取,以便于后续的级联任务。
在本课程中,我们提取车辆目标的区域,可以进行后续的车牌识别、车型识别、车标识别、驾驶员行为识别等后续级联算法功能。
而AI安全风险也往往会在两个任务级联的关键路径中出现,比如当提取车辆目标区域时,针对小轿车有一套分析逻辑,针对大卡车有一套分析逻辑,但是因为被攻击的原因,导致分析逻辑出现错乱,就有问题了。
在上一节课中我们尝试了白盒攻击,因为我们知道使用了什么模型。
而在本节课,我们一起尝试使用黑盒攻击对项目的关键路径进行攻击,这也更加贴合实际应用,因为在真实场景下,我们并不知道对方使用了什么模型,所以只能进行黑盒攻击。
在本课程中,我们主要使用基于迁移生成的对抗样本,对本课程中车辆检测模型后续的级联分类模型进行黑盒攻击。
相应的对抗样本已经生成好了放在这里,百度网盘资料包的Lesson5_code/adv_code/adv_results中。
考虑到时间效率,本课程将车辆检测提取的目标直接用对应的对抗样本替换,并没有在线进行黑盒攻击。
上一节课中,我们使用白盒防御策略来应对可能存在的白盒攻击情形,本节课面对黑盒攻击,我们一起注入相应的黑盒防御策略,进行安全风险的抵御。
我们在YOLOv5模型与分类模型中增加一个对抗风险监测模型,当检测到AI安全风险时,返回告警信息和告警图片。
一般在实际应用的项目业务系统中,会出现一个告警弹窗。
比如某个图片被识别为对抗样本,出现告警信息,便会安排人员进行及时评估。
这时候,数据流会被切断,后续级联任务暂时停止,在评估好安全风险后,我们可以选择对这张图片进行对抗噪声破坏操作或者直接在算法流程中移除。
不过我们训练营中并没有业务系统,为了更加贴近实际,在本训练营中,我们才用了一种更加简单实用的方式,即通过微信“喵提醒”的方式。
讲解完AI安全项目的整体功能,接下来的小节中,我门对每个细分模块进行拆解。
2. 车辆检测区域目标提取
我们先进行第一步,从图片中将车辆相关的小图检测,并扣取出来,做后续的分析。
2.1 代码复制到AidLux
和之前AidLux的使用说明和详细操作实例一样,我们将Lesson5_code的代码,全部上传到AidLux的home下面。
还是通过Cloud_ip在电脑上访问AidLux,打开文件浏览器,进入home下方,点击上传按钮,将Lesson5_code文件夹进行上传。
在第三节课,我们完成了车辆检测模型的训练与优化,在实际智慧城市的AI项目中,包括车辆检测在内的检测任务往往是第一道工序,后续会级联如车牌识别、车型识别、车标识别、驾驶员行为识别等细分任务。
因此,我们需要将车辆区域提取,输入到后续的任务流中。
2.2 AidLux端车辆目标区域提取保存
我们依然使用SSH连接到AidLux的方式。大家也可以远程连接到Lesson5_code,当看到VScode左下角部分的SSH:AIDLUX呈现绿色,即说明远程连接成功。
在本章节中,我们使用一个函数来提取车辆目标区域,并将其保存至yolov5_code/aidlux/extract_results文件夹中。函数代码在yolov5_code/aidlux/utils.py中。
其中车辆目标区域的保存路径需要进行修改。
接着我们修改yolov5_code/aidlux/yolov5_extract.py文件,主要是两个路径需要修改:
我们再理解一下模型推理,车辆目标提取代码:
比起第三章的模型推理测试代码,这里我们增加了一个extract_detect_res函数来实现目标区域提取与保存。
接着我们运行yolov5_extract.py,可以看到如下log:
等代码运行结束,我们进入Lesson5_code/yolov5_code/aidlux/extract_results文件夹中,可以看到所有车辆目标提取图片。
在后续的任务中,我们选取部分数据放置在Lesson5_code/adv_code/orig_images文件夹中,用于对抗样本的生成。
3. AidLux端注入黑盒攻击样本
有了车辆区域后,就可以模拟真实的场景,模拟外部用户对模型进行攻击,使得模型识别的能力出现错乱。
经过前面课程的学习,我们已经知道对抗攻击分为白盒攻击与黑盒攻击,在第四章的时候,我们学习了白盒攻击与白盒防御的相关知识。
在本节课中,我们在使用白盒攻击的基础上,进行迁移攻击,形成基于迁移的黑盒攻击。
具体来说,上面我们已经将车辆目标区域提取出来,在实际AI项目中,攻击者一般难以获得算法模型的参数,白盒攻击难以展开。
这时,可以选择另外一个模型作为替身模型,比如我们知道他后面会进行车辆分类,但是不知道用的什么分类模型(实际上系统方用的Mobilenetv2),这时我们可以使用一个已有的分类模型(ResNet18)作为替身。
使用攻击算法对替身模型进行攻击,这样生成的车辆目标区域对抗样本一定程度上也会使得业务模型产生错误的输出。
3.1 PC端代码理解
针对迁移攻击的代码,放在Lesson5_code/adv_code/black_attack.py中了。
接下来我们一起理解一下具体代码细节。
(1)数据读取
首先我们进行数据的读取,我们需要修改的是img_path路径,在Lesson5_code/adv_code/orig_images中包含了一些已经提取的车辆目标图,大家可以进行迁移攻击,可以直观的看到效果。
(2)加载常规模型和替身模型
这里我们将Mobilenetv2作为常规模型,将ResNet18作为替身模型。
为什么加载两种模型呢?
在业务场景下,客户系统用Mobilenetv2,把扣取出的车的小图,识别成了出租车,这是正确的。
而替身模型,是攻击者自己掌握的模型,进行攻击后,生成新的攻击样本(比如在图片上增加了非常不起眼的扰动),这时再用常规模型Mobilenetv2,去进行分类识别时,看是否识别就错误了,比如识别成卡车、或者救护车了。
当攻击者掌握了以上的漏洞后,他在一些业务场景,增加这种不起眼的干扰因素,客户系统就会出现各种问题。
同样的,这次实验我们选择了Pytorch已经训练好的预训练模型ResNet18,运行代码时,会将相应的预训练权重下载下来。
如果出现下载有问题的情况,dont’t worry 我们也可以选择本地我们已经下载好的模型权重,在Lesson5_code/model/resnet18-5c106cde.pth中。
(3)生成具备迁移攻击性的对抗样本
在这里,我们全部使用替身模型ResNet18的相关信息进行对抗样本的生成,比如替身模型的参数,输出label。
我们还是使用PGD攻击算法,各参数和上一节课保持一致。除了使用PGD对抗攻击算法外,大家还可以使用其他的算法进行尝试,我们将在后面的小节中给出一些示例供大家参考。
(4)测试黑盒攻击的效果
对抗样本生成以后,我们用常规模型MobileNetv2进行测试。
我们可以看到,MobileNetv2将两个出租车识别成为了雄孔雀和牵引车。
(5)迁移攻击样本保存
我们将生成的对抗样本保存在Lesson5_code/adv_code/adv_results中,可以看到,这里已经生成了一些对抗样本,大家可以方便地进行测试。
3.2 PC端黑盒攻击样本效果验证
我们运行Lesson5_code/adv_code/black_attack.py代码,可以看到,虽然攻击的是ResNet18模型,但是对抗样本依然能够影响MobileNetv2,使其输出错误类别。
比如下面一辆车,原本是cab出租车,但是增加扰动攻击后,就被识别成购物运输的马车了。
比如下面一辆车,原本也是cab出租车,但是增加扰动攻击后,就被识别成购物运输的slot了。
4. AidLux端项目注入黑盒防御策略
面对上面讲到的实际场景中可能存在的黑盒攻击,我们就需要提前准备,设计相应的黑盒防御策略。
在业务系统中,可以通过防御策略,比如通过二分类模型(正常图片和扰动图片),告知工作人员,图像中可能出现安全风险,这样系统就更加安全了。
那么有哪些黑盒防御策略呢?
具体来说,黑盒防御策略主要有数据预处理,设计鲁棒性模型结构,使用对抗样本监测模型等方法。
方法有很多,不过为了大家快速掌握,本课程主要使用对抗样本监测模型的形式。
下面,我们就来讲解一下。
4.1 对抗攻击监测模型理解
在前面的学习中,我们知道,对抗攻击监测模型是一个能够捕捉对抗扰动的二分类模型,监测模型的输入是一张图片,输出则是两个类别,0表示图片是正常图片,1表示图片是具有安全风险的图片。
本次训练营中,我们直接使用了一个已经训练好的基于ResNet50的模型,作为本次训练营的监测模型。
在实际场景中,当数据流中的图片进行AI项目中时,在一些关键节点处,可以前置一个监测模型,用于判断输入数据是否存在安全风险,如果发现对抗样本,则及时告警,并切断后续的算法功能,避免不确定风险的产生。
比如在智慧交通场景中,对每一个车辆进行提取,再进入对抗攻击监督模型判断是正常的图片,还是具有安全风险的图片。
本课程中的监测模型代码如下所示:
4.2 系统告警
当对抗攻击监测模型,监测到对抗样本或者对抗攻击后。
一般在实际场景的AI项目中,会出现一个告警弹窗,并且会告知安全人员及时进行安全排查。
当然我们此次训练营并没有业务系统,为了更加贴近实际,本次训练营采用一种简单的方式,当然也比较实用,即通过微信“喵提醒”的方式来实现。在后面的大作业中,我们也会使用到。
(1)新建喵提醒账号
首先关注“喵提醒”公众号,点击回复消息中最后的“注册账号”,填写手机号码进行注册,注册后跳到后台页面可以看到,今天还能收到提醒100条信息,基本上是够用的。
注册完成后,回到公众号页面,点击菜单栏的“提醒”,并选择新建。
然后我们填写新建提醒的相关信息,点击最后的“保存”,页面会自动加载,中间的部分会自动跳出自己账号专属的“喵码”和“网站”,后面的代码中,我们主要使用“喵码”进行告警的反馈。
(2)喵提醒代码测试
为了测试喵提醒的效果,大家可以运行Lesson5_code/adv_code/miaotixing.py。
不过需要注意的是,代码中的id要改成自己的“喵码”,不然喵提醒信息会发送到别人那里。
另外,text信息需要修改成告警信息,这里修改成“出现对抗攻击风险”的信息,大家也可以改成其他告警信息。
运行代码后,我们的手机上会收到一条告警信息。
(3)对抗攻击监测 + 喵提醒
首先,我们需要修改对抗样本读取的路径img_path:
接着我们进行级联分类模型的配置,我们依然使用class的形式:
最后,我们设计告警逻辑,我们将输入后续级联任务模型的图片先经过对抗攻击模型网络。
如果被识别为对抗样本,那么使用喵提醒逻辑进行告警,如果被识别为干净样本,则开启后续级联任务的正常流程。
(4)对抗攻击监测 + 喵提醒效果验证
我们还是像之前一样,在AidLux平台上修改上面讲过的参数,运行代码。当我们选择Lesson5_code/adv_code/adv_results中对抗样本作为输入,可以看到微信上会反馈安全风险告警。
当我们选择Lesson5_code/adv_code/orig_images干净样本作为输入,可以看到顺利进行后续级联任务的流程。
4.3 破坏对抗噪声的预处理模块
除了上面讲到的对抗攻击监测模块以外,我们也可以在 AI项目预处理阶段加入能提高模型鲁棒性的防御策略。
在预处理阶段的对抗防御策略中,对图像进行随机裁剪缩放和增加白噪声都能破坏对抗噪声结构,从而减弱对抗样本的威胁。
增加噪声破坏对抗噪声结构的方法主要是通过对输入图像添加微小的白噪声,使得对抗样本中本身就十分微小的对抗扰动结构破坏,从而一定程度上消除对抗扰动带来的影响。
下图主要使用对图像进行随机裁剪缩放的策略,来增强对扰动不明显的对抗样本的防御效果。
5. 大作业讲解及完成方式
到这里,本次训练营就要进入尾声了,通过这五节课,我们主要学习了智慧交通与AI安全的相关知识,训练优化了车辆检测模型,并尝试应用了对抗攻击与对抗防御的策略,最后完成了检测功能+AI安全功能+后续级联功能的智慧交通AI算法解决方案。
本次训练营最后留一个大作业,针对前面讲到的对抗样本监测模型与交通场景中存在的黑盒攻击风险,我们在此基础上优化对抗样本,并将车辆检测结果+对抗样本生成+对抗防御策略串联形成完善的AI安全功能。
5.1 作业流程
大作业的目的是使用车辆检测结果+对抗样本生成+对抗防御策略,完成AI安全风险预警的业务功能。
完成作业的整个流程,主要分为几个部分:
5.1.1 代码实现
大家可以参考本章节前面的代码示意以及之前课程中的代码,完成整体AI安全风险预警项目的开发和实现。主要有两个部分的作业:
(1)生成对抗样本
第一步我们先模拟攻击者,生成可以使得业务系统中,车辆分类识别会出现问题的对抗样本。
那么如何评判对抗样本的生成是有效果的呢?
这时就需要用到前面4.1中的监督模型ResNet50的模型,针对一张图片,会输出两个类别,正常图片0,有风险的图片1,从而判断我们生成的对抗样本是否有效果。
比如左面的车辆小图,原本是cab出租车,经过对抗攻击,生成右面的图片后,再输入ResNet50模型后,如果输出0,则表示对抗样本输出的不成功,没有生成具有安全风险的图片。
如果输出1,则表示对抗样本的制作是成功的,因为生成了具有安全风险的图片了。
这里用到的数据,可以从Lesson5_code/adv_code/orig_images中选择。
生成对抗样本的代码已经在上面3.1中详解拆解过,大家可以温习一下,主要流程的代码如下:
其中,本次作业中需要修改的是攻击算法部分。关于如何优化对抗样本,可以通过调整参数的方法:
也可以使用不同的对抗攻击算法进行尝试,这里给一些示例:
我们将生成的有效的对抗样本以及相关思路介绍word文档进行提交,作为大作业的一部分内容。
(2)整体业务功能串联
有了前面的对抗样本,即一张图片中其实暗藏着安全风险的图片。
这时就将前面的业务逻辑串联,判断每一个车辆是正常图片还是有安全风险的图片。
如果是正常图片,就进入后面的车辆分类的判断,如果是有安全风险的图片,则通过喵提醒来进行告警。
那么整体业务功能串联,主要包含以下几个部分:
a.车辆检测+检测框小图提取。
这里可以参照前面2.2的代码。
我们将source改成Lesson5_code/adv_code/test_images,里面有可以用于业务功能串联的图片。
比如得到一个个车辆的小图。
接下来,我们尝试两种方式,分别是不进行对抗攻击与对车辆目标图进行对抗攻击,看看会出现什么情况。
首先,我们不进行任何攻击,我们使用Lesson5_code/adv_code/test_images中的vid_5_31560.jpg,经过YOLOv5输出了图中车辆目标区域,并直接将其输入到后续的监测模型模块和级联分类任务中。
然后我们在尝试进行对抗攻击,将这些车辆目标图进行对抗攻击,生成相应的对抗样本,由于对抗攻击耗时较久,我们这里不进行在线的攻击,我们直接使用本地已经生成好的对抗样本将原始的车辆目标图进行替换,对抗样本路径为Lesson5_code/adv_code/adv_results。
具体来说,比如当我们输入车辆检测模型的是Lesson5_code/adv_code/test_images中的vid_5_31560.jpg,输出了图中车辆目标区域。
我们为了增加攻击效率,直接调用Lesson5_code/adv_code/adv_results中对应的vid_5_31560.jpg_0.png作为对抗攻击后的车辆目标区域图片,输入后续的监测模型等任务流程中。
大家可以编写相应的代码实现这里讲的相关图片匹配和读取功能的代码以及是否使用对抗样本的逻辑判断代码。
上面的两种形式,我们都将其输入到后续的对抗防御监测模型以及级联的业务模型中,这里可以参照4.2中的代码:
总的来说,我们需要在AidLux中将车辆检测+检测框提取+使用对抗样本+AI安全监测与告警功能串联,完成功能代码的撰写。
(一张图片跑通即可;编写一个app_main.py命名的程序启动Python文件,来运行整个算法流程;若能将整个流程录制视频,更能额外加分)
5.1.2 代码实现文章编写&分享
将完成项目的开发和实现过程,以图文+视频的形式写成文章,里面包含代码和使用心得,分享到技术社区。
参考作品模板可以看这里。
5.2 作业奖励
完成本次训练营的学习并完成最终作业的同学,可以提交交流,符合要求的,可以领取精美礼品(长期有效)。
5.3 认证开发者
AidLux认证开发者计划正式开启,提交作品成为认证开发者,高通边缘计算设备、创作激励等丰厚奖励等着你~
本次智慧交通训练营的全部课程到此结束了,感谢大家的学习,也期待大家的作品。
用AidLux,每个人都能轻松落地AI应用。