模型onnx转ncnn小记

2024-05-10 04:20
文章标签 模型 onnx 小记 ncnn

本文主要是介绍模型onnx转ncnn小记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前期准备

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.11:5472: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:5512: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:5552: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:5592: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:5632: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:5672: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:5712: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:5752: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:5792: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:5832: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:5872: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:5912: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:5952: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:5992: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:6032: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:6072: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:6112: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:6152: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:6192: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:6232: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:6272: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:6312: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:6352: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:6392: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:6432: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:6472: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:6512: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:6552: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:6592: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:6632: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.weight2: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.weight2: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.weight2: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,401:384输出节点:0:385 类型=Int64,shape=,len=1,val=40*序号79:Gather_111输入节点:0:383 类型=Int64,shape=4,len=4,val=1,56,40,401: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_2861:389 类型=Int64,shape=1,len=1,val=402: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:3922:3923: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,801:384输出节点:0:405 类型=Int64,shape=,len=1,val=80*序号87:Gather_131输入节点:0:403 类型=Int64,shape=4,len=4,val=1,56,80,801: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,401:3942:3963:394输出节点:0:417 类型=Int64,shape=2,len=2,val=1,56*序号92:Concat_142输入节点:0:417 类型=Int64,shape=2,len=2,val=1,561:409 类型=Int64,shape=1,len=1,val=802: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:3922:3923: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.weight2: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.weight2: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.weight2: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.weight2: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.weight2: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.weight2: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.weight2: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:6672: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:6712: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:6752: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).weight2: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).weight2: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).weight2: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:6792: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:6832: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:6872: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).weight2: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).weight2: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).weight2: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:6912: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:6952: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:6992: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).weight2: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).weight2: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).weight2: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

这篇关于模型onnx转ncnn小记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975427

相关文章

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}