Advertisement

基于AidLux平台的智慧交通中对抗防御监测应用评测

阅读量:

一、前言

智慧交通领域主要通过分析行人、机动车以及非机动车的行为模式来构建智能管理系统。然而,在这些复杂任务的过程中可能会遇到一些挑战性问题。例如在数据分析环节可能会出现人工定制的数据集会导致黑箱算法模型出现偏差判断的问题;此外过度利用数据的现象还会引发数据偏差问题进而影响系统的公平性与隐私性保障。特别是在安全性层面存在明显的漏洞例如对抗攻击可能导致AI系统出现偏差判断从而引发潜在的安全隐患这时就需要开发相应的防御机制来降低潜在的安全隐患。

本文选取智慧交通中的对抗防御监测应用作为案例研究对象,并详细分析基于AidLux平台开发的"车辆检测技术、自动识别与定位信息提取系统"及其伴随的"对抗样本生成系统"和"智能安全监控系统(具备实时告警能力)"。

二、AidLux环境配置

Adlux遵循ARM架构构建了一个多平台生态系统(Android/鸿蒙+Linux),为AIOT(智能网联技术)提供全方位支持的应用开发解决方案。通过将配备Adlux的应用程序安装在安卓手机或边缘设备并与PC建立连接后完成操作即可实现代码移植和调试功能,并最终实现应用程序测试。

如果使用安卓手机,则可通过应用商店下载特定版本的Aidlux软件并进行安装步骤。完成安装后启动设备并执行初始设置流程后需完成注册与登录操作即可进入其操作界面。在该界面内你可以访问examples模块以便尝试一系列AI功能案例。此外你可以将设备连接至同一局域网内的同一台PC设备通过本地网络实现连接过程请先单击操作界面中的Cloud_ip图标以获取设备IP地址随后打开浏览器并输入AI_dlux账号信息即可查看手机端软件的画面切换至文件管理模块即可执行必要的数据操作包括上传下载及修改等功能

在调试代码的过程中发现手机界面的操作较为繁琐,在此情况下建议采用电脑端安装的VSCode软件进行辅助操作以提升效率。具体思路在于将智能手机视为一台远程服务器,并在PC端利用SSH协议与其建立通信以完成数据传输与控制流程细节请参考相关文献:包括《厉害了我的哥:基于AidLux平台的人流统计应用评测》(https://zhuanlan.zhihu.com/p/578688643)以及《智慧安防AI实战训练营:边缘端实现越界识别》Lesson2(https://docs.qq.com/doc/DWEdSV2ZwdHVEQWJv)这两篇资源

三、车辆检测模型的训练和部署

3.1,在获取并预处理阶段中完成数据收集与整理工作。该平台提供的是官方提供的车辆数据集,并可通过以下链接访问:Car Object Detection | Kaggle)。为了方便后续模型训练需求,在完成数据标注后需将标签信息转换为YOLOv5可训练格式,并采用9:1的比例分割数据集(其中90%用于训练模型),剩余部分作为验证用例以确保模型泛化能力)。

3.2,在服务器上进行目标检测模型的部署。获取YOLOv5算法的源代码库,并启动该框架的学习过程。随后创建car.yaml配置文件作为任务所需的超参数配置路径。完成之后,在 train.py 文件中设置相关的训练参数选项以及优化器的选择项。接着引入预训练好的yolov5n权重文件到当前项目中,并更新本地存储目录下的 models/yolov5n.yaml 文件内容以完成权重迁移操作。最后选择YOLOv5官方推荐的镜像环境并按照指导完成安装步骤

3.3节中涉及PC端车辆检测模型的推理测试工作。首先需要完成PyTorch核心库的安装以及所有其他依赖库的安装;随后打开detect_image.py文件进行操作,在此过程中主要对代码中的模型参数设置、图像路径配置以及相关yaml配置文件进行调整和优化

3.4阶段任务:Aidlux端模型推理测试项目实施过程。
具体步骤如下:

  1. 将pt格式的模型转换为tflite格式。
  2. 开发并实现Aidlux端的推理功能。
  3. 将开发的推理逻辑编码并导入至Aidlux平台中运行。
  4. 通过远程终端连接至Aidlux软件后台服务。
  5. 进行完整的推理测试流程验证。
  6. 修改utils.py文件中的分类标签设置为coco_class=['car']。

3.5,在基于增强技术的扩展性方面表现突出。为了提升模型对训练数据的增强效果以及提高其抗干扰能力(即鲁棒性),建议采用数据增强技术进行优化训练工作。以imgaug为例(如图所示),该库集成了色彩调制、模糊处理、混合叠加以及天气模拟等多种数据增强功能,并提供了便捷的操作接口和详细的使用文档支持)。网址:https://github.com/aleju/imgaug。(生成图像如下)

​四、对抗攻击和对抗防御测试

4.1,对抗攻击

Adversarial attacks represent a crucial research area within AI security, characterized by the strategic insertion of subtle perturbations into data in a manner that remains imperceptible to human visual systems, thereby inducing machine learning models to make erroneous predictions. Among the data altered in this way, those perturbed samples are also referred to as adversarial examples, which can be seen as a form of artificial noise. The fundamental basis for their effectiveness lies in the phenomenon of overfitting in machine learning models.

抗扰算法在防御者与攻讦者之间具备多方面的运用潜力。目前主流抗扰算法主要包括白色方框技术和黑色方框技术两大类。白色方框技术主要包含梯度导向型攻讦、优化导向型攻讦以及生成对抗网络(GAN)导向型攻讦三种类型。黑色方框技术则主要可分为迁移导向型攻讦与查询导向型攻讦两类主要形式

CV算法兵器

CV算法兵器

CV算法兵器

全面解析相关攻击技术及其应用情况,请参考 Rocky Ding 的作品《CV算法 BX-117: 晓风残月 -> 对抗攻击 BX-117 大放送》(综述篇)。

4.2,对抗防御

伴随对抗攻击技术的出现而发展起来的则是对抗防御技术。随着人工智能等新兴技术的发展,在AI业务中进行鲁棒性与安全性检查工具的研发已成为主流方向之一。研究人员通过研究先进威胁手段来提升系统在实际环境下识别并应对威胁的能力已成为当前的研究热点之一。为了更好地保护敏感信息不被泄露或篡改,在数据处理过程中采取抗干扰手段来保护关键信息也成为重要措施之一。为了提高模型的安全性,在训练过程中加入抗干扰训练方法已成为必要的防护手段之一

例如,在面临遭受攻击威胁的情况下, 我们将开发一种轻量化对抗攻击检测机制, 该机制可作为安全防护的核心组件, 并在实际应用中展现出显著的安全性能保障作用。具体而言, 我们将通过以下步骤实现这一目标: 首先, 创建一批高质量的对抗样本, 并将其与真实数据样本结合使用, 从而训练出一种能够识别并捕获抗干扰特征的二分类模型; 最后, 将该技术方案整合进实际AI系统的安全防护体系中, 并持续优化其性能指标.

目前主流的对抗防御方法主要包括以下几种类型:
1)抗干扰训练是一种通过在训练过程中引入受控攻击样本来持续优化模型的方法。
2)监测识别技术则是实时监控和识别潜在威胁的一种手段,在项目关键节点部署专门的检测模块以提前发现潜在的安全漏洞。
3)构建特定的滤波机制能够在一定程度上增强模型对干扰信号的鲁棒性。
4)抗干扰策略则主要应用于数据流处理阶段,在这一环节采取多种滤波措施以削弱干扰信息对系统的影响。
5)梯度掩模是一种高效的白盒防御手段,
它通过掩盖真实梯度的方式成功阻止了白盒攻击算法的有效实施

4.3,对抗攻击算法效果验证

安装skimage库:

复制代码
 pip install scikit-image -i https://pypi.tuna.tsinghua.edu.cn/simple some-package  
    
 pip install torch==1.8.1 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 
    
 pip install torchvision==0.9.1 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

PC端代码示例:(Lesson4_code\adv_code\attack_code.py)

复制代码
 import os

    
 import torch
    
 import torch.nn as nn
    
 from torchvision.models import mobilenet_v2
    
 from advertorch.utils import predict_from_logits
    
 from advertorch.utils import NormalizeByChannelMeanStd
    
  
    
 from advertorch.attacks import LinfPGDAttack
    
 from advertorch_examples.utils import ImageNetClassNameLookup
    
 from advertorch_examples.utils import bhwc2bchw
    
 from advertorch_examples.utils import bchw2bhwc
    
  
    
 device = "cuda" if torch.cuda.is_available() else "cpu"
    
  
    
 ### 读取图片
    
 def get_image():
    
     img_path = os.path.join("./Lesson4_code/adv_code/images", "mountain_bike.png")
    
     img_url = "https://farm1.static.flickr.com/230/524562325_fb0a11d1e1.jpg"
    
  
    
     def _load_image():
    
     from skimage.io import imread
    
     return imread(img_path) / 255.
    
  
    
     if os.path.exists(img_path):
    
     return _load_image()
    
     else:
    
     import urllib
    
     urllib.request.urlretrieve(img_url, img_path)
    
     return _load_image()
    
  
    
 def tensor2npimg(tensor):
    
     return bchw2bhwc(tensor[0].cpu().numpy())
    
  
    
 ### 展示攻击结果
    
 def show_images(model, img, advimg, enhance=127):
    
     np_advimg = tensor2npimg(advimg)
    
     np_perturb = tensor2npimg(advimg - img)
    
  
    
     pred = imagenet_label2classname(predict_from_logits(model(img)))
    
     advpred = imagenet_label2classname(predict_from_logits(model(advimg)))
    
  
    
     import matplotlib.pyplot as plt
    
  
    
     plt.figure(figsize=(10, 5))
    
     plt.subplot(1, 3, 1)
    
     plt.imshow(np_img)
    
  
    
     plt.axis("off")
    
     plt.title("original image\n prediction: {}".format(pred))
    
     plt.subplot(1, 3, 2)
    
     plt.imshow(np_perturb * enhance + 0.5)
    
  
    
     plt.axis("off")
    
     plt.title("the perturbation,\n enhanced {} times".format(enhance))
    
     plt.subplot(1, 3, 3)
    
     plt.imshow(np_advimg)
    
     plt.axis("off")
    
     plt.title("perturbed image\n prediction: {}".format(advpred))
    
     plt.show()
    
  
    
  
    
 normalize = NormalizeByChannelMeanStd(
    
     mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    
  
    
 ### 常规模型加载
    
 model = mobilenet_v2(pretrained=True)
    
 model.eval()
    
 model = nn.Sequential(normalize, model)
    
 model = model.to(device)
    
  
    
 ### 数据预处理
    
 np_img = get_image()
    
 img = torch.tensor(bhwc2bchw(np_img))[None, :, :, :].float().to(device)
    
 imagenet_label2classname = ImageNetClassNameLookup()
    
  
    
 ### 测试模型输出结果
    
 pred = imagenet_label2classname(predict_from_logits(model(img)))
    
 print("test output:", pred)
    
  
    
 ### 输出原label
    
 pred_label = predict_from_logits(model(img))
    
  
    
 ### 对抗攻击:PGD攻击算法
    
 adversary = LinfPGDAttack(
    
     model, eps=8 / 255, eps_iter=2 / 255, nb_iter=80,
    
     rand_init=True)
    
  
    
 ### 完成攻击,输出对抗样本
    
 advimg = adversary.perturb(img, pred_label)
    
  
    
 ### 展示源图片,对抗扰动,对抗样本以及模型的输出结果
    
 show_images(model, img, advimg)

如下测试结果,右图中加入对抗扰动,模型把山地车错误判断成三轮车:

4.4,对抗防御算法效果验证

PC端核心代码样本:(Lesson4_code\adv_code\defense_code.py)(在第4.3节的代码中进行修改和替换)

复制代码
 ### GCM模块

    
 robust_mode = GradientConcealment()
    
  
    
 ### 常规模型+GCM模块
    
 class Model(nn.Module):
    
     def __init__(self, l=290):
    
     super(Model, self).__init__()
    
  
    
     self.l = l
    
     self.gcm = GradientConcealment()
    
     # model = resnet18(pretrained=True)
    
     model = mobilenet_v2(pretrained=True)
    
  
    
     # pth_path = "/Users/rocky/Desktop/训练营/model/mobilenet_v2-b0353104.pth"
    
     # print(f'Loading pth from {pth_path}')
    
     # state_dict = torch.load(pth_path, map_location='cpu')
    
     # is_strict = False
    
     # if 'model' in state_dict.keys():
    
     #    model.load_state_dict(state_dict['model'], strict=is_strict)
    
     # else:
    
     #    model.load_state_dict(state_dict, strict=is_strict)
    
  
    
     normalize = NormalizeByChannelMeanStd(
    
         mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    
     self.model = nn.Sequential(normalize, model)
    
  
    
     def load_params(self):
    
     pass
    
  
    
     def forward(self, x):
    
     x = self.gcm(x)
    
     # x = ResizedPaddingLayer(self.l)(x)
    
     out = self.model(x)
    
     return out
    
  
    
 ### 常规模型+GCM模块 加载
    
 model_defense = Model().eval().to(device)
    
  
    
 ### 数据预处理
    
 np_img = get_image()
    
 img = torch.tensor(bhwc2bchw(np_img))[None, :, :, :].float().to(device)
    
 imagenet_label2classname = ImageNetClassNameLookup()
    
  
    
 ### 测试模型输出结果
    
 pred_defense = imagenet_label2classname(predict_from_logits(model_defense(img)))
    
 print("test output:", pred_defense)
    
  
    
 ### 输出原label
    
 pre_label = predict_from_logits(model_defense(img))

如下测试结果,右图中加入对抗扰动,模型判断正确:

4.5,Aidlux端分类模型的部署与效果验证

代码上传。(Lesson4_code/adv_code/aidlux.py)

依赖库安装。

路径修改。

须知我们采用了Pytorch原生模型的aidlux部署方案,在运行代码时可能会遭遇OpenBLAS警告:检测OpenMP循环可能导致应用程序停滞。请务必备注该提示信息。

复制代码
    export OMP_NUM_THREADS=1

​五、整体业务功能实现

本节首先阐述了车辆检测系统及其相关技术要点如区域提取方法 黑盒攻击分析以及异常攻击处理机制 紧接着详细描述了基于多维度防护策略的整体安全防护体系 最后通过'车辆检测系统+对抗性攻击防御+多级防护机制'等核心组件完成了系统的完整架构设计 并对系统的实际运行效果进行了实验验证

​5.1.车俩检测和检测框提取

代码上传。(Lesson5_code/yolov5_code/aidlux/yolov5_extract.py)

我们调用一个函数以实现车辆目标区域的提取,并将其存储至 extract_results 文件夹中。该函数的代码位于 utils.py 文件中。

运行yolov5_extract.py,得到所有车辆目标的提取图片。

原图和提取图片如下:

​5.2.对抗样本的生成和替换

为模拟"对抗防御监测"应用场景,基于代码运行实时性的需求,在本文中我们采用线下方式生成对抗样本,并将车辆识别目标替换成对应的对抗样本。

在实际应用中,在现实场景中

PC端示例代码:位于4.3代码段中的(Lesson5_code\adv_code\black_attack.py),请将以下内容进行替换

复制代码
 ### 常规模型加载

    
 model = mobilenet_v2(pretrained=True)
    
 model.eval()
    
 model = nn.Sequential(normalize, model)
    
 model = model.to(device)
    
  
    
 ### 替身模型加载
    
 model_su = resnet18(pretrained=True)
    
 model_su.eval()
    
 model_su = nn.Sequential(normalize, model_su)
    
 model_su = model_su.to(device)
    
  
    
 ### 数据预处理
    
 np_img = get_image()
    
 img = torch.tensor(bhwc2bchw(np_img))[None, :, :, :].float().to(device)
    
 imagenet_label2classname = ImageNetClassNameLookup()
    
  
    
 ### 测试模型输出结果
    
 pred = imagenet_label2classname(predict_from_logits(model(img)))
    
 print("test output:", pred)
    
  
    
 ### 输出原label
    
 pred_label = predict_from_logits(model_su(img))
    
  
    
 ### 对抗攻击:PGD攻击算法
    
 adversary = LinfPGDAttack(
    
    model_su, eps=8/255, eps_iter=2/255, nb_iter=80,
    
    rand_init=True, targeted=False)
    
  
    
 ### 完成攻击,输出对抗样本
    
 advimg = adversary.perturb(img, pred_label)
    
  
    
 ### 展示源图片,对抗扰动,对抗样本以及模型的输出结果
    
 a_type = 'PGD'
    
 show_images(a_type, model, img, advimg)
    
  
    
 ### 迁移攻击样本保存
    
 save_path = "./Lesson5_code/adv_code/adv_results/" + img_path.split("/")[-1]
    
 # save_path = r"D:\code\aidlux_Rocky\Lesson5_code\adv_code\adv_results"
    
 torchvision.utils.save_image(advimg.cpu().data, save_path + "_adv_image_"+a_type+".png")

如下测试结果,右图中加入对抗扰动,模型将出租车错误识别为黑天鹅:

5.3. 安全监测和系统告警

针对黑盒防御策略的主要手段包括数据预处理技术的应用、鲁棒性网络架构的设计以及抗干扰能力的强化等多方面内容;本文重点采用对抗攻击检测系统作为核心模块进行防护设计;其中所指的对抗攻击监测系统是一种基于分类机制的实时检测系统;其输入是一幅图像,在输出结果上分为正常状态与异常状态两类;其中正常状态标记为0表示图像未受到恶意威胁影响;而异常状态标记为1则表示图像可能包含潜在的安全漏洞或被注入恶意代码等风险因素;此外,在本研究中我们采用了经过预先训练好的ResNet50深度学习框架作为本次系统的安全防护核心模块

关键代码示例:(Lesson5_code\adv_code\detect_adv_code.py)

复制代码
 ### 对抗攻击监测模型

    
 class Detect_Model(nn.Module):
    
     def __init__(self, num_classes=2):
    
     super(Detect_Model, self).__init__()
    
     self.num_classes = num_classes
    
     #model = create_model('mobilenetv3_large_075', pretrained=False, num_classes=num_classes)
    
     model = create_model('resnet50', pretrained=False, num_classes=num_classes)
    
     
    
  
    
     # self.multi_PreProcess = multi_PreProcess()
    
     pth_path = os.path.join("./Lesson5_code/model", 'track2_resnet50_ANT_best_albation1_64_checkpoint.pth')
    
     #pth_path = os.path.join("./Lesson5_code/model/", "track2_tf_mobilenetv3_large_075_64_checkpoint.pth")
    
     state_dict = torch.load(pth_path, map_location='cpu')
    
     is_strict = False
    
     if 'model' in state_dict.keys():
    
         model.load_state_dict(state_dict['model'], strict=is_strict)
    
     else:
    
         model.load_state_dict(state_dict, strict=is_strict)
    
     normalize = NormalizeByChannelMeanStd(
    
         mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    
     # self.model = nn.Sequential(normalize, self.multi_PreProcess, model)
    
     self.model = nn.Sequential(normalize, model)
    
  
    
     def load_params(self):
    
     pass
    
  
    
     def forward(self, x):
    
     # x = x[:,:,32:193,32:193]
    
     # x = F.interpolate(x, size=(224,224), mode="bilinear", align_corners=True)
    
     # x = self.multi_PreProcess.forward(x)
    
     out = self.model(x)
    
     if self.num_classes == 2:
    
         out = out.softmax(1)
    
         #return out[:,1:]
    
         return out[:,1:]
    
  
    
 detect_model = Detect_Model().eval().to(device)
    
  
    
 ### 对抗攻击监测
    
 detect_pred = detect_model(img)
    
 print(detect_pred)

在实际应用场景中, 当检测到AI安全风险时, 必须输出警示信息及 accompanying pictures. 由于缺乏相关的业务系统支持, 本文采用微信 '喵提醒' 的方式模拟 实际操作流程. 具体说明如下: 首先注册并创建 '喵提醒公众号' 账号; 其次针对 '喵 提醒' 平台的开发环境进行了相应的代码调试与优化工作; 最后构建了基于 '喵 提醒' 平台的 '对抗攻击监测 + 喵 提醒' 告警功能模块.

最终实现了功能,并根据判断结果采取相应措施:当检测到输入属于对抗样本时会触发喵提醒逻辑以发出告警信息;而当判定输入属于干净样本则会启动后续级联任务的常规处理流程

关键代码示例:(Lesson5_code\adv_code\detect_adv_code.py)

复制代码
 if detect_pred > 0.5:

    
     print("出现可疑对抗样本。")

效果验证如下:

5.4. 生成对抗样本的算法扩展和效果展示

第一步是通过模拟攻击者的行为模式来制造具有特定特征的测试数据。这些测试数据会被用来分析并改进车辆分类识别算法的安全性。

旨在利用不同对抗攻击算法生成对抗样本,在PC端的关键代码如下:(Lesson5_code\adv_code\black_attack.py)(请在5.2代码中进行相应修改)

复制代码
 ### 对抗攻击:PGD攻击算法

    
 adversary = LinfPGDAttack(
    
    model_su, eps=8/255, eps_iter=2/255, nb_iter=80,
    
    rand_init=True, targeted=False)
    
  
    
 # ### 对抗攻击:FGSM攻击算法 (eps = 0.5/255, 2/255, 8/255)S
    
 # adversary = FGSM(
    
 #    model_su, eps=8/255,
    
 #    targeted=False)
    
  
    
 # ### 对抗攻击:L1PGD攻击算法 (eps = 100, 400, 1600)
    
 # adversary = L1PGDAttack(
    
 #    model_su, eps=1600, eps_iter=2/255, nb_iter=80,
    
 #    rand_init=True, targeted=False)
    
  
    
 # ### 对抗攻击:L2PGD攻击算法 (eps = 0.5, 2, 8)
    
 # adversary = L2PGDAttack(
    
 #    model_su, eps=8, eps_iter=2/255, nb_iter=80,
    
 #    rand_init=True, targeted=False)
    
  
    
 # ### 对抗攻击:LinfMomentumIterativeAttack攻击算法 (eps = 0.5/255, 2/255, 8/255)
    
 # adversary = LinfMomentumIterativeAttack(
    
 #    model_su, eps=8/255

这里用到的数据,可以从Lesson5_code/adv_code/orig_images中选择。

复制代码
 img_path = "Lesson5_code/adv_code/orig_images/vid_5_27620.jpg_0.jpg"

    
 # img_path = "./Lesson5_code/adv_code/orig_images/vid_5_31560.jpg_0.jpg"

生成图像展示:

第二步,在这一阶段我们需要评估对抗样本生成的效果是否具有实际意义。为此,在4.1节中我们采用了监督学习方法ResNet50模型来完成这一任务:对于一张给定图片而言,在经过处理后系统会识别出两种类别——非风险图像标记为0类和存在风险图像标记为1类;通过这种方式我们可以判断所生成对抗样本的质量并评估其效果如何。

例如左边的小图原本属于出租车类别,在对抗攻击过程中生成右边的缩略图。将输入到ResNet50模型中后,若输出结果为0,则表明对抗样本未能成功生成具有安全风险的图片;若输出结果为1,则表明对抗样本生成成功。

对抗检测结果展示:

5.5. 整体业务功能串联

整合"车辆检测+检测框提取+对抗样本的应用+AI安全监测与告警功能"这一业务流程,在每张图片中逐一分析每辆车的状态:若确认为正常车辆,则进行后续的分类判断;若发现存在安全威胁,则触发喵系统进行告警提醒

首先, 没有发起攻击行动, 从指定路径下的图片文件夹中获取图片编号为vid_5_31560.jpg的图像数据. 通过YOLOv5技术对图像进行了目标检测与识别, 并成功提取出车辆的目标区域位置信息. 将检测到的目标区域数据 fed 到后续的监控模型模块以及串行分类子任务流程中.

在尝试执行抗干扰测试的过程中,在实验阶段对这些车辆的目标图像进行了抗干扰处理,并生成相应的抗干扰样本数据集。考虑到抗干扰测试耗时较长且当前实验条件限制,在线实时处理能力有限的情况下,在线测试无法持续运行……因此我们决定采用Rocky平台已提前完成并存储好的抗干扰样本数据集来替代实时处理的方式来进行图像更新替代操作。具体的抗干扰样本数据集路径位于 Lesson5_code/adv_code/adv_results 文件夹中

相应的脚本如下:(Lesson5_code/main_lxj/main_app.py)

复制代码
 #%%

    
 ## 1.车辆检测+检测框小图提取。
    
  
    
 # aidlux相关
    
 from cvs import *
    
 import aidlite_gpu
    
 from utils import detect_postprocess, preprocess_img, draw_detect_res, extract_detect_res
    
  
    
 import time
    
 import cv2
    
  
    
 # AidLite初始化:调用AidLite进行AI模型的加载与推理,需导入aidlite
    
 aidlite = aidlite_gpu.aidlite()
    
 # Aidlite模型路径
    
 model_path = '/home/Lesson5_code/yolov5_code/models/yolov5_car_best-fp16.tflite'
    
 # 定义输入输出shape
    
 in_shape = [1 * 640 * 640 * 3 * 4]
    
 out_shape = [1 * 25200 * 6 * 4]
    
 # 加载Aidlite检测模型:支持tflite, tnn, mnn, ms, nb格式的模型加载
    
 aidlite.ANNModel(model_path, in_shape, out_shape, 4, 0)
    
  
    
 # 读取图片进行推理
    
 # 设置测试集路径
    
 source = "/home/Lesson5_code/yolov5_code/data/images/test1"
    
 images_list = os.listdir(source)
    
 print(images_list)
    
 frame_id = 0
    
 # 读取数据集
    
 for image_name in images_list:
    
     frame_id += 1
    
     print("frame_id:", frame_id)
    
     image_path = os.path.join(source, image_name)
    
     frame = cvs.imread(image_path)
    
  
    
     # 预处理
    
     img = preprocess_img(frame, target_shape=(640, 640), div_num=255, means=None, stds=None)
    
     # 数据转换:因为setTensor_Fp32()需要的是float32类型的数据,所以送入的input的数据需为float32,大多数的开发者都会忘记将图像的数据类型转换为float32
    
     aidlite.setInput_Float32(img, 640, 640)
    
     # 模型推理API
    
     aidlite.invoke()
    
     # 读取返回的结果
    
     pred = aidlite.getOutput_Float32(0)
    
     # 数据维度转换
    
     pred = pred.reshape(1, 25200, 6)[0]
    
     # 模型推理后处理
    
     pred = detect_postprocess(pred, frame.shape, [640, 640, 3], conf_thres=0.25, iou_thres=0.45)
    
     # 绘制推理结果
    
     res_img = draw_detect_res(frame, pred)
    
     # cvs.imshow(res_img)
    
  
    
     # 测试结果展示停顿
    
     #time.sleep(5)
    
  
    
     # 图片裁剪,提取车辆目标区域
    
     extract_detect_res(frame, pred, image_name)
    
  
    
     # cvs.imshow(cut_img)
    
     # cap.release()
    
     # cv2.destroyAllWindows()
    
  
    
 #%%
    
 # ## 2.使用对抗样本
    
 # from cvs import os
    
  
    
 # rec_path = "/home/Lesson5_code/yolov5_code/aidlux/extract_results/"
    
 # recs_list = os.listdir(rec_path)
    
 # print(recs_list)
    
  
    
 # ## 使用原样本
    
 # img_path = os.path.join(rec_path, recs_list[1])
    
  
    
 # ## 替换对抗样本
    
 # rec_su_path = "/home/Lesson5_code/yolov5_code/aidlux/extract_results_su/"
    
 # recs_su_list = []
    
 # for rec_su in recs_list:
    
 #     recs_su_list.append(rec_su.split('.jpg_0.jpg')[0]+'.jpg_0.png')
    
 # img_path = os.path.join(rec_su_path, recs_su_list[1])
    
  
    
  
    
 #%%
    
 ## 3.AI安全监测与告警功能
    
 ## 
    
  
    
 import os
    
 import torch
    
 import requests
    
 import time
    
 import torch.nn as nn
    
 from torchvision.models import mobilenet_v2,resnet18
    
 from advertorch.utils import predict_from_logits
    
 from advertorch.utils import NormalizeByChannelMeanStd
    
 from robust_layer import GradientConcealment, ResizedPaddingLayer
    
 from timm.models import create_model
    
  
    
 from advertorch.attacks import LinfPGDAttack
    
 from advertorch_examples.utils import ImageNetClassNameLookup
    
 from advertorch_examples.utils import bhwc2bchw
    
 from advertorch_examples.utils import bchw2bhwc
    
  
    
 device = "cuda" if torch.cuda.is_available() else "cpu"
    
  
    
  
    
 ### 读取图片
    
 def get_image(img_path):
    
     # img_path = os.path.join("/home/Lesson5_code/adv_code/adv_results/", "adv_image.png")  ## Cars28.png
    
     print('img_path',img_path)
    
     img_url = "https://farm1.static.flickr.com/230/524562325_fb0a11d1e1.jpg"
    
  
    
     def _load_image():
    
     from skimage.io import imread
    
     return imread(img_path) / 255.
    
  
    
     if os.path.exists(img_path):
    
     return _load_image()
    
     else:
    
     import urllib
    
     urllib.request.urlretrieve(img_url, img_path)
    
     return _load_image()
    
  
    
  
    
 def tensor2npimg(tensor):
    
     return bchw2bhwc(tensor[0].cpu().numpy())
    
  
    
  
    
 normalize = NormalizeByChannelMeanStd(
    
     mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    
  
    
  
    
 ### 常规模型加载
    
 class Model(nn.Module):
    
     def __init__(self, l=290):
    
     super(Model, self).__init__()
    
  
    
     self.l = l
    
     self.gcm = GradientConcealment()
    
     #model = resnet18(pretrained=True)
    
     model = mobilenet_v2(pretrained=True)
    
  
    
     # pth_path = "/home/Lesson5_code/model/mobilenet_v2-b0353104.pth"
    
     # print(f'Loading pth from {pth_path}')
    
     # state_dict = torch.load(pth_path, map_location='cpu')
    
     # is_strict = False
    
     # if 'model' in state_dict.keys():
    
     #    model.load_state_dict(state_dict['model'], strict=is_strict)
    
     # else:
    
     #    model.load_state_dict(state_dict, strict=is_strict)
    
  
    
     normalize = NormalizeByChannelMeanStd(
    
         mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    
     self.model = nn.Sequential(normalize, model)
    
  
    
     def load_params(self):
    
     pass
    
  
    
     def forward(self, x):
    
     #x = self.gcm(x)
    
     #x = ResizedPaddingLayer(self.l)(x)
    
     out = self.model(x)
    
     return out
    
  
    
  
    
 ### 对抗攻击监测模型
    
 class Detect_Model(nn.Module):
    
     def __init__(self, num_classes=2):
    
     super(Detect_Model, self).__init__()
    
     self.num_classes = num_classes
    
     #model = create_model('mobilenetv3_large_075', pretrained=False, num_classes=num_classes)
    
     model = create_model('resnet50', pretrained=False, num_classes=num_classes)
    
  
    
     # self.multi_PreProcess = multi_PreProcess()
    
     pth_path = os.path.join("/home/Lesson5_code/model", 'track2_resnet50_ANT_best_albation1_64_checkpoint.pth')
    
     #pth_path = os.path.join("/home/Lesson5_code/model", "track2_tf_mobilenetv3_large_075_64_checkpoint.pth")
    
     state_dict = torch.load(pth_path, map_location='cpu')
    
     is_strict = False
    
     if 'model' in state_dict.keys():
    
         model.load_state_dict(state_dict['model'], strict=is_strict)
    
     else:
    
         model.load_state_dict(state_dict, strict=is_strict)
    
     normalize = NormalizeByChannelMeanStd(
    
         mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    
     # self.model = nn.Sequential(normalize, self.multi_PreProcess, model)
    
     self.model = nn.Sequential(normalize, model)
    
  
    
     def load_params(self):
    
     pass
    
  
    
     def forward(self, x):
    
     # x = x[:,:,32:193,32:193]
    
     # x = F.interpolate(x, size=(224,224), mode="bilinear", align_corners=True)
    
     # x = self.multi_PreProcess.forward(x)
    
     out = self.model(x)
    
     if self.num_classes == 2:
    
         out = out.softmax(1)
    
         #return out[:,1:]
    
         return out[:,1:]
    
  
    
  
    
 def main(img_path):
    
  
    
     np_img = get_image(img_path)
    
     img = torch.tensor(bhwc2bchw(np_img))[None, :, :, :].float().to(device)
    
     imagenet_label2classname = ImageNetClassNameLookup()
    
  
    
     model = Model().eval().to(device)
    
  
    
     detect_model = Detect_Model().eval().to(device)
    
  
    
  
    
     ### 对抗攻击监测
    
     detect_pred = detect_model(img)
    
     print(detect_pred)
    
  
    
     if detect_pred > 0.5:
    
     print("出现可疑对抗样本。")
    
     pred = imagenet_label2classname(predict_from_logits(model(img)))
    
     print(pred)
    
     id = 't5Su94C'
    
     # 填写喵提醒中,发送的消息,这里放上前面提到的图片外链
    
     text = "出现可疑对抗样本!!" +str(img_path)
    
     ts = str(time.time())  # 时间戳
    
     type = 'json'  # 返回内容格式
    
     request_url = "http://miaotixing.com/trigger?"
    
  
    
     headers = {
    
         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47'}
    
  
    
     result = requests.post(request_url + "id=" + id + "&text=" + text + "&ts=" + ts + "&type=" + type,
    
                         headers=headers)
    
     else:
    
     print("图片正常。")
    
     pred = imagenet_label2classname(predict_from_logits(model(img)))
    
     print(pred)
    
  
    
  
    
 # %%
    
  
    
 if __name__ == '__main__':
    
     ## 使用原样本
    
     img_path_ = "Lesson5_code/adv_code/orig_images/vid_5_26660.jpg_0.jpg"
    
     main(img_path_)
    
  
    
     ## 替换对抗样本
    
     img_path_ = "Lesson5_code/adv_code/adv_results/vid_5_26660.jpg_0.png"
    
     main(img_path_)

测试视频如下:

六、本文小结和学习心得

本文源自Rocky及Aidlux团队的训练营课程学习而成。您可访问Aidlux公众号,并在消息中输入关键词:'2211lesson3、2211lesson4、2211lesson5'以获取详细代码。此外,请参考附录中的链接以了解其他同学的学习经历和心得体会。

附录

参考链接

以Aidlux为核心的智慧交通系统中,人工智能技术在车辆检测中的应用与实践得到了充分展示,并将在知乎平台上有详细的介绍和讨论.

AidLux智慧交通AI安全实战之智慧与创新结合的应用 - 智慧交通系统在实战应用中的车辆检测技术 - 知乎 (zhihu.com)

AidLux智慧交通人工智能技术的安全应用实践——(目标识别与防护机制)

全部评论 (0)

还没有任何评论哟~