RK3568笔记四:基于TensorFlow花卉图像分类部署
若该文为原创文章,转载请注明原文出处。
基于正点原子的ATK-DLRK3568部署测试。
花卉图像分类任务,使用使用 tf.keras.Sequential 模型,简单构建模型,然后转换成 RKNN 模型部署到ATK-DLRK3568板子上。
在 PC 使用 Windows 系统安装 tensorflow,并创建虚拟环境进行训练,然后切换到VM下的RK3568环境,使用rknn-toolkit2把模型转成rknn模型部署到RK3568板子上测试。
一、介绍
TensorFlow 是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络算法库 DistBelief。
使用 tf.keras.Sequential 模型对花卉图像进行分类。
二、环境搭建
1、创建虚拟环境
conda create -n tensorflow_env python=3.8 -y
2、激活环境
conda activate tensorflow_env
3、安装环境
pip install numpypip install tensorflowpip install pillow
三、训练
1、下载数据集
https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
数据集不好下载,自行处理。
2、训练
tensorflow_classification.py
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential# 获取
import pathlib
#dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
#data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
data_dir = './flower_photos'
data_dir = pathlib.Path(data_dir)batch_size = 32
img_height = 180
img_width = 180# 划分数据
train_ds = tf.keras.utils.image_dataset_from_directory(data_dir,validation_split=0.2,subset="training",seed=123,image_size=(img_height, img_width),batch_size=batch_size)val_ds = tf.keras.utils.image_dataset_from_directory(data_dir,validation_split=0.2,subset="validation",seed=123,image_size=(img_height, img_width),batch_size=batch_size)class_names = train_ds.class_names
#print(class_names)# 处理数据
normalization_layer = layers.Rescaling(1./255)
train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))
val_ds = val_ds.map(lambda x, y: (normalization_layer(x), y))
num_classes = len(class_names)data_augmentation = keras.Sequential([layers.RandomFlip("horizontal",input_shape=(img_height,img_width,3)),layers.RandomRotation(0.1),layers.RandomZoom(0.1),]
)model = Sequential([data_augmentation,layers.Conv2D(16, 3, padding='same', activation='relu'),layers.MaxPooling2D(),layers.Conv2D(32, 3, padding='same', activation='relu'),layers.MaxPooling2D(),layers.Conv2D(64, 3, padding='same', activation='relu'),layers.MaxPooling2D(),layers.Dropout(0.2),layers.Flatten(),layers.Dense(128, activation='relu'),layers.Dense(num_classes, name="outputs")
])model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])model.summary()# 训练模型
epochs=15
history = model.fit(train_ds,validation_data=val_ds,epochs=epochs,
)# 测试模型
#sunflower_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/592px-Red_sunflower.jpg"
#sunflower_path = tf.keras.utils.get_file('Red_sunflower', origin=sunflower_url)
sunflower_path = './test_180.jpg'img = tf.keras.utils.load_img(sunflower_path, target_size=(img_height, img_width)
)
img_array = tf.keras.utils.img_to_array(img)
img_array = tf.expand_dims(img_array, 0) # Create a batchpredictions = model.predict(img_array)
score = tf.nn.softmax(predictions[0])print("This image most likely belongs to {} with a {:.2f} percent confidence.".format(class_names[np.argmax(score)], 100 * np.max(score))
)# Convert the model.
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()# Save the model.
with open('model.tflite', 'wb') as f:f.write(tflite_model)
代码有点需要注意,代码屏蔽了下载的功能,所以需要预先下载数据集,如果没有下载数据集,就需要把下载的代码开启。
#dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
#data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
执行下面命令开始训练:
python tensorflow_classification.py
等待一会,会生成model.tflite模型文件。
四、RKNN模型转换
转换代码通过下面代码:
rknn_transfer.py
import numpy as np
import cv2
from rknn.api import RKNN
import tensorflow as tfimg_height = 180
img_width = 180
IMG_PATH = 'test.jpg'
class_names = ['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']if __name__ == '__main__':# Create RKNN object#rknn = RKNN(verbose='Debug')rknn = RKNN()# Pre-process configprint('--> Config model')rknn.config(mean_values=[0, 0, 0], std_values=[255, 255, 255], target_platform='rk3568')print('done')# Load modelprint('--> Loading model')ret = rknn.load_tflite(model='model.tflite')if ret != 0:print('Load model failed!')exit(ret)print('done')# Build modelprint('--> Building model')ret = rknn.build(do_quantization=False)#ret = rknn.build(do_quantization=True,dataset='./dataset.txt')if ret != 0:print('Build model failed!')exit(ret)print('done')# Export rknn modelprint('--> Export rknn model')ret = rknn.export_rknn('./model.rknn')if ret != 0:print('Export rknn model failed!')exit(ret)print('done')#Init runtime environment
print('--> Init runtime environment')
ret = rknn.init_runtime()
# if ret != 0:
# print('Init runtime environment failed!')
# exit(ret)
print('done')img = cv2.imread(IMG_PATH)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img,(180,180))
img = np.expand_dims(img, 0)#print('--> Accuracy analysis')
#rknn.accuracy_analysis(inputs=['./test.jpg'])
#print('done')print('--> Running model')
outputs = rknn.inference(inputs=[img])
print(outputs)
outputs = tf.nn.softmax(outputs)
print(outputs)print("This image most likely belongs to {} with a {:.2f} percent confidence.".format(class_names[np.argmax(outputs)], 100 * np.max(outputs))
)
#print("图像预测是:", class_names[np.argmax(outputs)])
print('--> done')rknn.release()
运行后会生成RKNN模型

五、部署
rknnlite_inference.py
import numpy as np
import cv2
from rknnlite.api import RKNNLiteIMG_PATH = 'test.jpg'
RKNN_MODEL = 'model.rknn'
img_height = 180
img_width = 180
class_names = ['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']# Create RKNN object
rknn_lite = RKNNLite()# load RKNN model
print('--> Load RKNN model')
ret = rknn_lite.load_rknn(RKNN_MODEL)
if ret != 0:print('Load RKNN model failed')exit(ret)
print('done')# Init runtime environment
print('--> Init runtime environment')
ret = rknn_lite.init_runtime()
if ret != 0:print('Init runtime environment failed!')exit(ret)
print('done')# load image
img = cv2.imread(IMG_PATH)
img = cv2.resize(img,(180,180))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = np.expand_dims(img, 0)# runing model
print('--> Running model')
outputs = rknn_lite.inference(inputs=[img])
print("result: ", outputs)
print("This image most likely belongs to {}.".format(class_names[np.argmax(outputs)])
)rknn_lite.release()
把上面的rknnlite_inference.py和图片拷贝到开发板上,终端运行即可。
如有侵权,或需要完整代码,请及时联系博主。
相关文章:
RK3568笔记四:基于TensorFlow花卉图像分类部署
若该文为原创文章,转载请注明原文出处。 基于正点原子的ATK-DLRK3568部署测试。 花卉图像分类任务,使用使用 tf.keras.Sequential 模型,简单构建模型,然后转换成 RKNN 模型部署到ATK-DLRK3568板子上。 在 PC 使用 Windows 系统…...
甄知科技张礼军:数智化转型助企业破茧成蝶!
数智化浪潮滚滚向前,正席卷各行各业,带领企业从数字化时代跨入数智化时代。可什么是数智化?如何实现数智化转型?已经成为横亘在无数企业面前的大难题! 事实上,数智化是数字化、AI和业务三个要素的交集&…...
Golang Map:高效的键值对容器
1. 引言 在编程中,我们经常需要使用键-值对来存储和操作数据。Golang中提供了一种高效的键值对容器——Map(映射),它提供了快速的查找和插入操作,是处理大量关联数据的理想选择。本文将介绍Golang中的Map,…...
2023年【电工(高级)】报名考试及电工(高级)模拟考试题
题库来源:安全生产模拟考试一点通公众号小程序 2023年【电工(高级)】报名考试及电工(高级)模拟考试题,包含电工(高级)报名考试答案和解析及电工(高级)模拟考…...
伊朗相关的OilRig组织在为期8个月的网络攻击中针对中东政府
导语 伊朗相关的OilRig组织最近在中东政府中展开了一场长达8个月的网络攻击行动。这次攻击导致了文件和密码的被窃取,并且在其中一次攻击中,攻击者还使用了一种名为PowerExchange的PowerShell后门。据Symantec的威胁猎人团队称,他们在一份与T…...
服务器数据恢复-linux+raid+VMwave ESX数据恢复案例
服务器数据恢复环境: 一台某品牌x3950 X6型号服务器,linux操作系统,12块硬盘组建了一组raid阵列,上层运行VMwave ESX虚拟化平台。 服务器故障: 在服务器运行过程中,该raid阵列中有硬盘掉线,linu…...
残疾人求助报警器
残疾人求助报警器 实际上,求助报警对残疾人来说并不是一件容易的事情。首先,由于身体上的缺陷,他们在描述事件经过和罪犯体征时往往存在困难。此外,一些残疾人可能因为自卑或担心被歧视而犹豫不决,甚至选择忍气吞声。…...
【Datawhale】扩散模型学习笔记 第一次打卡
文章目录 扩散模型学习笔记1. 扩散模型库Diffusers1.1 安装1.2 使用 2. 从零开始搭建扩散模型2.1 数据准备2.2 损坏过程2.3 模型构建2.4 模型训练2.5 采样 3. webui 扩散模型学习笔记 1. 扩散模型库Diffusers 1.1 安装 由于diffusers库更新较快,所以建议时常upgr…...
Spring Boot学习笔记
SpringBoot特征 特征 创建独立的 Spring 应用程序 直接嵌入 Tomcat、Jetty 或 Undertow(无需部署 WAR 文件) 提供“入门”依赖项以简化构建配置 尽可能自动配置 Spring 和 第三方库 提供生产就绪功能,例如指标、健康检查和外部化配置 完…...
图像边缘检测--(Sobel、Laplacian、Canny)
1、图像中各种形状的检测是计算机视觉领域中非常常见的技术之一,特别是图像中直线的检测,圆的检测,图像边缘的检测等,下面将介绍如何快速检测图像边缘。 2、边缘是不同区域的分界线,是周围(局部)像素有显著变化的像素的集合,有幅值与方向两个属性。这个不是绝对的定义,…...
【计算机网络笔记】计算机网络性能(2)——时延带宽积、丢包率、吞吐量/率
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 系列文章目录时延带宽积丢包率吞吐量/率&am…...
自学(黑客技术)——网络安全高效学习方法
前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学?如何学? 今天给大家分享一下,很多人上来就说想学习黑客,…...
【Linux】进程概念与进程状态
文章目录 一、进程概念1.进程的概念2.进程的描述-PCB 二、进程相关的基本操作1.组织进程2.查看进程3.结束进程4.通过系统调用获取进程标示符5.通过系统调用创建进程-fork初识 三、进程状态1.普遍操作系统层面的进程状态2.Linux操作系统的进程状态 四、两种特殊的进程状态1.僵尸…...
解决安装nvm以后windows cmd无法找到npm/yarn命令的问题
安装了nodejs多版本管理工具nvm以后,会出现windows cmd无法找到npm/yarn命令的问题 只要一运行npm/yarn就会提示:不是内部命令,找不到运行路径之类的。 解决办法:首先打开windows环境变量的配置,查看NVM_SYMLINK指向…...
深入解析Java正则表达式:定义、原理和实例
1.前言 1.1简介 正则表达式在Java开发中扮演着重要的角色。本文将详细讲解Java正则表达式的定义、工作原理,并提供一些实例和示例代码,帮助读者更好地理解和应用正则表达式 1.2使用场景的介绍 正则表达式适用于许多问题和场景,包括但不限于…...
DatenLord前沿技术分享 No.38
达坦科技专注于打造新一代开源跨云存储平台DatenLord,通过软硬件深度融合的方式打通云云壁垒,致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题,以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。在本周…...
ms-sql server sql 把逗号分隔的字符串分开
案例: sql 查询-字段里是逗号,分隔开的数组,查询匹配数据 sql 查询-字段里是逗号,分隔开的数组,查询匹配数据_sql server 数组匹配-CSDN博客 SQL SERVER 把逗号隔开的字符串拆分成行 SQL SERVER 把逗号隔开的字符串拆分成行_sqlserver拆分…...
零基础制作预约小程序,微信小程序预约服务指南
随着互联网的发展,越来越多的服务开始转移到线上。预约服务也是其中之一。通过微信小程序,商家可以提供更加便捷的预约服务,让客户随时随地预约商品或服务。本文将介绍如何零基础制作预约小程序,包括使用第三方制作平台、选择合适…...
算法---交替合并字符串
题目 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 示例 1: 输入:word1 “abc”…...
下载运行ps软件提示因为计算机中丢失d3dcompiler_47.dll解决方法
在计算机系统中,DLL文件(动态链接库)是一种重要的共享库,它包含了可被多个程序使用的代码和数据。然而,当某些DLL文件丢失或损坏时,可能会导致程序无法正常运行。本文将介绍四种解决D3DCompiler_47.dll缺失…...
Mermaid Live Editor完全指南:5分钟学会用代码画专业图表
Mermaid Live Editor完全指南:5分钟学会用代码画专业图表 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-edi…...
Xshell5一键激活,亲测可用
下载链接: https://pan.baidu.com/s/1PY0RnCcj4EDp6bV1TR5pig?pwdpis9 安装完后,将该监听文件复制到安装的根目录,覆盖原文件即可激活使用...
2026年新生怎么搭建OpenClaw/Hermes Agent?一看就懂教程
2026年新生怎么搭建OpenClaw/Hermes Agent?一看就懂教程。Hermes Agent/OpenClaw怎么部署?还在为部署OpenClaw到处找教程踩坑吗?别再瞎折腾了!Hermes Agent/OpenClaw一键部署攻略来了,无需代码、只需两步,新…...
PyTorch 高频面试题
一、 核心概念与张量操作 1. 什么是PyTorch? PyTorch是一个开源的机器学习库,主要用于开发和训练基于神经网络的深度学习模型。其核心特点是动态计算图(又称即时执行模式),支持GPU加速,并集成了自动微分功…...
LM大模型算法原理浅析:从Transformer到现代预训练架构
LM大模型算法原理浅析:从Transformer到现代预训练架构 1. 引言:为什么需要理解大模型算法 如果你用过ChatGPT或者类似的AI对话工具,可能会好奇这些模型为什么能如此流畅地生成人类语言。背后的核心技术就是大语言模型(LM&#x…...
别再用namespace硬隔离了!MCP 2026正式启用硬件辅助隔离(Intel AMX+AMD SVM-V),性能损耗<0.7%?
更多请点击: https://intelliparadigm.com 第一章:MCP 2026沙箱资源隔离的演进逻辑与战略意义 随着云原生基础设施向多租户、高密调度和强合规方向加速演进,MCP(Multi-Container Platform)2026 引入了基于 eBPF cgro…...
【项目实训(个人)】7:完成AI相关的环境配置与AI角色对话功能
阅见项目AI角色对话功能实战:流式输出与上下文记忆的全栈实现 在本阶段的开发中,我们小组大家各自先尝试基本的api调用,理解基本的前后端逻辑,其中在这里,我实现了一个简单的AI角色对话功能的demo,构建了一…...
Spring框架 - AOP配置文件形式
目录AOP什么是AOP?什么是横切面关注点?AOP的优势AOP底层原理AOP实现形式AOP核心术语AOP - 配置文件形式切入点的表达式通知类型转账案例操作AOP 什么是AOP? AOP(Aspect Oriented Programming的缩写),意为:…...
一条查询跑了 8 小时,改写后 519 毫秒?金仓子查询等价谓词传递优化深度解析
引言:明明有 WHERE 条件,为什么数据库还是全表扫描?你有没有遇到过这样的场景:写了一条 SQL,外层明明带了精确的 WHERE 过滤条件,但执行计划一看——子查询内部仍然是全表扫描,没有利用到任何过…...
3步掌握微信聊天记录导出:免费备份的终极方案
3步掌握微信聊天记录导出:免费备份的终极方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾为无法备份珍贵的微信聊天记录而烦恼?WeCha…...

