关于onnx 转ncnn 的问题

解决YOLO5Face在NCNN转换中的Unsupportedsliceaxes问题
部署运行你感兴趣的模型镜像

由于有些操作是没法支持的

如5维的操作:

Unsupported slice axes !
Unsupported slice axes !
Unsupported slice axes !
Unsupported slice axes !
Unsupported slice axes !
Unsupported slice axes !

参考:
解决方案1

修改模型Detect层设计

这可能是由于ncnn会把一个5维张量捏成4维(假设batch=1),但是YOLO5Face的坐标反算逻辑基本上是在5维上做slice,所以导致了NCNN在转换这段反算逻辑时出现了slice错误。那么怎么解决这个问题呢?那就是不使用5维张量,把Detect中关于坐标反算的那段拿到C++中做实现。如果你理解了Detect的细节,以及张量在内存中的分布,这个实现其实不难做。首先,我们来看看,在YOLO5Face中这个代码怎么改。

# x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() 原来的处理
x[i] = x[i].view(bs, 3, 16, -1).permute(0, 1, 3, 2).contiguous()  # e.g (b,3,20x20,16) for NCNN
# ... 注释掉坐标反算的逻辑
# return torch.cat(z, 1)  # (bs,?,16) 原来的返回
return x # 修改后的返回 for NCNN

其实就是不展开最后(ny,no)这两个维度,把这2个维度flatten成一个维度。由于后续的处理都是基于5维的张量,所以,坐标反算那段逻辑也要注释掉,直接返回这个修改后的4维张量,把坐标反算这部分放在C++里面实现。为了顺利export出ONNX文件,还需要对应地修改export.py,因为现在输出是一个list了,里面有3个维度不一样的张量,而原来是被torch.cat在一起,只有一个张量。

# torch.onnx.export(model, img, f, verbose=False, opset_version=12,
    #                   input_names=input_names,
    #                   output_names=output_names,
    #                   dynamic_axes={'input': {0: 'batch'},
    #                                 'output': {0: 'batch'}
    #                                 } if opt.dynamic else None)
    torch.onnx.export(model, img, f,
                      verbose=False,
                      opset_version=12,
                      input_names=['input'],
                      output_names=["det_stride_8", "det_stride_16", "det_stride_32"],
                      )  # for ncnn

转换


python export.py --weights weights/yolov5n-face.pt --img_size 640 640 --batch_size 1 

python -m onnxsim weights/best.onnx weights/plate-sim.onnx

~ ncnn_models onnx2ncnn yolov5n-face-640x640-for-ncnn.onnx yolov5n-face-640x640.param yolov5n-face-640x640.bin
~ ncnnoptimize yolov5n-face-640x640.param yolov5n-face-640x640.bin yolov5n-face-640x640.opt.param yolov5n-face-640x640.opt.bin 0
Input layer input without shape info, shape_inference skipped
Input layer input without shape info, estimate_memory_footprint skipped

后处理

再根据需要实现nms等

github 处理代码

优质文章

https://www.zhihu.com/question/62871439/answer/2285654278?utm_id=0

您可能感兴趣的与本文相关的镜像

Yolo-v5

Yolo-v5

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

<think>嗯,用户现在明确在寻找ONNXNCNN的在线工具或网站,需要仔细分析已有引用并整理可用信息。虽然用户提到引用仅供参考,但所有引用都是关于换工具的信息,需要系统梳理。先看引用内容的特点:引用[1][2][4]都提到带GUI的本地工具,项目地址明确;引用[3]则是命令行工具。特别注意引用[1]和[4]其实是描述同一个工具,项目地址都是https://gitcode.com/open-source-toolkit/74771。引用[2]提到另一个独立工具onnx2ncnnGUI。根据已有资料,可以确认的核心事实是:所有引用均指向本地可执行工具而非在线服务。用户可能误解了“网站”的含义,实际需要的仍是软件下载。特别注意到引用[3]提到的ncnn自带工具onnx2ncnn,这属于编译后获得的命令行工具。在整理工具列表时,必须区分清楚三类工具:独立GUI工具(两个不同项目)、ncnn自带工具、其它社区解决方案。每个工具的特点都要对应引用源准确说明,例如可视化操作属于GUI工具专属,而命令行工具需要编译支持。准备在回答中明确标注工具分类,并强调主流方案都是离线工具。考虑到用户寻找在线工具的诉求可能源于环境配置困难,会在建议部分提醒在线换的局限性,同时提供替代方案如Colab脚本。对于用户可能遇到的环境问题,要补充ncnn官方依赖的安装说明,这样能形成闭环帮助——既说明没有在线工具的原因,又给出可立即操作的本地方案。最后关于“为什么没有主流在线服务”的解释要简洁,重点放在解决实际问题而非技术探讨。</think> 根据提供的站内引用和行业现状,目前**没有主流的在线网站支持ONNXNCNN的直接换**,但有以下高效可靠的本地化工具推荐: --- ### 🛠️ 一、推荐工具与资源(均需本地安装) 1. **onnx2ncnnGUI(可视化工具)** - **特点**:图形界面操作,拖拽式换,无需代码基础 - **来源**:引用[2]描述的独立工具 - **下载**:需从开源社区(如GitHub)搜索项目名称获取 2. **ONNXNCNN工具-UI(GitCode项目)** - **特点**:一键式换,中文操作指南,稳定性强 - **来源**:引用[1][4]描述的 **同一工具** - **项目地址**:👉 [https://gitcode.com/open-source-toolkit/74771](https://gitcode.com/open-source-toolkit/74771) - **流程**: ```mermaid graph TD A[下载工具] --> B[安装依赖库] B --> C[导入ONNX模型] C --> D[设置输出路径] D --> E[点击换] ``` 3. **ncnn官方工具链(命令行)** - **工具名称**:`onnx2ncnn` - **来源**:引用[3]所述,需**自行编译ncnn库**后获取 - **路径**:`ncnn/build/tools/onnx/onnx2ncnn` - **命令示例**: ```bash ./onnx2ncnn model.onnx # 生成model.param和model.bin ``` --- ### ⚠️ 二、关键注意事项 1. **依赖安装** - 工具运行需提前安装: - ONNX运行时库(`pip install onnx`) - NCNN编译环境(参考[NCNN官方文档](https://github.com/Tencent/ncnn))[^3] 2. **模型兼容性** - 避免将**非网络结构**(如后处理逻辑)打包进ONNX模型[^3] - 复杂OP(如动态维度)可能需手动修改网络结构 3. **在线替代方案局限** - 模型安全风险(在线换易泄露模型权重) - 大模型传输耗时(远超本地处理速度) - 框架依赖链复杂(无法云端统一环境) --- ### 💡 三、实用建议 - **首选方案**:优先使用 **可视化工具(如GitCode项目)**,操作门槛低 - **进阶需求**:搭配NCNN源码编译`onnx2ncnn`,灵活处理自定义OP - **调试技巧**:换后使用`ncnnoptimize`工具优化模型结构 - **替代路线**:通过ONNX→TensorRT→NCNN间接换(需中间格式适配) > 📌 **核心结论**:因安全性与技术限制,**当前无可靠在线换服务**,但本地工具成熟易用。推荐使用GitCode的可视化工具,10分钟内即可完成换[^1][^4]。 --- ### ⁉️ 相关问题(用户后续可能关注) 1. 换后模型精度下降如何调试? 2. 如何处理ONNX中的`ScatterND`等非常规算子? 3. 能否在Android Studio中直接集成NCNN模型? 4. ONNXNCNN的量化方案有哪些? 如需具体工具的安装/使用教程,可随时提出,我会提供分步指南 🔧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东哥aigc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值