yolov5、YOLOv7、YOLOv8改進:注意力機制CA

論文題目:《Coordinate Attention for Efficient Mobile NetWork Design》
論文地址:??https://arxiv.org/pdf/2103.02907.pdf

請添加圖片描述

?

本文中,作者通過將位置信息嵌入到通道注意力中提出了一種新穎的移動網絡注意力機制,將其稱為“Coordinate Attention”。與通過2維全局池化將特征張量轉換為單個特征向量的通道注意力不同,Coordinate注意力將通道注意力分解為兩個1維特征編碼過程,分別沿2個空間方向聚合特征。這樣,可以沿一個空間方向捕獲遠程依賴關系,同時可以沿另一空間方向保留精確的位置信息。然后將生成的特征圖分別編碼為一對方向感知和位置敏感的attention map,可以將其互補地應用于輸入特征圖,以增強關注對象的表示。


不同于通道注意力將輸入通過2D全局池化轉化為單個特征向量,CoordAttention將通道注意力分解為兩個沿著不同方向聚合特征的1D特征編碼過程。這樣的好處是可以沿著一個空間方向捕獲長程依賴,沿著另一個空間方向保留精確的位置信息。然后,將生成的特征圖分別編碼,形成一對方向感知和位置敏感的特征圖,它們可以互補地應用到輸入特征圖來增強感興趣的目標的表示
?

下面附上改進代碼

YOLOv5改進:

common中加入

?

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) / 6class 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 CA(nn.Module):# Coordinate Attention for Efficient Mobile Network Design'''Recent studies on mobile network design have demonstrated the remarkable effectiveness of channel attention (e.g., the Squeeze-and-Excitation attention) for liftingmodel performance, but they generally neglect the positional information, which is important for generating spatially selective attention maps. In this paper, we propose anovel attention mechanism for mobile iscyy networks by embedding positional information into channel attention, whichwe call “coordinate attention”. Unlike channel attentionthat transforms a feature tensor to a single feature vector iscyy via 2D global pooling, the coordinate attention factorizes channel attention into two 1D feature encoding processes that aggregate features along the two spatial directions, respectively'''def __init__(self, inp, oup, reduction=32):super(CA, self).__init__()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, oup, kernel_size=1, stride=1, padding=0)self.conv_w = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)def forward(self, x):identity = xn,c,h,w = x.size()pool_h = nn.AdaptiveAvgPool2d((h, 1))pool_w = nn.AdaptiveAvgPool2d((1, w))x_h = pool_h(x)x_w = 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_hreturn out   

?

在yolo.py中注冊

找到parse.model模塊? ?加入下列代碼

?

        elif m in [CA]:c1, c2 = ch[f], args[0]if c2 != no:  # if not outputssc2 = make_divisible(c2 * gw, 8)args = [c1, c2, *args[1:]]

添加配置文件

# YOLOv5 🚀, GPL-3.0 license# Parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth iscyy multiple
width_multiple: 0.50  # layer channel iscyy 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, CA, [1024]],[[17, 20, 24], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

?到此YOLOv5就改好了

下面介紹yolov7

同樣在common中加入以下代碼

?

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) / 6class 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 CA(nn.Module):# Coordinate Attention for Efficient Mobile Network Design'''Recent studies on mobile network design have demonstrated the remarkable effectiveness of channel attention (e.g., the Squeeze-and-Excitation attention) for liftingmodel performance, but they generally neglect the positional information, which is important for generating spatially selective attention maps. In this paper, we propose anovel attention mechanism for mobile iscyy networks by embedding positional information into channel attention, whichwe call “coordinate attention”. Unlike channel attentionthat transforms a feature tensor to a single feature vector iscyy via 2D global pooling, the coordinate attention factorizes channel attention into two 1D feature encoding processes that aggregate features along the two spatial directions, respectively'''def __init__(self, inp, oup, reduction=32):super(CA, self).__init__()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, oup, kernel_size=1, stride=1, padding=0)self.conv_w = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)def forward(self, x):identity = xn,c,h,w = x.size()pool_h = nn.AdaptiveAvgPool2d((h, 1))pool_w = nn.AdaptiveAvgPool2d((1, w))x_h = pool_h(x)x_w = 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_hreturn out   

?

在yolo.py中注冊

找到parse.model模塊? ?加入下列代碼

?

        elif m in [CA]:c1, c2 = ch[f], args[0]if c2 != no:  # if not outputssc2 = make_divisible(c2 * gw, 8)args = [c1, c2, *args[1:]]

添加配置文件

# YOLOv7 🚀, GPL-3.0 license
# parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel iscyy multiple# anchors
anchors:- [12,16, 19,36, 40,28]  # P3/8- [36,75, 76,55, 72,146]  # P4/16- [142,110, 192,243, 459,401]  # P5/32# yolov7 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [32, 3, 1]],  # 0[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2[-1, 1, Conv, [64, 3, 1]],[-1, 1, Conv, [128, 3, 2]],  # 3-P2/4 [-1, 1, C3, [128]], [-1, 1, Conv, [256, 3, 2]], [-1, 1, MP, []],[-1, 1, Conv, [128, 1, 1]],[-3, 1, Conv, [128, 1, 1]],[-1, 1, Conv, [128, 3, 2]],[[-1, -3], 1, Concat, [1]],  # 16-P3/8[-1, 1, Conv, [128, 1, 1]],[-2, 1, Conv, [128, 1, 1]],[-1, 1, Conv, [128, 3, 1]],[-1, 1, Conv, [128, 3, 1]],[-1, 1, Conv, [128, 3, 1]],[-1, 1, Conv, [128, 3, 1]],[[-1, -3, -5, -6], 1, Concat, [1]],[-1, 1, Conv, [512, 1, 1]],[-1, 1, MP, []],[-1, 1, Conv, [256, 1, 1]],[-3, 1, Conv, [256, 1, 1]],[-1, 1, Conv, [256, 3, 2]],[[-1, -3], 1, Concat, [1]],[-1, 1, Conv, [256, 1, 1]],[-2, 1, Conv, [256, 1, 1]],[-1, 1, Conv, [256, 3, 1]],[-1, 1, Conv, [256, 3, 1]],[-1, 1, Conv, [256, 3, 1]],[-1, 1, Conv, [256, 3, 1]],[[-1, -3, -5, -6], 1, Concat, [1]],[-1, 1, Conv, [1024, 1, 1]],          [-1, 1, MP, []],[-1, 1, Conv, [512, 1, 1]],[-3, 1, Conv, [512, 1, 1]],[-1, 1, Conv, [512, 3, 2]],[[-1, -3], 1, Concat, [1]],[-1, 1, C3, [1024]],[-1, 1, Conv, [256, 3, 1]],]# yolov7 head by iscyy
head:[[-1, 1, SPPCSPC, [512]],[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[31, 1, Conv, [256, 1, 1]],[[-1, -2], 1, Concat, [1]],[-1, 1, C3, [128]],[-1, 1, Conv, [128, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[18, 1, Conv, [128, 1, 1]],[[-1, -2], 1, Concat, [1]],[-1, 1, C3, [128]],[-1, 1, MP, []],[-1, 1, Conv, [128, 1, 1]],[-3, 1, CA, [128]],[-1, 1, Conv, [128, 3, 2]],[[-1, -3, 44], 1, Concat, [1]],[-1, 1, C3, [256]], [-1, 1, MP, []],[-1, 1, Conv, [256, 1, 1]],[-3, 1, Conv, [256, 1, 1]],[-1, 1, Conv, [256, 3, 2]], [[-1, -3, 39], 1, Concat, [1]],[-1, 3, C3, [512]],# 檢測頭 -----------------------------[49, 1, RepConv, [256, 3, 1]],[55, 1, RepConv, [512, 3, 1]],[61, 1, RepConv, [1024, 3, 1]],[[62,63,64], 1, IDetect, [nc, anchors]],   # Detect(P3, P4, P5)]

至此v7就配置完成了

v8的配置同v5是一樣的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35239.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35239.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35239.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nagle算法--網絡優化算法

Nagle Nagle算法是一種網絡優化算法,旨在減少小數據包的網絡傳輸次數,提高網絡傳輸效率。該算法由John Nagle在1984年提出,并被廣泛應用于TCP協議中。 Nagle算法的原理是將較小的數據包進行緩存,在緩存數據包的發送時機到來時&am…

拓撲布局和建立小型網絡

練習 2.6.1:拓撲布局和建立小型網絡 地址表 本實驗不包括地址表。 拓撲圖 學習目標 正確識別網絡中使用的電纜物理連接點對點交換網絡驗證每個網絡的基本連通性 簡介: 許多網絡問題都可以在網絡的物理層解決。因此,必須清楚了解網絡連接…

Python數據分析實戰-列表字符串、字符串列表、字符串的轉化(附源碼和實現效果)

實現功能 str([None,master,hh]) ---> [None,"master","hh"] ---> "None,master,hh" 實現代碼 import re import astx1 str([None,master,hh]) print(x1)x2 ast.literal_eval(x1) print(x2)x3 ",".join(str(item) for item…

阿里云服務器是什么?阿里云服務器有什么優缺點?

阿里云服務器是什么?云服務器ECS是一種安全可靠、彈性可伸縮的云計算服務,云服務器可以降低IT成本提升運維效率,免去企業或個人前期采購IT硬件的成本,阿里云服務器讓用戶像使用水、電、天然氣等公共資源一樣便捷、高效地使用服務器…

Controller是線程安全嗎?如何實現線程安全

測試是否是線程安全 RequestMapping("/test") RestController public class TestController {//1、定義num,判斷不同線程訪問的時候,num的返回結果是否一致private Integer num0;/*** 2、定義兩個方法*/GetMapping("/count1")publi…

【UE4 RTS】08-Setting up Game Clock

前言 本篇實現的效果是在游戲運行后能夠記錄當前的游戲時間(年月日時分秒),并且可以通過修改變量從而改變游戲時間進行的快慢。 效果 步驟 1. 在Blueprints文件夾中新建如下兩個文件夾,分別命名為“GameSettings”、“Player”…

JZ33二叉搜索樹的后序遍歷序列

題目地址:二叉搜索樹的后序遍歷序列_牛客題霸_牛客網 題目回顧: 解題思路: 使用棧 棧的特點是:先進后出。 通讀題目后,我們可以得出,二叉搜索樹是左子節點小于根節點,右子節點大于根節點。 …

章節5:腳本注入網頁-XSS

章節5:腳本注入網頁-XSS XSS :Cross Site Script 惡意攻擊者利用web頁面的漏洞,插入一些惡意代碼,當用戶訪問頁面的時候,代碼就會執行,這個時候就達到了攻擊的目的。 JavaScript、Java、VBScript、Activ…

Elasticsearch的一些基本概念

文章目錄 基本概念:文檔和索引JSON文檔元數據索引REST API 節點和集群節點Master eligible節點和Master節點Data Node 和 Coordinating Node其它節點 分片(Primary Shard & Replica Shard)分片的設定操作命令 基本概念:文檔和索引 Elasticsearch是面…

SQL-每日一題【1517. 查找擁有有效郵箱的用戶】

題目 表: Users 編寫一個解決方案,以查找具有有效電子郵件的用戶。 一個有效的電子郵件具有前綴名稱和域,其中: 前綴 名稱是一個字符串,可以包含字母(大寫或小寫),數字,下劃線 _ &…

RT-Thread Smart 用戶態開發體驗

背景 RT-Thread Smart 是基于 RT-Thread 操作系統上的混合操作系統,它把應用從內核中獨立出來,形成獨立的用戶態應用程序,并具備獨立的地址空間。 自 V5.0.0 起,rt-smart 分支已合并至 master 分支上,下載 rt-thread …

【學習】若依源碼(前后端分離版)之 “ 上傳圖片功能實現”

大型紀錄片:學習若依源碼(前后端分離版)之 “ 上傳圖片功能實現” 前言前端部分后端部分結語 前言 圖片上傳也基本是一個項目的必備功能了,所以今天和大家分享一下我最近在使用若依前后端分離版本時,如何實現圖片上傳…

數據結構和算法基礎

鞏固基礎,砥礪前行 。 只有不斷重復,才能做到超越自己。 能堅持把簡單的事情做到極致,也是不容易的。 java程序員要學習那些技能 : 作為一名Java程序員,要學習以下技能: Java編程語言:掌握Java編程語言的…

虛擬現實與增強現實技術的商業應用

章節一:引言 隨著科技的不斷發展,虛擬現實(Virtual Reality,簡稱VR)與增強現實(Augmented Reality,簡稱AR)技術正日益成為商業領域中的重要創新力量。這兩種技術為企業帶來了前所未…

Oracle將與Kubernetes合作推出DevOps解決方案!

導讀Oracle想成為云計算領域的巨頭,但它不是推出自己品牌的云DevOps軟件,而是將與CoreOS在Kubernetes端展開合作。七年前,Oracle想要成為Linux領域的一家重量級公司。于是,Oracle主席拉里埃利森(Larry Ellison&#xf…

阿里云Windows服務器怎么安裝多個網站?

本文阿里云百科介紹如何在Windows Server 2012 R2 64位系統的ECS實例上使用IIS服務器搭建多個Web站點。本教程適用于熟悉Windows操作系統,希望合理利用資源、統一管理站點以提高運維效率的用戶。比如,您可以在一臺云服務器上配置多個不同分類的博客平臺或…

wps設置一鍵標題字體和大小

參考 wps設置一鍵標題字體和大小:https://www.kafan.cn/A/7v5le1op3g.html 統一一鍵設置

docsify gitee 搭建個人博客

docsify & gitee 搭建個人博客 文章目錄 docsify & gitee 搭建個人博客1.npm 安裝1.1 在Windows上安裝npm:1.2 在macOS上安裝npm:1.3 linux 安裝npm 2. docsify2.1 安裝docsify2.2 自定義配置2.2.1 通過修改index.html,定制化開發頁面…

24屆近5年東南大學自動化考研院校分析

今天給大家帶來的是東南大學控制考研分析 滿滿干貨~還不快快點贊收藏 一、東南大學 學校簡介 東南大學是我國最早建立的高等學府之一,素有“學府圣地”和“東南學府第一流”之美譽。東南大學前身是創建于1902年的三江師范學堂。1921年經近代著名教育家…

數據結構-棧的實現(C語言版)

前言 棧是一種特殊的線性表,只允許在固定的一端進行插入和刪除的操作,進行數據插入和刪除的一端叫做棧頂,另一端叫做棧底。 棧中的數據元素遵循后進先出的的原則。 目錄 1.壓棧和出棧 2. 棧的實現 3.測試代碼 1.壓棧和出棧 壓棧&#xff…