【pytorch】ncnn

onnx转ncnn

完整实现:

代码语言:javascript
复制
def onnx2ncnn(self):
    assert os.path.isfile(simplified_onnx_path)
os.system('onnx2ncnn {} {} {}'.format(simplified_onnx_path, param_path, bin_path))
print('\n param has been save to {}'.format(param_path))
print(' bin   has been save to {}\n'.format(bin_path))

os.system('ncnnoptimize {} {} {} {} fp32'.format(param_path, bin_path, param_path, bin_path))
print('\n param has been ncnnoptimized')
print(&#39; bin   has been ncnnoptimized\n&#39;)</code></pre></div></div><h4 id="3qfbp" name="1.-%E7%AE%80%E5%8C%96onnx">1. 简化onnx</h4><p>如果省略此步,会导致模型耗时增加约一半,模型大小增加约一半。且利用网站在线转换时容易报错:<em style="font-style:italic">Unsupported unsqueeze axes !</em></p><p>如果没安装过 onnx-simplifie,安装一下:</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">pip install onnx-simplifier==0.2.4 -i https://pypi.tuna.tsinghua.edu.cn/simple </code></pre></div></div><blockquote><p> Note:经过simplify的onnx并不会有精度损失!</p></blockquote><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">python -m onnxsim .\2task.aiyou.0.0.onnx 2task.0.0.onnx</code></pre></div></div><h4 id="6d7ad" name="2.-onnx2ncnn">2. onnx2ncnn</h4><h6 id="356q7" name="2.1.%E6%8C%87%E4%BB%A4%E8%BD%ACncnn">2.1.指令转ncnn</h6><p>安装:</p><p>参照  进行安装。</p><p>把ncnn/build/tools/下的 onnx2ncnn 和 ncnnoptimize(其他地方会用到) 移到全局环境下: </p><p>即可到任意目录下执行 onnx 到 ncnn 的转换:     </p><h6 id="28vm8" name="2.2.%E7%BD%91%E7%AB%99%E5%9C%A8%E7%BA%BF%E8%BD%ACncnn">2.2.网站在线转ncnn</h6><p>进入 convertmodel.com 进行在线转换:</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:42.99%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723066859712664143.png" /></div><div class="figure-desc">在这里插入图片描述</div></div></div></figure><h4 id="44fd1" name="3.-%E4%BC%98%E5%8C%96ncnn">3. 优化ncnn</h4><blockquote><p> Note:如果不优化的话,pnn下loadModel时可能会fail。</p></blockquote><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">ncnnoptimize A.param A.bin A.param A.bin fp32</code></pre></div></div><p>优化后的param只剩卷积结构:</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:80.87%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723066859787732073.png" /></div><div class="figure-desc">在这里插入图片描述</div></div></div></figure>