我在yolov5l.yaml中添加了自定义模块
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
anchors:
- [ 10,13, 16,30, 33,23 ] # P3/8
- [ 30,61, 62,45, 59,119 ] # P4/16
- [ 116,90, 156,198, 373,326 ] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[ [ -1, 1, Conv, [ 64, 6, 2, 2 ] ], # 0-P1/2
[ -1, 1, SplitModule,[ 'test' ] ],
[ -1, 1, Conv, [ 128, 3, 2 ] ], # 2-P2/4
[ -1, 3, C3, [ 128 ] ],
[ -1, 1, Conv, [ 256, 3, 2 ] ], # 4-P3/8
[ -1, 6, C3, [ 256 ] ],
[ -1, 1, Conv, [ 512, 3, 2 ] ], # 6-P4/16
[ -1, 9, C3, [ 512 ] ],
[ -1, 1, Conv, [ 1024, 3, 2 ] ], # 8-P5/32
[ -1, 3, C3, [ 1024 ] ],
[ -1, 1, MergeModule,[ 'test' ] ],
[ -1, 1, SPPF, [ 1024, 5 ] ], # 11
]
# YOLOv5 v6.0 head
head:
[ [ -1, 1, Conv, [ 512, 1, 1 ] ],
[ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ],
[ [ -1, 7 ], 1, Concat, [ 1 ] ], # cat backbone P4
[ -1, 3, C3, [ 512, False ] ], # 15
[ -1, 1, Conv, [ 256, 1, 1 ] ],
[ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ],
[ [ -1, 5 ], 1, Concat, [ 1 ] ], # cat backbone P3
[ -1, 3, C3, [ 256, False ] ], # 19 (P3/8-small)
[ -1, 1, Conv, [ 256, 3, 2 ] ],
[ [ -1, 16 ], 1, Concat, [ 1 ] ], # cat head P4
[ -1, 3, C3, [ 512, False ] ], # 22 (P4/16-medium)
[ -1, 1, Conv, [ 512, 3, 2 ] ],
[ [ -1, 12 ], 1, Concat, [ 1 ] ], # cat head P5
[ -1, 3, C3, [ 1024, False ] ], # 25 (P5/32-large)
[ [ 19, 22, 25 ], 1, Detect, [ nc, anchors ] ], # Detect(P3, P4, P5)
]
为了验证吸力,这两个模块中都没有做操作,在forward函数中直接返回输入的Tensor
class SplitModule(nn.Module):
# Split a module into a list of modules
def __init__(self, arg1):
super(SplitModule, self).__init__()
print("SplitModule: ", arg1)
def forward(self, x):
# print("call SplitModule forward")
return x
class MergeModule(nn.Module):
def __init__(self, arg1):
super(MergeModule, self).__init__()
print("MergeModule: ", arg1)
def forward(self, x):
# print("call MergeModule forward")
return x
相应的我在yolo.py的parser_model中也做了修改,将这两个模块的通道数和他们的上层保持了一致
elif m is SplitModule:
c2 = ch[-1]
elif m is MergeModule:
c2 = ch[-1]
else:
c2 = ch[f]
但是,当我使用过的框架训练coco128数据集时我发现,同样使用yolov5l.pt的预训练修改权重,修改后的训练结果惨不忍睹。 all 128 929 0.00368 0.0421 0.0142 0.00567请问在yolo中正确的添加模块的方法是什么?为什么我添加了这个“透明”的模块,对结果的影响这么大?