如今yolov5的neck用的都是PANet,在efficient文章中給出了BiFPN結(jié)構(gòu),也有更為很不錯的特性,接下來本文關(guān)鍵為大家介紹了對于如何將yolov5里的PANet層改成BiFPN的資料,必須的小伙伴可以借鑒一下
一、Add
1.在common.py后放入如下所示編碼
#融合BiFPN設(shè)定可學(xué)習(xí)培訓(xùn)主要參數(shù)學(xué)習(xí)培訓(xùn)差異支系的權(quán)重值 #2個支系add實際操作 classBiFPN_Add2(nn.Module): def__init__(self,c1,c2): super(BiFPN_Add2,self).__init__() #設(shè)定可學(xué)習(xí)培訓(xùn)主要參數(shù)nn.Parameter的的作用是:把一個不能鍛煉的種類Tensor轉(zhuǎn)化成能夠鍛煉的種類parameter #而且會往寄主實體模型申請注冊該主要參數(shù)作為其部分即model.parameters()會含有這個parameter #進(jìn)而在參數(shù)優(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])) #三個分支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)#將權(quán)重進(jìn)行歸一化 #Fast normalized fusion return self.conv(self.silu(weight[0]*x[0]+weight[1]*x[1]+weight[2]*x[2]))
2.yolov5s.yaml進(jìn)行修改
#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 BiFPN head head: [[-1,1,Conv,[512,1,1]], [-1,1,nn.Upsample,[None,2,'nearest']], [[-1,6],1,BiFPN_Add2,[256,256]],#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,BiFPN_Add2,[128,128]],#cat backbone P3 [-1,3,C3,[256,False]],#17(P3/8-small) [-1,1,Conv,[512,3,2]],#為了BiFPN正確add,調(diào)整channel數(shù) [[-1,13,6],1,BiFPN_Add3,[256,256]],#cat P4<---BiFPN change注意v5s通道數(shù)是默認(rèn)參數(shù)的一半 [-1,3,C3,[512,False]],#20(P4/16-medium) [-1,1,Conv,[512,3,2]], [[-1,10],1,BiFPN_Add2,[256,256]],#cat head P5 [-1,3,C3,[1024,False]],#23(P5/32-large) [[17,20,23],1,Detect,[nc,anchors]],#Detect(P3,P4,P5) ]
3.修改yolo.py,在parse_model函數(shù)中找到elif m is Concat:語句,在其后面加上BiFPN_Add相關(guān)語句:
#添加bifpn_add結(jié)構(gòu)
elif m in[BiFPN_Add2,BiFPN_Add3]: c2=max([ch[x]for x in f])
4.修改train.py,向優(yōu)化器中添加BiFPN的權(quán)重參數(shù)
將BiFPN_Add2和BiFPN_Add3函數(shù)中定義的w參數(shù),加入g1
#BiFPN_Concat elif isinstance(v,BiFPN_Add2)and hasattr(v,'w')and isinstance(v.w,nn.Parameter): g1.append(v.w) elif isinstance(v,BiFPN_Add3)and hasattr(v,'w')and isinstance(v.w,nn.Parameter): g1.append(v.w)
然后導(dǎo)入一下這兩個包
二、Concat
1.在common.py后加入如下代碼
#結(jié)合BiFPN設(shè)置可學(xué)習(xí)參數(shù)學(xué)習(xí)不同分支的權(quán)重 #兩個分支concat操作 class BiFPN_Concat2(nn.Module): def __init__(self,dimension=1): super(BiFPN_Concat2,self).__init__() self.d=dimension self.w=nn.Parameter(torch.ones(2,dtype=torch.float32),requires_grad=True) self.epsilon=0.0001 def forward(self,x): w=self.w weight=w/(torch.sum(w,dim=0)+self.epsilon)#將權(quán)重進(jìn)行歸一化 #Fast normalized fusion x=[weight[0]*x[0],weight[1]*x[1]] return torch.cat(x,self.d) #三個分支concat操作 class BiFPN_Concat3(nn.Module): def __init__(self,dimension=1): super(BiFPN_Concat3,self).__init__() self.d=dimension #設(shè)置可學(xué)習(xí)參數(shù)nn.Parameter的作用是:將一個不可訓(xùn)練的類型Tensor轉(zhuǎn)換成可以訓(xùn)練的類型parameter #并且會向宿主模型注冊該參數(shù)成為其一部分即model.parameters()會包含這個parameter #從而在參數(shù)優(yōu)化的時候可以自動一起優(yōu)化 self.w=nn.Parameter(torch.ones(3,dtype=torch.float32),requires_grad=True) self.epsilon=0.0001 def forward(self,x): w=self.w weight=w/(torch.sum(w,dim=0)+self.epsilon)#將權(quán)重進(jìn)行歸一化 #Fast normalized fusion x=[weight[0]*x[0],weight[1]*x[1],weight[2]*x[2]] return torch.cat(x,self.d) 2.yolov5s.yaml進(jìn)行修改 #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 BiFPN head head: [[-1,1,Conv,[512,1,1]], [-1,1,nn.Upsample,[None,2,'nearest']], [[-1,6],1,BiFPN_Concat2,[1]],#cat backbone P4<---BiFPN change [-1,3,C3,[512,False]],#13 [-1,1,Conv,[256,1,1]], [-1,1,nn.Upsample,[None,2,'nearest']], [[-1,4],1,BiFPN_Concat2,[1]],#cat backbone P3<---BiFPN change [-1,3,C3,[256,False]],#17(P3/8-small) [-1,1,Conv,[256,3,2]], [[-1,14,6],1,BiFPN_Concat3,[1]],#cat P4<---BiFPN change [-1,3,C3,[512,False]],#20(P4/16-medium) [-1,1,Conv,[512,3,2]], [[-1,10],1,BiFPN_Concat2,[1]],#cat head P5<---BiFPN change [-1,3,C3,[1024,False]],#23(P5/32-large) [[17,20,23],1,Detect,[nc,anchors]],#Detect(P3,P4,P5) ] 3.修改yolo.py,在parse_model函數(shù)中找到elif m is Concat:語句,在其后面加上BiFPN_Concat相關(guān)語句: #添加bifpn_concat結(jié)構(gòu) elif m in[Concat,BiFPN_Concat2,BiFPN_Concat3]: c2=sum(ch[x]for x in f) 4.修改train.py,向優(yōu)化器中添加BiFPN的權(quán)重參數(shù) 添加復(fù)方式同上(Add) #BiFPN_Concat elif isinstance(v,BiFPN_Concat2)and hasattr(v,'w')and isinstance(v.w,nn.Parameter): g1.append(v.w) elif isinstance(v,BiFPN_Concat3)and hasattr(v,'w')and isinstance(v.w,nn.Parameter): g1.append(v.w)
綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家?guī)韼椭?/p>
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/129033.html
如今yolov5的neck用的都是PANet,在efficient文章中給出了BiFPN結(jié)構(gòu),也有更為很不錯的特性,接下來本文關(guān)鍵為大家介紹了對于如何將yolov5里的PANet層改成BiFPN的資料,需用的小伙伴可以借鑒一下 一、Add 1.在common.py后放入如下所示編碼 #融合BiFPN設(shè)定可學(xué)習(xí)培訓(xùn)主要參數(shù)學(xué)習(xí)培訓(xùn)不一樣支系的權(quán)重值 #2個支系add實際操作 cl...
注意力機(jī)制最開始被用于NLP行業(yè),Attention就是為了給實體模型意識到信息中哪一塊是最關(guān)鍵的,給它分派更多的權(quán)重值,獲得更多集中注意力在某些特點上,讓實體模型主要表現(xiàn)更強(qiáng),文中關(guān)鍵為大家介紹了有關(guān)YOLOv5改善實例教程之加上注意力機(jī)制的資料,必須的小伙伴可以借鑒一下 文中關(guān)鍵為大家講解一下下,怎樣在yolov5中加入注意力機(jī)制, 這兒給予SE通道專注力的改進(jìn)方案,別的專注力的加上方...
閱讀 919·2023-01-14 11:38
閱讀 891·2023-01-14 11:04
閱讀 750·2023-01-14 10:48
閱讀 2039·2023-01-14 10:34
閱讀 956·2023-01-14 10:24
閱讀 833·2023-01-14 10:18
閱讀 506·2023-01-14 10:09
閱讀 583·2023-01-14 10:02