当前位置:   article > 正文

海思开发:yolo v5s :pytorch->onnx->caffe->nnie_num_output_ % group_ == 0 (1 vs. 0) number of outp

num_output_ % group_ == 0 (1 vs. 0) number of outp should be multiples of gr

一、前言

主要是遇见几个问题,赶紧记录一下,免得后面兄弟们吃同样的亏,也帮助自己记忆。附上我的 yolo v5 后处理部分 c 语言版本代码:C版 yolo v5s 后处理部分

二、转换报错

1. 报错:
Reshape dimention number shall be 2 or 4
  • 1
  • 2

仔细看了一下,和我 reshape 处理的数据维度有关,而转换代码里 reshape 最高支持维度数是 4。而我的数据shape 是 (1, 3, H, W, class_num + 5),这是个五维数组。
在这里插入图片描述
本来就想在后面加个条件 : len(shape) == 5,又怕出现新的错误,上网找了篇其他的转换代码,点进去看了下,发现内容基本一致,只不过少了个 len(shape) == 3。看完就明白可能我现在用的demo也是作者自己做了些许改动,而且他遇见的问题恐怕和我一样。于是放心的加上 len(shape) == 5
,再次运行demo。

2. 报错:
Permute dimention number shall be 2 or 4
  • 1
  • 2

第二个错误与上面一致,轻车熟路,在后面加个条件。
在这里插入图片描述

3. 报错:
Check failed: num_output_ % group_ == 0 (1 vs. 0) Number of output should be multiples of group.
  • 1
  • 2

在这里插入图是片描述
具体报错如上,就是说分组卷积/分组反卷积有个硬性要求是 input_channel 与 output_channel 要是 group 的整数倍,只不过转换原因,使得这里的 output_channel 等于 1 。直接看转换的源码。
在这里插入图片描述
框里面的代码原本是 num_output=W.shape[1],而我反卷积是用了分组卷积,w.shape = (512, 1, 2, 2),这样就不对了,output num 应该是 512 才对,进行截图中的改正。再次运行,转换完成!下面跑几张图片具体看看输出值是否一致。

4. caffe 转 wk 模型报错
Permute can only support (0,1,2,3) -> (0,2,3,1) order!
reshape only support C/H/W, not N!
  • 1
  • 2
  • 3

这两个错误不是一起出现的,犯错原因差不多,就是模型的 prototxt 文件格式不符合 nnie 要求。先说说下面一个,即 Permute 层,临时翻海思文档,描述如下:
在这里插入图片描述
可以看见 Permute层 局限性蛮大的,据群友们反映,这个op还挺慢的, 结合实际情况,考虑去掉它,即在 prototxt文件里删去它。
在这里插入图片描述
至于 reshape 层,在文档里没找见它,只能各种方法都试试,最后发现正确格式是这种。
在这里插入图片描述
改为下面这种格式就好了:
在这里插入图片描述
之后再进行转换,就没什么问题,静待模型转换完成了。

三、 其他知识点

写这个项目时,遇到的一些问题,觉得有必要和大家讲下,帮助自己记忆,也给大伙一个经验来参考。

1. reshape 的维度与海思输出数据内存分布

先看看源码的输出数据 shape 变化过程,见 yolov5/model/yolo.py 文件:

bs, _, ny, nx = x[i].shape  # x(bs, 85 * 3, 20, 20) to x(bs, 3, 20, 20, 85)
# contiguous() : https://zhuanlan.zhihu.com/p/64551412
x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
  • 1
  • 2
  • 3

我的训练数据集是48类,则其中一个层的输出 shape 为 (1, 159, 20, 20),其 shape 变化过程为:

#                 reshape                       permute
(1, 159, 20, 20) ---------> (1, 3, 53, 20, 20) ---------> (1, 3, 20, 20, 53)
  • 1
  • 2

因为python版输出数据维度过高,海思不支持,且海思 permute op 先天性限制,无法支持更多的操作,所以取消 permute 是在所难免的。但是怎样获得我们需要的 shape ,一开始想着无脑 reshape 成需要的现状,如:

#                 reshape                       reshape
(1, 159, 20, 20) ---------> (0, 3, 53, 400) ---------> (03, 400, 53)
# 以上是错误操作,不要用,海思 reshape 要求输出第一维是 0 且最多维度数为 4 .
  • 1
  • 2
  • 3

这样看起来很顺利,不过仔细想想 permute 的机制与 reshape 不一样,为此特意做了个实验:

a = torch.arange(60).view((1, 15, 2, 2)).view((1
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/300266
    推荐阅读
    相关标签
      

    闽ICP备14008679号