ViG:图像分类领域前沿

news2024/12/17 3:36:41
🍑个人主页:Jupiter.
🚀 所属专栏:传知代码
欢迎大家点赞收藏评论😊

在这里插入图片描述

在这里插入图片描述

目录

  • 图片分类任务方法概述
      • 卷积神经网络(CNN)
      • 视觉Transformer(ViT)
      • 视觉图神经网络(ViG)
  • ViG模型
  • 模型架构
      • 图像输入
      • 图结构生成
      • 网络模块
      • 图处理
      • 特征变换
      • 多尺度处理
      • 输出头
    • ViG代码
    • 模型主体架构设计
  • 核心代码
  • 演示效果
  • 附件使用


  • 参考文献:需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:地址

图片分类任务方法概述

卷积神经网络(CNN)

  • 发展背景: CNN的出现标志着深度学习在图像识别领域的重大突破。最早的CNN模型可以追溯到1998年的LeNet,而2012年的AlexNet模型在ImageNet竞赛中取得优异成绩,使得CNN成为图像分类任务的主流方法。

分类方法优点:

  • 局部感知野: 通过卷积操作,CNN能够捕捉图像的局部特征,减少参数数量。
  • 参数共享: 卷积核在整张图像上共享,提高了模型的泛化能力。
  • 平移不变性: CNN具有平移不变性,能够识别图像中的物体,即使它们的位置发生变化。

视觉Transformer(ViT)

  • 发展背景: ViT于2020年被提出,借鉴了自然语言处理领域的Transformer架构,将自注意力机制应用于图像分类任务。

分类方法优点:

  • 自注意力机制: 能够捕捉图像中的长距离依赖关系,提高分类准确性。
  • 可扩展性: Transformer结构易于扩展,适用于大规模数据集。
  • 并行计算: 自注意力机制使得ViT能够更好地利用并行计算资源。

视觉图神经网络(ViG)

  • 发展背景: ViG的提出是为了解决CNN和ViT在处理不规则和复杂目标时的局限性。ViG将图像视为图结构,通过图卷积操作进行特征提取和分类。

分类方法优点:

  • 灵活的图结构: ViG采用图结构表示图像,能够更好地处理不规则形状的物体,提高对复杂场景的识别能力。
  • 图卷积操作: 通过图卷积,ViG能够有效地聚合和更新节点信息,捕捉局部和全局特征。
  • 节点特征变换: FFN模块(多层感知器)用于节点特征变换,增强了模型的表达能力

ViG模型

图片切成patch
在这里插入图片描述

(a) Grid Structure

  • 作用:
    像素级信息捕获:通过将图像切分成均匀分布的小块(Patch),每个Patch代表图像的一个局部区域。
    空间关系保持:保留了图像的空间布局信息,使得模型能够理解对象的位置和相对位置。

  • 重要性:
    经典方法的基础:这是许多传统计算机视觉算法的基本假设,包括早期的人工设计特征提取方法和现代的深度学习模型(如卷积神经网络CNN)。
    简单直观:易于理解和实施,是初学者入门的好选择。
    (b) Sequence Structure

  • 作用:
    序列化处理:将图像的Patch按某种顺序排列,形成一维序列。
    时间维度模拟:虽然实际处理的是静态图像,但通过序列化的方式,可以引入类似于自然语言处理(NLP)领域的时间维度概念。

  • 重要性:
    Transformer的应用:这种结构特别适合于基于Transformer架构的方法,如Vision Transformer(ViT)。ViT等模型通过自注意力机制对序列化的Patch进行处理,从而有效地捕捉全局上下文信息。
    灵活性提升:相比固定大小的卷积核,序列化处理允许模型关注任意距离的Patch之间的关系,提高了模型的灵活性和泛化能力。
    © Graph Structure

  • 作用:
    非结构化数据建模:将图像中的Patch视为图中的节点,允许模型处理更加复杂和灵活的数据结构。
    适应性强:能够更好地适应各种形状和尺寸的对象,尤其是对于那些不能很好地用网格或序列描述的情况。

  • 重要性:
    图神经网络优势:结合图神经网络(GNN)的优点,能够有效处理具有复杂拓扑结构的数据,如社交网络、分子结构等。
    创新性突破:在视觉任务中引入图结构是一种创新尝试,有望带来新的突破和进展,特别是在需要精细分析和理解场景的情况下。

模型架构

Description

图像输入

首先,从一张原始图像开始。在这个例子中,图像展示了一条鱼和一个人的部分身体。

图结构生成

接下来,将图像划分为若干个Patch,并将这些Patch作为图中的节点。每个节点代表图像的一部分,而边则表示这些部分之间的关联。红色圆圈内的节点可能表示图像的关键部分,比如鱼的身体或者人的衣服图案。

网络模块

然后,进入网络模块,该模块由两部分组成:图处理和特征变换。

图处理

在这一步骤中,模型会对图结构进行处理,以提取出各个Patch之间的关系和相互影响。这可以通过图卷积操作或其他类型的图神经网络技术完成。

特征变换

经过图处理之后,得到的特征会被送入特征变换模块。这里可能会涉及到一些标准的神经网络组件,如全连接层、激活函数等,目的是进一步提炼和转化所获得的信息。

多尺度处理

整个过程会重复多次(L次),每次都会产生一个新的特征图。这样做的好处是可以从不同的层次和角度来观察和理解图像内容,增强模型的表现力。

输出头

最后,所有经过多轮处理后的特征被整合起来,传递给输出头(Head for recognition)。这个输出头负责最终的识别任务,可能是分类、回归或者其他类型的问题。

ViG代码

PatchEmbedding
class Stem(nn.Module):
    def __init__(self, img_size=224, in_dim=3, out_dim=768, act='relu'):
        super().__init__()
        self.convs = nn.Sequential(
            nn.Conv2d(in_dim, out_dim//8, 3, stride=2, padding=1),
            nn.BatchNorm2d(out_dim//8),
            act_layer(act),
            nn.Conv2d(out_dim//8, out_dim//4, 3, stride=2, padding=1),
            nn.BatchNorm2d(out_dim//4),
            act_layer(act),
            nn.Conv2d(out_dim//4, out_dim//2, 3, stride=2, padding=1),
            nn.BatchNorm2d(out_dim//2),
            act_layer(act),
            nn.Conv2d(out_dim//2, out_dim, 3, stride=2, padding=1),
            nn.BatchNorm2d(out_dim),
            act_layer(act),
            nn.Conv2d(out_dim, out_dim, 3, stride=1, padding=1),
            nn.BatchNorm2d(out_dim),
        )

    def forward(self, x):
        x = self.convs(x)
        return x

模型主体架构设计

self.backbone = Seq(*[Seq(Grapher(channels, num_knn[i], 1, conv, act, norm,
                 bias, stochastic, epsilon, 1, drop_path=dpr[i]),
                 FFN(channels, channels * 4, act=act, drop_path=dpr[i])
) for i in range(self.n_blocks)])

核心代码

聚合特征

class MRConv2d(nn.Module):
    def __init__(self, in_channels, out_channels, act='relu', norm=None, bias=True):
        super(MRConv2d, self).__init__()
        self.nn = BasicConv([in_channels*2, out_channels], act, norm, bias)

    def forward(self, x, edge_index, y=None):
        print(x.shape, edge_index.shape)
        x_i = batched_index_select(x, edge_index[1])
        print(x_i.shape)
        if y is not None:
            x_j = batched_index_select(y, edge_index[0])
        else:
            x_j = batched_index_select(x, edge_index[0])
            print(x_j.shape)
        x_j, _ = torch.max(x_j - x_i, -1, keepdim=True)
        b, c, n, _ = x.shape
        x = torch.cat([x.unsqueeze(2), x_j.unsqueeze(2)], dim=2).reshape(b, 2 * c, n, _)
        print(x.shape)
        return self.nn(x)

演示效果

在这里插入图片描述

附件使用

  • 安装相应依赖包
pip install -r requirements.txt
  • 获取cifa10数据集
import torchvision
import torchvision.transforms as transforms
  • transforms用于数据预处理
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
  • 下载并加载训练数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)
# 下载并加载测试数据集
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)
  • CIFAR-10数据集中的类别
import torchvision
import torchvision.transforms as transforms

# transforms用于数据预处理
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

# 下载并加载训练数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)

# 下载并加载测试数据集
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)

# CIFAR-10数据集中的类别
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

  • 运行代码
python train.py

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

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

相关文章

系列2:基于Centos-8.6Kubernetes 集成GPU资源信息

每日禅语 自省,就是自我反省、自我检查,自知己短,从而弥补短处、纠正过失。佛陀强调自觉觉他,强调以达到觉行圆满为修行的最高境界。要改正错误,除了虚心接受他人意见之外,还要不忘时时观照己身。自省自悟之…

03篇--二值化与自适应二值化

二值化 定义 何为二值化?顾名思义,就是将图像中的像素值改为只有两种值,黑与白。此为二值化。 二值化操作的图像只能是灰度图,意思就是二值化也是一个二维数组,它与灰度图都属于单信道,仅能表示一种色调…

发现一个对话框中的按钮,全部失效,点击都没有任何反应,已经解决

前端问题,技术vue2,ts。 发现一个对话框中的按钮,全部失效,点击都没有任何反应。 因为我只在template标签中加入下面这个代码,并没有注册。 只要有一个子组件没有注册,就会影响所有的按钮,使当前…

RT系列机器人详细介绍(BC-Z、RT-1、OMM、RT-Trajectory、Q-Transformer、RT-2、RT-X、RT-H)

目录 一、BC-Z二、RT-1三、MOO四、RT-Trajectory五、Q-Transformer六、RT-2七、RT-X八、RT-H参考文献 一、BC-Z BC-Z通过结合大规模的交互式模仿学习系统、灵活的任务嵌入和多样化的数据,实现了在未见任务上的零样本泛化,为机器人学习领域提供了一种新的…

鸿蒙系统-前端0帧起手

鸿蒙系统-前端0帧起手 先search 一番 找到对应的入门文档1. 运行项目遇到问题 如下 (手动设计npm 的 registry 运行 npm config set registry https://registry.npmjs.org/)2.运行后不支持一些模拟器 配置一下(如下图,运行成功&am…

Redis是什么?Redis和MongoDB的区别在那里?

Redis介绍 Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。以下是关于Redis的详细介绍: 一、数据结构支持 字符串(String) 这是Redis最…

【问题记录】07 MAC电脑,使用FileZilla(SFTP)连接堡垒机不成功

项目场景: 使用MAC电脑,以子账号(非root)的形式登录,连接堡垒机CLB(传统型负载均衡),使用FileZilla(SFTP)进行FTP文件传输。 问题描述: MAC电脑…

从0到1实现vue3+vite++elementuiPlus+ts的后台管理系统(一)

前言:从这篇文章开始实现vue3vite的后台管理系统,记录下自己搭建后台系统图的过程。 这篇文章完成项目的初始化和基本配置,这一步可以直接跟着vue3官网进行。整个系列只有前端部分,不涉及后端。 vue3官网:https://cn.…

计算机网络错题

文章目录 码分复用透明传输差错检测停止-等待协议回退N帧协议CSMA/CD协议以太网交换机Vlanip地址的无分类编制方法ip地址的应用规划ip数据包的发送和转发过程路由信息协议IPI2016201720202022 2.5信道 码分复用 透明传输 差错检测 停止-等待协议 回退N帧协议 CSMA/CD协议 以太网…

报错:Method Not Allowed

当报错这个的时候就要注意了,自己的方法是否写对了!!! 就像我的这个因为我的后端是put,所以这也是put,我报错就是因为这写了get,虽然页面是改变了,但是一刷新,就会原形毕…

IDEA 2024 版本配置热部署

在实际开发过程中,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。对于一个后端开发者来说,重启过程确实很难受啊 采用下面三步骤可以完成 1.在IDEA中settings中搜索Debb…

客户端(浏览器)vue3本地预览txt,doc,docx,pptx,pdf,xlsx,csv,

预览文件 1、入口文件preview/index.vue2、预览txt3、预览doc4、预览pdf5、预览pptx6、预览xlsx7、预览csv 1、入口文件preview/index.vue 预览样式&#xff0c;如pdf 文件目录如图所示&#xff1a; 代码如下 <template><div class"preview-wrap" ref&…

安卓低功耗蓝牙BLE官方开发例程(JAVA)翻译注释版

官方原文链接 https://developer.android.com/develop/connectivity/bluetooth/ble/ble-overview?hlzh-cn 目录 低功耗蓝牙 基础知识 关键术语和概念 角色和职责 查找 BLE 设备 连接到 GATT 服务器 设置绑定服务 设置 BluetoothAdapter 连接到设备 声明 GATT 回…

uniapp打包apk允许横屏竖屏内容翻转

文章目录 一、教程总结 一、教程 1.添加配置 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏反方向"landscape-secondary",//自然方向"…

ElasticSearch 常见故障解析与修复秘籍

文章目录 一、ElasticSearch启动服务提示无法使用root用户二、ElasticSearch启动提示进程可拥有的虚拟内存少三、ElasticSearch提示用户拥有的可创建文件描述符太少四、ElasticSearch集群yellow状态分析五、ElasticSearch节点磁盘使用率过高&#xff0c;read_only状态问题解决六…

Java——网络编程(上)

1 计算机网络 (作用资源共享和信息传递) (计算机网络组成——> 硬件——>计算机设备&#xff0c;外部设备&#xff0c;通信线路 软件——>网络操作系统&#xff0c;网络管理软件&#xff0c;网络通信协议) 计算机网络是指将地理位置不同的具有独立功能的多台计算机…

游戏引擎学习第50天

仓库: https://gitee.com/mrxiao_com/2d_game Minkowski 这个算法有点懵逼 回顾 基本上&#xff0c;现在我们所处的阶段是&#xff0c;回顾最初的代码&#xff0c;我们正在讨论我们希望在引擎中实现的所有功能。我们正在做的版本是初步的、粗略的版本&#xff0c;涵盖我们认…

Unix 和 Windows 的有趣比较

Unix 和 Windows NT 比较 来源于这两本书&#xff0c;把两本书对照来读&#xff0c;发现很多有意思的地方&#xff1a; 《Unix 传奇》 https://book.douban.com/subject/35292726/ 《观止 微软创建NT和未来的夺命狂奔 》 Showstopper!: The Breakneck Race to Create Windows…

攻防世界逆向刷题笔记(新手模式6-?)

6.1000clicks 看题目名字似乎是让咱们点击1000次之后才会出flag。本来打算用CE看能不能搜索出来数值&#xff0c;技术不到家&#xff0c;最后没有搜索到&#xff0c;还导致永劫无间打不了了。所以还是拿出IDA老实分析。 直接搜索flag字符&#xff0c;出来一大堆。张紫涵大佬说…

ANOMALY BERT 解读

出处&#xff1a; ICLR workshop 2023 代码&#xff1a;Jhryu30/AnomalyBERT 可视化效果&#xff1a; 一 提出动机 动机&#xff1a;无监督 TSAD 领域内&#xff0c;“训练集” 也缺失&#xff1a;真值标签&#xff08;GT&#xff09;&#xff1b;换句话说&#xff0c;一个…