RK3568笔记三:部署ResNet50模型

news2024/11/19 21:27:29

若该文为原创文章,转载请注明原文出处。

通过ResNet50网络训练了识别10类车的模型并成功了转换成了onnx模型

具体训练过程可以参考文章AI项目十七:ResNet50训练部署教程-CSDN博客

这里部署使用rknn-toolkit2工具转换成RKNN模型并测试

rknn-toolkit2工具安装在前面文章有説明了,自行安装。

接下来测试并转成RKNN模型

一、onnx转成rknn模型

在rknn-toolkit2-master/examples/onnx目录下创建04_resnet50目录。

在04_resnet50目录下创建test.py文本

import os
import urllib.request as request
import urllib
import traceback
import time
import sys
import numpy as np
import cv2
from rknn.api import RKNN

ONNX_MODEL = '10class_ResNet50.onnx'
RKNN_MODEL = '10class_ResNet50.rknn'


def show_outputs(outputs):
    output = outputs[0][0]
    output_sorted = sorted(output, reverse=True)
    top5_str = 'resnet50v2\n-----TOP 5-----\n'
    for i in range(5):
        value = output_sorted[i]
        index = np.where(output == value)
        for j in range(len(index)):
            if (i + j) >= 5:
                break
            if value > 0:
                topi = '{}: {}\n'.format(index[j], value)
            else:
                topi = '-1: 0.0\n'
            top5_str += topi
    print(top5_str)


def readable_speed(speed):
    speed_bytes = float(speed)
    speed_kbytes = speed_bytes / 1024
    if speed_kbytes > 1024:
        speed_mbytes = speed_kbytes / 1024
        if speed_mbytes > 1024:
            speed_gbytes = speed_mbytes / 1024
            return "{:.2f} GB/s".format(speed_gbytes)
        else:
            return "{:.2f} MB/s".format(speed_mbytes)
    else:
        return "{:.2f} KB/s".format(speed_kbytes)


def show_progress(blocknum, blocksize, totalsize):
    speed = (blocknum * blocksize) / (time.time() - start_time)
    speed_str = " Speed: {}".format(readable_speed(speed))
    recv_size = blocknum * blocksize

    f = sys.stdout
    progress = (recv_size / totalsize)
    progress_str = "{:.2f}%".format(progress * 100)
    n = round(progress * 50)
    s = ('#' * n).ljust(50, '-')
    f.write(progress_str.ljust(8, ' ') + '[' + s + ']' + speed_str)
    f.flush()
    f.write('\r\n')


if __name__ == '__main__':

    # Create RKNN object
    rknn = RKNN(verbose=True)

    # If resnet50v2 does not exist, download it.
    # Download address:
    # https://s3.amazonaws.com/onnx-model-zoo/resnet/resnet50v2/resnet50v2.onnx
    if not os.path.exists(ONNX_MODEL):
        print('--> Download {}'.format(ONNX_MODEL))
        url = 'https://s3.amazonaws.com/onnx-model-zoo/resnet/resnet50v2/resnet50v2.onnx'
        download_file = ONNX_MODEL
        try:
            start_time = time.time()
            urllib.request.urlretrieve(url, download_file, show_progress)
        except:
            print('Download {} failed.'.format(download_file))
            print(traceback.format_exc())
            exit(-1)
        print('done')

    # pre-process config
    print('--> config model')
    rknn.config(mean_values=[123.675, 116.28, 103.53], std_values=[58.82, 58.82, 58.82])
    print('done')

    # Load model
    print('--> Loading model')
    ret = rknn.load_onnx(model=ONNX_MODEL)
    if ret != 0:
        print('Load model failed!')
        exit(ret)
    print('done')

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

    # Export rknn model
    print('--> Export rknn model')
    ret = rknn.export_rknn(RKNN_MODEL)
    if ret != 0:
        print('Export rknn model failed!')
        exit(ret)
    print('done')

    # Set inputs
    img1 = cv2.imread('./test.jpg')
    img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
    img = cv2.resize(img1, (224, 224)) 
    # Init runtime environment
    print('--> Init runtime environment')
    ret = rknn.init_runtime()
    if ret != 0:
        print('Init runtime environment failed!')
        exit(ret)
    print('done')

    # Inference
    print('--> Running model')
    outputs = rknn.inference(inputs=[img])
    np.save('./onnx_resnet50v2_0.npy', outputs[0])
    x = outputs[0]
    output = np.exp(x)/np.sum(np.exp(x))
    outputs = [output]
    show_outputs(outputs)
    print('done')

    rknn.release()

程序里有个需要注意的,resnet50模型使用的是224*224大小,所以在加载图片时,需要把图片缩放成224*224大小,否则会报下面的错误

E inference: The input(ndarray) shape (1, 768, 1024, 3) is wrong, expect 'nhwc' like (1, 224, 224, 3)!

运行

python test.py

成功运行 

如有侵权,或需要完整代码,请及时联系博主。

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

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

相关文章

12款SCADA软件功能比较

数据采集​​软件 SCADA是可用于监控工厂运营或工业流程的软件。通过使用SCADA软件,我们可以将硬件和软件结合起来,组成一个更好的控制系统。为了改进工业过程或纠正过程故障,SCADA 会将所需的命令信号发送到 PLC 或 RTU,这些设备…

大模型发展进入深水区,企业如何打造专属AI原生应用?

目录 📢前言 大模型发展进入深水区,企业如何打造专属AI原生应用?一、人工智能领域发展现状及行业特点二、百度GBI 的诞生三、百度GBI的特点和优势四、百度GBI的作用及应用场景五、 重磅发布“千帆AI原生应用开发工作台”六、千帆AI原生应用开…

亿赛通电子文档安全管理系统 Update.jsp SQL注入

目录 0x01 漏洞介绍 0x02 影响产品 0x03 语法特征 0x04 漏洞复现页面 0x05 漏洞修复建议 0x01 漏洞介绍 亿赛通电子文档安全管理系统是国内最早基于文件过滤驱动技术的文档加解密产品之一,保护范围涵盖终端电脑(Windows、Mac、Linux系统平台&#…

跬智信息(Kyligence)入选 IDC《中国数据智能市场生态图谱V4.0》

近日,IDC 咨询正式发布了《中国数据智能市场生态图谱V4.0》,该报告深入分析了当前中国数据智能市场的综合状况和市场格局。作为领先的大数据分析和指标平台供应商,跬智信息(Kyligence)凭借在 Data AI 领域的长期技术积…

1.33 定时器总结篇

文章目录 1、定时器相关描述1.1 定时器总类1.2 定时器整体与时钟来源1.2 定时对应总线时钟1.3定时器计数模式 1、定时器相关描述 1.1 定时器总类 定时器类型位数计数模式产生DMA请求捕获/比较通道互补输出特殊运用场景高级定时器TIM1、TIM816向上、向下、向上/下可以4有带可编…

Vue实现购物车页面

包括全选反选、数据的统计和本地持久化的处理。 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"view…

289. 生命游戏 Python

文章目录 一、题目描述示例 1示例 2 二、代码三、解题思路 一、题目描述 根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成…

以“大数据+云服务”为核心的SaaS云平台 智慧校园管理平台 教师端、家长端、学生端全套源码

智慧校园全套源码 电子班牌系统源码 家校互联小程序源码 智慧校园以互联网为基础&#xff0c;以“大数据云服务”为核心&#xff0c;融合校园教学、管理、生活软硬件平台&#xff0c;定义智慧校园新生活。智慧校园管理平台管理者、教师、学生、家长提供一站式智慧校园解决方案…

基于Java+SpringBoot+Vue前后端分离的宠物领养系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 近年来&#xff0c;随…

和鲸ModelWhale与中科可控X系列异构加速服务器完成适配认证,搭载海光芯片,构筑AI算力底座

AIGC 时代&#xff0c;算力作为新型生产力&#xff0c;是国家和企业构建竞争优势的关键。而随着传统计算方式无法满足新时代激增的算力需求&#xff0c;计算场景的多元化和计算应用的复杂化推动了 CPUGPU 异构平台的加速组建。在此全球激烈角逐的大趋势下&#xff0c;我国信创产…

再有国产手机宣布自研操作系统,去美国化成潮流,谷歌自作自受

在小米正在大举宣传自研操作系统之后&#xff0c;日前vivo也宣布将自研操作系统&#xff0c;它们未来的目标都是从兼容安卓到实现真正的独立自主&#xff0c;摆脱对美国谷歌的依赖&#xff0c;实现类似于苹果的封闭系统。 国产手机自研操作系统&#xff0c;首先是考虑到系统的供…

事件知识图谱综述10.17+10.18 弃

事件知识图谱综述 摘要介绍2 什么是事件知识图谱&#xff1a;历史视角2.1 EKG的简要历史2.2 EKG的定义 什么是EKG&#xff1a;本体视角3.1 事件架构归纳 摘要 除了以实体为中心的知识&#xff0c;通常以知识图谱&#xff08;KG&#xff09;的形式组织外&#xff0c;事件也是世…

单身狗1和单身狗2(C语言版)

目录 1. 单身狗1 2. 单身狗2 1. 单身狗1 题目&#xff1a; 一个数组中只有一个数字是出现一次&#xff0c;其他所有数字都出现了两次。 编写一个函数找出这一个只出现一次的数字。 例如&#xff1a;有数组的元素是&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&a…

输入/输出的实用性-SOLIDWORKS 2024新功能

导出为 Extended Reality 您可以将 SOLIDWORKS CAD 文件导出为 .glb 或 .gltf 文件格式。 文件包含以下信息&#xff0c;例如几何体、外观、纹理、动画、运动算例、配置、显示状态、爆炸视图、光源 和元数据。对于大文件&#xff0c;导出支持 Draco&#xff0c;这是 .glb 和 .…

ChatGPT对于留学生论文写作有哪些帮助?

2022年11月&#xff0c;OpenAI公司的智能聊天产品ChatGPT横空出世&#xff0c;并两个月之内吸引了超过1亿用户&#xff0c;打破了TikTok&#xff08;抖音国际版&#xff09;9个月用户破亿的纪录。 划时代的浪潮 ChatGPT的火爆立即引起了全球关注并成为热门话题&#xff0c;它…

Mysql 内外链接,索引,事务,用户管理以及用C语言链接Mysql

文章目录 内外链接索引索引的相关操作全文索引 事务事务的操作事务的隔离级别隔离级别3个记录隐藏列字段 用户管理权限修改 使用C语言链接数据库 内外链接 两张表直接做笛卡尔积为内连接&#xff0c;之前使用的都是内连接 两张表&#xff1a;stu和exam 将两张表进行连接&…

Arya碎碎念 | 我的创作纪念日——写在成为创作者的第1095天

前言 打开博客创作者页面&#xff0c;发现CSDN发送过来一条私信&#xff0c;提醒我3年前发了第一篇博客。3年的时间里&#xff0c;大家都经历了很多事情&#xff0c;疫情 . . . . . 本篇博客是一些碎碎念&#xff0c;作为一个成为1095天创作者的纪念博客。 一、个人优质博客汇…

I2C的硬件实现

因为I2C是同步的&#xff0c;所以相对来说I2C更好用软件来实现&#xff0c;硬件却相对来说没这么好&#xff0c;但是硬件I2C通信也是有其优点的 我们是通过软件写入控制寄存器CR和数据寄存器DR&#xff0c;读取状态寄存器SR来了解外设电路当前处于什么状态&#xff0c;来实现I…

jvm实现的锁优化

目录 轻量级锁 轻量级锁的工作流程 轻量级锁的解锁 偏向锁 偏向锁的流程&#xff1a; 偏向锁和轻量级锁机区别&#xff1a; 其他优化 自旋锁和自适应自旋锁 锁消除 锁粗化 轻量级锁 “轻量级” 是相对于使用操作系统互斥量来实现的传统锁而言的&#xff0c;因此传统的…

Java学习笔记(四)——程序控制结构

一、顺序控制 二、分支控制 &#xff08;一&#xff09;单分支 &#xff08;二&#xff09;双分支 &#xff08;三&#xff09;多分支 &#xff08;四&#xff09;嵌套分支 &#xff08;五&#xff09;switch分支结构 &#xff08;六&#xff09;if和switch的选择 三、循…