ultralytics-yolov8-backbone改卷积的流程(pconv风车卷积为例)
·
一、我的版本
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里面的现成的数据集,也可以用自己的数据集,不过大部分应该都是自己的数据集。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)