论文阅读 Vision GNN: An Image is Worth Graph of Nodes
論文閱讀:Vision GNN: An Image is Worth Graph of Nodes
? ?Kai Han?,Yunhe Wang,Jianyuan Guo,Yehui Tang,?Enhua Wu 文章和代碼: ## ViG Code Paper: [Vision GNN: An Image is Worth Graph of Nodes](https://arxiv.org/abs/2206.00272)- Pretrained models|Model|Params (M)|FLOPs (B)|Top-1|URL| |-|-|-|-|-| |Pyramid ViG-Ti|10.7|1.7|78.5|[[BaiduDisk]](https://pan.baidu.com/s/1Vrr-oXQeUFujaHKMC5sXIQ), Password: chae| |Pyramid ViG-S|27.3|4.6|82.1|[[BaiduDisk]](https://pan.baidu.com/s/10MWZznvPIvGAiBtnwj7TRg), Password: 81mg| |Pyramid ViG-M|51.7|8.9|83.1|[[BaiduDisk]](https://pan.baidu.com/s/1N3nviACOrY0XBC0FKoDL6g), Password: prd3| |Pyramid ViG-B|82.6|16.8|83.7|[[BaiduDisk]](https://pan.baidu.com/s/1b5OvPZXwcSwur2nuDAzf5Q), Password: rgm4|摘要:
?廣泛使用的卷積神經網絡和轉換器將圖像視為一個網格或序列結構,不能靈活地捕捉不規則和復雜的物體。
? ?本文提出將圖像表示為圖結構,并引入一種新的視覺GNN (ViG)體系結構來提取視覺任務的圖級特征。首先將圖像分割成一些被視為節點的補丁,并通過連接最近的鄰居來構造一個圖。基于圖像的圖形表示,我們建立了ViG模型來實現所有節點之間的信息轉換和交換。
? ?ViG由兩個基本模塊組成:graph卷積的Grapher模塊,用于聚集和更新圖信息;兩層線性層的FFN模塊,用于節點特征變換。在不同的模型尺寸下,分別建立各向同性結構和金字塔結構。
1 ?Introduction
計算機視覺:CNN/transformer with attention mechanism/ MLP (multi-layer
? ? ? ? ? ? ? ? ? ? ? ?perceptron)
? ?圖1:圖像數據通常表示為歐氏空間中規則的像素網格
? ?由于物體通常不是不規則的方形,在以前的網絡如ResNet和ViT中常用的網格或序列結構是冗余的,難以處理。一個物體可以被看作是一些部件的組成,這些由關節連接的部分自然地形成了一個圖形結構。
? ? 此外,圖是一種廣義的數據結構,網格和序列可以看作是圖的一種特殊情況。將一個圖像視為一個圖對視覺感知更加靈活和有效。
? ? 將輸入圖像劃分為若干個patch,并將每個patch視為一個節點。在構建了圖像斑塊圖后,使用我們的ViG模型對所有節點之間的信息進行轉換和交換。?
??
? ViG基本單元:
? ? ?GCN (graph convolutional network) module 用于圖形信息處理
? ? ?FFN (feed-forward network) module ?用于節點特征轉換
利用Grapher和FFN模塊,以各向同性和金字塔的方式建立了ViG模型。
圖1 表示圖像數據通常表示為歐氏空間中規則的像素網格?
2 Related Work
? 2.1 CNN, Transformer and MLP for Vision
? 2.2 Graph Neural Network
? Micheli[36]通過結構上的復合非遞歸層提出了基于空間的圖卷積網絡;基于光譜的GCN是Bruna等人[2]首先提出的;GCN在計算機視覺領域的應用:點云分類、場景圖生成和動作識別。GCN只能用自然構造的圖形來處理特定的視覺任務。在計算機視覺的一般應用中,需要一個基于GCN的骨干網絡來直接處理圖像數據。
3 Approach
圖2 是提出的ViG模型的框架
3.1 ViG Block
圖像的圖形表示,這段話多讀幾遍就能理解。重點我已經畫出來了,與最近鄰點生成的邊聚合起來就是想要的圖形。
圖級處理。圖卷積層可以通過聚合其相鄰節點的特征來在節點之間交換信息。
使用最大相對圖卷積
引入了 圖形卷積的多頭更新操作,首先將聚集特征 xi'' 分成 h 個頭,然后分別用不同的權重更新這些頭。所有的頭可以并行更新,并連接為最終值:
?多頭更新操作允許模型在多個表示子空間中更新信息,這有利于特征的多樣性。
?以往的 GCNs 通常重復使用多個圖卷積層來提取圖數據的聚合特征。深度 GCNs 的過平滑現象會降低節點特征的判別性,導致視覺識別性能下降,如下圖所示
其中特征多樣性通過下式判斷
為了緩解這個問題,文中在 ViG 塊中引入了更多的特征變換和非線性激活。
?在圖卷積前后應用一個線性層,將節點特征投影到同一域,增加特征多樣性。在圖卷積后插入一個非線性激活函數,以避免圖層的坍塌。我們將升級后的模塊稱為Grapher模塊。
輸入特征X ∈ RN×D,??Grapher模塊可以表示為
?為了進一步提高特征轉換能力,緩解過平滑現象,我們在每個節點上使用了前饋網絡(FFN)。FFN模塊是一個簡單的多層感知器,有兩個全連接層:?
?在Grapher和FFN模塊中,在每個全連接層或圖卷積層之后都應用批處理歸一化。
3.2 Network Architecture ?
?在計算機視覺領域,常用的轉換器通常具有各向同性結構(如ViT[8]),而CNN更傾向于使用金字塔結構(即ResNet[16])。為了與其他類型的神經網絡進行廣泛的比較,我們為ViG構建了兩種網絡架構,即各向同性架構和金字塔架構。
?Isotropic architecture
我們構建了三個具有不同模型尺寸的各向同性ViG架構版本,即ViG-ti、S和B。節點數設置為N=196。為了逐漸擴大感受域,在這三種模型中,隨著接收層的深度,相鄰節點K的數量從9個線性增加到18個。heads默認設置為h=4。具體情況見表1。?
注:FLOPs,? s小寫,是floating point operations的縮寫(s表復數),意指浮點運算數,理解為計算量。可以用來衡量算法/模型的復雜度。
?Pyramid architecture
?金字塔體系結構考慮了圖像的多尺度特性,隨著層的深入,提取空間尺寸逐漸減小的特征,如ResNet[16]和PVT[54]. 利用先進的設計和建立了四個版本的金字塔ViG模型。具體情況見表2。
?Positional encoding. 位置編碼
?為了表示節點的位置信息,我們在每個節點特征上添加一個位置編碼向量:xi ← xi + ei,??
where ei ∈ RD.?
上式所描述的絕對位置編碼應用于各向同性和金字塔結構。對于節點i和節點j,它們之間的相對位置距離為eTiej,并將其加到特征距離中以構造圖。
?4 Experiments
?4.2?Main Results on ImageNet
?4.3?Ablation Study
?The effects of modules in ViG.
?The number of neighbors.
?The number of heads.
4.5 Visualization
圖中五角星是中心節點,顏色相同的節點是它的相鄰節點。兩個中心節點被可視化為繪制所有的邊緣將是混亂的。可以觀察到,我們的模型可以選擇與內容相關的節點作為一階近鄰,在淺層中,鄰近節點傾向于基于低層次和局部特征,如顏色和紋理。在深層中,中心節點的鄰近語義更強并屬于同一類別。
5 Conclusion?
?我們將圖像劃分成一些補丁,并將它們視為節點。基于這些節點構造圖可以更好地表示不規則的復雜對象。在圖像圖結構上直接使用圖卷積存在過平滑問題,且性能較差。在每個節點內引入了更多的特征轉換,以鼓勵信息的多樣性。基于圖像的圖表示和改進的圖塊,構建了具有各向同性和金字塔結構的視覺GNN(ViG)網絡。
?附錄-偽碼
核心部分即ViG塊的偽代碼
import torch.nn as nn from gcn_lib.dense.torch_vertex import DynConv2d # gcn_lib is downloaded from https://github.com/lightaime/deep_gcns_torch class GrapherModule(nn.Module): """Grapher module with graph conv and FC layers """ def __init__(self, in_channels, hidden_channels, k=9, dilation=1, drop_path=0.0): super(GrapherModule, self).__init__() self.fc1 = nn.Sequential( nn.Conv2d(in_channels, in_channels, 1, stride=1, padding=0), nn.BatchNorm2d(in_channels), ) self.graph_conv = nn.Sequential( DynConv2d(in_channels, hidden_channels, k, dilation, act=None), nn.BatchNorm2d(hidden_channels), nn.GELU(), ) self.fc2 = nn.Sequential( nn.Conv2d(hidden_channels, in_channels, 1, stride=1, padding=0), nn.BatchNorm2d(in_channels), ) self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() def forward(self, x): B, C, H, W = x.shape x = x.reshape(B, C, -1, 1).contiguous() shortcut = x x = self.fc1(x) x = self.graph_conv(x) x = self.fc2(x) x = self.drop_path(x) + shortcut return x.reshape(B, C, H, W) class FFNModule(nn.Module): """Feed-forward Network """ def __init__(self, in_channels, hidden_channels, drop_path=0.0): super(FFNModule, self).__init__() self.fc1 = nn.Sequential( nn.Conv2d(in_channels, in_channels, 1, stride=1, padding=0), nn.BatchNorm2d(in_channels), nn.GELU() ) self.fc2 = nn.Sequential( nn.Conv2d(hidden_channels, in_channels, 1, stride=1, padding=0), nn.BatchNorm2d(in_channels), ) self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() def forward(self, x): shortcut = x x = self.fc1(x) x = self.fc2(x) x = self.drop_path(x) + shortcut return x class ViGBlock(nn.Module): """ViG block with Grapher and FFN modules """ def __init__(self, channels, k, dilation, drop_path=0.0): super(ViGBlock, self).__init__() self.grapher = GrapherModule(channels, channels * 2, k, dilation, drop_path) self.ffn = FFNModule(channels, channels * 4, drop_path) def forward(self, x): x = self.grapher(x) x = self.ffn(x) return x?文章內容大概就是這些啦。
總結
以上是生活随笔為你收集整理的论文阅读 Vision GNN: An Image is Worth Graph of Nodes的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我在b站学数据库 (九):函数
- 下一篇: 解决锐捷客户端出现密码不匹配,请输入正确