AidLux智慧交通AI安全实战学习

news2024/7/31 5:48:20

本次参加AidLux训练营,Rocky作为主讲老师,学习到了利用目标检测算法流程和AI攻防策略进行结合,从而达到安全。

1.检测汽车模型的训练

本次目标检测的模型是Yolov5,首先对标注图片 进行转换,转换为yolov5的格式,然后利用train.py进行训练,调整输入图片的位置,car.yaml,由于本次只是训练一个类型,所以模型结构的yaml中也要修改为nc:1

数据转换代码如下:

import csv
import os
import shutil

image_dir = "/car_train_data/image_txt/"
train_val_dir = "/car_train_data/train_val_txt/"

if not os.path.exists(image_dir):
    os.makedirs(image_dir)

if not os.path.exists(train_val_dir):
    os.makedirs(train_val_dir)

csv_reader = csv.reader(open("/car_train_data/train.csv"))
count = -1
for line in csv_reader:
    count += 1
    if count == 0:
        continue

    with open(image_dir + line[0].split('.')[0] + ".txt", 'a+') as f:
        width = float(line[3]) - float(line[1])
        height = float(line[4]) - float(line[2])
        x_center = float(line[1]) + width / 2
        y_center = float(line[2]) + height / 2
        f.write('1' + ' ' + str(x_center / 676) + ' ' + str(y_center / 380) + ' '
                + str(width / 676) + ' ' + str(height / 380) + "\n")
        shutil.copy("/car_train_data/train_images/" + line[0], image_dir + line[0])
    if count % 10 != 0:
        with open(train_val_dir + "train.txt", "a+") as f:
            f.write(image_dir + line[0] + "\n")
    else:
        with open(train_val_dir + "val.txt", "a+") as f:
            f.write(image_dir + line[0] + "\n")





2. AI安全

2.1 常用AI对抗防御算法划分

目前主流对抗防御的总体分支与逻辑:

 

其中对抗训练是指在训练过程中加入对抗样本,通过不断的学习对抗样本的特征,从而提升模型的鲁 棒性。
监测识别对抗样本顾名思义,在项目关键节点处,设置一些能够识别对抗样本的特种模型,从而提前 预警对抗攻击风险。
模型鲁棒结构设计是指在模型中设计特定的滤波结构能够一定程度上增强模型鲁棒性,抵御对抗噪
声。
对抗扰动结构破坏主要在数据流处理的时候使用,通过一些滤波算法,噪声结构破坏算法,噪声覆盖算法等策略,减弱对抗噪声的影响,使其不能对模型造成攻击。
梯度掩膜则是在白盒对抗防御中非常高效的一种算法,因为其能掩盖真实梯度,从而能够使得白盒攻 击算法失效。本章中在后面小节使用到的对抗防御方法主要是基于梯度掩膜的GCM模块。

 

 2.2 攻击算法&效果:

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(r"D:\Study\dabai-study-2\lesson-4\Lesson4_code\adv_code\images", "school_bus.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)




攻击效果:从右侧图片看出,原始图片是school_bus,错误识别成:acoustic_guitar

  2.3 防御算法&效果:

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 robust_layer import GradientConcealment, ResizedPaddingLayer

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(r"D:\Study\dabai-study-2\lesson-4\Lesson4_code\adv_code\images", "school_bus.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])

### 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)

pre_label = predict_from_logits(model_defense(img))


### 对抗攻击:PGD攻击算法
adversary = LinfPGDAttack(
    model_defense, eps=8 / 255, eps_iter=2 / 255, nb_iter=80,
    rand_init=True, targeted=False)


### 完成攻击,输出对抗样本
advimg = adversary.perturb(img, pre_label)


### 展示源图片,对抗扰动,对抗样本以及模型的输出结果
show_images(model_defense, img, advimg)

从下图可以看出,原图是school_bus,防御算法也是识别为 school_bus

 

3. 系统警告

当对抗攻击监测模型,监测到对抗样本或者对抗攻击后。
一般在实际场景的AI项目中,会出现一个告警弹窗,并且会告知安全人员及时进行安全排查。
当然我们此次训练营并没有业务系统,为了更加贴近实际,本次训练营采用一种简单的方式,当然也
比较实用,即通过微信“喵提醒”的方式来实现。在后面的大作业中,我们也会使用到。
3.1 喵喵提醒代码
import requests
import time

# 填写对应的喵码
id = 'xxx' # 这里填自己的ID
# 填写喵提醒中,发送的消息,这里放上前面提到的图片外链
text = "出现对抗攻击风险!!"
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)

不过代码中的id,需要填写自己的id id = 'xxx' # 这里填自己的ID

4. 运行效果,

这里我们设置的阈值为0.5,所以提醒了。

4. 收获

本次训练营的学习,让我知道了目标检测+AI安全的算法功能+消息提示的完整流程,也对生活中的一些场景的应用有收获,这里也了解到了AidLux这个软件是非常强大的,可以手机边缘设备进行计算,快速验证整体流程,收获满满。感谢主讲老师Rocky,江大白,AidLux软件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《痞子衡嵌入式半月刊》 第 61 期

痞子衡嵌入式半月刊: 第 61 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢…

激光切割机机械结构设计

目 录 摘 要………………………………………………………………………………………Ⅰ ABSTRACT…………………………………………………………………………………… Ⅱ 1 绪论 1 1.1课题背景 1 1.2现实意义 1 1.3设计任务 1 1.4总体设计方案分析 2 2 机械部分XY工作台及Z轴的…

分享99个小清新PPT模板,总有一款适合您

PPT下载链接:https://pan.baidu.com/s/1VW0Eljx1Ac9QEEBaiIvqcg?pwd40hn 提取码:40hn 源码下载链接:ppt.rar - 蓝奏云 采集的参数 page_count 1 # 每个栏目开始业务content"text/html; charsetgb2312"base_url "https:…

如何查找无物流信息单号

我是在一家大公司里面上班,我公司都是那种厂家直销,所以每天发货量是比较大,同时一天都是几家快递同时发货,我是负责每天跟踪物流信息状况,公司要求每天都上报当天发货的快递在24小时之内有没有物流信息,如…

嵌入式编程别忽略了C语言的标准

正文大家好,我是bug菌~最近做代码评审发现很多同事的编码都游走在风险的边沿,其中最显眼的就是局部变量定义位置比较随意。对于C语言编程老手而言,绝大部分都已经养成了"变量定义必放在语句块的开头"这一习惯,依稀还记得…

windows虚拟机中docker运行springboot容器报错:Unable to access jarfile /app.jar

1.在Windows系统中创建了虚拟机,并且在虚拟机中安装了docker,但是在使用Dockerfile创建镜像并且运行时报错 2.使用shell脚本运行的,并且检查后也没有发现文件或者路径有错 解决: 使用vim加参数的形式打开shell脚本,可以…

微服务架构下的认证鉴权解决方案

背景 单体应用在向微服务化架构演进时,需要考虑如何解决服务认证授权的问题。如果处理不好,会引发架构的混乱,带来安全、性能、难以维护的问题。 以最典型的包含WEB页面的具备登录态管理的系统为例。在最初阶段,登录鉴权一般通过…

文华财经期货技术分析日内多空信号共振指标公式,波段行情短线抄单操盘幅图指标

​期货交易的很大一个误区是“痴迷于各种指标公式” 大家千万不要痴迷于指标,记住一点:行情软件界面之中的K线图叫主图,其余指标叫附图。 这从叫法上就该知道,我们寻找买卖点要在主图K线上来寻找,指标只是起到辅助分析的作用&…

操作系统02_内存分页管理_分段管理_设备管理_IO处理_索引文件结构_文件目录_位示图---软考高级系统架构师007

存储管理可以分为固定存储管理和分页存储管理。 现在固定存储管理已经不用也不考,但要知道因为固定存储管理指的是整存整取 也就是把一整个程序,比如说10G的游戏全部都存到内存里 这样的话是非常占用内存的,这个固定存储管理现在已经不用了。 然后这里我们主要看分页存储管: …

蓝桥杯比赛 NOC竞赛C++项目选择题真题和模拟题汇总

题目来源:第10届蓝桥杯青少年组C选拔赛 1、下面哪个密码最安全 A. 111111 B. 123456 C. qwerty D. Z2a8Q1 2、如果今天是星期六,再过60天是星期几? A. 星期三 B. 星期四 C. 星期五 D. 星期六 3、90到100之间有几个素数? …

mmcv和openCV两个库imcrop()和imresize()方法的对应【基础分析】

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录MMCV 全家桶mmcv.imresize(img, (1000, 600), return_scaleTrue) 方法实现对应的…

Unity 之 Post Processing后处理不同项目配置(URP项目配置)

Unity 之 Post Processing后处理不同项目配置(URP项目配置)一,Post Processing介绍二,正常项目配置2.1 场景配置2.2 摄像机配置2.3 集成步骤小结三,URP项目配置3.1 具体配置步骤3.2 最终实现效果四,代码控制…

【每天一个cmake技巧】简单的cmake demo

简单的cmake demo 一个简单的cmake 工程,包括生成动态库和链接动态库的demo工程和test工程。 demo下载链接: https://download.csdn.net/download/sinat_35178307/87243966 目录结构 该工程可以生成一个dll,一个调用dll的demo,…

【数据分享】维基百科Wiki负面有害评论(网络暴力)文本数据多标签分类挖掘可视化...

原文链接:http://tecdat.cn/?p8640讨论你关心的事情可能很困难。网络暴力骚扰的威胁意味着许多人停止表达自己并放弃寻求不同的意见(查看文末了解数据免费获取方式)。平台努力有效地促进对话,导致许多社区限制或完全关闭用户评论…

C++中的菱形继承问题及解决方案

存在问题 C中支持多重继承,但是由于这个特性,导致会有如下继承关系。 这样,类D就会同时拥有从类B中继承下来的A中的函数,也会拥有从类C中继承下来的A中的函数,会产生模糊调用的现象。 解决方案 为了解决这个问题&a…

spring源码 - AOP原理理解

AOP使用 1.我们都知道我们在使用spring aop时需要在configuration类上增加EnableAspectJAutoProxy 2.然后在准备AOP类就可以对相应类的方法进行aop Component Aspect public class MyAspect { Pointcut("execution(* com.my.service.*.*(..))") public void as…

利用WSL2搭建Qemu仿真Vexpress-a9开发环境

利用WSL2搭建Qemu仿真Vexpress-a9开发环境开发环境搭建更新软件源uboot-tools安装交叉编译环境安装qemu安装编译linux镜像和DBT文件启动qemu仿真kernelbusybox制作根文件系统制作rootfs使用u-boot启动kernel下载编译u-bootu-boot利用tftp网络引导方式启动Linux内核WSL2主机网络…

火爆朋友圈的ChatGPT是什么?

火爆朋友圈的ChatGPT是什么? 官方博客:https://openai.com/blog/chatgpt/ 背景 OpenAI,在美国成立的人工智能研究公司。2015年,OpenAI由马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始人彼得…

Java入门教程(14) ——Scanner 获取键盘输入

在后台开发中,我们可能需要在运行的时候传递一些参数进去,该怎么处理呢? Java 提供了一个 Scanner 类,利用这个类,我们可以很方便的获取键盘输入的参数,接下来给大家详细介绍一下 1.首先导包 import jav…

到底什么是类脑计算?

当前感存算一体化的类脑神经拟态芯片流行,对其类脑计算的定义各家有各家的说法。但总之,类脑计算就是模拟人类思考方式的一种计算。 本文摘编自《类脑计算》(危辉著. 北京:科学出版社, 2022. 7)一书“第1 章什么是类脑…