YOLOv5 主干网从 Darknet 替换为 Resnet-50 形状问题

问题描述 投票:0回答:1

我是一名研究员,想要将 YOLOv5 当前的 backbon 从 darknet 更改为 resnet,因为我在 commons.py 中添加了这两个类。 在 Yolo.py 中添加 Maxpooling2D 和 Resblock 类名后出现此形状错误 发生此错误后,模型摘要成功打印在屏幕上。

    # MaxPooling2D layer with args(kernel, stride, padding)
    def __init__(self, k=2, s=2, p=0):
        super().__init__()
        self.maxpool = nn.MaxPool2d(k, s, p)

    def forward(self, x):
        return self.maxpool(x)

class ResBlock(nn.Module):
    def __init__(self, c1, num_repeats):
        super().__init__()
        self.blocks = nn.Sequential(*[
            nn.Identity() if i == 0 else Conv(c1, c1, k=3, s=1, act=True) for i in range(num_repeats)
        ])

    def forward(self, x):
        return torch.cat(x, self.blocks(x))

#Backbone
backbone: [
    [-1, 1, "Conv", [64, 6, 2, 2]],  # 0 - Conv1
    [-1, 1, "MaxPooling2D", [3, 2]],   # 1 - MaxPool
    [-1, 3, "ResBlock", [64]],         # 2 - Res2a, Res2b, Res2c
    [-1, 1, "Conv", [128, 3, 2]], # 3 - Conv3
    [-1, 4, "ResBlock", [128]],        # 4 - Res3a, Res3b, Res3c, Res3d
    [-1, 1, "Conv", [256, 3, 2]], # 5 - Conv4
    [-1, 6, "ResBlock", [256]],        # 6 - Res4a, Res4b, Res4c, Res4d, Res4e, Res4f
    [-1, 1, "Conv", [512, 3, 2]], # 7 - Conv5
    [-1, 3, "ResBlock", [512]],        # 8 - Res5a, Res5b, Res5c
    [-1, 1, "SPPF", [1024, 5]]         # 9 - SPPF
    ]
Traceback (most recent call last):
  File "train.py", line 647, in <module>
    main(opt)
  File "train.py", line 536, in main
    train(opt.hyp, opt, device, callbacks)
  File "train.py", line 130, in train
    model = Model(cfg or ckpt['model'].yaml, ch=3, nc=nc, anchors=hyp.get('anchors')).to(device)  # create
  File "/home/dev/Documents/yolov5/models/yolo.py", line 195, in __init__
    m.stride = torch.tensor([s / x.shape[-2] for x in forward(torch.zeros(1, ch, s, s))])  # forward
  File "/home/dev/Documents/yolov5/models/yolo.py", line 194, in <lambda>
    forward = lambda x: self.forward(x)[0] if isinstance(m, Segment) else self.forward(x)
  File "/home/dev/Documents/yolov5/models/yolo.py", line 209, in forward
    return self._forward_once(x, profile, visualize)  # single-scale inference, train
  File "/home/dev/Documents/yolov5/models/yolo.py", line 121, in _forward_once
    x = m(x)  # run
  File  "/home/dev/Documents/yolov5/models/common.py", line 90, in forward
    return torch.cat(x, self.blocks(x))
  File "/home/dev/Documents/yolov5/models/common.py", line 68, in forward
    return self.act(self.bn(self.conv(x)))
  File "/home/dev/.cache/pypoetry/virtualenvs/yolov5-FT1Hnn5N-py3.8/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/dev/.cache/pypoetry/virtualenvs/yolov5-FT1Hnn5N-py3.8/lib/python3.8/site-packages/torch/nn/modules/conv.py", line 463, in forward
    return self._conv_forward(input, self.weight, self.bias)
 RuntimeError: Given groups=1, weight of size [8, 8, 3, 3], expected input[1, 32, 13, 13] to have 8 channels, but got 32 channels instead```
python deep-learning resnet yolov5 darknet
1个回答
0
投票

也许尝试将 MaxPooling2D 的步幅设置为 1。

MaxPooling2D 类(nn.Module):

definit(自身,k=2,s=1,p=0):

© www.soinside.com 2019 - 2024. All rights reserved.