地平线X3pi基于YOLOv5-5.0版本程序上板运行推理

2023-11-09 22:30

本文主要是介绍地平线X3pi基于YOLOv5-5.0版本程序上板运行推理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

地平线X3pi

基于YOLOv5-5.0版本进行模型转换

注意:首先确保本地环境支持YOLOv5能够正常运行。

1. 官方模型转换onnx模型(pt->onnx)

1.1、从官方网站github上下载5.0版本源码

链接直达

1.2、转换指令:

python export.py --weights yolov5s.pt --img 672 --batch 1 --opset=11

对于 YOLOv5 模型,我们在模型结构上的修改点主要在于几个输出节点处。由于目前的浮点转换工具链暂时不支持 5 维的 Reshape,所以在 prototxt中进行了删除,并将其移至后处理中执行。同时还添加了一个 transpose 算子,使该节点将以 NHWC 进行输出。这是因为在地平线芯片中, BPU 硬件本身以 NHWC 的layout 运行,这样修改后可以让 BPU 直接输出结果,而不在量化模型中引入额外的transpose。在转换onnx模型时需要先对代码进行修改。具体流程如下:

①、修改models目录下yolo.py


# x = x.copy() # for profilingz = [] # inference outputself.training |= self.exportfor i in range(self.nl):x[i] = self.m[i](x[i]) # convbs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85)# x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()x[i] = x[i].permute(0, 2, 3, 1).contiguous() #此项为新修改内容if not self.training: # inferenceif self.grid[i].shape[2:4] != x[i].shape[2:4]:self.grid[i] = self._make_grid(nx, ny).to(x[i].device)y = x[i].sigmoid()y[..., 0:2] = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i] # xyy[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # whz.append(y.view(bs, -1, self.no))return x if self.training else (torch.cat(z, 1), x)

②修改export.py脚本(此脚本是导出onnx模型使用的)

由于地平线AI工具链支持的ONNX opset版本为 10 和 11, 请将 torch.onnx.export 的 opset_version 参数根据您要使用的版本进行修改。

将 torch.onnx.export 部分的默认输入名称参数由 ‘images’ 改为 ‘data’,与模型转换示例包的YOLOv5示例脚本保持一致。

将 parser.add_argument 部分中默认的数据输入尺寸640x640改为模型转换示例包YOLOv5示例中的672x672。

具体详见地平线官方手册:模型转换说明

修改完成执行上述指令即可完成onnx模型的转换,转换完成之后生成如下文件:
在这里插入图片描述

以下在转换过程中需注意:

1.3、 自己训练模型转 best.pt ——>onnx (需注意点)(根本原因在于模型与源码版本不匹配)

①、报错:报错AttributeError: Can’t get attribute ‘SPPF’

解决方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4f228oWa-1662096991372)(_v_images/20220805093256919_27643.png)]

②、在模型转换时需要将export.py从models文件夹中复制到源码的根目录下使用。或者将转换指令修改为:


python models/export.py --weights yolov5s.pt --img 672 --batch 1 --opset=11
1.4、使用AI工具链进行onnx模型转换BIN模型

转换过程详见官方手册:模型转换手册

或者使用官方的DDK包中已经写好的转换脚本进行意见模型转换

路径如下:/ddk/samples/ai_toolchain/horizon_model_convert_sample/04_detection/03_yolov5/mapper

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FID2kpqm-1662096991372)(_v_images/20220902113615948_387.png)]

下面说一下在转换BIN模型过程中我遇到的问题:

在使用地平线模型转换工具转换完成模型之后,进行单张图片推理的过程中遇到的问题。

按照官方5.0版本修改相应文件后,进行第四步sh 04_inference.sh推理时报错如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xkJhNsiq-1662096991373)(_v_images/20220831140742578_19613.png)]

:①、原因分析

原因是在进行第四步模型推理时是使用的上一步模型转换后生成的以下两种模型的其中一个来进行推理(此模型是专门用作推理使用的)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ls9pvNbC-1662096991373)(_v_images/20220831140935904_14634.png)]

使用Netron工具查看最终模型的数据数据(或者直接查看.pt模型转换完成onnx模型后的结果)最后是33

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EPfedLv0-1662096991373)(_v_images/20220831141238239_9018.png)]

②、修改代码

根据这一项数据更改后处理文件postprocess.py,存放在如下图所在位置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPkPa0Gz-1662096991374)(_v_images/20220831141445637_19796.png)]

在后处理文件postprocess.py中修改标签数量、reshape形状

修改标签数量:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9BvXyH70-1662096991374)(_v_images/20220831141626360_22733.png)]

修改reshape形状

因为转换完成的onnx模型最后以为数据是33,因此再此处需要修改为一致的但维度不能减少,所以修改为11,11x3=33

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p4sIiYKo-1662096991374)(_v_images/20220831141851553_21402.png)]

修改coco_metric.py和coco_classes.names中标签名称

coco_metric.py中修改:(根据自己模型标签情况而定)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x9N3lNaq-1662096991375)(_v_images/20220831142605683_21256.png)]

coco_classes.names中修改:(根据自己模型标签情况而定)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Az12x4Fj-1662096991376)(_v_images/20220831142653699_30839.png)]

到此修改后处理操作完成,再次运行sh 04_inference.sh进行推理得到结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A1J8C5KH-1662096991377)(_v_images/20220831142234717_3222.png)]

在这里插入图片描述

这篇关于地平线X3pi基于YOLOv5-5.0版本程序上板运行推理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5