旧地址里没有,需要导出.onnx
你好!关于 export_monkey_patch.py 文件找不到以及 YOLOv5s 导出 ONNX 的问题,目前官方资源已经更新,旧的 monkey_patch 方式可能不再适用或已迁移。
核心结论
不要再单独寻找 export_monkey_patch.py。
现在的推荐做法是直接使用 RDK Model Zoo 中提供的完整导出脚本,或者参考官方文档修改 YOLOv5 源码中的 forward 函数。旧版教程中的 “monkey_patch” 是通过运行时替换函数来实现的,新版更推荐直接修改源码或使用封装好的导出脚本。
解决方案
方案一:使用 RDK Model Zoo 导出脚本(推荐)
官方已经将导出逻辑整合到了 Model Zoo 的示例代码中。
-
获取代码
克隆或下载 RDK Model Zoo 仓库(注意分支对应你的板卡版本):git clone https://github.com/DRobotics/rdk_model_zoo.git注:如果 GitHub 访问困难,可在地瓜机器人开发者社区搜索 “RDK MODEL ZOO” 获取国内镜像或最新下载地址。
-
定位脚本
进入 YOLOv5 相关目录,通常位于:
rdk_model_zoo/demos/detect/YOLOv5/
或者在新版结构中查找export_yolo.py或类似的导出脚本。 -
执行导出
根据目录下的README_cn.md说明运行导出命令。通常会指定 pt 模型路径和输出 onnx 路径:python export_yolo.py --weights yolov5s.pt --output yolov5s.onnx --img-size 640
方案二:手动修改 YOLOv5 源码(经典方法)
如果你坚持使用原版 YOLOv5 仓库导出,需要修改 models/yolo.py 中的 Detect 类 forward 函数,使其输出符合地平线 BPU 要求的格式(去掉 reshape,保留多尺度输出)。
修改步骤:
- 打开
models/yolo.py。 - 找到
class Detect(nn.Module)。 - 修改
forward函数,参考以下逻辑(针对 YOLOv5 6.x 版本):
# models/yolo.py 中的修改示例
def forward(self, x):
# x: list of tensors from different scales
z = [] # inference output
for i in range(self.nl):
x[i] = self.m[i](x[i]) # conv
bs, _, ny, nx = x[i].shape # batch, channels, height, width
# 将输出 reshape 为 [bs, anchors, classes+5, ny, nx] -> [bs, anchors*ny*nx, classes+5]
# 地平线通常要求输出为 [N, C, H, W] 或特定格式,具体参考文档
# 注意:地平线工具链通常希望去掉最后的 concat 和 reshape,直接输出三个头
x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
if not self.training: # inference
if self.grid[i].shape[2:4] != x[i].shape[2:4]:
self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)
# 这里通常不需要做 decode (sigmoid 等),留给后处理
# 但为了 ONNX 导出符合地平线要求,可能需要保留原始卷积输出
z.append(x[i].view(bs, -1, self.no)) # 或者直接 append x[i] 视具体工具链版本要求
# 关键:地平线通常需要直接返回 list 或者 concat 之前的 tensor
# 如果是导出用于 BPU,通常直接 return x (list of 3 tensors)
# 或者根据 export 脚本的要求 return torch.cat(z, 1)
return x if self.training else (torch.cat(z, 1), x) # 具体返回值看 export 脚本需求
注意: 最稳妥的方式是参考社区精华帖 YOLOV5 在地平线 RDK X3 的高效部署,里面有详细的代码修改对比。
常见问题排查
- 报错
IndexError: Dimension out of range:说明view或permute的维度计算错误,检查self.no(number of outputs = 5 + num_classes) 是否正确。 - ONNX 检查失败 (
ir_version过高):使用onnx-simplifier简化模型,或降低 ONNX 导出时的 opset 版本(例如opset_version=11或13)。python -m onnxsim yolov5s.onnx yolov5s_sim.onnx - 输出节点名称不对:导出时确保指定了正确的输出节点名,或者使用 Netron 查看 ONNX 结构是否符合地平线要求(通常是 3 个输出,对应 3 个尺度)。
建议
鉴于你是新账号且遇到资源失效问题,建议直接在地瓜社区搜索 “YOLOv5 ONNX 导出” 或 “Model Zoo YOLOv5”,下载最新的示例代码包,里面通常包含了修改好的 yolo.py 或独立的导出脚本,比单独找 monkey_patch.py 更高效。
如果需要具体的代码片段或遇到具体报错,欢迎把错误日志贴出来。