国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何把yolov5里的PANet層改成BiFPN詳析

89542767 / 1361人閱讀

  如今yolov5的neck用的都是PANet,在efficient文章中給出了BiFPN結構,也有更為很不錯的特性,接下來本文關鍵為大家介紹了對于如何將yolov5里的PANet層改成BiFPN的資料,必須的小伙伴可以借鑒一下


  一、Add


  1.在common.py后放入如下所示編碼


  #融合BiFPN設定可學習培訓主要參數學習培訓差異支系的權重值
  #2個支系add實際操作
  classBiFPN_Add2(nn.Module):
  def__init__(self,c1,c2):
  super(BiFPN_Add2,self).__init__()
  #設定可學習培訓主要參數nn.Parameter的的作用是:把一個不能鍛煉的種類Tensor轉化成能夠鍛煉的種類parameter
  #而且會往寄主實體模型申請注冊該主要參數作為其部分即model.parameters()會含有這個parameter
  #進而在參數優化的時候也可以全自動一塊兒提升
  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)#將權重進行歸一化
  #Fast normalized fusion
  return self.conv(self.silu(weight[0]*x[0]+weight[1]*x[1]+weight[2]*x[2]))


  2.yolov5s.yaml進行修改


  #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,調整channel數
  [[-1,13,6],1,BiFPN_Add3,[256,256]],#cat P4<---BiFPN change注意v5s通道數是默認參數的一半
  [-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函數中找到elif m is Concat:語句,在其后面加上BiFPN_Add相關語句:

01.png

  #添加bifpn_add結構


  elif m in[BiFPN_Add2,BiFPN_Add3]:
  c2=max([ch[x]for x in f])

02.png

  4.修改train.py,向優化器中添加BiFPN的權重參數


  將BiFPN_Add2和BiFPN_Add3函數中定義的w參數,加入g1

03.png

  #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)


  然后導入一下這兩個包

04.png

  二、Concat


  1.在common.py后加入如下代碼


  #結合BiFPN設置可學習參數學習不同分支的權重
  #兩個分支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)#將權重進行歸一化
  #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
  #設置可學習參數nn.Parameter的作用是:將一個不可訓練的類型Tensor轉換成可以訓練的類型parameter
  #并且會向宿主模型注冊該參數成為其一部分即model.parameters()會包含這個parameter
  #從而在參數優化的時候可以自動一起優化
  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)#將權重進行歸一化
  #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進行修改
  #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函數中找到elif m is Concat:語句,在其后面加上BiFPN_Concat相關語句:
  #添加bifpn_concat結構
  elif m in[Concat,BiFPN_Concat2,BiFPN_Concat3]:
  c2=sum(ch[x]for x in f)
  4.修改train.py,向優化器中添加BiFPN的權重參數
  添加復方式同上(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)


  綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家帶來幫助。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129033.html

相關文章

  • 如何yolov5里的PANet改成BiFPN詳析

      如今yolov5的neck用的都是PANet,在efficient文章中給出了BiFPN結構,也有更為很不錯的特性,接下來本文關鍵為大家介紹了對于如何將yolov5里的PANet層改成BiFPN的資料,需用的小伙伴可以借鑒一下  一、Add  1.在common.py后放入如下所示編碼   #融合BiFPN設定可學習培訓主要參數學習培訓不一樣支系的權重值   #2個支系add實際操作   cl...

    89542767 評論0 收藏0
  • YOLOv5改善實例教程之加上注意力機制

      注意力機制最開始被用于NLP行業,Attention就是為了給實體模型意識到信息中哪一塊是最關鍵的,給它分派更多的權重值,獲得更多集中注意力在某些特點上,讓實體模型主要表現更強,文中關鍵為大家介紹了有關YOLOv5改善實例教程之加上注意力機制的資料,必須的小伙伴可以借鑒一下  文中關鍵為大家講解一下下,怎樣在yolov5中加入注意力機制,  這兒給予SE通道專注力的改進方案,別的專注力的加上方...

    89542767 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<