Yolov5更換BiFPN的詳細(xì)步驟總結(jié)
Yolov5如何更換BiFPN?
第一步:修改common.py
將如下代碼添加到common.py文件中
# BiFPN
# 兩個(gè)特征圖add操作
class BiFPN_Add2(nn.Module):
def __init__(self, c1, c2):
super(BiFPN_Add2, self).__init__()
# 設(shè)置可學(xué)習(xí)參數(shù) nn.Parameter的作用是:將一個(gè)不可訓(xùn)練的類(lèi)型Tensor轉(zhuǎn)換成可以訓(xùn)練的類(lèi)型parameter
# 并且會(huì)向宿主模型注冊(cè)該參數(shù) 成為其一部分 即model.parameters()會(huì)包含這個(gè)parameter
# 從而在參數(shù)優(yōu)化的時(shí)候可以自動(dòng)一起優(yōu)化
self.w = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True)
self.epsilon = 0.0001
self.conv = nn.Conv2d(c1, c2, kernel_size=1, stride=1, padding=0)
self.silu = nn.SiLU()
def forward(self, x):
w = self.w
weight = w / (torch.sum(w, dim=0) + self.epsilon)
return self.conv(self.silu(weight[0] * x[0] + weight[1] * x[1]))
# 三個(gè)特征圖add操作
class BiFPN_Add3(nn.Module):
def __init__(self, c1, c2):
super(BiFPN_Add3, self).__init__()
self.w = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True)
self.epsilon = 0.0001
self.conv = nn.Conv2d(c1, c2, kernel_size=1, stride=1, padding=0)
self.silu = nn.SiLU()
def forward(self, x):
w = self.w
weight = w / (torch.sum(w, dim=0) + self.epsilon)
# Fast normalized fusion
return self.conv(self.silu(weight[0] * x[0] + weight[1] * x[1] + weight[2] * x[2]))第二步:修改yolo.py
在parse_model函數(shù)中找到elif m is Concat:語(yǔ)句,在其后面加上BiFPN_Add相關(guān)語(yǔ)句

elif m is Concat:
c2 = sum(ch[x] for x in f)
# 添加bifpn_add結(jié)構(gòu)
elif m in [BiFPN_Add2, BiFPN_Add3]:
c2 = max([ch[x] for x in f])
第三步:修改train.py
將BiFPN_Add2和BiFPN_Add3函數(shù)中定義的w參數(shù),加入g1

g = [], [], [] # optimizer parameter groups
bn = tuple(v for k, v in nn.__dict__.items() if 'Norm' in k) # normalization layers, i.e. BatchNorm2d()
for v in model.modules():
# hasattr: 測(cè)試指定的對(duì)象是否具有給定的屬性,返回一個(gè)布爾值
if hasattr(v, 'bias') and isinstance(v.bias, nn.Parameter): # bias
g[2].append(v.bias)
if isinstance(v, bn): # weight (no decay)
g[1].append(v.weight)
elif hasattr(v, 'weight') and isinstance(v.weight, nn.Parameter): # weight (with decay)
g[0].append(v.weight)
# BiFPN_Concat
elif isinstance(v, BiFPN_Add2) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter):
g[1].append(v.w)
elif isinstance(v, BiFPN_Add3) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter):
g[1].append(v.w)
導(dǎo)入BiFPN_Add3, BiFPN_Add2
from models.common import BiFPN_Add3, BiFPN_Add2
第四步:修改yolov5.yaml
將Concat全部換成BiFPN_Add
注意:BiFPN_Add本質(zhì)是add操作,因此輸入層通道數(shù)、feature map要完全對(duì)應(yīng)
2022.8.25 官方也提供了BiFPN,可以嘗試用官方的
關(guān)于5m加BiFPN的文件我已經(jīng)更新到了我的Git
總結(jié)
到此這篇關(guān)于Yolov5更換BiFPN的文章就介紹到這了,更多相關(guān)Yolov5更換BiFPN內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python爬蟲(chóng)之必備chardet庫(kù)
這篇文章主要介紹了Python爬蟲(chóng)之必備chardet庫(kù),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
python編程實(shí)現(xiàn)12306的一個(gè)小爬蟲(chóng)實(shí)例
這篇文章主要介紹了python編程實(shí)現(xiàn)12306的一個(gè)小爬蟲(chóng)實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
python日期與時(shí)間戳的各種轉(zhuǎn)換示例
這篇文章主要介紹了python日期與時(shí)間戳的各種轉(zhuǎn)換示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
詳解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和區(qū)別
這篇文章主要介紹了詳解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-06-06
pytorch中使用cuda擴(kuò)展的實(shí)現(xiàn)示例
這篇文章主要介紹了pytorch中使用cuda擴(kuò)展的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Django REST framework 單元測(cè)試實(shí)例解析
這篇文章主要介紹了Django REST framework 單元測(cè)試實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11

