模型onnx转ncnn小记

news2024/11/17 21:19:40

前期准备

Netron

模型准备:onnx模型,这里使用模型face【det_10g.onnx】

大佬文档引用:手工优化ncnn模型结构 - 知乎

ncnn算子描述参考:ncnn 算子操作描述-CSDN博客

模型优化

安装

pip install onnx-simplifier

先把我要转的模型优化合并下,去除多余的op

python -m onnxsim det_10g.onnx det_10g_sim.onnx

模型转换

通过onnx2ncnn  进行转换

onnx2ncnn det_10g_sim.onnx det_10g_sim.param  det_10g_sim.bin

发现还是不行,还遇到不少报错,我这里是改了代码提升更清晰点,具体报错如下:

节点77 名称:【Shape_106】 op=Shape not supported yet!

序号:79 节点:Unsqueeze_112 Unsupported unsqueeze axes !

序号:80 节点:Unsqueeze_113 Unsupported unsqueeze axes !

节点(Resize_124) input[3] 没有权重信息
序号:82 节点:Resize_124 Unsupported Resize scales and sizes are all empty!

节点85 名称:【Shape_126】 op=Shape not supported yet!

序号:87 节点:Unsqueeze_132 Unsupported unsqueeze axes !

序号:88 节点:Unsqueeze_133 Unsupported unsqueeze axes !

节点90 名称:【Shape_136】 op=Shape not supported yet!

节点(Resize_144) input[3] 没有权重信息
序号:92 节点:Resize_144 Unsupported Resize scales and sizes are all empty!

序号:113 节点:Transpose_168 Unsupported transpose type!

序号:116 节点:Transpose_172 Unsupported transpose type!

序号:118 节点:Transpose_175 Unsupported transpose type!

序号:130 节点:Transpose_191 Unsupported transpose type!

序号:133 节点:Transpose_195 Unsupported transpose type!

序号:135 节点:Transpose_198 Unsupported transpose type!

序号:147 节点:Transpose_214 Unsupported transpose type!

序号:150 节点:Transpose_218 Unsupported transpose type!

序号:152 节点:Transpose_221 Unsupported transpose type!

 
如包含问题,请使用工具先优化,再尝试生成
pip install onnx-simplifier
python -m onnxsim det_10g.onnx det_10g_sim.onnx

定位问题

通过Netron  打开det_10g_sim.onnx

根据手工优化ncnn模型结构 - 知乎 文件学习一遍

搜索Shape_106 这个,查询出下面一堆。

解析下这个结构:

通过发现,其实这个就是提取 节点【Conv_104】 输出的 形状,假如是:1x1x320x160

shape就是取出:1x1x320x160

1、第一个Gather(左边) :就是取第三位 就是160

2、第二个Gather(右边):就是取第二位 就是320

3、通过Unsqueeze 添加维度: 第一个Gather的160 变为 [160],第二个Gather的320 变为 [320]

4、然后Concat就是连接,把这两个连接起来,但是我们看到Concat是有三个输入,我们继续看图

我们看到三个参数,通过图可以看到 第一个参数是[1,56]  第二个参数是左边的Gater,最终的值是[320] 第三个参数是左边的Gater值,最终的值是[160],最终把几个连接起来就是[1,56,320,160]

这个数组可以给到resize使用,给Conv变换维度使用,其实通过图也可以看出来这个的操作的作用。就是把如下中的B 变换维度和A一样,然后再让他们进行相加操作。

但是知道了作用又能咋办呢,ncnn里面有没有这几个操作,没有获取shape的算子替换,通过大佬的文章展示,需要合并这几个操作 ,直接用一个 Interp 操作来替代放大缩小。但是关键对此模型不熟悉,而且是动态参数,那咋办呢。

解决问题

通过对onnx 进行一下推理,把Resize的输入值和输出值 打印出来,那么就知道如何使用了。

这边打印如下:通过netron 查询Resize的名称是 Resize_124


*序号1:Conv_0
  输入节点:
    0:input.1
    1:547
    2:549
  输出节点:
    0:277 类型=Float,shape=1x28x320x320,len=2867200,val=数据过大或为空,不展示

*序号2:Relu_2
  输入节点:
    0:277 类型=Float,shape=1x28x320x320,len=2867200,val=数据过大或为空,不展示
  输出节点:
    0:279 类型=Float,shape=1x28x320x320,len=2867200,val=数据过大或为空,不展示

*序号3:Conv_3
  输入节点:
    0:279 类型=Float,shape=1x28x320x320,len=2867200,val=数据过大或为空,不展示
    1:551
    2:553
  输出节点:
    0:280 类型=Float,shape=1x28x320x320,len=2867200,val=数据过大或为空,不展示

*序号4:Relu_5
  输入节点:
    0:280 类型=Float,shape=1x28x320x320,len=2867200,val=数据过大或为空,不展示
  输出节点:
    0:282 类型=Float,shape=1x28x320x320,len=2867200,val=数据过大或为空,不展示

*序号5:Conv_6
  输入节点:
    0:282 类型=Float,shape=1x28x320x320,len=2867200,val=数据过大或为空,不展示
    1:555
    2:557
  输出节点:
    0:283 类型=Float,shape=1x56x320x320,len=5734400,val=数据过大或为空,不展示

*序号6:Relu_8
  输入节点:
    0:283 类型=Float,shape=1x56x320x320,len=5734400,val=数据过大或为空,不展示
  输出节点:
    0:285 类型=Float,shape=1x56x320x320,len=5734400,val=数据过大或为空,不展示

*序号7:MaxPool_9
  输入节点:
    0:285 类型=Float,shape=1x56x320x320,len=5734400,val=数据过大或为空,不展示
  输出节点:
    0:286 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号8:Conv_10
  输入节点:
    0:286 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
    1:559
    2:561
  输出节点:
    0:287 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号9:Relu_12
  输入节点:
    0:287 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
  输出节点:
    0:289 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号10:Conv_13
  输入节点:
    0:289 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
    1:563
    2:565
  输出节点:
    0:290 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号11:Add_15
  输入节点:
    0:290 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
    1:286 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
  输出节点:
    0:292 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号12:Relu_16
  输入节点:
    0:292 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
  输出节点:
    0:293 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号13:Conv_17
  输入节点:
    0:293 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
    1:567
    2:569
  输出节点:
    0:294 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号14:Relu_19
  输入节点:
    0:294 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
  输出节点:
    0:296 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号15:Conv_20
  输入节点:
    0:296 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
    1:571
    2:573
  输出节点:
    0:297 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号16:Add_22
  输入节点:
    0:297 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
    1:293 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
  输出节点:
    0:299 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号17:Relu_23
  输入节点:
    0:299 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
  输出节点:
    0:300 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号18:Conv_24
  输入节点:
    0:300 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
    1:575
    2:577
  输出节点:
    0:301 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号19:Relu_26
  输入节点:
    0:301 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
  输出节点:
    0:303 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号20:Conv_27
  输入节点:
    0:303 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
    1:579
    2:581
  输出节点:
    0:304 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号21:Add_29
  输入节点:
    0:304 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
    1:300 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
  输出节点:
    0:306 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号22:Relu_30
  输入节点:
    0:306 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
  输出节点:
    0:307 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示

*序号23:Conv_31
  输入节点:
    0:307 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
    1:583
    2:585
  输出节点:
    0:308 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号24:Relu_33
  输入节点:
    0:308 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:310 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号25:Conv_34
  输入节点:
    0:310 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:587
    2:589
  输出节点:
    0:311 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号26:AveragePool_36
  输入节点:
    0:307 类型=Float,shape=1x56x160x160,len=1433600,val=数据过大或为空,不展示
  输出节点:
    0:313 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示

*序号27:Conv_37
  输入节点:
    0:313 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示
    1:591
    2:593
  输出节点:
    0:314 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号28:Add_39
  输入节点:
    0:311 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:314 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:316 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号29:Relu_40
  输入节点:
    0:316 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:317 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号30:Conv_41
  输入节点:
    0:317 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:595
    2:597
  输出节点:
    0:318 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号31:Relu_43
  输入节点:
    0:318 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:320 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号32:Conv_44
  输入节点:
    0:320 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:599
    2:601
  输出节点:
    0:321 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号33:Add_46
  输入节点:
    0:321 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:317 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:323 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号34:Relu_47
  输入节点:
    0:323 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:324 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号35:Conv_48
  输入节点:
    0:324 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:603
    2:605
  输出节点:
    0:325 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号36:Relu_50
  输入节点:
    0:325 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:327 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号37:Conv_51
  输入节点:
    0:327 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:607
    2:609
  输出节点:
    0:328 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号38:Add_53
  输入节点:
    0:328 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:324 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:330 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号39:Relu_54
  输入节点:
    0:330 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:331 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号40:Conv_55
  输入节点:
    0:331 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:611
    2:613
  输出节点:
    0:332 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号41:Relu_57
  输入节点:
    0:332 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:334 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号42:Conv_58
  输入节点:
    0:334 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:615
    2:617
  输出节点:
    0:335 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号43:Add_60
  输入节点:
    0:335 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:331 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:337 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号44:Relu_61
  输入节点:
    0:337 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:338 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示

*序号45:Conv_62
  输入节点:
    0:338 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:619
    2:621
  输出节点:
    0:339 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号46:Relu_64
  输入节点:
    0:339 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
  输出节点:
    0:341 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号47:Conv_65
  输入节点:
    0:341 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
    1:623
    2:625
  输出节点:
    0:342 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号48:AveragePool_67
  输入节点:
    0:338 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
  输出节点:
    0:344 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号49:Conv_68
  输入节点:
    0:344 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
    1:627
    2:629
  输出节点:
    0:345 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号50:Add_70
  输入节点:
    0:342 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
    1:345 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
  输出节点:
    0:347 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号51:Relu_71
  输入节点:
    0:347 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
  输出节点:
    0:348 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号52:Conv_72
  输入节点:
    0:348 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
    1:631
    2:633
  输出节点:
    0:349 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号53:Relu_74
  输入节点:
    0:349 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
  输出节点:
    0:351 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号54:Conv_75
  输入节点:
    0:351 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
    1:635
    2:637
  输出节点:
    0:352 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号55:Add_77
  输入节点:
    0:352 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
    1:348 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
  输出节点:
    0:354 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号56:Relu_78
  输入节点:
    0:354 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
  输出节点:
    0:355 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示

*序号57:Conv_79
  输入节点:
    0:355 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
    1:639
    2:641
  输出节点:
    0:356 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号58:Relu_81
  输入节点:
    0:356 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:358 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号59:Conv_82
  输入节点:
    0:358 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
    1:643
    2:645
  输出节点:
    0:359 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号60:AveragePool_84
  输入节点:
    0:355 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
  输出节点:
    0:361 类型=Float,shape=1x88x20x20,len=35200,val=数据过大或为空,不展示

*序号61:Conv_85
  输入节点:
    0:361 类型=Float,shape=1x88x20x20,len=35200,val=数据过大或为空,不展示
    1:647
    2:649
  输出节点:
    0:362 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号62:Add_87
  输入节点:
    0:359 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
    1:362 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:364 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号63:Relu_88
  输入节点:
    0:364 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:365 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号64:Conv_89
  输入节点:
    0:365 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
    1:651
    2:653
  输出节点:
    0:366 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号65:Relu_91
  输入节点:
    0:366 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:368 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号66:Conv_92
  输入节点:
    0:368 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
    1:655
    2:657
  输出节点:
    0:369 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号67:Add_94
  输入节点:
    0:369 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
    1:365 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:371 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号68:Relu_95
  输入节点:
    0:371 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:372 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号69:Conv_96
  输入节点:
    0:372 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
    1:659
    2:661
  输出节点:
    0:373 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号70:Relu_98
  输入节点:
    0:373 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:375 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号71:Conv_99
  输入节点:
    0:375 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
    1:663
    2:665
  输出节点:
    0:376 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号72:Add_101
  输入节点:
    0:376 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
    1:372 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:378 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号73:Relu_102
  输入节点:
    0:378 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:379 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示

*序号74:Conv_103
  输入节点:
    0:338 类型=Float,shape=1x88x80x80,len=563200,val=数据过大或为空,不展示
    1:neck.lateral_convs.0.conv.weight
    2:neck.lateral_convs.0.conv.bias
  输出节点:
    0:380 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示

*序号75:Conv_104
  输入节点:
    0:355 类型=Float,shape=1x88x40x40,len=140800,val=数据过大或为空,不展示
    1:neck.lateral_convs.1.conv.weight
    2:neck.lateral_convs.1.conv.bias
  输出节点:
    0:381 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示

*序号76:Conv_105
  输入节点:
    0:379 类型=Float,shape=1x224x20x20,len=89600,val=数据过大或为空,不展示
    1:neck.lateral_convs.2.conv.weight
    2:neck.lateral_convs.2.conv.bias
  输出节点:
    0:382 类型=Float,shape=1x56x20x20,len=22400,val=数据过大或为空,不展示

*序号77:Shape_106
  输入节点:
    0:381 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:383 类型=Int64,shape=4,len=4,val=1,56,40,40

*序号78:Gather_108
  输入节点:
    0:383 类型=Int64,shape=4,len=4,val=1,56,40,40
    1:384
  输出节点:
    0:385 类型=Int64,shape=,len=1,val=40

*序号79:Gather_111
  输入节点:
    0:383 类型=Int64,shape=4,len=4,val=1,56,40,40
    1:387
  输出节点:
    0:388 类型=Int64,shape=,len=1,val=40

*序号80:Unsqueeze_112
  输入节点:
    0:385 类型=Int64,shape=,len=1,val=40
  输出节点:
    0:389 类型=Int64,shape=1,len=1,val=40

*序号81:Unsqueeze_113
  输入节点:
    0:388 类型=Int64,shape=,len=1,val=40
  输出节点:
    0:390 类型=Int64,shape=1,len=1,val=40

*序号82:Concat_122
  输入节点:
    0:_v_286
    1:389 类型=Int64,shape=1,len=1,val=40
    2:390 类型=Int64,shape=1,len=1,val=40
  输出节点:
    0:399 类型=Int64,shape=4,len=4,val=1,56,40,40

*序号83:Resize_124
  输入节点:
    0:382 类型=Float,shape=1x56x20x20,len=22400,val=数据过大或为空,不展示
    1:392
    2:392
    3:399 类型=Int64,shape=4,len=4,val=1,56,40,40
  输出节点:
    0:401 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示

*序号84:Add_125
  输入节点:
    0:381 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示
    1:401 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:402 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示

*序号85:Shape_126
  输入节点:
    0:380 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示
  输出节点:
    0:403 类型=Int64,shape=4,len=4,val=1,56,80,80

*序号86:Gather_128
  输入节点:
    0:403 类型=Int64,shape=4,len=4,val=1,56,80,80
    1:384
  输出节点:
    0:405 类型=Int64,shape=,len=1,val=80

*序号87:Gather_131
  输入节点:
    0:403 类型=Int64,shape=4,len=4,val=1,56,80,80
    1:387
  输出节点:
    0:408 类型=Int64,shape=,len=1,val=80

*序号88:Unsqueeze_132
  输入节点:
    0:405 类型=Int64,shape=,len=1,val=80
  输出节点:
    0:409 类型=Int64,shape=1,len=1,val=80

*序号89:Unsqueeze_133
  输入节点:
    0:408 类型=Int64,shape=,len=1,val=80
  输出节点:
    0:410 类型=Int64,shape=1,len=1,val=80

*序号90:Shape_136
  输入节点:
    0:402 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:413 类型=Int64,shape=4,len=4,val=1,56,40,40

*序号91:Slice_140
  输入节点:
    0:413 类型=Int64,shape=4,len=4,val=1,56,40,40
    1:394
    2:396
    3:394
  输出节点:
    0:417 类型=Int64,shape=2,len=2,val=1,56

*序号92:Concat_142
  输入节点:
    0:417 类型=Int64,shape=2,len=2,val=1,56
    1:409 类型=Int64,shape=1,len=1,val=80
    2:410 类型=Int64,shape=1,len=1,val=80
  输出节点:
    0:419 类型=Int64,shape=4,len=4,val=1,56,80,80

*序号93:Resize_144
  输入节点:
    0:402 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示
    1:392
    2:392
    3:419 类型=Int64,shape=4,len=4,val=1,56,80,80
  输出节点:
    0:421 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示

*序号94:Add_145
  输入节点:
    0:380 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示
    1:421 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示
  输出节点:
    0:422 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示

*序号95:Conv_146
  输入节点:
    0:422 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示
    1:neck.fpn_convs.0.conv.weight
    2:neck.fpn_convs.0.conv.bias
  输出节点:
    0:423 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示

*序号96:Conv_147
  输入节点:
    0:402 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示
    1:neck.fpn_convs.1.conv.weight
    2:neck.downsample_convs.0.conv.bias
  输出节点:
    0:424 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示

*序号97:Conv_148
  输入节点:
    0:382 类型=Float,shape=1x56x20x20,len=22400,val=数据过大或为空,不展示
    1:neck.fpn_convs.2.conv.weight
    2:neck.downsample_convs.1.conv.bias
  输出节点:
    0:425 类型=Float,shape=1x56x20x20,len=22400,val=数据过大或为空,不展示

*序号98:Conv_149
  输入节点:
    0:423 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示
    1:neck.downsample_convs.0.conv.weight
    2:neck.downsample_convs.0.conv.bias
  输出节点:
    0:426 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示

*序号99:Add_150
  输入节点:
    0:424 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示
    1:426 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示
  输出节点:
    0:427 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示

*序号100:Conv_151
  输入节点:
    0:427 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示
    1:neck.downsample_convs.1.conv.weight
    2:neck.downsample_convs.1.conv.bias
  输出节点:
    0:428 类型=Float,shape=1x56x20x20,len=22400,val=数据过大或为空,不展示

*序号101:Add_152
  输入节点:
    0:425 类型=Float,shape=1x56x20x20,len=22400,val=数据过大或为空,不展示
    1:428 类型=Float,shape=1x56x20x20,len=22400,val=数据过大或为空,不展示
  输出节点:
    0:429 类型=Float,shape=1x56x20x20,len=22400,val=数据过大或为空,不展示

*序号102:Conv_153
  输入节点:
    0:427 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示
    1:neck.pafpn_convs.0.conv.weight
    2:neck.pafpn_convs.0.conv.bias
  输出节点:
    0:430 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示

*序号103:Conv_154
  输入节点:
    0:429 类型=Float,shape=1x56x20x20,len=22400,val=数据过大或为空,不展示
    1:neck.pafpn_convs.1.conv.weight
    2:neck.pafpn_convs.1.conv.bias
  输出节点:
    0:431 类型=Float,shape=1x56x20x20,len=22400,val=数据过大或为空,不展示

*序号104:Conv_155
  输入节点:
    0:423 类型=Float,shape=1x56x80x80,len=358400,val=数据过大或为空,不展示
    1:667
    2:669
  输出节点:
    0:432 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示

*序号105:Relu_157
  输入节点:
    0:432 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示
  输出节点:
    0:434 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示

*序号106:Conv_158
  输入节点:
    0:434 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示
    1:671
    2:673
  输出节点:
    0:435 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示

*序号107:Relu_160
  输入节点:
    0:435 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示
  输出节点:
    0:437 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示

*序号108:Conv_161
  输入节点:
    0:437 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示
    1:675
    2:677
  输出节点:
    0:438 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示

*序号109:Relu_163
  输入节点:
    0:438 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示
  输出节点:
    0:440 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示

*序号110:Conv_164
  输入节点:
    0:440 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示
    1:bbox_head.stride_cls.(8, 8).weight
    2:bbox_head.stride_cls.(8, 8).bias
  输出节点:
    0:441 类型=Float,shape=1x2x80x80,len=12800,val=数据过大或为空,不展示

*序号111:Conv_165
  输入节点:
    0:440 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示
    1:bbox_head.stride_reg.(8, 8).weight
    2:bbox_head.stride_reg.(8, 8).bias
  输出节点:
    0:442 类型=Float,shape=1x8x80x80,len=51200,val=数据过大或为空,不展示

*序号112:Mul_166
  输入节点:
    0:442 类型=Float,shape=1x8x80x80,len=51200,val=数据过大或为空,不展示
    1:bbox_head.scales.0.scale
  输出节点:
    0:443 类型=Float,shape=1x8x80x80,len=51200,val=数据过大或为空,不展示

*序号113:Conv_167
  输入节点:
    0:440 类型=Float,shape=1x80x80x80,len=512000,val=数据过大或为空,不展示
    1:bbox_head.stride_kps.(8, 8).weight
    2:bbox_head.stride_kps.(8, 8).bias
  输出节点:
    0:444 类型=Float,shape=1x20x80x80,len=128000,val=数据过大或为空,不展示

*序号114:Transpose_168
  输入节点:
    0:441 类型=Float,shape=1x2x80x80,len=12800,val=数据过大或为空,不展示
  输出节点:
    0:445 类型=Float,shape=80x80x1x2,len=12800,val=数据过大或为空,不展示

*序号115:Reshape_170
  输入节点:
    0:445 类型=Float,shape=80x80x1x2,len=12800,val=数据过大或为空,不展示
    1:446
  输出节点:
    0:447 类型=Float,shape=12800x1,len=12800,val=数据过大或为空,不展示

*序号116:Sigmoid_171
  输入节点:
    0:447 类型=Float,shape=12800x1,len=12800,val=数据过大或为空,不展示
  输出节点:
    0:448 类型=Float,shape=12800x1,len=12800,val=数据过大或为空,不展示

*序号117:Transpose_172
  输入节点:
    0:443 类型=Float,shape=1x8x80x80,len=51200,val=数据过大或为空,不展示
  输出节点:
    0:449 类型=Float,shape=80x80x1x8,len=51200,val=数据过大或为空,不展示

*序号118:Reshape_174
  输入节点:
    0:449 类型=Float,shape=80x80x1x8,len=51200,val=数据过大或为空,不展示
    1:450
  输出节点:
    0:451 类型=Float,shape=12800x4,len=51200,val=数据过大或为空,不展示

*序号119:Transpose_175
  输入节点:
    0:444 类型=Float,shape=1x20x80x80,len=128000,val=数据过大或为空,不展示
  输出节点:
    0:452 类型=Float,shape=80x80x1x20,len=128000,val=数据过大或为空,不展示

*序号120:Reshape_177
  输入节点:
    0:452 类型=Float,shape=80x80x1x20,len=128000,val=数据过大或为空,不展示
    1:453
  输出节点:
    0:454 类型=Float,shape=12800x10,len=128000,val=数据过大或为空,不展示

*序号121:Conv_178
  输入节点:
    0:430 类型=Float,shape=1x56x40x40,len=89600,val=数据过大或为空,不展示
    1:679
    2:681
  输出节点:
    0:455 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示

*序号122:Relu_180
  输入节点:
    0:455 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示
  输出节点:
    0:457 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示

*序号123:Conv_181
  输入节点:
    0:457 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示
    1:683
    2:685
  输出节点:
    0:458 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示

*序号124:Relu_183
  输入节点:
    0:458 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示
  输出节点:
    0:460 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示

*序号125:Conv_184
  输入节点:
    0:460 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示
    1:687
    2:689
  输出节点:
    0:461 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示

*序号126:Relu_186
  输入节点:
    0:461 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示
  输出节点:
    0:463 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示

*序号127:Conv_187
  输入节点:
    0:463 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示
    1:bbox_head.stride_cls.(16, 16).weight
    2:bbox_head.stride_cls.(16, 16).bias
  输出节点:
    0:464 类型=Float,shape=1x2x40x40,len=3200,val=数据过大或为空,不展示

*序号128:Conv_188
  输入节点:
    0:463 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示
    1:bbox_head.stride_reg.(16, 16).weight
    2:bbox_head.stride_reg.(16, 16).bias
  输出节点:
    0:465 类型=Float,shape=1x8x40x40,len=12800,val=数据过大或为空,不展示

*序号129:Mul_189
  输入节点:
    0:465 类型=Float,shape=1x8x40x40,len=12800,val=数据过大或为空,不展示
    1:bbox_head.scales.1.scale
  输出节点:
    0:466 类型=Float,shape=1x8x40x40,len=12800,val=数据过大或为空,不展示

*序号130:Conv_190
  输入节点:
    0:463 类型=Float,shape=1x80x40x40,len=128000,val=数据过大或为空,不展示
    1:bbox_head.stride_kps.(16, 16).weight
    2:bbox_head.stride_kps.(16, 16).bias
  输出节点:
    0:467 类型=Float,shape=1x20x40x40,len=32000,val=数据过大或为空,不展示

*序号131:Transpose_191
  输入节点:
    0:464 类型=Float,shape=1x2x40x40,len=3200,val=数据过大或为空,不展示
  输出节点:
    0:468 类型=Float,shape=40x40x1x2,len=3200,val=数据过大或为空,不展示

*序号132:Reshape_193
  输入节点:
    0:468 类型=Float,shape=40x40x1x2,len=3200,val=数据过大或为空,不展示
    1:446
  输出节点:
    0:470 类型=Float,shape=3200x1,len=3200,val=数据过大或为空,不展示

*序号133:Sigmoid_194
  输入节点:
    0:470 类型=Float,shape=3200x1,len=3200,val=数据过大或为空,不展示
  输出节点:
    0:471 类型=Float,shape=3200x1,len=3200,val=数据过大或为空,不展示

*序号134:Transpose_195
  输入节点:
    0:466 类型=Float,shape=1x8x40x40,len=12800,val=数据过大或为空,不展示
  输出节点:
    0:472 类型=Float,shape=40x40x1x8,len=12800,val=数据过大或为空,不展示

*序号135:Reshape_197
  输入节点:
    0:472 类型=Float,shape=40x40x1x8,len=12800,val=数据过大或为空,不展示
    1:450
  输出节点:
    0:474 类型=Float,shape=3200x4,len=12800,val=数据过大或为空,不展示

*序号136:Transpose_198
  输入节点:
    0:467 类型=Float,shape=1x20x40x40,len=32000,val=数据过大或为空,不展示
  输出节点:
    0:475 类型=Float,shape=40x40x1x20,len=32000,val=数据过大或为空,不展示

*序号137:Reshape_200
  输入节点:
    0:475 类型=Float,shape=40x40x1x20,len=32000,val=数据过大或为空,不展示
    1:453
  输出节点:
    0:477 类型=Float,shape=3200x10,len=32000,val=数据过大或为空,不展示

*序号138:Conv_201
  输入节点:
    0:431 类型=Float,shape=1x56x20x20,len=22400,val=数据过大或为空,不展示
    1:691
    2:693
  输出节点:
    0:478 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示

*序号139:Relu_203
  输入节点:
    0:478 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示
  输出节点:
    0:480 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示

*序号140:Conv_204
  输入节点:
    0:480 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示
    1:695
    2:697
  输出节点:
    0:481 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示

*序号141:Relu_206
  输入节点:
    0:481 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示
  输出节点:
    0:483 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示

*序号142:Conv_207
  输入节点:
    0:483 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示
    1:699
    2:701
  输出节点:
    0:484 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示

*序号143:Relu_209
  输入节点:
    0:484 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示
  输出节点:
    0:486 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示

*序号144:Conv_210
  输入节点:
    0:486 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示
    1:bbox_head.stride_cls.(32, 32).weight
    2:bbox_head.stride_cls.(32, 32).bias
  输出节点:
    0:487 类型=Float,shape=1x2x20x20,len=800,val=数据过大或为空,不展示

*序号145:Conv_211
  输入节点:
    0:486 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示
    1:bbox_head.stride_reg.(32, 32).weight
    2:bbox_head.stride_reg.(32, 32).bias
  输出节点:
    0:488 类型=Float,shape=1x8x20x20,len=3200,val=数据过大或为空,不展示

*序号146:Mul_212
  输入节点:
    0:488 类型=Float,shape=1x8x20x20,len=3200,val=数据过大或为空,不展示
    1:bbox_head.scales.2.scale
  输出节点:
    0:489 类型=Float,shape=1x8x20x20,len=3200,val=数据过大或为空,不展示

*序号147:Conv_213
  输入节点:
    0:486 类型=Float,shape=1x80x20x20,len=32000,val=数据过大或为空,不展示
    1:bbox_head.stride_kps.(32, 32).weight
    2:bbox_head.stride_kps.(32, 32).bias
  输出节点:
    0:490 类型=Float,shape=1x20x20x20,len=8000,val=数据过大或为空,不展示

*序号148:Transpose_214
  输入节点:
    0:487 类型=Float,shape=1x2x20x20,len=800,val=数据过大或为空,不展示
  输出节点:
    0:491 类型=Float,shape=20x20x1x2,len=800,val=数据过大或为空,不展示

*序号149:Reshape_216
  输入节点:
    0:491 类型=Float,shape=20x20x1x2,len=800,val=数据过大或为空,不展示
    1:446
  输出节点:
    0:493 类型=Float,shape=800x1,len=800,val=数据过大或为空,不展示

*序号150:Sigmoid_217
  输入节点:
    0:493 类型=Float,shape=800x1,len=800,val=数据过大或为空,不展示
  输出节点:
    0:494 类型=Float,shape=800x1,len=800,val=数据过大或为空,不展示

*序号151:Transpose_218
  输入节点:
    0:489 类型=Float,shape=1x8x20x20,len=3200,val=数据过大或为空,不展示
  输出节点:
    0:495 类型=Float,shape=20x20x1x8,len=3200,val=数据过大或为空,不展示

*序号152:Reshape_220
  输入节点:
    0:495 类型=Float,shape=20x20x1x8,len=3200,val=数据过大或为空,不展示
    1:450
  输出节点:
    0:497 类型=Float,shape=800x4,len=3200,val=数据过大或为空,不展示

*序号153:Transpose_221
  输入节点:
    0:490 类型=Float,shape=1x20x20x20,len=8000,val=数据过大或为空,不展示
  输出节点:
    0:498 类型=Float,shape=20x20x1x20,len=8000,val=数据过大或为空,不展示

*序号154:Reshape_223
  输入节点:
    0:498 类型=Float,shape=20x20x1x20,len=8000,val=数据过大或为空,不展示
    1:453
  输出节点:
    0:500 类型=Float,shape=800x10,len=8000,val=数据过大或为空,不展示

上述的节点每层输出的shape,是我自己做了工具输出来的,为了怕同学们迷茫,可以使用python,参考输出,下面部分代码

import numpy as np
import onnx
import onnxruntime
        
# 加载模型
model = onnx.load(r"det_10g_sim.onnx")
#把节点的输出项都添加到输出列表
for node in model.graph.node:
	for output in node.output:
		model.graph.output.extend([onnx.ValueInfoProto(name=output)])
#加载修改的模型
session = onnxruntime.InferenceSession(model.SerializeToString(), None)
output_names = session.get_outputs()
# 输入数据
ort_inputs = {session.get_inputs()[0].name: np.zeros((1, 3, 640, 640)}
#推理
net_outs = session.run(None, ort_inputs)
#下面可以输出形状数据,或者自己下断点
print(net_outs)

通过搜索节点【resize_124】发现最终的输出是  1x56x40x40

知道了这个值,意味着 如下的可以合并

修改如下,把其中的7行合并

这里减少了7层,我们这里总的层数是179  bolb个数是208,层数减少7,这里修改为 172 208

可以改完后,最后再来数层数也行

其实bolb个数也会减少,但是太费事了,使用ncnnoptimize进行优化下就行了,具体如下,会自动计算层数和去掉无用的权重。

./ncnnoptimize det_10g_sim.param det_10g_sim.bin det_10g_sim-opt.param det_10g_sim-opt.bin 0

继续看,看到图形上面还有一个类似的,如下:

其他几个已经讲过了,这里的Shape到Slice没有讲解,这里来看下

从上图可以分析,从Shape出来的值,经过Slice进行切片其中,开始切片是[0] 结束位置是[2],轴是[0],那么就是从Shape给出来的值 取 第0位和第1位就行了。

其实搜索下我们之前的打印值就行了,如下:

可以看到就取值了1和56,那么知道原因了,那么就开始进行合并,直接看Resize_144 的值

发现直接输出就是1x56x80x80

修改之后如下,们这里总的层数是171 bolb个数是208,层数减少9层,这里修改为 162 208

经过这么一整,进行图像缩放的操作已经全部改完了。

然后过来看下剩下的Transpose 维度置换操作,具体看看推理他做了啥

根据上图发现其实就是把维度进行了转换,把所有的transpose上面添加一个 0=16就行了

这样所有的op错误都已经解决了,接下来开始进行优化下了

ncnnoptimize det_10g_sim.param det_10g_sim.bin det_10g_sim-opt.param det_10g_sim-opt.bin 0

转换成功 得到了det_10g_sim-opt.param

用 netron 工具打开没问题

推理验证

简单测试看看能否跑起来

pip install ncnn

import ncnn
import cv2
import numpy as np

# 创建ncnn的网络对象
net = ncnn.Net()

# 加载ONNX模型
net.load_param(r'det_10g_sim.param')
net.load_model(r'det_10g_sim.bin')

# 创建一个形状为 1x2x59x59 的随机数据张量
input_blob = ncnn.Mat(640, 640, 1,3)
# 运行网络
ex = net.create_extractor()
# net_input = ncnn.Extractor(net)
ex.input("input.1", input_blob)

# 设置保留中间层输出
ex.set_light_mode(True)

output_blob = ncnn.Mat()
output_blob1 = ncnn.Mat()
output_blob2 = ncnn.Mat()
output_blob3 = ncnn.Mat()

# ex.extract("426", output_blob1)
# print('output_blob1.shape:',output_blob1)

# ex.extract("424", output_blob)
# print('output_blob.shape:',output_blob)


ex.extract("424", output_blob1)
print('output_blob3.shape:',output_blob1)

ex.extract("426", output_blob3)
print('output_blob3.shape:',output_blob3)

通过定位发现,Permute 【Transpose】转换的都为0,然后试了0=1 0=2 一直到0=5,到了0=6 就出现问题,这个不是三维吗,通过查询ncnn Permute的代码发现,和我们的矩阵里面的维度dims有关系,我通过获取发现我的dims为3,天啦,我入参的时候都为4的,为啥给我整出了个3。

后面通过一层一层获取,发现竟然在第二层就把我的dims变为了3

通过查询源代码发现,Convolution 默认会把维度改为3,下面途中的tob_blob就是返回的张量

通过查询代码,发现需要用到Convolution3D 才行,然后满心欢喜的把全部Convolution改为Convolution3D,但是结果马上打脸。

改过之后发现获取权重值又会出现问题,输入权重的时候 会出现乱码取值的格式不对了,这种时候单纯为了这几个去修改源码已经划不来了,然后直接这节不要了。

直接从从Transpose上层取出结果。自己在代码做处理,要不就自己添加一个算子替换Transpose,这两种都费时费力,还是懒得自己添加算子了,知道后续的算法直接自己取出结果再去处理下吧。

经过测试发现这个多余的算子要干掉不然会影响结果,去掉后结果正常

原始

修改后

通过python的ncnn先推理验证,也可以直接在原始的代码里面验证,把onnx推理用作ncnn推理就行了,最终结果显示没问题的

具体执行如下

其他的库依次移植过来,可以看到关键点图2d和3d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1658063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

extern关键字的使用。keil中编译时,出现error:identifier xxx is undefined

问题 编译时,出现error: identifier “Reg_Flag” is undefined extern Reg_Flag reg_flag; 很奇怪,我明明已经定义了。无非就是定义是在extern的下面,会不会是这个原因? 解决 果然,把extern的部分放到…

类和对象test

一、初始化列表 引言: 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量 的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始 化一次&#x…

[华为OD] C卷 田忌赛马 DFS 200

题目: 给定两个只包含数字的数组a, b,调整数组a里面数字的顺序,使得尽可能多的a[i] >b[i]。 数组a和b中的数字各不相同。 输出所有可以达到最优结果的a数组的数量 输入描述 输入的第一行是数组a中的数字,其中只包含数字,每…

网页主题自动适配:网页跟随系统自动切换主题

主题切换是网站设计中一个非常有趣的功能,它允许用户在多种预先设计的样式之间轻松切换,以改变网站的视觉表现。最常见的就是白天和黑夜主题的切换,用户可以根据自己的喜好进行设置。 除了让用户手动去切换主题外,如果能够让用户第…

2024年3月份宠物行业线上市场数据分析:市场呈现出精细化、品质化趋势

近些年来,养宠物的家庭越来越多,宠物经济也逐渐衍生开来。宠物经济主要是围绕宠物产生的一整条产业链,包括宠物食品、宠物家居、宠物美容和最近火起来的宠物保险等多个领域。目前随着居民人均收入的提高,宠物市场也得到稳步发展。…

PC端网页特效异读

pc网页特效 一、三大系列1.元素偏移量(offset系列)(1)一些属性(2).offset和style的区别(3).一些例子 2.元素可视区(client系列)(1).一些属性(2).flexible.js源码分析 3.scroll系列(4).三大系列小结 其他&am…

YOLOv9改进策略 | 添加注意力篇 | 一文带你改进GAM、CBAM、CA、ECA等通道注意力机制和多头注意力机制

一、本文介绍 这篇文章给大家带来的改进机制是一个汇总篇,包含一些简单的注意力机制,本来一直不想发这些内容的(网上教程太多了,发出来增加文章数量也没什么意义),但是群内的读者很多都问我这些机制所以单…

雷伴品鉴【神农式】倪琴 倪诗韵古琴

雷伴品鉴【神农式】倪琴 倪诗韵古琴 此琴材质为老杉木音色细腻,下指按弹舒适,手感极好漆面精美,线条流畅。

一文搞懂 ARM 64 系列: ADC

1 指令语法 adc <Xd>, <Xn>, <Xm> 2 指令语义 adc就是带「进位」加法&#xff0c;指令中的c就是英文carry。 整个指令等价于: (Xd, _) Xn Xm PSTATE.C 也就是将寄存器Xn&#xff0c;寄存器Xm&#xff0c;PSTATE中的「进位」标志相加&#xff0c;将相加的…

元素设置 flex:1,但是会被内部长单词宽度超出拉伸

初始布局如上图&#xff0c;left中是代码编辑器&#xff0c;实际上是个文本域&#xff0c;当输入长文本过长时&#xff0c;left宽度会被拉伸。 右侧容器被挤压。 解决方案&#xff1a;width&#xff1a;0&#xff1b; .left{flex:1; width:0} 当输入长文本过长时&#xff0c…

二分查找向下取整导致的死循环69. x 的平方根

二分查找向下取整导致的死循环 考虑伪题目&#xff1a;从数组arr中查找出目标元素target对应的下标&#xff0c;如果数组中不存在目标元素&#xff0c;找 到第一个元素值小于target的元素的下标。 编写二分查找算法如下&#xff1a; Testvoid testBinarySearch(){int[] arr n…

HackBar 新手使用教程(入门)

啥是Hackbar&#xff1f; Hackbar是一个Firefox 的插件,它的功能类似于地址栏,但是它里面的数据不受服务器的相应触发的重定向等其它变化的影响。 有网址的载入于访问,联合查询,各种编码,数据加密功能。 这个Hackbar可以帮助你在测试SQL注入,XSS漏洞和网站的安全性,主要是帮助…

车载测试___面试题和答案归纳

车载面试题 一、实车还在设计开发阶段&#xff0c;大部分测试通过什么测试&#xff1f; 答案&#xff1a;通过台架和仿真来完成的 二、测试部分划分&#xff1f; 测试部门是分为自研&#xff0c;系统&#xff0c;验收&#xff0c;自研部门是开发阶段测试&#xff0c;系统部门…

「网络流 24 题」餐巾计划【费用流】

「网络流 24 题」餐巾计划 思路 我们先建立超级源点 S S S 和超级汇点 T T T&#xff0c;对于每一天&#xff0c;我们将其拆分成两个点 A i A_i Ai​ 和 B i B_i Bi​&#xff0c;其中 A i A_i Ai​ 表示这一天实际消耗的餐巾&#xff0c;连边 S → ∞ A i S \stackrel{…

关于线程池,它的扩展问题你知道吗?(自己总结)

专门想一下为什么线程池不用Excutors&#xff0c;之前的印象是错的&#xff0c;居然还拿来面试里讲&#xff0c;惭愧&#xff0c;这里暂时整理俩小问题&#xff0c;其他的后续可能会更新。。 线程池是创建的越大越好嘛 #线程池创建的越大越好吗 Tip&#xff1a;2024-04-10 更…

车载测试系列:车载以太网测试(一)

汽车行业对可靠性和安全性要求越来越高&#xff0c;车载以太网在应用过程中&#xff0c;为了保证其可靠性与安全性&#xff0c;需要对其开展测试工作。 传统的以太网测试和车载以太网测试存在一定差异&#xff0c;传统以太网测试方法并不适用汽车以太网测试。 汽车行业对测试…

C++ 直接初始化 和 拷贝初始化 的区别

参考链接&#xff1a;https://www.jb51.net/article/54773.htm这篇文章主要介绍了C直接初始化与复制初始化的区别深入解析,是很多C初学者需要深入了解的重要概念,需要的朋友可以参考下https://www.jb51.net/article/54773.htm

Web3空投入门:如何增加空投成功的几率

今天分享空投如何避免限制以提高效率&#xff0c;增加成功几率&#xff0c;首先我们来了解什么是空投加密&#xff0c;有哪些空投类型。 一、什么是空投加密&#xff1f; 加密货币空投是一种营销策略&#xff0c;包括向用户的钱包地址发送免费的硬币或代币。 加密货币项目使用…

UE5 audio capture 回声问题 ||在安卓上有爆鸣声

参考视频 0.基本步骤 【UE4_蓝图】录制麦克风声音/系统声音并输出保存WAV文件_ue4录音-CSDN博客 1.步骤 1.创建Sound Submix A 2. 右键新建Sound Submix B 3.把B的两个参数调为-96 4.audio capture的Base Submix&#xff0c;把前面提到的A赋值进去 5.开始录制输出和完成录制…

云动态摘要 2024-05-09

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…