目錄
1.簡介
2.YOLOv5改進
2.1增加以下S2-MLPv2.yaml文件
2.2common.py配置
2.3yolo.py配置
1.簡介
?S2-MLPv2注意力機制
?
最近,出現(xiàn)了基于 MLP 的視覺主干。與 CNN 和視覺Transformer相比,基于 MLP 的視覺架構具有較少的歸納偏差,在圖像識別方面實現(xiàn)了有競爭力的性能。其中,spatial-shift MLP (S2-MLP),采用直接的空間位移操作,取得了比包括 MLP-mixer 和 ResMLP 在內(nèi)的開創(chuàng)性工作更好的性能。使用具有金字塔結構的較小補丁,視覺置換器 (ViP) 和Global Filter Network (GFNet) 實現(xiàn)了比 S2-MLP 更好的性能。
在本文中,我們改進了 S2-MLP 視覺主干。我們沿通道維度擴展特征圖,并將擴展后的特征圖分成幾個部分。我們對分割部分進行不同的空間移位操作。
本文對空間移位MLP (S2-MLP)模型進行了改進,提出了S2-MLPv2模型。將feature map進行擴展,并將擴展后的feature map分為三部分。它將每個部分單獨移動,然后通過split-attention融合分開的特征圖。同時,我們利用層次金字塔來提高其建模細粒度細節(jié)的能力,以獲得更高的識別精度。在沒有外部訓練數(shù)據(jù)集的情況下,采用224×224的images,我們的s2-mlv2-medium模型在ImageNet1K數(shù)據(jù)集上取得了83.6%的top-1準確率,這是目前基于MLP的方法中最先進的性能。同時,與基于transformer的方法相比,我們的S2-MLPv2模型在不需要自我注意的情況下,參數(shù)更少,達到了相當?shù)木取?/p>
? ? ? ? 與基于MLP的先驅作品如MLP-Mixer、ResMLP以及最近類似MLP的模型如Vision Permutator和GFNet相比,空間移位MLP的另一個重要優(yōu)勢是,空間移位MLP的形狀對圖像的輸入尺度是不變的。因此,經(jīng)過特定尺度圖像預訓練的空間移位MLP模型可以很好地應用于具有不同尺寸輸入圖像的下游任務。未來的工作將致力于不斷提高空間移位MLP體系結構的圖像識別精度。一個有希望且直接的方向是嘗試更小尺寸的patch和更高級的四層金字塔,如CycleMLP和AS-MLP,以進一步減少FLOPs和縮短基于transformer模型之間的識別差距。
?
?S2注意力機制(S2 Attention Mechanism)是一種用于序列建模和注意力機制改進的方法,特別在自然語言處理(NLP)領域中得到廣泛應用。它是對傳統(tǒng)的自注意力機制(self-attention)進行改進,旨在提高序列中不同位置之間的關聯(lián)性建模能力。
-
自注意力機制回顧: 自注意力機制是一種用于處理序列數(shù)據(jù)的方法,最早在Transformer模型中提出并廣泛用于NLP任務中。在自注意力機制中,序列中的每個位置都可以與其他所有位置進行交互,以便捕獲位置之間的關系。然而,這種全局的交互可能會導致計算復雜度的增加,并且可能過于強調(diào)距離較近的位置。
-
S2注意力機制的改進: S2注意力機制引入了一種分段結構,將序列分為不同的段(segments)。每個段內(nèi)的位置之間可以進行交互,但不同段之間的交互被限制。這種分段結構在捕獲長距離依賴關系時更加高效,因為不同段之間的關聯(lián)性通常較弱。
-
注意力計算: 在S2注意力中,注意力權重的計算仍然涉及對查詢(query)、鍵(key)和值(value)的操作。不同之處在于,每個段的注意力計算是獨立的,而不同段之間的注意力權重設為固定值(通常為0)。
-
優(yōu)勢與應用: S2注意力機制的主要優(yōu)勢是在捕獲序列中的長距離依賴關系時表現(xiàn)更加高效。這在處理長文本或長序列時特別有用,可以減少計算成本,同時提高建模性能。S2注意力機制在機器翻譯、文本生成、命名實體識別等NLP任務中都有應用,以更好地處理長文本的關系建模。
2.YOLOv5改進
2.1增加以下S2-MLPv2.yaml文件
# parameters
# YOLOv5 ?? by Ultralytics, GPL-3.0 license
# Parameters
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[-1, 1, S2Attention, [1024]], #修改
[[17, 20, 24], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
2.2common.py配置
./models/common.py文件增加以下模塊
import numpy as np
import torch
from torch import nn
from torch.nn import init
# https://arxiv.org/abs/2108.01072
def spatial_shift1(x):
b,w,h,c = x.size()
x[:,1:,:,:c//4] = x[:,:w-1,:,:c//4]
x[:,:w-1,:,c//4:c//2] = x[:,1:,:,c//4:c//2]
x[:,:,1:,c//2:c*3//4] = x[:,:,:h-1,c//2:c*3//4]
x[:,:,:h-1,3*c//4:] = x[:,:,1:,3*c//4:]
return x
def spatial_shift2(x):
b,w,h,c = x.size()
x[:,:,1:,:c//4] = x[:,:,:h-1,:c//4]
x[:,:,:h-1,c//4:c//2] = x[:,:,1:,c//4:c//2]
x[:,1:,:,c//2:c*3//4] = x[:,:w-1,:,c//2:c*3//4]
x[:,:w-1,:,3*c//4:] = x[:,1:,:,3*c//4:]
return x
class SplitAttention(nn.Module):
def __init__(self,channel=512,k=3):
super().__init__()
self.channel=channel
self.k=k
self.mlp1=nn.Linear(channel,channel,bias=False)
self.gelu=nn.GELU()
self.mlp2=nn.Linear(channel,channel*k,bias=False)
self.softmax=nn.Softmax(1)
def forward(self,x_all):
b,k,h,w,c=x_all.shape
x_all=x_all.reshape(b,k,-1,c)
a=torch.sum(torch.sum(x_all,1),1)
hat_a=self.mlp2(self.gelu(self.mlp1(a)))
hat_a=hat_a.reshape(b,self.k,c)
bar_a=self.softmax(hat_a)
attention=bar_a.unsqueeze(-2)
out=attention*x_all
out=torch.sum(out,1).reshape(b,h,w,c)
return out
class S2Attention(nn.Module):
def __init__(self, channels=512 ):
super().__init__()
self.mlp1 = nn.Linear(channels,channels*3)
self.mlp2 = nn.Linear(channels,channels)
self.split_attention = SplitAttention()
def forward(self, x):
b,c,w,h = x.size()
x=x.permute(0,2,3,1)
x = self.mlp1(x)
x1 = spatial_shift1(x[:,:,:,:c])
x2 = spatial_shift2(x[:,:,:,c:c*2])
x3 = x[:,:,:,c*2:]
x_all=torch.stack([x1,x2,x3],1)
a = self.split_attention(x_all)
x = self.mlp2(a)
x=x.permute(0,3,1,2)
return x
2.3yolo.py配置
在 models/yolo.py文件夾下
定位到parse_model函數(shù)中,新增以下代碼
elif m is S2Attention:
c1, c2 = ch[f], args[0]
if c2 != no:
c2 = make_divisible(c2 * gw, 8)
以上就修改完成了文章來源:http://www.zghlxwxcb.cn/news/detail-656875.html
又遇到的問題歡迎評論區(qū)留言討論文章來源地址http://www.zghlxwxcb.cn/news/detail-656875.html
到了這里,關于YOLOv5、YOLOv8改進:S2注意力機制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!