自定义数据训练的rknn模型部署 踩坑记录

news2024/10/6 6:13:14

自己训练了一个只有2种类别的yolov8模型之后,部署到瑞芯微RKNN。

踩坑一:类别的变化

之前用COCO数据集训练的.pt模型转rknn后,output0的shape为8400 x 176.
而把自定义数据集训练的模型转rknn后,output0的shape为8400 x 98.
为什么会不一样?一度以为模型或代码有问题,拿图片测了下发现模型没问题,能检测出来。

分析一下8400x176,其中8400是proposal的个数,176是box相关的64+80个类别+32的mask coefficient.
现在类别变成了2,自然要变成64+2+32=98.

所以,如果后处理中用到类别数=80,画图中的类别标签用了80个的,这里需要修改一下。

踩坑二:模型转化(.pt 转 .rknn)

用转化后的rknn模型检测,只能检测出一种类别,另一种检测不出来。

于是从后处理出发找原因,
现输入图片中有两种物体,每种一个,理论上应该检测出2个物体。
先看NMS之前检测了多少个物体。

std::vector<int> picked;
nms_sorted_bboxes(proposals, picked); //picked里面保存的是proposals的下标

int count = picked.size();

这里NMS之前 picked.size() = 1, 说明NMS之前就只检测出一个,已经不对了。

回到NMS之前的处理,
这里选择较大概率的类别作为label,保存label, score和box坐标。

int label = -1;
float score = -FLT_MAX;
//找到最大score和对应的label
for (int k = 0; k < num_class; k++) {
    float confidence = deqnt_affine_to_f32(score_ptr[k], zp,
                                           scale);  //反量化,int转float
    if (confidence > score) {
        label = k;
        score = confidence;
    }
}

float box_prob = sigmoid(score);
if (box_prob >= thres) {
    //忽略一段处理过程
    obj.rect.x = x0;
    obj.rect.y = y0;
    obj.rect.width = x1 - x0;
    obj.rect.height = y1 - y0;
    obj.label = label;
    obj.prob = box_prob;
}

于是追踪label = 0和label = 1的检测概率。
用同一图片测试,很神奇的是.pt模型(转rknn之前)测试中,label=0和label=1的目标 检测概率都>0.9,
而转rknn之后label=1的目标 检测概率只有0.5,label=0的目标 检测概率小得出奇。
观察到score作softmax运算前,label=0的目标 反量化的检测概率小于-7.

认为这是反量化出现了问题,不过反量化用的是从rknn模型中读出的量化参数scales和zp。

for (int i = 0; i < io_num.n_output; ++i) {
    output_attrs[i].index = i;
    if(rknn_query(ctx, RKNN_QUERY_OUTPUT_ATTR, &(output_attrs[i]), sizeof(rknn_tensor_attr)) < 0) {
        LOGE("rknn_query output_attrs[%d] fail!\n", i);
        return;
    }
    // set out_scales/out_zps for post_process
    out_scales.push_back(output_attrs[i].scale);
    out_zps.push_back(output_attrs[i].zp);
}

如果量化参数有问题,那就是转rknn模型的过程有问题。

找到转rknn模型的代码。

    OUT_DIR = "rknn_models"
    RKNN_MODEL_PATH = '{}/{}.rknn'.format(OUT_DIR,exp)
    if NEED_BUILD_MODEL:
        DATASET = './dataset.txt'
        rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform="rkXXXX")
        # Load model
        print('--> Loading model')
        ret = rknn.load_onnx(MODEL_PATH)
        if ret != 0:
            print('load model failed!')
            exit(ret)
        print('done')

        # Build model
        print('--> Building model')
        ret = rknn.build(do_quantization=True, dataset=DATASET)
        if ret != 0:
            print('build model failed.')
            exit(ret)
        print('done')

        # Export rknn model
        if not os.path.exists(OUT_DIR):
            os.mkdir(OUT_DIR)
        print('--> Export RKNN model: {}'.format(RKNN_MODEL_PATH))
        ret = rknn.export_rknn(RKNN_MODEL_PATH)
        if ret != 0:
            print('Export rknn model failed.')
            exit(ret)
        print('done')
    else:
        ret = rknn.load_rknn(RKNN_MODEL_PATH)

    rknn.release()

注意到rknn模型的转换用到了dataset.txt,它指定的是如下图片。

请添加图片描述

这是原版COCO训练下的yolov8的图片,而现在的自定义数据集中没有这样的图片。
换成现在自定义数据集中的图片,再次转rknn模型。

然后观察scales和zp这两个量化值,发现跟之前不一样了。
再次检测,成功检测出2个目标,且检测概率>0.9,和.pt模型差不多。

总结:
转rknn模型时用的图片可能需要用现有数据集中的图片,不要用不相关的图片。
(原理不清楚)

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

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

相关文章

法大大举办2023年伙伴大会:AI赋能,建设生态2.0

“数智‘签’引&#xff0c;聚力共赢——法大大2023年伙伴大会”10月13日在深圳隆重举办。包括腾讯、德勤、PWC、安永、金蝶、致远互联、明源云、蓝凌、玄武、甄零科技、北森、司享网络、明道云、企企通等在内的100多家企业服务厂商及企业高层代表齐聚一堂&#xff0c;探讨AI浪…

探索UI设计|栅格系统的深入分析和应用

界面排版太乱了。你知道网格系统的用途吗&#xff1f;网格系统困扰着许多初级网页设计师&#xff0c;就像一个谜。如果您对网格在设计中的应用有任何疑问&#xff0c;本文是为您量身定制的&#xff0c;并深入分析UI设计中网格系统的基本要素和优点。 什么是网格系统 网格系统…

制造企业有了ERP,是否需要MES系统?

导 读 ( 文/ 1656 ) 在制造业的数字化转型中&#xff0c;企业常常会引入企业资源计划&#xff08;ERP&#xff09;系统来实现企业级的信息管理和资源规划。然而&#xff0c;对于制造企业而言&#xff0c;是否还需要引入制造执行系统&#xff08;MES&#xff09;系统呢&#xf…

【c++源码】老飞飞源码完整v15源码(包含数据库前端后端源文件)

老飞飞源码完整v15源码&#xff08;包含数据库前端后端源文件&#xff09;程序来源于国外网站。程序仅供参考学习游戏开发流程。以及框架内容。 测试环境搭建 Visual Studio 2013 SQL Server 2008r Windows 10 和 11 专业版 这些文件已经过测试&#xff0c;搭建&#xff0c;运行…

介绍一款小巧的Excel比对工具-DiffExcel

【缘起&#xff1a;此前找了一通&#xff0c;没有找到免费又好用的Excel比对工具&#xff0c;而ExcelBDD需要把Excel文件存放到Git&#xff0c;因此迫切需要Excel比对工具。 最新升级到V1.3.3&#xff0c;因为git diff有变化&#xff0c;原来是git diff会修改文件名&#xff0…

数字化转型背景下,MES管理系统的新特征是什么

近年来&#xff0c;随着智能制造的快速发展&#xff0c;MES管理系统作为生产过程中的重要管理系统&#xff0c;也越来越受到企业的关注和应用。在实现MES系统的过程中&#xff0c;需要将JIT思想融入其中&#xff0c;实现业务流程管理的自动化&#xff1b;同时&#xff0c;也需要…

c语言练习86:移除元素

移除元素 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额…

EtherCAT转Modbus-TCP协议网关与DCS连接的配置方法

远创智控YC-ECTM-TCP&#xff0c;自主研发的通讯网关&#xff0c;将为你解决以太网通讯难题。YC-ECTM-TCP是一款EtherCAT主站功能的通讯网关&#xff0c;能够将EtherCAT网络和Modbus-TCP网络连接起来。它可以作为EtherCAT网络中的主站使用&#xff0c;同时也可以作为Modbus-TCP…

Django Test

Django--Laboratory drug management and early warning system-CSDN博客 创建项目doinglms django-admin startproject doinglms python manage.py runserver 运行开发服务器(Development Server) 创建一个自定义 App,名称为 lms: python manage.py startapp lms

HJ86 求最大连续bit数

目录 一、题目 二、代码 一、题目 求最大连续bit数_牛客题霸_牛客网 二、代码 #include <iostream> #include<stack> #include<vector> using namespace std; void TEN_to_TWO(int x, vector<int>& data) { //10进制转换成二进制stack<int&…

androidx.appcompat.widget.Toolbar最右边设置控件不能仅靠最右边

androidx.appcompat.widget.Toolbar最右边设置控件不能仅靠最右边 Android Toolbar左、中、右对齐-CSDN博客&#xfeff;&#xfeff;Android Toolbar左、中、右对齐默认的Android Toolbar中添加子元素view是从左到右依次添加。需要注意的是&#xff0c;Android Toolbar为自身的…

与HTTP相关的各种概念

网络世界 网络世界中最重要的一个名词就是互联网&#xff08;Internet&#xff09;,它以TCP/IP协议族为基础&#xff0c;构建成了一望无际的信息传输网络。而我们通常所说的“上网”&#xff0c;主要就是访问互联网的一个子集——万维网&#xff08;World Wide Web&#xff09…

虹科方案 | 车载以太网转换器交换机解决方案

全文导读&#xff1a;虹科推出的基于转换器&交换机的车载以太网解决方案&#xff0c;旨在满足汽车领域对高速、可靠、安全的数据传输和系统集成的需求&#xff0c;并且具有高稳定性&#xff0c;在转换过程中不修改任何数据包&#xff0c;有效应用于传感器数据采集、台架测试…

【机器学习】sklearn特征选择(feature selection)

文章目录 特征工程过滤法&#xff08;Filter&#xff09;方差过滤相关性过滤卡方过滤F验表互信息法小结 嵌入法&#xff08;Embedded&#xff09;包装法&#xff08;Wrapper&#xff09; 特征工程 特征提取(feature extraction)特征创造(feature creation)特征选择(feature se…

C++入门篇---(2)函数重载

1.函数重载的概念 函数重载&#xff1a; 是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功能类似的同名…

[Vue]之Jwt的入门和Jwt工具类的使用及Jwt集成spa项目

一&#xff0c;jwt入门 1.1 是什么&#xff1f; JWT&#xff0c;全称为 JSON Web Token&#xff0c;是一种用于在网络应用之间传递信息的标准方法。它是基于 JSON 格式定义的一种简洁且自包含的方式&#xff0c;可以安全地在用户和服务之间传输声明信息 1.2 为什么要使用 ①简…

动态分区分配算法之首次适应算法,最佳适应算法,最坏适应算法以及邻近适应算法

1.首次适应算法(First Fit) 1.算法思想: 每次都从低地址开始查找&#xff0c;找到第一个能满足大小的空闲分区。 2.如何实现: 空闲分区以地址递增的次序排列。 每次分配内存时顺序查找空闲分区链&#xff08;或空闲分区表&#xff09;&#xff0c;找到大小能满足要求的第一…

简单实现一个todoList(上移、下移、置顶、置底)

演示 html部分 <!DOCTYPE html> <html> <head><title>表格示例</title> </head> <body><table border"1"><thead><tr><th>更新时间</th><th>操作</th></tr></thead…

Python 的安装

二、Python 的安装 因为 Python 是跨平台的&#xff0c;它可以运行在 Windows、Mac 和各种 Linux/Unix 系统上。目前&#xff0c;Python 有两个版本&#xff0c;一个是 2.x 版&#xff0c;一个是 3.x版&#xff0c;这两个版本是不兼容的。本草根安装的是 3.6.1 版本的。 至于…

MySQL之双主双从读写分离

一个主机 Master1 用于处理所有写请求&#xff0c;它的从机 Slave1 和另一台主机 Master2 还有它的从 机 Slave2 负责所有读请求。当 Master1 主机宕机后&#xff0c; Master2 主机负责写请求&#xff0c; Master1 、 Master2 互为备机。架构图如下 : 准备 我们…