1,Pconv(來自Fasternet)(可作為模型中的基礎卷積模塊使用)
論文鏈接:https://arxiv.org/abs/2303.03667
2,為了大家方便的使用,這里我對原本的PConv的代碼做了部分的改動,使得它的參數設置與Conv保持一致。大家直接將這一部分代碼放到models/common.py的最后面。
import torch
import torch.nn as nn
import torch.nn.functional as F
class PConv(nn.Module):def __init__(self,dim: int,c2,k,s=1,n_div=2,forward: str = "split_cat",kernel_size: int = 3) -> None:super(PConv, self).__init__()self.dim_conv = dim//n_divself.dim_untouched = dim - self.dim_convself.conv = nn.Conv2d(self.dim_conv,self.dim_conv,kernel_size=k,stride=s,padding=k//2,bias=False)self.bn = nn.BatchNorm2d(dim)self.act = nn.SiLU()def forward(self,x):x1,x2 = torch.split(x,[self.dim_conv,self.dim_untouched],dim=1)x1 = self.conv(x1)x = torch.cat((x1,x2),1)return self.act(self.bn(x))
3,在models/yolo.py中將模塊名添加上,大約是752行
4,自己動手diy配置文件yolov7.yaml文件。
這里有一個注意事項,因為PConv本身只是一個基本的卷積操作,因此它并不支持下采樣和通道變換操作,因此為了盡可能的簡單,大家直接在一些通道前后沒改變的地方,沒有進行下采樣的地方使用PConv即可。