前期准备
模型准备: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推理就行了,最终结果显示没问题的
具体执行移植c++可以查询博文:人脸识别之bbox【det_10g】-ncnn(c++)-CSDN博客
具体执行如下
其他的库依次移植过来,可以看到关键点图2d和3d