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_div
self.dim_untouched = dim - self.dim_conv
self.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即可。