齐天小圣66 2023-05-27 20:59 采纳率: 50%
浏览 53
已结题

yolov5转onnx验证出错

改过结构的yolov5转onnx,转换成功,但是用detect.py --weights best.onnx验证的时候出现下面报错:
IndexError: The shape of the mask [3, 40, 2] at index 2 does not match the shape of the indexed tensor [3, 40, 6] at index 2
是输出张量不匹配,请问要怎么修改呢?看哪一个文件修改?

  • 写回答

6条回答 默认 最新

  • 这一次有糖 2023-05-27 21:08
    关注
    获得2.40元问题酬金

    输入输出张量图像检查过了吗,可以去看看输出节点的定义--在模型的ONNX文件里

    评论 编辑记录
  • 瞬间动力 2023-05-27 22:34
    关注
    获得1.50元问题酬金

    这个问题是由于模型输出的张量的形状(shape)与推理过程中的处理方式不匹配导致的。推理过程中的处理方式要求输出张量中的值必须为385或36,而您的模型输出张量的形状为[3, 40, 6]或[3, 40, 2],其中2或6是对两个坐标的预测,而在模型输出的张量中,每个预测都应该包含5+num_classes个值(5个常数+类别数目个置信度分数)。

    为了解决这个问题,建议您按照以下步骤进行修改:

    1. 首先,您需要先检查生成ONNX模型的代码,看看生成模型的时候是否正确地给每个输出层定义了名称,并验证每个输出层的维度信息是否正确。

    2. 然后,使用ONNX模型检查器(如Netron)来检查您的模型的输出形状是否正确。如果不正确,需要进一步检查生成ONNX模型的代码,尤其需要重点关注输出张量的形状信息是否正确。如果模型输出的张量形状与期望值不一致,需要相应地进行修改。

    3. 最后,您需要检查使用ONNX模型执行推理时的代码,确保您为每个输出层指定了正确的名称,并正确地处理每个输出张量。您需要检查输出张量形状信息是否与您在ONNX模型检查器中预期的一致,如果不一致,则需要相应地调整代码。

    综上所述,在优化和修改模型输出张量的形状之前,最好先检查生成ONNX模型的代码,确保每个输出层都有正确的名称和形状。因为模型输出的形状可能会因模型结构、输入形状等多个因素而发生变化。只有在对生成ONNX模型的代码进行仔细检查和确认后,才能及时解决模型输出张量与推理过程中的处理方式不匹配的问题。

    评论
  • 我就只会python 2023-05-27 22:37
    关注
    获得0.45元问题酬金

    根据您提供的错误信息,似乎是输出张量的维度不匹配导致的问题。要解决这个问题,您需要修改detect.py文件中的相关代码,以确保输出张量的形状与模型的期望形状相匹配。
    具体来说,您可以尝试按照以下步骤进行修改:
    打开detect.py文件,找到与输出张量相关的部分。通常,在使用ONNX模型进行推理时,会涉及到对输出张量的处理和解析。
    确定输出张量的名称或索引。根据报错信息中的索引2,您需要查找代码中与该索引相关的部分。
    检查输出张量的形状。通过输出张量的形状信息,您可以确定预期的形状和实际形状是否匹配。
    根据模型的期望形状修改输出张量的处理方式。您可能需要调整相关代码,以确保输出张量的形状与模型的期望形状相匹配。
    请注意,具体的修改方式取决于您使用的代码库和detect.py文件的实现细节。如果您能提供更多关于detect.py文件的代码片段或上下文信息

    评论 编辑记录
  • 鱼弦 全栈领域创作新星创作者 2023-05-29 11:01
    关注
    获得1.50元问题酬金

    根据你提供的错误信息,可以看出这是在使用 ONNX 模型进行推理时出现的错误。具体来说,错误信息表明在第2个索引位置上,尝试将一个形状为 [3, 40, 2] 的掩码应用于一个形状为 [3, 40, 6] 的张量上,导致形状不匹配。

    要解决这个问题,你需要找到产生错误的代码,并确认哪个文件需要进行修改。一般来说,可能需要修改以下几个文件:

    detect.py:这是用于运行检测模型的脚本文件,你可以检查该文件中与 ONNX 模型相关的代码,例如载入模型、进行推理等代码,以确保代码正确。

    yolov5/models/yolo.py:这是 YOLOv5 的模型定义文件,你可以检查该文件中与模型结构相关的代码,例如层定义、张量形状等,以确保模型正确。

    utils/activations.py:这是定义激活函数的文件,你可以检查该文件中与激活函数相关的代码,例如 Sigmoid、ReLU 等,以确保激活函数的输出形状与模型结构匹配。

    在检查代码时,你需要仔细阅读错误信息,尤其是错误信息中提到的索引位置和形状大小,以确定哪个张量形状不匹配。然后,你可以根据错误信息来修改代码,以确保张量形状匹配。具体的修改方式可能有很多种,例如更改层定义、调整张量形状、更改激活函数等,具体取决于你的模型结构和代码实现。

    总之,要解决这个问题,你需要仔细检查代码和错误信息,并进行必要的修改。如果你不确定如何修改代码,可以参考 YOLOv5 的官方文档或在线社区,或者寻求更专业的帮助。

    评论
  • 还有头发的程序员- 2023-05-29 19:57
    关注
    获得0.45元问题酬金

    可以试试

    class Detect(nn.Module):
        stride = None  # strides computed during build
        # export = False  # onnx export
    
        def __init__(self, nc=80, anchors=(), ch=()):  # detection layer
            super(Detect, self).__init__()
            self.nc = nc  # number of classes
            self.no = nc + 5  # number of outputs per anchor
            self.nl = len(anchors)  # number of detection layers
            self.na = len(anchors[0]) // 2  # number of anchors
            self.grid = [torch.zeros(1)] * self.nl  # init grid
            a = torch.tensor(anchors).float().view(self.nl, -1, 2)
            self.register_buffer('anchors', a)  # shape(nl,na,2)
            self.register_buffer('anchor_grid', a.clone().view(self.nl, 1, -1, 1, 1, 2))  # shape(nl,1,na,1,1,2)
            self.m = nn.ModuleList(nn.Conv2d(x, self.no * self.na, 1) for x in ch)  # output conv
    
        def forward(self, x):
            # x = x.copy()  # for profiling
            z = []  # inference output
            # self.training |= self.export
            for i in range(self.nl):
                x[i] = self.m[i](x[i])  # conv
                #修改1
                bs, _, ny, nx = map(int, x[i].shape)  # x(bs,255,20,20) to x(bs,3,20,20,85)
                 #修改2
                x[i] = x[i].view(-1, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
    
    
                if not self.training:  # inference
                    self.grid[i] = self._make_grid(nx, ny).to(x[i].device)
    
                    y = x[i].sigmoid()
                    #修改3
                    xy = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i]  # xy
                    wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i].view(1, self.na, 1, 1, 2)  # wh
                    y = torch.cat((xy, wh, y[..., 4:]), -1)
                    #修改4
                    z.append(y.view(-1, int(y.size(1) * y.size(2) * y.size(3)), self.no))
    
            return x if self.training else torch.cat(z, 1)
    
    
    
    评论
  • 会跑的小鹿 2023-06-02 12:42
    关注
    获得0.90元问题酬金

    这个错误提示表明输出的张量维度不匹配。要修复这个问题,需要在转换模型时修改输出张量的维度,以便与正在使用的代码相匹配,可以检查代码中要求输出张量的维度和形状

    评论

报告相同问题?

问题事件

  • 系统已结题 6月4日
  • 创建了问题 5月27日

悬赏问题

  • ¥15 在工控机(Ubuntu系统)上外接USB蓝牙硬件进行蓝牙通信
  • ¥15 关于PROCEDURE和FUNCTION的问题
  • ¥100 webapi的部署(标签-服务器)
  • ¥20 怎么加快手机软件内部计时的时间(关键词-日期时间)
  • ¥15 C语言除0问题的检测方法
  • ¥15 为什么四分管的内径有的是16mm有的15mm,四分不应该是12.7mm吗
  • ¥15 macos13下 ios交叉编译的问题
  • ¥15 bgz压缩文件怎么打开
  • ¥15 封装dll(引入了pcl的点云设计库)
  • ¥30 关于#开发语言#的问题:我需要在抄板的基础上再抄板抄程序,根据RDA8851CM基础上开发