yolo5 onnx2rknn 瑞芯微香橙派 rk3588

简介: 本人博客搬运

参考文件

https://download.csdn.net/download/qq_31764341/88479978?spm=1001.2014.3001.5501
操作前后的onnx发出来给大家参考下

yolo 训练

我用的环境是yolo5.6.0 应该是
然后使用同环境下的export 注意 不要换环境。。。

python export.py --weights D:\project\Pythonproj\yolov5\yolo5\runs\train\exp5\weights\best.pt --img 640 --batch 1 --include onnx --opset 12

导出 onnx ,如果你和我的版本完全相同 ,那么你的onnx路径应该是
D:\project\Pythonproj\yolov5\yolo5\runs\train\exp5\weights\best.onnx

yolo onnx 剪裁

原则上,如果你自己写后处理函数/对yolo后处理函数非常熟悉的话,你可以直接改他的后处理,应该也是可以的
那么如果你是新手,并且想快速的在3588上面部署yolo5 看下面
使用onnx可视化网站(网不好的话可以fanqiang 加速) https://netron.app/ 查看你的生成模型的可视化结果

看到了之后,把transpose前面的卷积层(三个卷积层的名字找到) 从左到右分别是1 2 3 ,分别放到下面的三个名字的位置

使用下面的脚本

import onnx
from onnx import helper, checker
from onnx import TensorProto
import re
import argparse
# model = "D:\project\Pythonproj\yolov5\yolo5\yolov5s.onnx"
model = r"D:\project\Pythonproj\yolov5\yolo5\runs\train\exp5\weights\best.onnx"
# model = r"D:\project\Pythonproj\yolov5\yolo5\runs\train\exp15\weights\best.onnx"


# model = "D:\project\caffe\dockerfile\yolov5s-simple.onnx"
import onnx

onnx_model = onnx.load(model)
graph = onnx_model.graph
# print(graph)
node = graph.node

# node[213].output[0] = node[212].output[0]
# node[213].output[0] = node[213].input[0]
# for idx in graph.node:
#     print(idx)
# graph.node[]
print(graph.output[0].type.tensor_type.shape)

# graph.output
# graph.output[1].type.tensor_type.elem_type = 1
# graph.output[2].name = "output2"
def createGraphMemberMap(graph_member_list):
    member_map=dict()
    for n in graph_member_list:
        member_map[n.name]=n
    return member_map

x = {
   "Concat_302","Reshape_301","Reshape_263","Reshape_282","Sigmoid_267","Sigmoid_286","Sigmoid_248","Split_249","Split_268","Split_287","Mul_251","Mul_257","Mul_270","Mul_276","Mul_289","Mul_295","Mul_255","Mul_261","Mul_274","Mul_280","Mul_293","Mul_299","Add_253","Add_291","Add_272","Pow_259","Pow_278","Pow_297","Concat_262","Concat_281","Concat_300"}# 我没有实际用到 不用看我
# x = {"Concat_382","Reshape_257","Reshape_319","Reshape_381","Sigmoid_245","Sigmoid_307","Sigmoid_369","Split_246","Split_308","Split_370","Mul_248","Mul_253","Mul_310","Mul_315","Mul_372","Mul_377","Mul_251","Mul_255","Mul_313","Mul_317","Mul_375","Mul_379","Add_249","Add_311","Add_373","Pow_254","Pow_316","Pow_378","Concat_256","Concat_318","Concat_380","Transpose_322","Transpose_198","Transpose_260"}

de = []
num = 0
#
node_map = createGraphMemberMap(graph.node)
output_map = createGraphMemberMap(graph.output)
graph.output.remove(output_map["output0"])
# new_output_node_names  = ["output0","output1","output2"]
output_shape_map = [[1,18,80,80],[1,18,40,40],[1,18,20,20]]
# for i in range(3):

    # new_nv = helper.make_tensor_value_info(new_output_node_names[i], TensorProto.FLOAT, output_shape_map[i])
    # graph.output.extend([new_nv])
output_map = createGraphMemberMap(graph.output)


for i in range(len(graph.node)):
    if node[i].name in x:
        de.append(i)
        num = num+1
de.sort()
de.reverse()
# for i in range(num):
#     graph.node.remove(graph.node[de[i]])
print("graph_output:", graph.output)
for i in range(len(graph.node)):
    if node[i].name == "Conv_196":# 卷积层1 
        new_nv = helper.make_tensor_value_info(node[i].output[0], TensorProto.FLOAT, output_shape_map[0])
        graph.output.extend([new_nv])
        # node[i].output[0]="output0"
    if node[i].name == "Conv_215":# 卷积层2 
        new_nv = helper.make_tensor_value_info(node[i].output[0], TensorProto.FLOAT, output_shape_map[1])
        graph.output.extend([new_nv])
    #     node[i].output[0]="output1"
    if node[i].name == "Conv_234":# 卷积层3 
        new_nv = helper.make_tensor_value_info(node[i].output[0], TensorProto.FLOAT, output_shape_map[2])
        graph.output.extend([new_nv])
    #     node[i].output[0]="output2"



onnx.checker.check_model(onnx_model)
onnx.save(onnx_model,"del_rknn.onnx")

运行python 脚本 删除层
在脚本同路径拿到结果 del_rknn.onnx

结果转换

剩下的千篇一律了,找到官方的RKNN文档随便下载一下看看,最快的方案是使用docker那个拉取一下,
然后Python test.py
需要注意的是 广为流传的demo里面的test.py导出的是rk3568还是rk3566的,需要config里面配置一下targetplatform

目录
相关文章
|
20天前
|
安全 Linux Shell
Codex CLI 速查表
本文详解 OpenAI Codex CLI(cx)的安装、配置与实战技巧:涵盖 WSL2/Windows 双环境部署、沙盒安全机制、TOML 配置、AGENTS.md 项目约定、快捷键及斜杠命令,对比 cc 差异,附避坑指南与自动化最佳实践。
|
5月前
|
JSON 负载均衡 监控
《服务治理》Thrift与gRPC深度对比与实践
在微服务架构中,服务间通信是系统设计的核心环节。RPC(Remote Procedure Call)框架通过抽象网络通信细节,让开发者能够像调用本地方法一样调用远程服务,极大地提升了开发效率。
|
10月前
|
算法 安全 测试技术
GPS北斗信号放大转发器应用特点分析
GPS 北斗信号放大转发器是一种用于增强和转发GPS/北斗卫星信号的设备,以下是关于它的详细介绍: GPS 北斗信号放大转发器主要应用于以下场景 生产测试 卫星导航产品生产线:在智能手机、平板电脑、车载 DVD、导航仪、天线、模块、行车记录仪等产品的生产过程中,需要对其GPS或北斗定位功能进行测试。信号放大转发器可将室外卫星信号引入室内生产线,让产品在室内就能接收到稳定的卫星信号,从而完成各项定位功能测试,提高生产效率和产品质量。 科研院校实验室:科研人员在进行卫星导航相关的研究和实验时,需要在实验室环境中模拟真实的卫星信号。SYN2308型GNSS卫星信号转发器能够为实验室提供可调整的 GP
|
机器学习/深度学习 编解码 PyTorch
CVPR 2023 | 主干网络FasterNet 核心解读 代码分析
本文分享来自CVPR 2023的论文,提出了一种快速的主干网络,名为FasterNet。核心算子是PConv,partial convolution,部分卷积,通过减少冗余计算和内存访问来更有效地提取空间特征。
10785 58
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
RT-DETR改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
496 13
RT-DETR改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
|
搜索推荐 数据挖掘 数据处理
NVIDIA Triton系列12-模型与调度器2
本文介绍了NVIDIA Triton服务器的“集成推理”功能,涵盖“集成模型”与“集成调度器”两部分,通过示例说明了如何构建一个包含图像预处理、分类和语义分割的推理流水线,强调了模型间数据张量的连接与处理,以及配置集成模型和调度器的具体步骤。
386 1
NVIDIA Triton系列12-模型与调度器2
|
数据可视化 Docker Python
yolo5 onnx2rknn 瑞芯微香橙派 rk3588
本人博客 自转多平台发布
710 2
|
人工智能 测试技术 PyTorch
AI计算机视觉笔记二十四:YOLOP 训练+测试+模型评估
本文介绍了通过正点原子的ATK-3568了解并实现YOLOP(You Only Look Once for Panoptic Driving Perception)的过程,包括训练、测试、转换为ONNX格式及在ONNX Runtime上的部署。YOLOP由华中科技大学团队于2021年发布,可在Jetson TX2上达到23FPS,实现了目标检测、可行驶区域分割和车道线检测的多任务学习。文章详细记录了环境搭建、训练数据准备、模型转换和测试等步骤,并解决了ONNX转换过程中的问题。
【抗扰PID控制】干扰抑制PID控制器研究(Matlab代码实现)
【抗扰PID控制】干扰抑制PID控制器研究(Matlab代码实现)
605 0
|
自然语言处理 并行计算 Python
千问大模型对话
该段Python代码演示了如何使用`modelscope`库加载预训练的因果语言模型`Qwen2-1___5B-Instruct`到CUDA设备,并进行文本生成。首先,它定义了设备为`cuda`,然后加载模型和分词器。接着,设置了一个聊天情境并准备输入文本。通过调用`tokenizer.apply_chat_template`处理输入,然后将处理后的文本转化为模型输入张量并传入设备。使用`model.generate`方法生成新的文本,截取生成的输出并解码为人类可读的字符串。最后,打印出生成的响应。
564 6

热门文章

最新文章