1、計(jì)算機(jī)視覺(jué)中的注意力機(jī)制
計(jì)算機(jī)視覺(jué)中的注意力機(jī)制是一種聚焦于局部信息的機(jī)制,其基本思想是讓系統(tǒng)學(xué)會(huì)忽略無(wú)關(guān)信息而關(guān)注重點(diǎn)信息。這種機(jī)制在圖像識(shí)別、物體檢測(cè)和人臉識(shí)別等任務(wù)中都發(fā)揮了重要作用。
注意力機(jī)制的實(shí)現(xiàn)方法有多種,其中包括空間注意力模型、通道注意力模型、空間和通道混合注意力模型等。這些模型可以將圖像中的關(guān)鍵信息提取出來(lái),并通過(guò)抑制無(wú)用信息來(lái)提高模型的性能。在計(jì)算機(jī)視覺(jué)中,注意力機(jī)制被廣泛應(yīng)用于各種任務(wù),如目標(biāo)檢測(cè)、圖像分類(lèi)、人臉識(shí)別等。
通過(guò)引入注意力機(jī)制,計(jì)算機(jī)視覺(jué)系統(tǒng)可以更加高效地處理圖像數(shù)據(jù),減少計(jì)算資源的浪費(fèi),同時(shí)提高模型的性能和準(zhǔn)確性。在未來(lái),隨著深度學(xué)習(xí)技術(shù)的不斷發(fā)展,注意力機(jī)制在計(jì)算機(jī)視覺(jué)領(lǐng)域的應(yīng)用前景將會(huì)更加廣闊。
1.1 CBAM:通道注意力和空間注意力的集成者
CBAM(Convolutional Block Attention Module)是一種注意力機(jī)制,它結(jié)合了通道注意力和空間注意力來(lái)提高卷積神經(jīng)網(wǎng)絡(luò)的性能。通道注意力模塊通過(guò)計(jì)算每個(gè)通道的重要性,以區(qū)分不同通道之間的特征。空間注意力模塊則計(jì)算每個(gè)像素在空間上的重要性,以更好地捕捉圖像中的空間結(jié)構(gòu)。
論文題目:《CBAM: Convolutional Block Attention Module》
論文地址: https://arxiv.org/pdf/1807.06521.pdf
上圖可以看到,CBAM包含CAM(Channel Attention Module)和SAM(Spartial Attention Module)兩個(gè)子模塊,分別進(jìn)行通道和空間上的Attention。這樣不只能夠節(jié)約參數(shù)和計(jì)算力,并且保證了其能夠做為即插即用的模塊集成到現(xiàn)有的網(wǎng)絡(luò)架構(gòu)中去。
CBAM的工作原理如下:
- 通道注意力模塊:通過(guò)在通道維度上對(duì)輸入特征圖進(jìn)行最大池化和平均池化,然后將這兩個(gè)池化結(jié)果輸入到一個(gè)全連接層中,最后輸出一個(gè)通道注意力權(quán)重向量。這個(gè)權(quán)重向量可以用來(lái)加權(quán)輸入特征圖的每個(gè)通道,以增強(qiáng)重要的通道特征并抑制不重要的通道特征。
- 空間注意力模塊:類(lèi)似于通道注意力模塊,空間注意力模塊也是通過(guò)對(duì)輸入特征圖進(jìn)行操作來(lái)計(jì)算每個(gè)像素的重要性。它通常使用全局平均池化來(lái)獲取每個(gè)像素的特征向量,然后通過(guò)一個(gè)全連接層來(lái)輸出每個(gè)像素的權(quán)重。這些權(quán)重可以用于加權(quán)輸入特征圖的每個(gè)像素,以強(qiáng)調(diào)圖像中的重要區(qū)域并抑制不重要的區(qū)域。
通過(guò)將通道注意力和空間注意力模塊串聯(lián)起來(lái),可以得到一個(gè)完整的CBAM模塊,用于插入到卷積神經(jīng)網(wǎng)絡(luò)中以提升模型性能。CBAM可以顯著提高計(jì)算機(jī)視覺(jué)任務(wù)的性能,例如目標(biāo)檢測(cè)、圖像分類(lèi)和語(yǔ)義分割等。
2.Yolov8加入CBAM
2.1 CBAM加入cony.py中(相當(dāng)于yolov5中的common.py)
"""
通道注意力模型: 通道維度不變,壓縮空間維度。該模塊關(guān)注輸入圖片中有意義的信息。
1)假設(shè)輸入的數(shù)據(jù)大小是(b,c,w,h)
2)通過(guò)自適應(yīng)平均池化使得輸出的大小變?yōu)?b,c,1,1)
3)通過(guò)2d卷積和sigmod激活函數(shù)后,大小是(b,c,1,1)
4)將上一步輸出的結(jié)果和輸入的數(shù)據(jù)相乘,輸出數(shù)據(jù)大小是(b,c,w,h)。
"""
class ChannelAttention(nn.Module):
# Channel-attention module https://github.com/open-mmlab/mmdetection/tree/v3.0.0rc1/configs/rtmdet
def __init__(self, channels: int) -> None:
super().__init__()
self.pool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Conv2d(channels, channels, 1, 1, 0, bias=True)
self.act = nn.Sigmoid()
def forward(self, x: torch.Tensor) -> torch.Tensor:
return x * self.act(self.fc(self.pool(x)))
"""
空間注意力模塊:空間維度不變,壓縮通道維度。該模塊關(guān)注的是目標(biāo)的位置信息。
1) 假設(shè)輸入的數(shù)據(jù)x是(b,c,w,h),并進(jìn)行兩路處理。
2)其中一路在通道維度上進(jìn)行求平均值,得到的大小是(b,1,w,h);另外一路也在通道維度上進(jìn)行求最大值,得到的大小是(b,1,w,h)。
3) 然后對(duì)上述步驟的兩路輸出進(jìn)行連接,輸出的大小是(b,2,w,h)
4)經(jīng)過(guò)一個(gè)二維卷積網(wǎng)絡(luò),把輸出通道變?yōu)?,輸出大小是(b,1,w,h)
4)將上一步輸出的結(jié)果和輸入的數(shù)據(jù)x相乘,最終輸出數(shù)據(jù)大小是(b,c,w,h)。
"""
class SpatialAttention(nn.Module):
# Spatial-attention module
def __init__(self, kernel_size=7):
super().__init__()
assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
padding = 3 if kernel_size == 7 else 1
self.cv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
self.act = nn.Sigmoid()
def forward(self, x):
return x * self.act(self.cv1(torch.cat([torch.mean(x, 1, keepdim=True), torch.max(x, 1, keepdim=True)[0]], 1)))
class CBAM(nn.Module):
# Convolutional Block Attention Module
def __init__(self, c1, kernel_size=7): # ch_in, kernels
super().__init__()
self.channel_attention = ChannelAttention(c1)
self.spatial_attention = SpatialAttention(kernel_size)
def forward(self, x):
return self.spatial_attention(self.channel_attention(x))
2.2 CBAM加入tasks.py中(相當(dāng)于yolov5中的yolo.py)
from ultralytics.nn.modules import (C1, C2, C3, C3TR, SPP, SPPF, Bottleneck, BottleneckCSP, C2f, C3Ghost, C3x, Classify,
Concat, Conv, ConvTranspose, Detect, DWConv, DWConvTranspose2d, Ensemble, Focus,
GhostBottleneck, GhostConv, Segment,CBAM, GAM_Attention , ResBlock_CBAM)
如圖所示:
2.4 還是在tasks.py,def parse_model(d, ch, verbose=True):函數(shù)中
# 添加CBAM注意力機(jī)制
elif m is CBAM:
c1, c2 = ch[f], args[0]
if c2 != nc: # if c2 not equal to number of classes (i.e. for Classify() output)
c2 = make_divisible(min(c2, max_channels) * width, 8)
args = [c1, *args[1:]]
如圖所示:
2.5 CBAM修改對(duì)應(yīng)yaml
CBAM加入yolov8
將yolov8.yaml復(fù)制一份,改為yolov8n-CBAM.yaml
路徑:ultralytics/ultralytics/cfg/models/v8/yolov8n-CBAM.yaml
yolov8n-CBAM.yaml文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-791562.html
# Ultralytics YOLO ??, GPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 7 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers, 3157200 parameters, 3157184 gradients, 8.9 GFLOPs
s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPs
m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPs
l: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
x: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs
# YOLOv8.0n backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
# YOLOv8.0n head
head:
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 12
- [-1, 1, CBAM, [512]]
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 16 (P3/8-small)
- [-1, 1, CBAM, [256]]
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f, [512]] # 20 (P4/16-medium)
- [-1, 1, CBAM, [512]]
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f, [1024]] # 24 (P5/32-large)
- [-1, 1, CBAM, [1024]]
- [[17, 21, 25], 1, Detect, [nc]] # Detect(P3, P4, P5)
可以看到在head層添加了四層CBAM注意力機(jī)制,至此完成!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-791562.html
到了這里,關(guān)于改進(jìn)YOLOv8:添加CBAM注意力機(jī)制(漲點(diǎn)明顯)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!