移植driver_monitoring_system里的MobileNet到RK3588

根据下面的内容写一篇技术博客,要求增加更多的解释,让普通读者也能了解为什么这样做,具体怎么做

移植driver_monitoring_system里的MobileNet到RK3588

    • 一、背景
    • 二、操作步骤
      • 2.1 下载源码
      • 2.2 Tensorflow转成ONNX
        • 2.2.1 在x86上创建容器,安装依赖
        • 2.2.2 保存为saved-model
        • 2.2.3 saved-model转ONNX
        • 2.2.4 ONNX推理
      • 2.3 ONNX转RKNN
      • 2.4 RKNN推理

一、背景

  • driver_monitoring_system 是一个旨在监控驾驶员状态和行为的项目,例如打哈欠、打电话
  • MobileNet用来预测驾驶员的行为(电话、短信) 该模型基于tensorflow
  • 本文介绍如果将该模型移植到RK3588
  • 手机检测模型参考:在RK3588上实现YOLOv8n高效推理

二、操作步骤

2.1 下载源码

git clone https://github.com/jhan15/driver_monitoring.git
cd driver_monitoring

2.2 Tensorflow转成ONNX

2.2.1 在x86上创建容器,安装依赖
docker run -it --privileged --net=host \-v $PWD:/home -w /home --rm  nvcr.io/nvidia/pytorch:22.02-py3 /bin/bashpip install tf-estimator-nightly==2.8.0.dev2021122109
pip install tensorflow==2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install tf2onnx onnx -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2.2 保存为saved-model
cat > cvt.py <<-'EOF'
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers.experimental.preprocessing import Rescaling
from tensorflow.keras.layers import RandomRotation, RandomZoom, Dense, Dropout,\BatchNormalization, GlobalAveragePooling2D
from tensorflow.keras.optimizers import Adam
from tf2onnx import convert
from net import MobileNet
from PIL import Image
import tensorflow as tf
import numpy as npclass MobileNet(Sequential):   def __init__(self, input_shape=(224,224,3), num_classes=2, dropout=0.25, lr=1e-3,augmentation=False, train_base=False, add_layer=False):super().__init__()self.base_model = tf.keras.applications.MobileNetV2(weights='imagenet',input_shape=input_shape,include_top=False)self.base_model.trainable = train_base        self.add(self.base_model)self.add(GlobalAveragePooling2D())self.add(Dropout(dropout))        if add_layer:self.add(Dense(256, activation='relu'))self.add(Dropout(dropout))        self.add(Dense(num_classes, activation='softmax'))        self.compile(optimizer=Adam(learning_rate=lr),loss='sparse_categorical_crossentropy',metrics=["accuracy"])model = MobileNet()
model.load_weights('models/model_split.h5')rgb_image = Image.open("0.jpg")
rgb_image = np.array(rgb_image.resize((224,224))).astype(np.float32)
rgb_image = (tf.expand_dims(rgb_image, 0)-127.5)/127.5
print(rgb_image.shape)
y = model.predict(rgb_image)
print(model.input)
print(model.output)
print(y.shape,y.reshape(-1)[:8])
result = np.argmax(y, axis=1)
print(result.shape)
model.save("keras_model")
EOF
rm -rf keras_model
python3 cvt.py
2.2.3 saved-model转ONNX
python -m tf2onnx.convert --inputs-as-nchw mobilenetv2_1_00_224_input:0 \--inputs mobilenetv2_1_00_224_input:0[1,224,224,3] \--saved-model keras_model --output model.onnx
rm keras_model -rf
2.2.4 ONNX推理
cat > onnx_forward.py <<-'EOF'
import onnxruntime as ort
import numpy as np
import sys
from PIL import Imagemodel_path = "model.onnx"
session = ort.InferenceSession(model_path)
inputs_info = session.get_inputs()
outputs_info = session.get_outputs()rgb_image = Image.open("0.jpg")
rgb_image = np.array(rgb_image.resize((224,224)))
rgb_image = rgb_image[np.newaxis, :].transpose(0, 3, 1, 2)
rgb_image = (rgb_image.astype(np.float32)-127.5)/127.5input_data = {}
input_data['mobilenetv2_1_00_224_input:0']=rgb_image
outputs = session.run(None, input_data)for i, output_info in enumerate(outputs_info):output_name = output_info.nameprint(outputs[i])
EOF
python3 onnx_forward.py

2.3 ONNX转RKNN

cat > onnx2rknn.py <<-'EOF'
import os
import urllib
import traceback
import time
import sys
import numpy as np
import cv2
from rknn.api import RKNN
from math import exp
import cv2
import numpy as npONNX_MODEL = 'model.onnx'
RKNN_MODEL = 'model.rknn'
is_quant=1rknn = RKNN(verbose=True)
rknn.config(mean_values=[[127.5, 127.5, 127.5]], std_values=[[127.5, 127.5, 127.5]], target_platform='rk3588')
ret = rknn.load_onnx(model=ONNX_MODEL)
if ret != 0:print('Load model failed!')exit(ret)
ret = rknn.build(do_quantization=is_quant, dataset='./dataset.txt',auto_hybrid=True)
if ret != 0:print('Build model failed!')exit(ret)
ret = rknn.export_rknn(RKNN_MODEL)
if ret != 0:print('Export rknn model failed!')exit(ret)
rknn.release()
EOF
echo "0.jpg" > ./dataset.txt
python3 onnx2rknn.py

2.4 RKNN推理

cat > rknn_forward.py <<-'EOF'
import time
import numpy as np
from rknnlite.api import RKNNLite
from PIL import Image
import numpy as nprgb_image = Image.open("0.jpg")
rgb_image = np.array(rgb_image.resize((224,224)))
rgb_image = rgb_image[np.newaxis, :]rknn_lite = RKNNLite()
ret = rknn_lite.load_rknn('model.rknn')
if ret != 0:print('Load RKNN model failed')exit(ret)
ret = rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_AUTO)
if ret != 0:print('Init runtime environment failed')exit(ret)
outputs = rknn_lite.inference(inputs=[rgb_image],data_format=['nhwc'])
print(outputs)
EOF
python3 rknn_forward.py

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

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

相关文章

低代码平台前端页面表格字段绑定与后端数据传输交互主要有哪些方式?华为云Astro在这方面有哪些方式?

目录 🔧 一、低代码平台中常见的数据绑定与交互方式 1. 接口绑定(API 调用) 2. 数据源绑定(DataSource) 3. 变量中转(临时变量 / 页面状态) 4. 数据模型绑定(模型驱动) 🌐 二、华为云 Astro 轻应用的实现方式 ✅ 1. 数据源绑定(API服务+API网关) ✅ 2. 变…

《doubao-lite-32k 模型缓存机制使用指南》

doubao-lite-32k 模型缓存机制使用指南 一、缓存概述 1. 缓存作用 doubao-lite-32k 模型的缓存(Session 缓存)主要用于多轮对话场景,实现以下功能: 存储历史对话信息(Token),避免重复传输上下文,减少计算资源消耗。 优化长上下文(最长 32K Token)处理效率,提升多…

量子计算突破:新型超导芯片重构计算范式

​​2024年IBM 1281量子比特超导芯片实现0.001%量子错误率&#xff0c;计算速度达经典超算2.5亿倍​​。本文解析&#xff1a; ​​物理突破​​&#xff1a;钽基超导材料使量子相干时间突破​​800μs​​&#xff08;提升15倍&#xff09;​​架构革命​​&#xff1a;十字形…

云计算 Linux Rocky day03(which、快捷键、mount、家目录、ls、alias、mkdir、rm、mv、cp、grep)

云计算 Linux Rocky day03&#xff08;which、快捷键、mount、家目录、ls、alias、mkdir、rm、mv、cp、grep&#xff09; 目录 云计算 Linux Rocky day03&#xff08;which、快捷键、mount、家目录、ls、alias、mkdir、rm、mv、cp、grep&#xff09;1.which找到命令所对应的程序…

负载均衡LB》》HAproxy

Ubuntu 22.04 安装HA-proxy 官网 资料 # 更新系统包列表&#xff1a; sudo apt update # 安装 HAproxy sudo apt install haproxy -y # 验证安装 haproxy -v # 如下图配置 Haproxy ##### 基于IP的访问控制 acl ctrl_ip src 172.25.254.1 172.25.254.20 192.168.0.0/24 #…

轻创业技术方案:基于格行双目摄像头的代理系统设计!低成本创业项目有哪些?2025轻资产创业项目排行榜前十名!0成本创业项目推荐!格行代理项目靠谱吗?

没本金&#xff0c;没资源&#xff0c;没人脉&#xff0c;想挣钱且有持续稳定的现金流&#xff0c;只有一条路就是轻创业&#xff01;这里说个表哥的真实创业故事。 我表哥90后&#xff0c;普通农村人&#xff0c;中专毕业跟朋友一起外出打工&#xff0c;刚开始也是吃喝玩乐不…

【推荐算法】Embedding+MLP:TensorFlow实现经典深度学习推荐模型详解

EmbeddingMLP&#xff1a;TensorFlow实现经典深度学习模型详解 1. 算法逻辑模型结构和工作流程关键组件 2. 算法原理与数学推导Embedding层原理MLP前向传播反向传播与优化 3. 模型评估常用评估指标评估方法 4. 应用案例&#xff1a;推荐系统CTR预测问题描述模型架构性能优化 5.…

黑马点评【基于redis实现共享session登录】

目录 一、基于Session实现登录流程 1.发送验证码&#xff1a; 2.短信验证码登录、注册&#xff1a; 3.校验登录状态: 4.session共享问题 4.1为什么会出现 Session 集群共享问题&#xff1f; 4.2常见解决方案 1. 基于 Cookie 的 Session&#xff08;客户端存储&#xff0…

Python读取阿里法拍网的html+解决登录cookie

效果图 import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from lxml import etreedef get_taobao_auct…

【win | docker开启远程配置】使用 SSH 隧道访问 Docker的前操作

在主机A pycharm如何连接远程主机B win docker? 需要win docker配置什么&#xff1f; 快捷配置-主机B win OpenSSH SSH Server https://blog.csdn.net/z164470/article/details/121683333 winR,打开命令行&#xff0c;输入net start sshd,启动SSH。 或者右击我的电脑&#…

Cursor生成Java的架构设计图

文章目录 整体说明一、背景二、前置条件三、生成 Promt四、结果查看五、结果编辑 摘要&#xff1a; Cursor生成Java的架构设计图 关键词&#xff1a; Cursor、人工智能 、开发工具、Java 架构设计图 整体说明 Cursor 作为现在非常好用的开发工具&#xff0c;非常的火爆&#…

1Panel运行的.net程序无法读取系统字体(因为使用了docker)

问题来源 我之前都是使用的宝塔面板&#xff0c;之前我也部署过我的程序&#xff0c;就没有什么问题&#xff0c;但是上次我部署我的程序的时候&#xff0c;就提示无法找到字体Arial。 我的程序中使用该字体生成验证码。 我多次安装了微软的字体包&#xff0c;但是依旧没有效…

面试总结。

一、回流&#xff08;重排&#xff09;与重绘&#xff08;Repaint&#xff09; 优化回答&#xff1a; 概念区分&#xff1a; 回流&#xff08;Reflow/Relayout&#xff09;&#xff1a;当元素的几何属性&#xff08;如宽高、位置、隐藏 / 显示&#xff09;发生改变时&#xff…

TensorFlow深度学习实战(20)——自组织映射详解

TensorFlow深度学习实战&#xff08;20&#xff09;——自组织映射详解 0. 前言1. 自组织映射原理2. 自组织映射的优缺点3. 使用自组织映射实现颜色映射小结系列链接 0. 前言 自组织映射 (Self-Organizing Map, SOM) 是一种无监督学习算法&#xff0c;主要用于高维数据的降维、…

Go内存泄漏排查与修复最佳实践

一、引言 即使Go语言拥有强大的垃圾回收机制&#xff0c;内存泄漏仍然是我们在生产环境中经常面临的挑战。与传统印象不同&#xff0c;垃圾回收并不是万能的"记忆清道夫"&#xff0c;它只能处理那些不再被引用的内存&#xff0c;而无法识别那些仍被引用但实际上不再…

LeetCode刷题 -- 542. 01矩阵 基于 DFS 更新优化的多源最短路径实现

LeetCode刷题 – 542. 01矩阵 基于 DFS 更新优化的多源最短路径实现 题目描述简述 给定一个 m x n 的二进制矩阵 mat&#xff0c;其中&#xff1a; 每个元素为 0 或 1返回一个同样大小的矩阵 ans&#xff0c;其中 ans[i][j] 表示 mat[i][j] 到最近 0 的最短曼哈顿距离 算法思…

MySQL用户远程访问权限设置

mysql相关指令 一. MySQL给用户添加远程访问权限1. 创建或者修改用户权限方法一&#xff1a;创建用户并授予远程访问权限方法二&#xff1a;修改现有用户的访问限制方法三&#xff1a;授予特定数据库的特定权限 2. 修改 MySQL 配置文件3. 安全最佳实践4. 测试远程连接5. 撤销权…

如何使用 BPF 分析 Linux 内存泄漏,Linux 性能调优之 BPF 分析内核态、用户态内存泄漏

写在前面 博文内容为 通过 BCC 工具集 memleak 进行内存泄漏分析的简单认知包括 memleak 脚本简单认知,内核态(内核模块)、用户态(Java,Python,C)内存跟踪泄漏分析 Demo理解不足小伙伴帮忙指正 😃,生活加油知其不可奈何而安之若命,德之至也。----《庄子内篇人间世》 …

谷歌Sign Gemma: AI手语翻译,沟通从此无界!

嘿&#xff0c;朋友们&#xff01;想象一下&#xff0c;语言不再是交流的障碍&#xff0c;每个人都能顺畅表达与理解。这听起来是不是很酷&#xff1f;谷歌最新发布的Sign Gemma AI模型&#xff0c;正朝着这个激动人心的未来迈出了一大步&#xff01;它就像一位随身的、不知疲倦…

全生命周期的智慧城市管理

前言 全生命周期的智慧城市管理。未来&#xff0c;城市将在 实现从基础设施建设、日常运营到数据管理的 全生命周期统筹。这将避免过去智慧城市建设 中出现的“碎片化”问题&#xff0c;实现资源的高效配 置和项目的协调发展。城市管理者将运用先进 的信息技术&#xff0c;如物…