首頁 > 軟體

如何將yolov5中的PANet層改為BiFPN詳析

2022-06-27 22:01:34

本文以YOLOv5-6.1版本為例

一、Add

1.在common.py後加入如下程式碼

# 結合BiFPN 設定可學習引數 學習不同分支的權重
# 兩個分支add操作
class BiFPN_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 

IT145.com E-mail:sddin#qq.com