1. CA注意力機制
CA(Coordinate Attention)注意力機制是一種用于加強深度學習模型對輸入數(shù)據(jù)的空間結(jié)構(gòu)理解的注意力機制。CA 注意力機制的核心思想是引入坐標信息,以便模型可以更好地理解不同位置之間的關(guān)系。如下圖:
1. 輸入特征: CA 注意力機制的輸入通常是一個特征圖,它通常是卷積神經(jīng)網(wǎng)絡(CNN)中的某一層的輸出,具有以下形狀:[C, H, W]
,其中:
-
C
是通道數(shù),表示特征圖中的不同特征通道。 -
H
是高度,表示特征圖的垂直維度。 -
W
是寬度,表示特征圖的水平維度。
2. 全局平均池化: CA 注意力機制首先對輸入特征圖進行兩次全局平均池化,一次在寬度方向上,一次在高度方向上。這兩次操作分別得到兩個特征映射:
- 在寬度方向上的平均池化得到特征映射
[C, H, 1]
。 - 在高度方向上的平均池化得到特征映射
[C, 1, W]
。
這兩個特征映射分別捕捉了在寬度和高度方向上的全局特征。
3. 合并寬高特征: 將上述兩個特征映射合并,通常通過簡單的堆疊操作,得到一個新的特征層,形狀為 [C, 1, H + W]
,其中 H + W
表示在寬度和高度兩個方向上的維度合并在一起。
4. 卷積+標準化+激活函數(shù): 對合并后的特征層進行卷積操作,通常是 1x1 卷積,以捕捉寬度和高度維度之間的關(guān)系。然后,通常會應用標準化(如批量標準化)和激活函數(shù)(如ReLU)來進一步處理特征,得到一個更加豐富的表示。
5. 再次分開: 分別從上述特征層中分離出寬度和高度方向的特征:
- 一個分支得到特征層
[C, 1, H]
。 - 另一個分支得到特征層
[C, 1, W]
。
6. 轉(zhuǎn)置: 對分開的兩個特征層進行轉(zhuǎn)置操作,以恢復寬度和高度的維度,得到兩個特征層分別為 [C, H, 1]
和 [C, 1, W]
。
7. 通道調(diào)整和 Sigmoid: 對兩個分開的特征層分別應用 1x1 卷積,以調(diào)整通道數(shù),使其適應注意力計算。然后,應用 Sigmoid 激活函數(shù),得到在寬度和高度維度上的注意力分數(shù)。這些分數(shù)用于指示不同位置的重要性。
8. 應用注意力: 將原始輸入特征圖與寬度和高度方向上的注意力分數(shù)相乘,得到 CA 注意力機制的輸出。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-712989.html
2. YOLOv8添加CA注意力機制
加入注意力機制,在ultralytics包中的nn包的modules里添加CA注意力模塊,我這里選擇在conv.py文件中添加CA注意力機制。
CA注意力機制代碼如下:
import torch
import torch.nn as nn
import torch.nn.functional as F
class h_sigmoid(nn.Module):
def __init__(self, inplace=True):
super(h_sigmoid, self).__init__()
self.relu = nn.ReLU6(inplace=inplace)
def forward(self, x):
return self.relu(x + 3) / 6
class h_swish(nn.Module):
def __init__(self, inplace=True):
super(h_swish, self).__init__()
self.sigmoid = h_sigmoid(inplace=inplace)
def forward(self, x):
return x * self.sigmoid(x)
class CoordAtt(nn.Module):
def __init__(self, inp, reduction=32):
super(CoordAtt, self).__init__()
self.pool_h = nn.AdaptiveAvgPool2d((None, 1))
self.pool_w = nn.AdaptiveAvgPool2d((1, None))
mip = max(8, inp // reduction)
self.conv1 = nn.Conv2d(inp, mip, kernel_size=1, stride=1, padding=0)
self.bn1 = nn.BatchNorm2d(mip)
self.act = h_swish()
self.conv_h = nn.Conv2d(mip, inp, kernel_size=1, stride=1, padding=0)
self.conv_w = nn.Conv2d(mip, inp, kernel_size=1, stride=1, padding=0)
def forward(self, x):
identity = x
n, c, h, w = x.size()
x_h = self.pool_h(x)
x_w = self.pool_w(x).permute(0, 1, 3, 2)
y = torch.cat([x_h, x_w], dim=2)
y = self.conv1(y)
y = self.bn1(y)
y = self.act(y)
x_h, x_w = torch.split(y, [h, w], dim=2)
x_w = x_w.permute(0, 1, 3, 2)
a_h = self.conv_h(x_h).sigmoid()
a_w = self.conv_w(x_w).sigmoid()
out = identity * a_w * a_h
return out
CA注意力機制的注冊和引用如下:
?ultralytics/nn/modules/_init_.py文件中:
??ultralytics/nn/tasks.py文件夾中:
?在tasks.py中的parse_model中添加如下代碼:
elif m in {CoordAtt}:
args=[ch[f],*args]
新建相應的yolov8s-CA.yaml文件,代碼如下:
# Ultralytics YOLO ??, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 80 # 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,CoordAtt,[]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1,1,CoordAtt,[]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1,1,CoordAtt,[]]
- [-1, 1, SPPF, [1024, 5]] # 9
# YOLOv8.0n head
head:
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 8], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 12
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 5], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 15 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 15], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f, [512]] # 18 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 12], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f, [1024]] # 21 (P5/32-large)
- [[18, 21, 24], 1, Detect, [nc]] # Detect(P3, P4, P5)
在main.py文件中進行訓練:
if __name__ == '__main__':
# 使用yaml配置文件來創(chuàng)建模型,并導入預訓練權(quán)重.
model = YOLO('ultralytics/cfg/models/v8/yolov8s-CA.yaml')
# model.load('yolov8n.pt')
model.train(**{'cfg': 'ultralytics/cfg/default.yaml', 'data': 'dataset/data.yaml'})
?文章來源:http://www.zghlxwxcb.cn/news/detail-712989.html
?
到了這里,關(guān)于YOLOv8改進算法之添加CA注意力機制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!