当前位置: 首页 > news >正文

yolo26模型部署在rk3588

1生成PT模型

1.1获取源码

从github官⽹下载源码

下载的源码版本为ultralytics8.4.38,下载地址为

https://github.com/ultralytics/ultralytics/tree/3108aa614d801b6b4a18ef7d1755b8c53dffe8a4

1.2适配源码

主要修改部分为ultralytics/nn/modules/head.py⽂件中导出onnx的逻辑。此处修改不影响代码

训练过程。代码具体修改如下:

1.3准备数据集

1.4生成PT模型

将修改后的代码上传⾄服务器,进⾏训练,得到best.pt权重⽂件。

2 PT模型转RKNN模型

2.1PT模型转ONNX模型

接下来需要将pt⽂件转化为onnx⽂件,需要注意在转换前,即转换脚本export_rknn.py中添加下⾯两⾏代码:

current_dir=os.path.dirname(os.path.abspath(__file__))

sys.path.insert(0,current_dir)

因为yolo26配置环境时,是直接下载名为ultralyticspython库,在库中有ultralytics的源码。

若不使⽤这两⾏代码,则在导出onnx时,调⽤的是ultralytics库中的head.py⽂件。

因此这两⾏代码的作⽤是,修改环境搜索优先级,使代码运⾏时优先调⽤⾃⼰修改的

ultralytics代码,⽽不是从ultralytics库中调⽤代码

转换模型

检查onnx模型输出

2.2ONNX模型转RKNN模型

从瑞芯微的github中下载rknn_model_zoo,⽹址为

https://github.com/airockchip/rknn_model_zoo
找到rknn_model_zoo/examples/yolo11,在yolo11的基础上修改yolo26,需要修改的⽂件
postprocess.cc 才是因为 YOLO26 的输出结构和 YOLO11 不一样,所以必须重写

包括:

rknn_model_zoo/examples/yolo26/cpp/main.cc

rknn_model_zoo/examples/yolo26/cpp/yolo26.h

rknn_model_zoo/examples/yolo26/cpp/postprocess.h

rknn_model_zoo/examples/yolo26/cpp/postprocess.cc

rknn_model_zoo/examples/yolo26/cpp/CMakeLists.txt

rknn_model_zoo/examples/yolo26/cpp/rknpu1/yolo26.cc

rknn_model_zoo/examples/yolo26/cpp/rknpu2/yolo26.cc

rknn_model_zoo/examples/yolo26/cpp/rknpu2/yolo26_zero_copy.cc

若训练数据集不为coco数据集,则还需要修改下⾯两个⽂件:

rknn_model_zoo/examples/yolo26/model/coco_80_labels_list.txt

rknn_model_zoo/datasets/COCO/coco_subset_20.txt

1.1

project(rknn_yolo11_demo)
改为
project(rknn_yolo26_demo)

1.2 12-24行
set(rknpu_yolo11_file rknpu2/yolo11.cc)

if (TARGET_SOC STREQUAL "rv1106" OR TARGET_SOC STREQUAL "rv1103")

add_definitions(-DRV1106_1103)

set(rknpu_yolo11_file rknpu2/yolo11_rv1106_1103.cc)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/allocator/dma)

endif()

if(TARGET_SOC STREQUAL "rk1808" OR TARGET_SOC STREQUAL "rv1109" OR TARGET_SOC STREQUAL "rv1126")

add_definitions(-DRKNPU1)

set(rknpu_yolo11_file rknpu1/yolo11.cc)

endif()

改为
set(rknpu_yolo26_file rknpu2/yolo26.cc)

if (TARGET_SOC STREQUAL "rv1106" OR TARGET_SOC STREQUAL "rv1103")

add_definitions(-DRV1106_1103)

set(rknpu_yolo26_file rknpu2/yolo26_rv1106_1103.cc)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/allocator/dma)

endif()

if(TARGET_SOC STREQUAL "rk1808" OR TARGET_SOC STREQUAL "rv1109" OR TARGET_SOC STREQUAL "rv1126")

add_definitions(-DRKNPU1)

set(rknpu_yolo26_file rknpu1/yolo26.cc)

endif()

1.3 33-37

add_executable(${PROJECT_NAME}

main.cc

postprocess.cc

${rknpu_yolo11_file}

)
改为
add_executable(${PROJECT_NAME}

main.cc

postprocess.cc

${rknpu_yolo26_file}

)

1.4 66-73

add_executable(${PROJECT_NAME}_zero_copy

main.cc

postprocess.cc

rknpu2/yolo11_zero_copy.cc

)

改为
add_executable(${PROJECT_NAME}_zero_copy

main.cc

postprocess.cc

rknpu2/yolo26_zero_copy.cc

)

main.cc

2.1 18-26

#include "yolo11.h"

#include "image_utils.h"

#include "file_utils.h"

#include "image_drawing.h"
改为
#include "yolo11.h"

#include "image_utils.h"

#include "file_utils.h"

#include "image_drawing.h"

2.2 46-58

ret = init_yolo11_model(model_path, &rknn_app_ctx);

改为
ret = init_yolo26_model(model_path, &rknn_app_ctx);

2.3 80-88

ret = inference_yolo11_model(&rknn_app_ctx, &src_image, &od_results);

if (ret != 0)

{

printf("init_yolo11_model fail! ret=%d\n", ret);

goto out;

}

改为
ret = inference_yolo26_model(&rknn_app_ctx, &src_image, &od_results);

if (ret != 0)

{

printf("inference_yolo26_model fail! ret=%d\n", ret);

goto out;

}

printf("inference_yolo26_model use: inference time: %.2f ms, post process time: %.2f ms\n",

rknn_app_ctx.inference_time_ms, rknn_app_ctx.post_process_time_ms);

2.4 115

ret = release_yolo11_model(&rknn_app_ctx);
改为

ret = release_yolo26_model(&rknn_app_ctx);

yolo26.h

3.1 15-16

#ifndef _RKNN_DEMO_YOLO11_H_

#define _RKNN_DEMO_YOLO11_H_

改为
#ifndef _RKNN_DEMO_YOLO26_H_

#define _RKNN_DEMO_YOLO26_H_

3.2 28-50

int model_channel;

int model_width;

int model_height;

bool is_quant;
改为
int model_channel;

int model_width;

int model_height;

bool is_quant;

double inference_time_ms;

double post_process_time_ms;

3.3 55-59

int init_yolo11_model(...);

int release_yolo11_model(...);

int inference_yolo11_model(...);
改为
int init_yolo26_model(...);

int release_yolo26_model(...);

int inference_yolo26_model(...);

postprocess.h

4.1

#ifndef _RKNN_YOLO11_DEMO_POSTPROCESS_H_

#define _RKNN_YOLO11_DEMO_POSTPROCESS_H_

改为
#ifndef _RKNN_YOLO26_DEMO_POSTPROCESS_H_

#define _RKNN_YOLO26_DEMO_POSTPROCESS_H_

4.2 9-15

#define OBJ_NAME_MAX_SIZE 64

#define OBJ_NUMB_MAX_SIZE 128

#define OBJ_CLASS_NUM 80

#define NMS_THRESH 0.45

#define BOX_THRESH 0.25
改为
#define OBJ_NAME_MAX_SIZE 64

#define OBJ_NUMB_MAX_SIZE 128

#define OBJ_CLASS_NUM 80

#define NMS_THRESH 0.45

#define BOX_THRESH 0.25

#define YOLO26_OUTPUT_NUM 9

#define YOLO26_BRANCH_NUM 3

#define YOLO26_OUT_PER_BRANCH 3

4.3 30-36

int post_process(...);

void deinitPostProcess();

#endif //_RKNN_YOLO11_DEMO_POSTPROCESS_H_
改为
int post_process(...);

#endif //_RKNN_YOLO26_DEMO_POSTPROCESS_H_

postprocess.cc核心修改
5.1 15

#include "yolo11.h"

改为
#include "yolo26.h"

5.2 99-178

static float CalculateOverlap(...)

static int nms(...)

static int quick_sort_indice_inverse(...)
新版删除


5.3 208-223

static void compute_dfl(float* tensor, int dfl_len, float* box)

{

...

}
新版删除


5.4 225-298

float before_dfl[dfl_len * 4];

compute_dfl(before_dfl, dfl_len, box);
改为
#ifdef RKNPU1

printf("Process u8 not fully implemented for YOLO26 here.\n");

#else

validCount += process_i8(...);

#endif

新版 YOLO26 主要实现了 RKNPU2 的 int8 / fp32 后处理,RKNPU1 的 u8 量化分支没有完整实现。如果后面真跑 RKNPU1 量化模型,这里还需要继续补。

5.5 300-368

5.6 370-433

5.7

5.8

5.9

rknpu1/yolo26.cc

6.1 14-23

#include "yolo11.h"
改为

#include "yolo26.h"

6.2 34-136

int init_yolo11_model(...)
改为

int init_yolo26_model(...)

6.3 138-156

int release_yolo11_model(...)

改为

int release_yolo26_model(...)

6.4 158-249

int inference_yolo11_model(...)

改为

int inference_yolo26_model(...)

rknpu2/yolo26.cc

7.1 14-23

#include "yolo11.h"

具体列举没有列举完全,其余部分将在附件代码中展示

执行转换
python3 convert.py ../model/yolo26.onnx rk3576 i8 ../model/yolo26_i8.rknn

注意rknn_model_zoo在模型转换为rknn后,在模型中加入了归一化操作

3上板验证RKNN模型

⽣成demo可执⾏⽂件并上板测试

具体流程请查看rknn_model_zoo/docs/Compilation_Environment_Setup_Guide_CN.md

生成3576对应demo

3.1单张图片

打包demo发到rk3588板子上运行图片检测demo即可。

3.2离线视频

因为瑞芯微的rknn_model_zoo中不涉及视频流的处理,因此修改后的rknn_model_yolo26

只能进⾏图⽚推理,不能进⾏视频流推理。

!相关代码在主页上传附件资源

http://www.jsqmd.com/news/899097/

相关文章:

  • 7×24小时不打烊:数字人智能客服如何重塑政务服务“最后一公里“
  • 2026年5月工程信息平台:中项网重构工程行业获客逻辑 - GrowthUME
  • 义乌网店饰品批发厂家实力对比:五大硬指标逐一解析 - 资讯快报
  • 创业公司如何建立合作伙伴生态
  • 学术写作提质新思路:paperxie 毕业论文 AI 创作功能实操使用解析
  • 如何快速掌握C++游戏开发:基于Cocos2d-x的植物大战僵尸完整实战指南
  • 2026年饶阳钢格栅采购选型与合规落地全攻略 - 资讯纵览
  • MCP测试v4
  • 2026年闵行那些靠谱的回收黄金加工厂家揭秘 - 资讯纵览
  • 火爆分享使用Taotoken后API调用延迟与稳定性的真实体感
  • 电商关键词挖掘:Java 爬虫抓取 1688 推荐搜索词
  • 高端腕表维修深度测评|从设备、技术、服务四维实测,解析盛时出圈原因 - 资讯快报
  • 高效搞定学术文稿:paperxie 论文智能创作功能实操用法分享
  • Cache主存地址映射实战:从课后题到三种映射方式的地址格式设计
  • 深圳电子元器件供应商哪家种类全
  • 搭上鸿蒙“快车”,ToDesk远控如何用全场景体验点燃效率革命?
  • Qwen-Edit-2509多角度图像生成:用自然语言指令重塑视觉创作
  • MCP博客园工具集成测试v2
  • 2026年河北钢格栅行业深度攻略:选型、合规、品牌与落地全指南 - 资讯纵览
  • 2026重庆全屋定制公司推荐排行榜 五大高端品牌实力深度测评 - 资讯快报
  • 2026年驱蚊雾森系统排名:最新权威排名与专业指南。 - 资讯快报
  • 零信任架构:打破边界,构筑以身份为核心的新一代安全体系
  • 别让“能用”的IP拖垮业务——共享IP易封禁的原因与IP风险等级评估实战
  • 插件集成实战:将 AI 编码助手嵌入 VS Code 和 JetBrains
  • 华为韬(τ)定律:一场对热管理行业的“压力测试”
  • 2026年iPaaS系统集成平台怎么选?国内主流产品深度对比与选型指南
  • 2026上海二奢回收商家综合实力测评|6大维度评测,权威推荐 - GrowthUME
  • 成都本地人都要去的宝藏火锅店推荐|口碑4.8分以上必吃榜单 - TOP10品牌推荐榜单
  • 2026年苏州名酒回收行业研究报告:专业检测机构发展现状与趋势 - 资讯纵览
  • 生产数据库批量 UPDATE / DELETE 核心要点-不备份=自行提桶跑路