一、我的版本

ultralytics8.3.112

python3.9

二、在conv.py里面添加Pconv的代码

conv.py的位置位于ultralytics-8.3.112/ultralytics/nn/modules/conv.py

点开后把pconv的代码复制到这个文件最下面即可

class PConv(nn.Module):
    ''' Pinwheel-shaped Convolution using the Asymmetric Padding method. '''

    def __init__(self, c1, c2, k, s):
        super().__init__()

        # self.k = k
        p = [(k, 0, 1, 0), (0, k, 0, 1), (0, 1, k, 0), (1, 0, 0, k)]
        self.pad = [nn.ZeroPad2d(padding=(p[g])) for g in range(4)]
        self.cw = Conv(c1, c2 // 4, (1, k), s=s, p=0)
        self.ch = Conv(c1, c2 // 4, (k, 1), s=s, p=0)
        self.cat = Conv(c2, c2, 2, s=1, p=0)

    def forward(self, x):
        yw0 = self.cw(self.pad[0](x))
        yw1 = self.cw(self.pad[1](x))
        yh0 = self.ch(self.pad[2](x))
        yh1 = self.ch(self.pad[3](x))
        return self.cat(torch.cat([yw0, yw1, yh0, yh1], dim=1))


class APC2f(nn.Module):
    """Faster Implementation of APCSP Bottleneck with Asymmetric Padding convolutions."""

    def __init__(self, c1, c2, n=1, shortcut=False, P=True, g=1, e=0.5):
        """Initialize CSP bottleneck layer with two convolutions with arguments ch_in, ch_out, number, shortcut, groups,
        expansion.
        """
        super().__init__()
        self.c = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)
        if P:
            self.m = nn.ModuleList(
                APBottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))
        else:
            self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))

    def forward(self, x):
        """Forward pass through APC2f layer."""
        y = list(self.cv1(x).chunk(2, 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.cv2(torch.cat(y, 1))

    def forward_split(self, x):
        """Forward pass using split() instead of chunk()."""
        y = list(self.cv1(x).split((self.c, self.c), 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.cv2(torch.cat(y, 1))


class APBottleneck(nn.Module):
    """Asymmetric Padding bottleneck."""

    def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):
        """Initializes a bottleneck module with given input/output channels, shortcut option, group, kernels, and
        expansion.
        """
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        p = [(2, 0, 2, 0), (0, 2, 0, 2), (0, 2, 2, 0), (2, 0, 0, 2)]
        self.pad = [nn.ZeroPad2d(padding=(p[g])) for g in range(4)]
        self.cv1 = Conv(c1, c_ // 4, k[0], 1, p=0)
        self.cv2 = Conv(c_, c2, k[1], 1, g=g)
        self.add = shortcut and c1 == c2

    def forward(self, x):
        """'forward()' applies the YOLO FPN to input data."""
        return x + self.cv2((torch.cat([self.cv1(self.pad[g](x)) for g in range(4)], 1))) if self.add else self.cv2(
            (torch.cat([self.cv1(self.pad[g](x)) for g in range(4)], 1)))

 然后在conv.py文件的最上面all里面加入“Pconv”

 

三、在init.py里面添加Pconv

点开ultralytics-8.3.112/ultralytics/nn/modules/__init__.py,在箭头所指的这一行加入Pconv

往下拉到最后all里面同样加入Pconv

四、在task.py里面有两个操作

位置:ultralytics-8.3.112/ultralytics/nn/tasks.py

from ultralytics.nn.modules import 顶部的这个代码里面也加入Pconv

继续往下拉找到这个

def parse_model(d, ch, verbose=True):  # model_dict, input_channels(3)

在这个类别里面加入Pconv

    if verbose:
        LOGGER.info(f"\n{'':>3}{'from':>20}{'n':>3}{'params':>10}  {'module':<45}{'arguments':<30}")
    ch = [ch]
    layers, save, c2 = [], [], ch[-1]  # layers, savelist, ch out
    base_modules = frozenset(
        {
            Classify,
            Conv,
            ConvTranspose,
            GhostConv,
            Bottleneck,
            GhostBottleneck,
            SPP,
            SPPF,
            C2fPSA,
            C2PSA,
            DWConv,
            Focus,
            BottleneckCSP,
            C1,
            C2,
            C2f,
            C3k2,
            RepNCSPELAN4,
            ELAN1,
            ADown,
            AConv,
            SPPELAN,
            C2fAttn,
            C3,
            C3TR,
            C3Ghost,
            torch.nn.ConvTranspose2d,
            DWConvTranspose2d,
            C3x,
            RepC3,
            PSA,
            SCDown,
            C2fCIB,
            A2C2f,
            ScConv,
            AKConv,
            PConv,
            GSConv,
        }
    )

五、修改backbone

ultralytics-8.3.112/ultralytics/cfg/models/v8/yolov8.yaml

复制一个yolov8.yaml的文件在这个文件夹里面改名为myyolov8.yaml

然后在backbone里面把conv改为pconv,具体是什么位置,这个可以自己去试,根据情况尝试

六、运行

from ultralytics import YOLO
import multiprocessing


# --- 主要执行逻辑 ---
if __name__ == '__main__':
    # 在 Windows 上使用 multiprocessing 时,建议添加这行
    # 尤其是在将来可能将脚本打包成可执行文件时
    multiprocessing.freeze_support()

    # --- 把你的模型初始化和训练调用放在这里 ---
    # 例如:
    model = YOLO(r'F:\no2\1code\ultralytics-8.3.112-2\ultralytics-8.3.112\ultralytics\cfg\models\v8\myyolov8.yaml') 

    results = model.train(data='data.yaml',
                          epochs=200, imgsz=640)

    # --- 其他只应在主脚本运行时执行的代码 ---
    print("Training finished.")
    # print(results)

这里的data可以用ultralytics里面的现成的数据集,也可以用自己的数据集,不过大部分应该都是自己的数据集。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐