瑞芯微RKNN开发·yolov5

news2024/11/21 1:31:46

官方预训练模型转换

  1. 下载yolov5-v6.0分支源码解压到本地,并配置基础运行环境。
  2. 下载官方预训练模型
  • yolov5n.pt
  • yolov5s.pt
  • yolov5m.pt
  1. 进入yolov5-6.0目录下,新建文件夹weights,并将步骤2中下载的权重文件放进去。
  2. 修改models/yolo.py文件
    def forward(self, x):
        z = []  # inference output
        for i in range(self.nl):
            x[i] = self.m[i](x[i]).sigmoid()  # conv
        #     bs, _, 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()

        #     if not self.training:  # inference
        #         if self.grid[i].shape[2:4] != x[i].shape[2:4] or self.onnx_dynamic:
        #             self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)

        #         y = x[i].sigmoid()
        #         if self.inplace:
        #             y[..., 0:2] = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i]  # xy
        #             y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
        #         else:  # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
        #             xy = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i]  # xy
        #             wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
        #             y = torch.cat((xy, wh, y[..., 4:]), -1)
        #         z.append(y.view(bs, -1, self.no))

        # return x if self.training else (torch.cat(z, 1), x)
        return x[0], x[1], x[2]
  1. 新建export_rknn.py文件
import os
import torch
import onnx
from onnxsim import simplify
import onnxoptimizer
import argparse
from models.yolo import Detect, Model

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default='./weights/yolov5n.pt', help='initial weights path') 

    #================================================================
    opt = parser.parse_args()
    print(opt)

    #Save Only weights
    ckpt = torch.load(opt.weights, map_location=torch.device('cpu'))
    torch.save(ckpt['model'].state_dict(), opt.weights.replace(".pt", "-model.pt"))

    #Load model without postprocessing
    new_model = Model("./models/{}.yaml".format(os.path.basename(opt.weights).strip(".pt")))
    new_model.load_state_dict(torch.load(opt.weights.replace(".pt", "-model.pt"), map_location=torch.device('cpu')), False)
    new_model.eval()

    #save to JIT script
    example = torch.rand(1, 3, 640, 640)
    traced_script_module = torch.jit.trace(new_model, example)
    traced_script_module.save(opt.weights.replace(".pt", "-jit.pt"))

    #save to onnx
    f = opt.weights.replace(".pt", ".onnx")
    torch.onnx.export(new_model, example, f, verbose=False, opset_version=12,
                            training=torch.onnx.TrainingMode.EVAL,
                            do_constant_folding=True,
                            input_names=['data'],
                            output_names=['out0','out1','out2'])

    #onnxsim
    model_simp, check = simplify(f)
    assert check, "Simplified ONNX model could not be validated"
    onnx.save(model_simp, opt.weights.replace(".pt", "-sim.onnx"))

    #optimize onnx
    passes = ["extract_constant_to_initializer", "eliminate_unused_initializer"]
    optimized_model = onnxoptimizer.optimize(model_simp, passes)
    onnx.checker.check_model(optimized_model)
    onnx.save(optimized_model, opt.weights.replace(".pt", "-op.onnx"))
    print('finished exporting onnx')
  1. 命令行执行python3 export_rknn.py脚本(默认为yolov5n.pt, 加–weights参数可指定权重),转换成功会输出一下信息, 转换后的模型存于权重同级目录(*-op.onnx后缀模型)
Namespace(weights='./weights/yolov5n.pt')
finished exporting onnx

请添加图片描述

RKNN开发板植入-模型转换篇

前期准备
  • RKNN开发环境(python)
  • rknn-toolkits2
详细流程
  1. 进入rknn-toolkits2/examples/onnx/yolov5示例目录下
  2. 修改test.py内容(按需修改ONNX_MODEL、RKNN_MODEL、IMG_PATH、DATASET等等超参数)
def sigmoid(x):
    # return 1 / (1 + np.exp(-x))
    return x
  1. 命令行执行python3 test.py即可获取推理结果
    请添加图片描述

请添加图片描述

RKNN开发板植入-NPU加载推理篇(C++)

后续放出代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1111726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

文章目录 一、public 公有继承 - 示例分析1、类型兼容性原则2、类型兼容性原则应用场景 二、类型兼容性原则 - 示例分析1、父类指针 指向 子类对象2、使用 子类对象 为 父类对象 进行初始化3、完整代码示例 一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 :…

测试开发之性能篇 —— 性能测试设计

很多朋友接触性能测试是从工具开始的,比如流行的JMeter、Loadrunner等。熟悉一个测试工具,有助于对性能测试的过程、方法和机制有个直观的理解。 我们知道,无论是什么类型的测试,其目标不外乎两个,一是为了证明系统满…

直播带货前途渺茫了

我是卢松松,点点上面的头像,欢迎关注我哦! 种种迹象表明电商行业和直播带货将受到冲击。直播带货前途渺茫了,相信很快就有政策出来了,针对电商这块的,支持实体、支持取消直播带货。 (1)目前,…

C++对多继承的理解

学到C时我们知道了继承但是一般都是使用单继承为主,单继承就是一个子类只能继承一个父类而多继承是指一个子类可以同时继承多个父类。 菱形继承 菱形继承是多继承中的一个特殊情况。当一个子类同时继承两个具有共同父类的类时,就会出现菱形继承问题。但…

2 spring 识别自定义实现BeanFactoryPostProcessor 的接口

如果自定义实现了BeanFactoryPostProcessor接口,那么想让spring识别到的话,有两种方式: 1 定义在spring的配置文件中,让spring自动识别 2 调用具体的addBeanFactoryPostProcessor方法 方法1 的代码实现 定义实现BeanFactoryPo…

淘宝拍立淘接口,按图搜索商品接口,图片识别接口,图片上传搜索接口,图片搜索API接口,以图搜货接口

淘宝拍立淘图片搜索接口可以通过上传或输入图片链接的方式,调用淘宝的图片搜索引擎,返回与该图片相关的所有淘宝商品。 使用该接口需要先申请淘宝开放平台的App Key和App Secret,获取相应的API访问权限。在调用接口时,需要传入商…

YOLOv5算法改进(12)— 如何去更换主干网络(1)(包括代码+添加步骤+网络结构图)

前言:Hello大家好,我是小哥谈。YOLOv5采用的主干网络是CSPDarknet53,它是Darknet53的改进版本,采用了Cross Stage Partial连接(CSP)结构,可以提高模型的效率和准确率。在学术上,为了提升YOLOv5算法模型的准确率或者鲁棒性等,已经有很多改进方案问世。更换主干网络作为…

[C++]:2初识C++(auto) + 类和对象上:

[TOC](初识C(auto) 类和对象上) 一.初始C 1.auto关键字:(C11) 1.作为一个变量的类型给这个类型初始化,auto自动识别初始化这个变量值的类型,为auto类型的这个变量开辟一个合适的空间。 补充: 1.typeid(变量名).name—>可以打…

快速入门:Spring Cache

目录 一:Spring Cache简介 二:Spring Cache常用注解 2.1:EnableCaching 2.2: Cacheable 2.3:CachePut 2.4:CacheEvict 三:Spring Cache案例 3.1:先在pom.xml中引入两个依赖 3.2:案例 3.2.1:构建数据库表 3.2.2:构建User类 3.2.3:构建Controller mapper层代码 3.…

ModuleNotFoundError: No module named ‘torch‘

目录 情况1,真的没有安装pytorch情况2(安装了与CUDA不对应的pytorch版本导致无法识别出torch) 情况1,真的没有安装pytorch 虚拟环境里面真的是没有torch,这种情况就easy job了,点击此链接直接安装与CUDA对应的pytorch版本,CTRLF直接搜索对应CUDA版本即可查找到对应的命令.按图…

【复盘】主从延迟以及 Waiting for tablemetadata lock 线上问题

背景 今晚DBA给一个大表添加索引,1000多W,正好风控系统这个时间段有查询这个表的请求,于是就出现了复制延迟。 这是正常下的延迟 可以看出基本都是是100毫秒以下。 Waiting for tablemetadata lock,并且业务跑的SQL出现锁等待…

实现Traefik工具Dashboard远程访问:搭建便捷的远程管理平台

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件,能轻易的部署微服务。它支持多种后端 (D…

24-数据结构-内部排序-基数排序

基数排序 基数排序,给关键字分成d位(组),,对每一位的情况,可能会出现的值位r(基数)个,然后分成r个队列,对每个对林进行分配耗时O(n),最后按照改位…

join、inner join、left join、right join、outer join的区别

内连接 inner join(等值连接):只显示两表联结字段相等的行,(很少用到,最好别用); 外连接 left join:以左表为基础,显示左表中的所有记录,不管是否与关联条件相匹配,而右表中的数据只显示与关联条件相匹配的记录,不匹配…

【C/PTA】顺序结构专项练习

本文结合PTA专项练习带领读者掌握顺序结构,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。 7-1 是不是太胖了 据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已…

山海鲸可视化B/S架构应用

一、什么是B/S架构 BS架构(Browser-Server架构)是一种常见的软件架构模式,其中系统的核心业务逻辑和数据处理都发生在服务器端(Server),而客户端(Browser)主要负责显示和用户交互。…

【AIGC核心技术剖析】用于 3D 生成的多视图扩散模型

MVDream是一种多视图扩散模型,能够从给定的文本提示生成一致的多视图图像。多视图扩散模型从二维和三维数据中学习,可以实现二维扩散模型的泛化和三维渲染的一致性。我们证明了这样的多视图先验可以作为可推广的 2D 先验,与 3D 表示无关。它可以通过分数蒸馏取样应用于 2D 生…

vue视频直接播放rtsp流;vue视频延迟问题解决;webRTC占cpu太大卡死问题解决;解决webRTC播放卡花屏问题:

播放多个视频 <div class"video-box"><div class"video"><iframe style"width:100%;height:100%;" name"ddddd" id"iframes" scrolling"auto" :src"videoLeftUrl"></iframe>&l…

Python---练习:求世界杯小组赛的总成绩(涉及:布尔类型转换为整型)

案例 世界杯案例 需求&#xff1a; 世界杯案例&#xff0c;世界杯小组赛的比赛规则是我们的球队与其他三支球队进行比赛&#xff0c;然后根据总成绩(积分)确定出线资格。小组赛球队实力已知(提示用户输入各球队实力&#xff09;&#xff0c;我们通过一个数字表示。如果我们赢…

C#冒泡排序算法

冒泡排序实现原理 冒泡排序是一种简单的排序算法&#xff0c;其原理如下&#xff1a; 从待排序的数组的第一个元素开始&#xff0c;依次比较相邻的两个元素。 如果前面的元素大于后面的元素&#xff08;升序排序&#xff09;&#xff0c;则交换这两个元素的位置&#xff0c;使…