移植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
繁體地址,請注明出處:http://hk.pswp.cn/web/82846.shtml
英文地址,請注明出處:http://en.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;如物…